[Libreoffice-commits] core.git: filter/source include/vcl
Noel Grandin
noel.grandin at collabora.co.uk
Wed Feb 14 06:29:03 UTC 2018
filter/source/graphicfilter/ipsd/ipsd.cxx | 89 ++++++++++--------------------
include/vcl/BitmapTools.hxx | 5 +
2 files changed, 36 insertions(+), 58 deletions(-)
New commits:
commit 2168d709805a847ac012ff87b06e081ca139d064
Author: Noel Grandin <noel.grandin at collabora.co.uk>
Date: Mon Feb 12 15:29:10 2018 +0200
use RawBitmap in PSDReader
part of making Bitmap an internal detail of vcl
Change-Id: Icdb7a7474b19e304950fcf75ef2b85006b7755e9
Reviewed-on: https://gerrit.libreoffice.org/49664
Tested-by: Jenkins <ci at libreoffice.org>
Reviewed-by: Noel Grandin <noel.grandin at collabora.co.uk>
diff --git a/filter/source/graphicfilter/ipsd/ipsd.cxx b/filter/source/graphicfilter/ipsd/ipsd.cxx
index 3d484621596e..e254b1946be0 100644
--- a/filter/source/graphicfilter/ipsd/ipsd.cxx
+++ b/filter/source/graphicfilter/ipsd/ipsd.cxx
@@ -19,7 +19,7 @@
#include <vcl/graph.hxx>
-#include <vcl/bitmapaccess.hxx>
+#include <vcl/BitmapTools.hxx>
#include <vcl/outdev.hxx>
#include <tools/fract.hxx>
#include <memory>
@@ -65,11 +65,8 @@ private:
bool mbStatus;
bool mbTransparent;
- Bitmap maBmp;
- Bitmap maMaskBmp;
- BitmapReadAccess* mpReadAcc;
- BitmapWriteAccess* mpWriteAcc;
- BitmapWriteAccess* mpMaskWriteAcc;
+ std::unique_ptr<vcl::bitmap::RawBitmap> mpBitmap;
+ std::vector<Color> mvPalette;
sal_uInt16 mnDestBitDepth;
bool mbCompression; // RLE decoding
std::unique_ptr<sal_uInt8[]>
@@ -92,9 +89,6 @@ PSDReader::PSDReader(SvStream &rStream)
, mnYResFixed(0)
, mbStatus(true)
, mbTransparent(false)
- , mpReadAcc(nullptr)
- , mpWriteAcc(nullptr)
- , mpMaskWriteAcc(nullptr)
, mnDestBitDepth(0)
, mbCompression(false)
, mpPalette(nullptr)
@@ -114,32 +108,19 @@ bool PSDReader::ReadPSD(Graphic & rGraphic )
return false;
Size aBitmapSize( mpFileHeader->nColumns, mpFileHeader->nRows );
- maBmp = Bitmap( aBitmapSize, mnDestBitDepth );
- if ( ( mpWriteAcc = maBmp.AcquireWriteAccess() ) == nullptr )
- mbStatus = false;
- if ( ( mpReadAcc = maBmp.AcquireReadAccess() ) == nullptr )
- mbStatus = false;
- if ( mbTransparent && mbStatus )
- {
- maMaskBmp = Bitmap( aBitmapSize, 1 );
- if ( ( mpMaskWriteAcc = maMaskBmp.AcquireWriteAccess() ) == nullptr )
- mbStatus = false;
- }
+ mpBitmap.reset( new vcl::bitmap::RawBitmap( aBitmapSize ) );
if ( mpPalette && mbStatus )
{
- mpWriteAcc->SetPaletteEntryCount( 256 );
+ mvPalette.resize( 256 );
for ( sal_uInt16 i = 0; i < 256; i++ )
{
- mpWriteAcc->SetPaletteColor( i, Color( mpPalette[ i ], mpPalette[ i + 256 ], mpPalette[ i + 512 ] ) );
+ mvPalette[i] = Color( mpPalette[ i ], mpPalette[ i + 256 ], mpPalette[ i + 512 ] );
}
}
// read bitmap data
if ( mbStatus && ImplReadBody() )
{
- if ( mbTransparent )
- rGraphic = Graphic( BitmapEx( maBmp, maMaskBmp ) );
- else
- rGraphic = maBmp;
+ rGraphic = Graphic( vcl::bitmap::CreateFromData( std::move(*mpBitmap) ) );
if ( mnXResFixed && mnYResFixed )
{
@@ -154,12 +135,6 @@ bool PSDReader::ReadPSD(Graphic & rGraphic )
}
else
mbStatus = false;
- if ( mpWriteAcc )
- Bitmap::ReleaseAccess( mpWriteAcc );
- if ( mpReadAcc )
- Bitmap::ReleaseAccess( mpReadAcc );
- if ( mpMaskWriteAcc )
- Bitmap::ReleaseAccess( mpMaskWriteAcc );
return mbStatus;
}
@@ -361,7 +336,7 @@ bool PSDReader::ImplReadBody()
nDat ^= 0xff;
nBitCount = 7;
}
- mpWriteAcc->SetPixelIndex( nY, nX, nDat >> nBitCount-- );
+ mpBitmap->SetPixel( nY, nX, mvPalette[nDat >> nBitCount--] );
if ( ++nX == mpFileHeader->nColumns )
{
nX = 0;
@@ -383,7 +358,7 @@ bool PSDReader::ImplReadBody()
nDat ^= 0xff;
nBitCount = 7;
}
- mpWriteAcc->SetPixelIndex( nY, nX, nDat >> nBitCount-- );
+ mpBitmap->SetPixel( nY, nX, mvPalette[nDat >> nBitCount--] );
if ( ++nX == mpFileHeader->nColumns )
{
nX = 0;
@@ -417,7 +392,7 @@ bool PSDReader::ImplReadBody()
const sal_uInt16 nCount = -nRunCount + 1;
for (sal_uInt16 i = 0; i < nCount && m_rPSD.good(); ++i)
{
- mpWriteAcc->SetPixelIndex( nY, nX, nDat );
+ mpBitmap->SetPixel( nY, nX, mvPalette[nDat] );
if ( ++nX == mpFileHeader->nColumns )
{
nX = 0;
@@ -435,7 +410,7 @@ bool PSDReader::ImplReadBody()
m_rPSD.ReadUChar( nDat );
if ( mpFileHeader->nDepth == 16 ) // 16 bit depth is to be skipped
m_rPSD.ReadUChar( nDummy );
- mpWriteAcc->SetPixelIndex( nY, nX, nDat );
+ mpBitmap->SetPixel( nY, nX, mvPalette[nDat] );
if ( ++nX == mpFileHeader->nColumns )
{
nX = 0;
@@ -472,7 +447,7 @@ bool PSDReader::ImplReadBody()
const sal_uInt16 nCount = -nRunCount + 1;
for (sal_uInt16 i = 0; i < nCount && m_rPSD.good(); ++i)
{
- mpWriteAcc->SetPixel( nY, nX, BitmapColor( nRed, sal_uInt8(0), sal_uInt8(0) ) );
+ mpBitmap->SetPixel( nY, nX, Color( nRed, sal_uInt8(0), sal_uInt8(0) ) );
if ( ++nX == mpFileHeader->nColumns )
{
nX = 0;
@@ -490,7 +465,7 @@ bool PSDReader::ImplReadBody()
m_rPSD.ReadUChar( nRed );
if ( mpFileHeader->nDepth == 16 ) // 16 bit depth is to be skipped
m_rPSD.ReadUChar( nDummy );
- mpWriteAcc->SetPixel( nY, nX, BitmapColor( nRed, sal_uInt8(0), sal_uInt8(0) ) );
+ mpBitmap->SetPixel( nY, nX, Color( nRed, sal_uInt8(0), sal_uInt8(0) ) );
if ( ++nX == mpFileHeader->nColumns )
{
nX = 0;
@@ -519,8 +494,8 @@ bool PSDReader::ImplReadBody()
const sal_uInt16 nCount = -nRunCount + 1;
for (sal_uInt16 i = 0; i < nCount && m_rPSD.good(); ++i)
{
- aBitmapColor = mpReadAcc->GetPixel( nY, nX );
- mpWriteAcc->SetPixel( nY, nX, BitmapColor( aBitmapColor.GetRed(), nGreen, aBitmapColor.GetBlue() ) );
+ aBitmapColor = mpBitmap->GetPixel( nY, nX );
+ mpBitmap->SetPixel( nY, nX, Color( aBitmapColor.GetRed(), nGreen, aBitmapColor.GetBlue() ) );
if ( ++nX == mpFileHeader->nColumns )
{
nX = 0;
@@ -538,8 +513,8 @@ bool PSDReader::ImplReadBody()
m_rPSD.ReadUChar( nGreen );
if ( mpFileHeader->nDepth == 16 ) // 16 bit depth is to be skipped
m_rPSD.ReadUChar( nDummy );
- aBitmapColor = mpReadAcc->GetPixel( nY, nX );
- mpWriteAcc->SetPixel( nY, nX, BitmapColor( aBitmapColor.GetRed(), nGreen, aBitmapColor.GetBlue() ) );
+ aBitmapColor = mpBitmap->GetPixel( nY, nX );
+ mpBitmap->SetPixel( nY, nX, Color( aBitmapColor.GetRed(), nGreen, aBitmapColor.GetBlue() ) );
if ( ++nX == mpFileHeader->nColumns )
{
nX = 0;
@@ -568,8 +543,8 @@ bool PSDReader::ImplReadBody()
const sal_uInt16 nCount = -nRunCount + 1;
for (sal_uInt16 i = 0; i < nCount && m_rPSD.good(); ++i)
{
- aBitmapColor = mpReadAcc->GetPixel( nY, nX );
- mpWriteAcc->SetPixel( nY, nX, BitmapColor( aBitmapColor.GetRed(), aBitmapColor.GetGreen(), nBlue ) );
+ aBitmapColor = mpBitmap->GetPixel( nY, nX );
+ mpBitmap->SetPixel( nY, nX, Color( aBitmapColor.GetRed(), aBitmapColor.GetGreen(), nBlue ) );
if ( ++nX == mpFileHeader->nColumns )
{
nX = 0;
@@ -587,8 +562,8 @@ bool PSDReader::ImplReadBody()
m_rPSD.ReadUChar( nBlue );
if ( mpFileHeader->nDepth == 16 ) // 16 bit depth is to be skipped
m_rPSD.ReadUChar( nDummy );
- aBitmapColor = mpReadAcc->GetPixel( nY, nX );
- mpWriteAcc->SetPixel( nY, nX, BitmapColor( aBitmapColor.GetRed(), aBitmapColor.GetGreen(), nBlue ) );
+ aBitmapColor = mpBitmap->GetPixel( nY, nX );
+ mpBitmap->SetPixel( nY, nX, Color( aBitmapColor.GetRed(), aBitmapColor.GetGreen(), nBlue ) );
if ( ++nX == mpFileHeader->nColumns )
{
nX = 0;
@@ -622,13 +597,13 @@ bool PSDReader::ImplReadBody()
for ( sal_uInt16 i = 0; i < ( -nRunCount + 1 ); i++ )
{
- nBlack = mpReadAcc->GetPixel( nY, nX ).GetRed() + nDat;
+ nBlack = mpBitmap->GetPixel( nY, nX ).GetRed() + nDat;
if ( nBlack > nBlackMax )
nBlackMax = nBlack;
- nBlack = mpReadAcc->GetPixel( nY, nX ).GetGreen() + nDat;
+ nBlack = mpBitmap->GetPixel( nY, nX ).GetGreen() + nDat;
if ( nBlack > nBlackMax )
nBlackMax = nBlack;
- nBlack = mpReadAcc->GetPixel( nY, nX ).GetBlue() + nDat;
+ nBlack = mpBitmap->GetPixel( nY, nX ).GetBlue() + nDat;
if ( nBlack > nBlackMax )
nBlackMax = nBlack;
pBlack[ nX + nY * mpFileHeader->nColumns ] = nDat ^ 0xff;
@@ -649,13 +624,13 @@ bool PSDReader::ImplReadBody()
if ( mpFileHeader->nDepth == 16 ) // 16 bit depth is to be skipped
m_rPSD.ReadUChar( nDummy );
- nBlack = mpReadAcc->GetPixel( nY, nX ).GetRed() + nDat;
+ nBlack = mpBitmap->GetPixel( nY, nX ).GetRed() + nDat;
if ( nBlack > nBlackMax )
nBlackMax = nBlack;
- nBlack = mpReadAcc->GetPixel( nY, nX ).GetGreen() + nDat;
+ nBlack = mpBitmap->GetPixel( nY, nX ).GetGreen() + nDat;
if ( nBlack > nBlackMax )
nBlackMax = nBlack;
- nBlack = mpReadAcc->GetPixel( nY, nX ).GetBlue() + nDat;
+ nBlack = mpBitmap->GetPixel( nY, nX ).GetBlue() + nDat;
if ( nBlack > nBlackMax )
nBlackMax = nBlack;
pBlack[ nX + nY * mpFileHeader->nColumns ] = nDat ^ 0xff;
@@ -672,17 +647,15 @@ bool PSDReader::ImplReadBody()
for ( nY = 0; nY < mpFileHeader->nRows; nY++ )
{
- Scanline pScanline = mpWriteAcc->GetScanline( nY );
- Scanline pScanlineRead = mpReadAcc->GetScanline( nY );
for ( nX = 0; nX < mpFileHeader->nColumns; nX++ )
{
sal_Int32 nDAT = pBlack[ nX + nY * mpFileHeader->nColumns ] * ( nBlackMax - 256 ) / 0x1ff;
- aBitmapColor = mpReadAcc->GetPixelFromData( pScanlineRead, nX );
+ aBitmapColor = mpBitmap->GetPixel( nY, nX );
sal_uInt8 cR = static_cast<sal_uInt8>(MinMax( aBitmapColor.GetRed() - nDAT, 0L, 255L ));
sal_uInt8 cG = static_cast<sal_uInt8>(MinMax( aBitmapColor.GetGreen() - nDAT, 0L, 255L ));
sal_uInt8 cB = static_cast<sal_uInt8>(MinMax( aBitmapColor.GetBlue() - nDAT, 0L, 255L ));
- mpWriteAcc->SetPixelOnData( pScanline, nX, BitmapColor( cR, cG, cB ) );
+ mpBitmap->SetPixel( nY, nX, Color( cR, cG, cB ) );
}
}
}
@@ -715,7 +688,7 @@ bool PSDReader::ImplReadBody()
m_rPSD.ReadUChar( nDummy );
for ( sal_uInt16 i = 0; i < ( -nRunCount + 1 ); i++ )
{
- mpMaskWriteAcc->SetPixelIndex( nY, nX, nDat );
+ mpBitmap->SetPixel( nY, nX, mvPalette[nDat] );
if ( ++nX == mpFileHeader->nColumns )
{
nX = 0;
@@ -736,7 +709,7 @@ bool PSDReader::ImplReadBody()
nDat = 1;
if ( mpFileHeader->nDepth == 16 ) // 16 bit depth is to be skipped
m_rPSD.ReadUChar( nDummy );
- mpMaskWriteAcc->SetPixelIndex( nY, nX, nDat );
+ mpBitmap->SetPixel( nY, nX, mvPalette[nDat] );
if ( ++nX == mpFileHeader->nColumns )
{
nX = 0;
diff --git a/include/vcl/BitmapTools.hxx b/include/vcl/BitmapTools.hxx
index d5c3056e8738..f2cf5512dc6f 100644
--- a/include/vcl/BitmapTools.hxx
+++ b/include/vcl/BitmapTools.hxx
@@ -39,6 +39,11 @@ public:
mpData[ p++ ] = nColor.GetGreen();
mpData[ p ] = nColor.GetBlue();
}
+ Color GetPixel(long nY, long nX) const
+ {
+ long p = (nY * maSize.getWidth() + nX) * 3;
+ return Color( mpData[p], mpData[p+1], mpData[p+2]);
+ }
// so we don't accidentally leave any code in that uses palette color indexes
void SetPixel(long nY, long nX, BitmapColor nColor) = delete;
long Height() { return maSize.Height(); }
More information about the Libreoffice-commits
mailing list