canvas/source/cairo/cairo_canvashelper.cxx |    1 +
 vcl/source/bitmap/BitmapTools.cxx          |   28 ++++++++++++++++++++--------
 2 files changed, 21 insertions(+), 8 deletions(-)

New commits:
commit 201fadd949d258b66d6848f0c4cedb8b95876084
Author:     Noel Grandin <noel.gran...@collabora.co.uk>
AuthorDate: Thu Aug 21 09:36:41 2025 +0200
Commit:     Noel Grandin <noel.gran...@collabora.co.uk>
CommitDate: Thu Aug 21 11:23:57 2025 +0200

    tdf#168018 PPTX: graphics shows with weird effects in presentation mode
    
    regression from
        commit eb4394e3460932011940a1e3c03d5d67d7f45885
        Author: Noel Grandin <noel.gran...@collabora.co.uk>
        Date:   Mon Aug 18 13:31:30 2025 +0200
        tdf#167893 and tdf#167876 weird effects in slideshow
    
    added a bunch of comments so the next person doesn't assume that cairo is 
sane, like I initially did.
    
    Change-Id: I37558c423e740421952b7c7a7e318dec17262191
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/189981
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>

diff --git a/canvas/source/cairo/cairo_canvashelper.cxx 
b/canvas/source/cairo/cairo_canvashelper.cxx
index e957d4d6460f..941068f7b4ad 100644
--- a/canvas/source/cairo/cairo_canvashelper.cxx
+++ b/canvas/source/cairo/cairo_canvashelper.cxx
@@ -348,6 +348,7 @@ constexpr OUStringLiteral 
PARAMETRICPOLYPOLYGON_IMPLEMENTATION_NAME = u"Canvas::
                 tools::Long nHeight;
                 vcl::bitmap::CanvasCairoExtractBitmapData(aBitmap, data, 
bHasAlpha, nWidth, nHeight);
 
