diff options
author | Luboš Luňák <l.lunak@collabora.com> | 2020-01-24 10:45:57 +0100 |
---|---|---|
committer | Luboš Luňák <l.lunak@collabora.com> | 2020-01-27 15:58:51 +0100 |
commit | 9bc731524b3c5cc809ca4573daa316173a5ec13a (patch) | |
tree | 4daad6314ac0d96275b4401ed98ca43194756b13 /vcl | |
parent | a439167552c1d9e02f3b50759fdbfbea0a3a5709 (diff) |
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.lunak@collabora.com>
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/source/filter/png/pngwrite.cxx | 68 |
1 files changed, 23 insertions, 45 deletions
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 ); |