[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Gnash-commit] gnash ChangeLog backend/render_handler_cairo.cpp
From: |
Sandro Santilli |
Subject: |
[Gnash-commit] gnash ChangeLog backend/render_handler_cairo.cpp |
Date: |
Wed, 11 Jul 2007 15:18:00 +0000 |
CVSROOT: /sources/gnash
Module name: gnash
Changes by: Sandro Santilli <strk> 07/07/11 15:18:00
Modified files:
. : ChangeLog
backend : render_handler_cairo.cpp
Log message:
Patch by Timothy Lee <address@hidden>:
* backend/render_handler_cairo.cpp: correct scaling and offset
in video rendering. Optimize RGB data conversion as suggested
by John Gilmore.
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.3713&r2=1.3714
http://cvs.savannah.gnu.org/viewcvs/gnash/backend/render_handler_cairo.cpp?cvsroot=gnash&r1=1.20&r2=1.21
Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/gnash/gnash/ChangeLog,v
retrieving revision 1.3713
retrieving revision 1.3714
diff -u -b -r1.3713 -r1.3714
--- ChangeLog 11 Jul 2007 09:10:08 -0000 1.3713
+++ ChangeLog 11 Jul 2007 15:18:00 -0000 1.3714
@@ -1,4 +1,10 @@
-2007-07-04 Udo Giacomozzi <address@hidden>
+2007-07-11 Timothy Lee <address@hidden>
+
+ * backend/render_handler_cairo.cpp: correct scaling and offset
+ in video rendering. Optimize RGB data conversion as suggested
+ by John Gilmore.
+
+2007-07-11 Udo Giacomozzi <address@hidden>
* gui/fb.cpp: print fatal error messages to stdout (workaround),
fixes bug #20012
Index: backend/render_handler_cairo.cpp
===================================================================
RCS file: /sources/gnash/gnash/backend/render_handler_cairo.cpp,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -b -r1.20 -r1.21
--- backend/render_handler_cairo.cpp 10 Jul 2007 14:49:56 -0000 1.20
+++ backend/render_handler_cairo.cpp 11 Jul 2007 15:18:00 -0000 1.21
@@ -25,19 +25,35 @@
static cairo_t* g_cr = 0;
-// Converts from RGB image to 32-bit pixels in CAIRO_FORMAT_RGB24 format
+// Converts from RGBA image to 32-bit pixels in CAIRO_FORMAT_RGB24 format
static void
rgb_to_cairo_rgb24(uint8_t* dst, const image::rgb* im)
{
+ uint32_t* dst32 = reinterpret_cast<uint32_t*>(dst);
for (int y = 0; y < im->m_height; y++)
{
const uint8_t* src = image::scanline(im, y);
for (int x = 0; x < im->m_width; x++, src += 3)
{
- *dst++ = src[2]; // blue
- *dst++ = src[1]; // green
- *dst++ = src[0]; // red
- *dst++; // alpha not used
+ // 32-bit RGB data in native endian format
+ *dst32++ = (src[0] << 16) | (src[1] << 8) | src[2];
+ }
+ }
+}
+
+
+// Converts from RGBA image to 32-bit pixels in CAIRO_FORMAT_ARGB32 format
+static void
+rgba_to_cairo_argb32(uint8_t* dst, const image::rgba* im)
+{
+ uint32_t* dst32 = reinterpret_cast<uint32_t*>(dst);
+ for (int y = 0; y < im->m_height; y++)
+ {
+ const uint8_t* src = image::scanline(im, y);
+ for (int x = 0; x < im->m_width; x++, src += 3)
+ {
+ // 32-bit ARGB data in native endian format
+ *dst32++ = (src[0] << 24) | (src[1] << 16) | (src[2] << 8) | src[3];
}
}
}
@@ -605,17 +621,26 @@
int w = frame->m_width;
int h = frame->m_height;
- // Compute video object size relative to bounding rectangle
- double w_scale = w / bounds->width();
- double h_scale = h / bounds->height();
+ // Compute bounding rectangle size relative to video object
+ double w_scale = bounds->width() / w;
+ double h_scale = bounds->height() / h;
- // Prepare transformation matrix for RGB frame
+ // Fit video to bounding rectangle
cairo_matrix_t mat;
- cairo_matrix_init(&mat,
+ cairo_matrix_init_scale(&mat, w_scale, h_scale);
+ cairo_matrix_translate(&mat,
+ bounds->get_x_min(), bounds->get_y_min());
+
+ // Now apply transformation to video
+ cairo_matrix_t frame_mat;
+ cairo_matrix_init(&frame_mat,
m->m_[0][0], m->m_[1][0],
m->m_[0][1], m->m_[1][1],
m->m_[0][2], m->m_[1][2]);
- cairo_matrix_scale(&mat, w_scale, h_scale);
+ cairo_matrix_multiply(&mat, &mat, &frame_mat);
+
+ // Inverse the matrix for pattern space
+ cairo_matrix_invert(&mat);
// Convert RGB frame to cairo format
int buf_size = w * h * 4;
@@ -631,7 +656,7 @@
cairo_surface_t* surface = cairo_image_surface_create_for_data(
m_video_buffer, CAIRO_FORMAT_RGB24, w, h, w * 4);
cairo_pattern_t* pattern =
cairo_pattern_create_for_surface(surface);
- cairo_pattern_set_extend(pattern, CAIRO_EXTEND_REPEAT);
+ cairo_pattern_set_extend(pattern, CAIRO_EXTEND_NONE);
cairo_pattern_set_matrix(pattern, &mat);
// Draw the frame now
@@ -716,20 +741,7 @@
// Allocate output buffer
int buf_size = im->m_width * im->m_height * 4;
m_buffer = new unsigned char[buf_size];
-
- // Convert BGRA data to ARGB
- unsigned char* dst = m_buffer;
- for (int y = 0; y < im->m_height; y++)
- {
- uint8_t* src = image::scanline(im, y);
- for (int x = 0; x < im->m_width; x++, src += 4)
- {
- *dst++ = src[3]; // blue
- *dst++ = src[2]; // green
- *dst++ = src[1]; // red
- *dst++ = src[0]; // alpha
- }
- }
+ rgba_to_cairo_argb32(m_buffer, im);
// Create the image
m_original_width = im->m_width;