summaryrefslogtreecommitdiff
path: root/vcl/unx/gtk/window/gtksalframe.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'vcl/unx/gtk/window/gtksalframe.cxx')
-rw-r--r--vcl/unx/gtk/window/gtksalframe.cxx46
1 files changed, 18 insertions, 28 deletions
diff --git a/vcl/unx/gtk/window/gtksalframe.cxx b/vcl/unx/gtk/window/gtksalframe.cxx
index ebc038ccb123..997b9482a879 100644
--- a/vcl/unx/gtk/window/gtksalframe.cxx
+++ b/vcl/unx/gtk/window/gtksalframe.cxx
@@ -1966,8 +1966,11 @@ void GtkSalFrame::AllocateFrame()
if( aFrameSize.getY() == 0 )
aFrameSize.setY( 1 );
sal_Int32 nStride(basebmp::getBitmapDeviceStrideForWidth(basebmp::FORMAT_TWENTYFOUR_BIT_TC_MASK, aFrameSize.getX()));
+ int cairo_stride = cairo_format_stride_for_width(CAIRO_FORMAT_RGB24, aFrameSize.getX());
+ assert(cairo_stride >= basebmp::getBitmapDeviceStrideForWidth(basebmp::FORMAT_THIRTYTWO_BIT_TC_MASK_BGRX,
+ aFrameSize.getX()));
m_aFrame = basebmp::createBitmapDevice(aFrameSize, true,
- basebmp::FORMAT_TWENTYFOUR_BIT_TC_MASK, nStride);
+ basebmp::FORMAT_THIRTYTWO_BIT_TC_MASK_BGRX, cairo_stride);
m_aFrame->setDamageTracker(
basebmp::IBitmapDeviceDamageTrackerSharedPtr(new DamageTracker(*this)) );
fprintf( stderr, "allocated m_aFrame size of %dx%d \n",
@@ -3423,41 +3426,28 @@ void GtkSalFrame::renderArea( cairo_t *cr, cairo_rectangle_t *area )
cairo_save( cr );
- int cairo_stride = cairo_format_stride_for_width (CAIRO_FORMAT_ARGB32, area->width);
- unsigned char *p, *src, *mem = (unsigned char *)malloc (cairo_stride * area->height);
- p = mem;
- src = data.get();
- src += (int)ay * nStride + (int)ax * 3;
-
- for (int y = 0; y < aheight; ++y)
- {
- for (int x = 0; x < awidth; ++x)
- {
- p[x*4 + 0] = src[x*3 + 0]; // B
- p[x*4 + 1] = src[x*3 + 1]; // G
- p[x*4 + 2] = src[x*3 + 2]; // R
- p[x*4 + 3] = 255; // A
- }
- src += nStride;
- p += cairo_stride;
- }
+ unsigned char *src = data.get();
+ assert(cairo_format_stride_for_width(CAIRO_FORMAT_RGB24, size.getX()) == nStride);
cairo_surface_t *pSurface =
- cairo_image_surface_create_for_data( mem,
- CAIRO_FORMAT_ARGB32,
- awidth, aheight,
- cairo_stride );
- /* g_warning( "Fixed cairo status %d %d strides: %d vs %d, mask %d\n",
+ cairo_image_surface_create_for_data(src,
+ CAIRO_FORMAT_RGB24,
+ size.getX(), size.getY(),
+ nStride);
+ /*
+ int cairo_stride = cairo_format_stride_for_width(CAIRO_FORMAT_RGB24, size.getX());
+ g_warning( "Fixed cairo status %d %d strides: %d vs %d, mask %d\n",
(int) cairo_status( cr ),
(int) cairo_surface_status( pSurface ),
(int) nStride,
(int) cairo_stride,
- (int) (cairo_stride & (sizeof (uint32_t)-1)) ); */
+ (int) (cairo_stride & (sizeof (uint32_t)-1)) );
+ */
cairo_set_operator( cr, CAIRO_OPERATOR_OVER );
- cairo_set_source_surface( cr, pSurface, ax, ay );
- cairo_paint( cr );
+ cairo_set_source_surface( cr, pSurface, 0, 0 );
+ cairo_rectangle( cr, ax, ay, awidth, aheight );
+ cairo_fill( cr );
cairo_surface_destroy( pSurface );
- free (mem);
cairo_restore( cr );
// Render red rectangles to show what was re-rendered ...