+                // both of the cairo formats use a 32-bit pixel
                 pSurface = rSurfaceProvider->getOutputDevice()->CreateSurface(
                     CairoSurfaceSharedPtr(
                         cairo_image_surface_create_for_data(
diff --git a/vcl/source/bitmap/BitmapTools.cxx 
b/vcl/source/bitmap/BitmapTools.cxx
index 85e40b8540be..95b37e88d212 100644
--- a/vcl/source/bitmap/BitmapTools.cxx
+++ b/vcl/source/bitmap/BitmapTools.cxx
@@ -664,16 +664,18 @@ void CanvasCairoExtractBitmapData( const Bitmap & 
aBitmap, unsigned char*& data,
     tools::Long nX, nY;
     bHasAlpha = aBitmap.HasAlpha();
 
-    data = static_cast<unsigned char*>(malloc( nWidth*nHeight*(bHasAlpha ? 4 : 
3) ));
+    /// BOTH of the cairo formats use a 32-bit pixel.
+    auto nScanlineSize = nWidth*4;
+    data = static_cast<unsigned char*>(malloc(nHeight * nScanlineSize));
     if (!data)
         std::abort();
 
-    tools::Long nOff = 0;
     ::Color aColor;
 
     for( nY = 0; nY < nHeight; nY++ )
     {
         ::Scanline pReadScan;
+        tools::Long nOff = nY * nScanlineSize;
 
         switch( pBitmapReadAcc->GetScanlineFormat() )
         {
@@ -685,6 +687,7 @@ void CanvasCairoExtractBitmapData( const Bitmap & aBitmap, 
unsigned char*& data,
             {
                 aColor = pBitmapReadAcc->GetPaletteColor(*pReadScan++);
 #ifdef OSL_BIGENDIAN
+                data[ nOff++ ] = 0xff;
                 data[ nOff++ ] = aColor.GetRed();
                 data[ nOff++ ] = aColor.GetGreen();
                 data[ nOff++ ] = aColor.GetBlue();
@@ -692,6 +695,7 @@ void CanvasCairoExtractBitmapData( const Bitmap & aBitmap, 
unsigned char*& data,
                 data[ nOff++ ] = aColor.GetBlue();
                 data[ nOff++ ] = aColor.GetGreen();
                 data[ nOff++ ] = aColor.GetRed();
+                data[ nOff++ ] = 0xff;
 #endif
             }
             break;
@@ -702,15 +706,17 @@ void CanvasCairoExtractBitmapData( const Bitmap & 
aBitmap, unsigned char*& data,
             for( nX = 0; nX < nWidth; nX++ )
             {
 #ifdef OSL_BIGENDIAN
-                data[ nOff + 3 ] = *pReadScan++;
+                data[ nOff + 3 ] = 0xff;
                 data[ nOff + 2 ] = *pReadScan++;
                 data[ nOff + 1 ] = *pReadScan++;
+                data[ nOff + 0 ] = *pReadScan++;
 #else
+                data[ nOff + 0 ] = *pReadScan++;
                 data[ nOff + 1 ] = *pReadScan++;
                 data[ nOff + 2 ] = *pReadScan++;
-                data[ nOff + 3 ] = *pReadScan++;
+                data[ nOff + 3 ] = 0xff;
 #endif
-                nOff += 3;
+                nOff += 4;
             }
             break;
         case ScanlineFormat::N24BitTcRgb:
@@ -720,15 +726,17 @@ void CanvasCairoExtractBitmapData( const Bitmap & 
aBitmap, unsigned char*& data,
             for( nX = 0; nX < nWidth; nX++ )
             {
 #ifdef OSL_BIGENDIAN
-                data[ nOff + 3 ] = *pReadScan++;
+                data[ nOff + 3 ] = 0xff;
                 data[ nOff + 2 ] = *pReadScan++;
                 data[ nOff + 1 ] = *pReadScan++;
+                data[ nOff + 0 ] = *pReadScan++;
 #else
+                data[ nOff + 0 ] = *pReadScan++;
                 data[ nOff + 1 ] = *pReadScan++;
                 data[ nOff + 2 ] = *pReadScan++;
-                data[ nOff + 3 ] = *pReadScan++;
+                data[ nOff + 3 ] = 0xff;
 #endif
-                nOff += 3;
+                nOff += 4;
             }
             break;
         case ScanlineFormat::N32BitTcBgra:
@@ -760,6 +768,7 @@ void CanvasCairoExtractBitmapData( const Bitmap & aBitmap, 
unsigned char*& data,
             for( nX = 0; nX < nWidth; nX++ )
             {
 #ifdef OSL_BIGENDIAN
+                data[ nOff++ ] = 0xff;
                 data[ nOff++ ] = pReadScan[ 2 ];
                 data[ nOff++ ] = pReadScan[ 1 ];
                 data[ nOff++ ] = pReadScan[ 0 ];
@@ -768,6 +777,7 @@ void CanvasCairoExtractBitmapData( const Bitmap & aBitmap, 
unsigned char*& data,
                 data[ nOff++ ] = *pReadScan++;
                 data[ nOff++ ] = *pReadScan++;
                 data[ nOff++ ] = *pReadScan++;
+                data[ nOff++ ] = 0xff;
                 pReadScan++;
 #endif
             }
@@ -801,6 +811,7 @@ void CanvasCairoExtractBitmapData( const Bitmap & aBitmap, 
unsigned char*& data,
             for( nX = 0; nX < nWidth; nX++ )
             {
 #ifdef OSL_BIGENDIAN
+                data[ nOff++ ] = 0xff;
                 data[ nOff++ ] = *pReadScan++;
                 data[ nOff++ ] = *pReadScan++;
                 data[ nOff++ ] = *pReadScan++;
@@ -809,6 +820,7 @@ void CanvasCairoExtractBitmapData( const Bitmap & aBitmap, 
unsigned char*& data,
                 data[ nOff++ ] = pReadScan[ 2 ];
                 data[ nOff++ ] = pReadScan[ 1 ];
                 data[ nOff++ ] = pReadScan[ 0 ];
+                data[ nOff++ ] = 0xff;
                 pReadScan += 4;
 #endif
             }

Reply via email to