diff options
author | Noel Grandin <noel.grandin@collabora.co.uk> | 2021-06-09 15:24:19 +0200 |
---|---|---|
committer | Noel Grandin <noel.grandin@collabora.co.uk> | 2021-06-09 18:25:10 +0200 |
commit | 520bb32555985c12642b40fad3b7dcac7a940585 (patch) | |
tree | 9a48efb494135b429e63b1bcbe5d2c916daba70a | |
parent | e6aecfeea18a5b98ec724e6229295170ec75c936 (diff) |
tdf#142629 import psd image with transparent background
regression from
commit 2168d709805a847ac012ff87b06e081ca139d064
Date: Mon Feb 12 15:29:10 2018 +0200
use RawBitmap in PSDReader
Change-Id: I8d547d3cca7fb8fc90a8d9382e054b4d4b2f3519
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/116916
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
-rw-r--r-- | include/vcl/RawBitmap.hxx | 6 | ||||
-rw-r--r-- | vcl/source/filter/ipsd/ipsd.cxx | 9 |
2 files changed, 11 insertions, 4 deletions
diff --git a/include/vcl/RawBitmap.hxx b/include/vcl/RawBitmap.hxx index 26e08dbdedac..b26d532a4032 100644 --- a/include/vcl/RawBitmap.hxx +++ b/include/vcl/RawBitmap.hxx @@ -49,6 +49,12 @@ public: if (mnBitCount == 32) mpData[p] = nColor.GetAlpha(); } + void SetAlpha(tools::Long nY, tools::Long nX, sal_uInt8 nAlpha) + { + assert(mnBitCount == 32); + tools::Long p = (nY * maSize.getWidth() + nX) * (mnBitCount / 8) + 3; + mpData[p] = nAlpha; + } Color GetPixel(tools::Long nY, tools::Long nX) const { tools::Long p = (nY * maSize.getWidth() + nX) * mnBitCount / 8; diff --git a/vcl/source/filter/ipsd/ipsd.cxx b/vcl/source/filter/ipsd/ipsd.cxx index 6b96d742dae2..08e520884754 100644 --- a/vcl/source/filter/ipsd/ipsd.cxx +++ b/vcl/source/filter/ipsd/ipsd.cxx @@ -121,7 +121,7 @@ bool PSDReader::ReadPSD(Graphic & rGraphic ) } Size aBitmapSize( mpFileHeader->nColumns, mpFileHeader->nRows ); - mpBitmap.reset( new vcl::bitmap::RawBitmap( aBitmapSize, 24 ) ); + mpBitmap.reset( new vcl::bitmap::RawBitmap( aBitmapSize, mbTransparent ? 32 : 24 ) ); if ( mpPalette && mbStatus ) { mvPalette.resize( 256 ); @@ -131,8 +131,9 @@ bool PSDReader::ReadPSD(Graphic & rGraphic ) } } - if ((mnDestBitDepth == 1 || mnDestBitDepth == 8 || mbTransparent) && mvPalette.empty()) + if ((mnDestBitDepth == 1 || mnDestBitDepth == 8) && mvPalette.empty()) { + SAL_WARN("vcl", "no palette, but bit depth is " << mnDestBitDepth); mbStatus = false; return mbStatus; } @@ -723,7 +724,7 @@ bool PSDReader::ImplReadBody() m_rPSD.ReadUChar( nDummy ); for ( sal_uInt16 i = 0; i < ( -nRunCount + 1 ); i++ ) { - mpBitmap->SetPixel(nY, nX, SanitizePaletteIndex(mvPalette, nDat)); + mpBitmap->SetAlpha(nY, nX, nDat ? 0 : 255); if ( ++nX == mpFileHeader->nColumns ) { nX = 0; @@ -744,7 +745,7 @@ bool PSDReader::ImplReadBody() nDat = 1; if ( mpFileHeader->nDepth == 16 ) // 16 bit depth is to be skipped m_rPSD.ReadUChar( nDummy ); - mpBitmap->SetPixel(nY, nX, SanitizePaletteIndex(mvPalette, nDat)); + mpBitmap->SetAlpha(nY, nX, nDat ? 0 : 255); if ( ++nX == mpFileHeader->nColumns ) { nX = 0; |