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 }