vcl/source/filter/png/pngwrite.cxx | 68 ++++++++++++------------------------- 1 file changed, 23 insertions(+), 45 deletions(-)
New commits: commit 9bc731524b3c5cc809ca4573daa316173a5ec13a Author: Luboš Luňák <l.lu...@collabora.com> AuthorDate: Fri Jan 24 10:45:57 2020 +0100 Commit: Luboš Luňák <l.lu...@collabora.com> CommitDate: Mon Jan 27 15:58:51 2020 +0100 Revert "avoid needless 32bpp->24+8bpp conversion in png writer" (tdf#130128) The separate alpha channel that VCL normally uses really messes up trying to switch to 32bpp bitmaps all over the code. In the case of tdf#130128 the bitmap has data as ScanlineFormat::N32BitTcMask, and this uses class ColorMask, which handles only separate alpha and drops it from the bitmap data itself. So I'm just giving up on the 32bpp idea in Skia for somewhen later maybe. This reverts commit 86d44930eecb5e8933f6870684adbb5f9200d6f7. Change-Id: Iff419e8162c4e0f0680bf62d2b078f9ea809959e Reviewed-on: https://gerrit.libreoffice.org/c/core/+/87467 Tested-by: Jenkins Reviewed-by: Luboš Luňák <l.lu...@collabora.com> diff --git a/vcl/source/filter/png/pngwrite.cxx b/vcl/source/filter/png/pngwrite.cxx index be1dac83d908..8190c1efd38a 100644 --- a/vcl/source/filter/png/pngwrite.cxx +++ b/vcl/source/filter/png/pngwrite.cxx @@ -114,7 +114,19 @@ PNGWriterImpl::PNGWriterImpl( const BitmapEx& rBitmapEx, { if (!rBitmapEx.IsEmpty()) { - Bitmap aBmp(rBitmapEx.GetBitmap()); + BitmapEx aBitmapEx; + + if (rBitmapEx.GetBitmap().GetBitCount() == 32) + { + if (!vcl::bitmap::convertBitmap32To24Plus8(rBitmapEx, aBitmapEx)) + return; + } + else + { + aBitmapEx = rBitmapEx; + } + + Bitmap aBmp(aBitmapEx.GetBitmap()); mnMaxChunkSize = std::numeric_limits<sal_uInt32>::max(); @@ -136,26 +148,9 @@ PNGWriterImpl::PNGWriterImpl( const BitmapEx& rBitmapEx, } mnBitsPerPixel = static_cast<sal_uInt8>(aBmp.GetBitCount()); - if (mnBitsPerPixel == 32) - { - mpAccess = Bitmap::ScopedReadAccess(aBmp); // RGBA - if (mpAccess) - { - if (ImplWriteHeader()) - { - ImplWritepHYs(rBitmapEx); - ImplWriteIDAT(); - } - mpAccess.reset(); - } - else - { - mbStatus = false; - } - } - else if (rBitmapEx.IsTransparent()) + if (aBitmapEx.IsTransparent()) { - if (mnBitsPerPixel <= 8 && rBitmapEx.IsAlpha()) + if (mnBitsPerPixel <= 8 && aBitmapEx.IsAlpha()) { aBmp.Convert( BmpConversion::N24Bit ); mnBitsPerPixel = 24; @@ -164,14 +159,14 @@ PNGWriterImpl::PNGWriterImpl( const BitmapEx& rBitmapEx, if (mnBitsPerPixel <= 8) // transparent palette { aBmp.Convert(BmpConversion::N8BitTrans); - aBmp.Replace(rBitmapEx.GetMask(), BMP_COL_TRANS); + aBmp.Replace(aBitmapEx.GetMask(), BMP_COL_TRANS); mnBitsPerPixel = 8; mpAccess = Bitmap::ScopedReadAccess(aBmp); if (mpAccess) { if (ImplWriteHeader()) { - ImplWritepHYs(rBitmapEx); + ImplWritepHYs(aBitmapEx); ImplWritePalette(); ImplWriteTransparent(); ImplWriteIDAT(); @@ -188,16 +183,16 @@ PNGWriterImpl::PNGWriterImpl( const BitmapEx& rBitmapEx, mpAccess = Bitmap::ScopedReadAccess(aBmp); // true RGB with alphachannel if (mpAccess) { - mbTrueAlpha = rBitmapEx.IsAlpha(); + mbTrueAlpha = aBitmapEx.IsAlpha(); if (mbTrueAlpha) { - AlphaMask aMask(rBitmapEx.GetAlpha()); + AlphaMask aMask(aBitmapEx.GetAlpha()); mpMaskAccess = aMask.AcquireReadAccess(); if (mpMaskAccess) { if (ImplWriteHeader()) { - ImplWritepHYs(rBitmapEx); + ImplWritepHYs(aBitmapEx); ImplWriteIDAT(); } aMask.ReleaseAccess(mpMaskAccess); @@ -210,13 +205,13 @@ PNGWriterImpl::PNGWriterImpl( const BitmapEx& rBitmapEx, } else { - Bitmap aMask(rBitmapEx.GetMask()); + Bitmap aMask(aBitmapEx.GetMask()); mpMaskAccess = aMask.AcquireReadAccess(); if (mpMaskAccess) { if (ImplWriteHeader()) { - ImplWritepHYs(rBitmapEx); + ImplWritepHYs(aBitmapEx); ImplWriteIDAT(); } Bitmap::ReleaseAccess(mpMaskAccess); @@ -242,7 +237,7 @@ PNGWriterImpl::PNGWriterImpl( const BitmapEx& rBitmapEx, { if (ImplWriteHeader()) { - ImplWritepHYs(rBitmapEx); + ImplWritepHYs(aBitmapEx); if (mpAccess->HasPalette()) ImplWritePalette(); @@ -318,11 +313,6 @@ bool PNGWriterImpl::ImplWriteHeader() if (mpMaskAccess) nColorType |= 4; - if (mnBitsPerPixel == 32) - { - nBitDepth = mnBitsPerPixel / 4; - nColorType |= 4; - } ImplWriteChunk(nBitDepth); ImplWriteChunk(nColorType); // colortype @@ -595,18 +585,6 @@ sal_uLong PNGWriterImpl::ImplGetFilter (sal_uLong nY, sal_uLong nXStart, sal_uLo } } } - else if(mnBitsPerPixel == 32) // RGBA - { - Scanline pScanline = mpAccess->GetScanline( nY ); - for (sal_uLong nX = nXStart; nX < mnWidth; nX += nXAdd) - { - const BitmapColor& rColor = mpAccess->GetPixelFromData(pScanline, nX); - *pDest++ = rColor.GetRed(); - *pDest++ = rColor.GetGreen(); - *pDest++ = rColor.GetBlue(); - *pDest++ = 255 - rColor.GetTransparency(); - } - } else { Scanline pScanline = mpAccess->GetScanline( nY ); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits