[Libreoffice-commits] core.git: 3 commits - include/vcl vcl/qa vcl/source

Tomaž Vajngerl tomaz.vajngerl at collabora.co.uk
Sun Mar 29 02:27:40 PDT 2015


 include/vcl/bitmap.hxx        |    7 -
 include/vcl/pngread.hxx       |   48 +++++------
 vcl/qa/cppunit/BitmapTest.cxx |   36 ++++++++
 vcl/source/gdi/bitmap.cxx     |   43 ++++------
 vcl/source/gdi/bitmap3.cxx    |  179 +++++++++++++++++++++---------------------
 vcl/source/gdi/pngread.cxx    |   74 ++++++++---------
 6 files changed, 213 insertions(+), 174 deletions(-)

New commits:
commit 85d549adccb0d5942aca34f6836bf5e69bc0c736
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
Date:   Sun Mar 29 18:23:28 2015 +0900

    vcl: add ScopedInfoAccess to Bitmap
    
    Change-Id: I57292ef47ecec98d2faeff9689702e07050dde1b

diff --git a/include/vcl/bitmap.hxx b/include/vcl/bitmap.hxx
index 25842c6..37f9954 100644
--- a/include/vcl/bitmap.hxx
+++ b/include/vcl/bitmap.hxx
@@ -862,10 +862,9 @@ public:
     BitmapWriteAccess*      AcquireWriteAccess();
     void                    ReleaseAccess( BitmapInfoAccess* pAccess );
 
-    typedef vcl::ScopedBitmapAccess< BitmapReadAccess, Bitmap, &Bitmap::AcquireReadAccess >
-        ScopedReadAccess;
-    typedef vcl::ScopedBitmapAccess< BitmapWriteAccess, Bitmap, &Bitmap::AcquireWriteAccess >
-        ScopedWriteAccess;
+    typedef vcl::ScopedBitmapAccess<BitmapReadAccess, Bitmap, &Bitmap::AcquireReadAccess> ScopedReadAccess;
+    typedef vcl::ScopedBitmapAccess<BitmapWriteAccess, Bitmap, &Bitmap::AcquireWriteAccess> ScopedWriteAccess;
+    typedef vcl::ScopedBitmapAccess<BitmapInfoAccess, Bitmap, &Bitmap::AcquireInfoAccess> ScopedInfoAccess;
 
 private:
 
commit 2fb8cf7cdc48aa97eabf14a51c2a141823368de3
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
Date:   Sun Mar 29 17:50:40 2015 +0900

    vcl: cleanup pngreader, use unique_ptr for pImpl
    
    Change-Id: I36fb35338d8635e4bf1ac7c60e0f09da401406db

diff --git a/include/vcl/pngread.hxx b/include/vcl/pngread.hxx
index 8513a1a..3954f5c 100644
--- a/include/vcl/pngread.hxx
+++ b/include/vcl/pngread.hxx
@@ -24,40 +24,38 @@
 #include <vcl/bitmapex.hxx>
 #include <vector>
 
-
-// - PNGReader -
-
-
 namespace vcl
 {
-    class PNGReaderImpl;
 
-    class VCL_DLLPUBLIC PNGReader
-    {
-        PNGReaderImpl*          mpImpl;
+class PNGReaderImpl;
 
-    public:
+class VCL_DLLPUBLIC PNGReader
+{
+    std::unique_ptr<PNGReaderImpl> mpImpl;
 
-        /* the PNG chunks are read within the c'tor, so the stream will
-        be positioned at the end of the PNG */
-        explicit PNGReader( SvStream& rStm );
-        ~PNGReader();
+public:
 
-        /* an empty preview size hint (=default) will read the whole image
-        */
-        BitmapEx                        Read( const Size& i_rPreviewHint = Size() );
+    /* the PNG chunks are read within the c'tor, so the stream will
+    be positioned at the end of the PNG */
+    explicit PNGReader(SvStream& rStream);
+    ~PNGReader();
 
-        // retrieve every chunk that resides inside the PNG
-        struct ChunkData
-        {
-            sal_uInt32                  nType;
-            std::vector< sal_uInt8 >    aData;
-        };
-        const std::vector< ChunkData >& GetChunks() const;
+    /* an empty preview size hint (=default) will read the whole image
+    */
+    BitmapEx Read(const Size& i_rPreviewHint = Size());
 
-        void SetIgnoreGammaChunk( bool b );
+    // retrieve every chunk that resides inside the PNG
+    struct ChunkData
+    {
+        sal_uInt32 nType;
+        std::vector<sal_uInt8> aData;
     };
-}
+    const std::vector<ChunkData>& GetChunks() const;
+
+    void SetIgnoreGammaChunk(bool bIgnoreGammaChunk);
+};
+
+} // end namespace vcl
 
 #endif // INCLUDED_VCL_PNGREAD_HXX
 
diff --git a/vcl/source/gdi/pngread.cxx b/vcl/source/gdi/pngread.cxx
index 38a5bd7..62fc45f 100644
--- a/vcl/source/gdi/pngread.cxx
+++ b/vcl/source/gdi/pngread.cxx
@@ -29,6 +29,9 @@
 #include <vcl/alpha.hxx>
 #include <osl/endian.h>
 
+namespace vcl
+{
+
 #define PNGCHUNK_IHDR       0x49484452
 #define PNGCHUNK_PLTE       0x504c5445
 #define PNGCHUNK_IDAT       0x49444154
@@ -41,8 +44,6 @@
 #define VIEWING_GAMMA       2.35
 #define DISPLAY_GAMMA       1.0
 
-namespace vcl
-{
 
 static const sal_uInt8 mpDefaultColorTable[ 256 ] =
 {   0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
@@ -69,9 +70,9 @@ private:
     SvStream&           mrPNGStream;
     SvStreamEndian      mnOrigStreamMode;
 
-    std::vector< vcl::PNGReader::ChunkData >    maChunkSeq;
-    std::vector< vcl::PNGReader::ChunkData >::iterator maChunkIter;
-    std::vector< sal_uInt8 >::iterator          maDataIter;
+    std::vector<vcl::PNGReader::ChunkData> maChunkSeq;
+    std::vector<vcl::PNGReader::ChunkData>::iterator maChunkIter;
+    std::vector<sal_uInt8>::iterator maDataIter;
 
     Bitmap*             mpBmp;
     BitmapWriteAccess*  mpAcc;
@@ -79,11 +80,11 @@ private:
     AlphaMask*          mpAlphaMask;
     BitmapWriteAccess*  mpMaskAcc;
     ZCodec              mpZCodec;
-    sal_uInt8*              mpInflateInBuf; // as big as the size of a scanline + alphachannel + 1
-    sal_uInt8*              mpScanPrior;    // pointer to the latest scanline
-    sal_uInt8*              mpTransTab;     // for transparency in images with palette colortype
-    sal_uInt8*              mpScanCurrent;  // pointer into the current scanline
-    sal_uInt8*              mpColorTable;
+    sal_uInt8*          mpInflateInBuf; // as big as the size of a scanline + alphachannel + 1
+    sal_uInt8*          mpScanPrior;    // pointer to the latest scanline
+    sal_uInt8*          mpTransTab;     // for transparency in images with palette colortype
+    sal_uInt8*          mpScanCurrent;  // pointer into the current scanline
+    sal_uInt8*          mpColorTable;
     sal_Size            mnStreamSize;   // estimate of PNG file size
     sal_uInt32          mnChunkType;    // Type of current PNG chunk
     sal_Int32           mnChunkLen;     // Length of current PNG chunk
@@ -99,28 +100,28 @@ private:
     sal_uInt32          mnYAdd;         // the increment for input images Y coords for the current pass
     int                 mnPreviewShift; // shift to convert orig image coords into preview image coords
     int                 mnPreviewMask;  // == ((1 << mnPreviewShift) - 1)
-    sal_uInt16              mnTargetDepth;      // pixel depth of target bitmap
-    sal_uInt8               mnTransRed;
-    sal_uInt8               mnTransGreen;
-    sal_uInt8               mnTransBlue;
-    sal_uInt8               mnPngDepth;     // pixel depth of PNG data
-    sal_uInt8               mnColorType;
-    sal_uInt8               mnCompressionType;
-    sal_uInt8               mnFilterType;
-    sal_uInt8               mnInterlaceType;
+    sal_uInt16          mnTargetDepth;      // pixel depth of target bitmap
+    sal_uInt8           mnTransRed;
+    sal_uInt8           mnTransGreen;
+    sal_uInt8           mnTransBlue;
+    sal_uInt8           mnPngDepth;     // pixel depth of PNG data
+    sal_uInt8           mnColorType;
+    sal_uInt8           mnCompressionType;
+    sal_uInt8           mnFilterType;
+    sal_uInt8           mnInterlaceType;
     BitmapColor         mcTranspColor;  // transparency mask's transparency "color"
     BitmapColor         mcOpaqueColor;  // transparency mask's opaque "color"
-    bool                mbTransparent;  // graphic includes an tRNS Chunk or an alpha Channel
-    bool                mbAlphaChannel; // is true for ColorType 4 and 6
-    bool                mbRGBTriple;
-    bool                mbPalette;      // false if we need a Palette
-    bool                mbGrayScale;
-    bool                mbzCodecInUse;
-    bool                mbStatus;
-    bool                mbIDAT;         // true if finished with enough IDAT chunks
-    bool                mbGamma;        // true if Gamma Correction available
-    bool                mbpHYs;         // true if pysical size of pixel available
-    bool                mbIgnoreGammaChunk;
+    bool                mbTransparent : 1;  // graphic includes an tRNS Chunk or an alpha Channel
+    bool                mbAlphaChannel : 1; // is true for ColorType 4 and 6
+    bool                mbRGBTriple : 1;
+    bool                mbPalette : 1;      // false if we need a Palette
+    bool                mbGrayScale : 1;
+    bool                mbzCodecInUse : 1;
+    bool                mbStatus : 1;
+    bool                mbIDAT : 1;         // true if finished with enough IDAT chunks
+    bool                mbGamma : 1;        // true if Gamma Correction available
+    bool                mbpHYs : 1;         // true if pysical size of pixel available
+    bool                mbIgnoreGammaChunk : 1;
 
 #if OSL_DEBUG_LEVEL > 0
     // do some checks in debug mode
@@ -146,7 +147,7 @@ private:
     bool                ImplReadTransparent();
     void                ImplGetGamma();
     void                ImplGetBackground();
-    sal_uInt8               ImplScaleColor();
+    sal_uInt8           ImplScaleColor();
     bool                ImplReadHeader( const Size& rPreviewSizeHint );
     bool                ImplReadPalette();
     void                ImplGetGrayPalette( sal_uInt16 );
@@ -158,7 +159,7 @@ public:
                         ~PNGReaderImpl();
 
     BitmapEx            GetBitmapEx( const Size& rPreviewSizeHint );
-    const std::vector< PNGReader::ChunkData >& GetAllChunks();
+    const std::vector<vcl::PNGReader::ChunkData>& GetAllChunks();
     void                SetIgnoreGammaChunk( bool bIgnore ){ mbIgnoreGammaChunk = bIgnore; };
 };
 
@@ -1639,14 +1640,13 @@ sal_uInt32 PNGReaderImpl::ImplReadsal_uInt32()
     return nRet;
 }
 
-PNGReader::PNGReader( SvStream& rIStm ) :
-    mpImpl( new ::vcl::PNGReaderImpl( rIStm ) )
+PNGReader::PNGReader(SvStream& rIStream) :
+    mpImpl(new ::vcl::PNGReaderImpl(rIStream))
 {
 }
 
 PNGReader::~PNGReader()
 {
-    delete mpImpl;
 }
 
 BitmapEx PNGReader::Read( const Size& i_rPreviewSizeHint )
@@ -1659,9 +1659,9 @@ const std::vector< vcl::PNGReader::ChunkData >& PNGReader::GetChunks() const
     return mpImpl->GetAllChunks();
 }
 
-void PNGReader::SetIgnoreGammaChunk( bool b )
+void PNGReader::SetIgnoreGammaChunk(bool bIgnoreGammaChunk)
 {
-    mpImpl->SetIgnoreGammaChunk( b );
+    mpImpl->SetIgnoreGammaChunk(bIgnoreGammaChunk);
 }
 
 } // namespace vcl
commit 024bc58aefdce2becb170939eac68e18cce2977c
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
Date:   Sun Mar 29 14:35:11 2015 +0900

    vcl: test for bitmap convert, use scoped read/write access
    
    Change-Id: I702d3e1ced356efce28ebfec141776f07645b2f9

diff --git a/vcl/qa/cppunit/BitmapTest.cxx b/vcl/qa/cppunit/BitmapTest.cxx
index cc8534f..dc2070d 100644
--- a/vcl/qa/cppunit/BitmapTest.cxx
+++ b/vcl/qa/cppunit/BitmapTest.cxx
@@ -25,13 +25,49 @@ namespace
 
 class BitmapTest : public CppUnit::TestFixture
 {
+    void testConvert();
     void testScale();
 
     CPPUNIT_TEST_SUITE(BitmapTest);
+    CPPUNIT_TEST(testConvert);
     CPPUNIT_TEST(testScale);
     CPPUNIT_TEST_SUITE_END();
 };
 
+void BitmapTest::testConvert()
+{
+    Bitmap aBitmap(Size(10, 10), 8);
+
+    aBitmap.Erase(COL_LIGHTGRAYBLUE);
+
+    CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt16>(8), aBitmap.GetBitCount());
+    {
+        Bitmap::ScopedReadAccess pReadAccess(aBitmap);
+        CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt16>(8), pReadAccess->GetBitCount());
+        CPPUNIT_ASSERT_EQUAL(static_cast<sal_uLong>(10), pReadAccess->GetScanlineSize());
+        CPPUNIT_ASSERT(pReadAccess->HasPalette());
+        const BitmapColor& rColor = pReadAccess->GetPaletteColor(pReadAccess->GetPixelIndex(1, 1));
+        CPPUNIT_ASSERT_EQUAL(sal_Int32(204), sal_Int32(rColor.GetRed()));
+        CPPUNIT_ASSERT_EQUAL(sal_Int32(204), sal_Int32(rColor.GetGreen()));
+        CPPUNIT_ASSERT_EQUAL(sal_Int32(255), sal_Int32(rColor.GetBlue()));
+    }
+
+    aBitmap.Convert(BMP_CONVERSION_24BIT);
+
+    CPPUNIT_ASSERT_EQUAL(sal_uInt16(24), aBitmap.GetBitCount());
+    {
+        Bitmap::ScopedReadAccess pReadAccess(aBitmap);
+        // 24 bit Bitmap on SVP backend uses 32bit BGRX format
+        CPPUNIT_ASSERT_EQUAL(static_cast<sal_uInt16>(32), pReadAccess->GetBitCount());
+        CPPUNIT_ASSERT_EQUAL(sal_uLong(40), pReadAccess->GetScanlineSize());
+        CPPUNIT_ASSERT(!pReadAccess->HasPalette());
+        Color aColor = pReadAccess->GetPixel(0, 0);
+        CPPUNIT_ASSERT_EQUAL(sal_Int32(204), sal_Int32(aColor.GetRed()));
+        CPPUNIT_ASSERT_EQUAL(sal_Int32(204), sal_Int32(aColor.GetGreen()));
+        CPPUNIT_ASSERT_EQUAL(sal_Int32(255), sal_Int32(aColor.GetBlue()));
+    }
+}
+
 void BitmapTest::testScale()
 {
     bool bExportBitmap(false);
diff --git a/vcl/source/gdi/bitmap.cxx b/vcl/source/gdi/bitmap.cxx
index 2315ab1..71ae7a3 100644
--- a/vcl/source/gdi/bitmap.cxx
+++ b/vcl/source/gdi/bitmap.cxx
@@ -443,52 +443,52 @@ void Bitmap::ReleaseAccess( BitmapInfoAccess* pBitmapAccess )
     delete pBitmapAccess;
 }
 
-bool Bitmap::Erase( const Color& rFillColor )
+bool Bitmap::Erase(const Color& rFillColor)
 {
-    if( !(*this) )
+    if (IsEmpty())
         return true;
 
-    BitmapWriteAccess*  pWriteAcc = AcquireWriteAccess();
-    bool                bRet = false;
+    Bitmap::ScopedWriteAccess  pWriteAcc(*this);
+    bool bRet = false;
 
-    if( pWriteAcc )
+    if (pWriteAcc)
     {
         const sal_uLong nFormat = pWriteAcc->GetScanlineFormat();
-        sal_uInt8       cIndex = 0;
-        bool            bFast = false;
+        sal_uInt8 cIndex = 0;
+        bool bFast = false;
 
-        switch( nFormat )
+        switch (nFormat)
         {
-            case( BMP_FORMAT_1BIT_MSB_PAL ):
-            case( BMP_FORMAT_1BIT_LSB_PAL ):
+            case BMP_FORMAT_1BIT_MSB_PAL:
+            case BMP_FORMAT_1BIT_LSB_PAL:
             {
-                cIndex = (sal_uInt8) pWriteAcc->GetBestPaletteIndex( rFillColor );
-                cIndex = ( cIndex ? 255 : 0 );
+                cIndex = static_cast<sal_uInt8>(pWriteAcc->GetBestPaletteIndex(rFillColor));
+                cIndex = (cIndex ? 255 : 0);
                 bFast = true;
             }
             break;
 
-            case( BMP_FORMAT_4BIT_MSN_PAL ):
-            case( BMP_FORMAT_4BIT_LSN_PAL ):
+            case BMP_FORMAT_4BIT_MSN_PAL:
+            case BMP_FORMAT_4BIT_LSN_PAL:
             {
-                cIndex = (sal_uInt8) pWriteAcc->GetBestPaletteIndex( rFillColor );
+                cIndex = static_cast<sal_uInt8>(pWriteAcc->GetBestPaletteIndex(rFillColor));
                 cIndex = cIndex | ( cIndex << 4 );
                 bFast = true;
             }
             break;
 
-            case( BMP_FORMAT_8BIT_PAL ):
+            case BMP_FORMAT_8BIT_PAL:
             {
-                cIndex = (sal_uInt8) pWriteAcc->GetBestPaletteIndex( rFillColor );
+                cIndex = static_cast<sal_uInt8>(pWriteAcc->GetBestPaletteIndex(rFillColor));
                 bFast = true;
             }
             break;
 
-            case( BMP_FORMAT_24BIT_TC_BGR ):
-            case( BMP_FORMAT_24BIT_TC_RGB ):
+            case BMP_FORMAT_24BIT_TC_BGR:
+            case BMP_FORMAT_24BIT_TC_RGB:
             {
-                if( ( rFillColor.GetRed() == rFillColor.GetGreen() ) &&
-                    ( rFillColor.GetRed() == rFillColor.GetBlue() ) )
+                if (rFillColor.GetRed() == rFillColor.GetGreen() &&
+                    rFillColor.GetRed() == rFillColor.GetBlue())
                 {
                     cIndex = rFillColor.GetRed();
                     bFast = true;
@@ -516,7 +516,6 @@ bool Bitmap::Erase( const Color& rFillColor )
             pWriteAcc->FillRect( aRect );
         }
 
-        ReleaseAccess( pWriteAcc );
         bRet = true;
     }
 
diff --git a/vcl/source/gdi/bitmap3.cxx b/vcl/source/gdi/bitmap3.cxx
index d8e18af..5bf275d 100644
--- a/vcl/source/gdi/bitmap3.cxx
+++ b/vcl/source/gdi/bitmap3.cxx
@@ -588,69 +588,77 @@ bool Bitmap::ImplMakeGreyscales( sal_uInt16 nGreys )
     return bRet;
 }
 
-bool Bitmap::ImplConvertUp( sal_uInt16 nBitCount, Color* pExtColor )
+bool Bitmap::ImplConvertUp(sal_uInt16 nBitCount, Color* pExtColor)
 {
     DBG_ASSERT( nBitCount > GetBitCount(), "New BitCount must be greater!" );
 
-    BitmapReadAccess* pReadAcc = AcquireReadAccess();
+    Bitmap::ScopedReadAccess pReadAcc(*this);
     bool bRet = false;
 
-    if( pReadAcc )
+    if (pReadAcc)
     {
-        BitmapPalette aPal;
-        Bitmap aNewBmp( GetSizePixel(), nBitCount, pReadAcc->HasPalette() ? &pReadAcc->GetPalette() : &aPal );
-        BitmapWriteAccess* pWriteAcc = aNewBmp.AcquireWriteAccess();
+        BitmapPalette aPalette;
+        Bitmap aNewBmp(GetSizePixel(), nBitCount, pReadAcc->HasPalette() ? &pReadAcc->GetPalette() : &aPalette);
+        Bitmap::ScopedWriteAccess pWriteAcc(aNewBmp);
 
-        if( pWriteAcc )
+        if (pWriteAcc)
         {
             const long nWidth = pWriteAcc->Width();
             const long nHeight = pWriteAcc->Height();
 
-            if( pWriteAcc->HasPalette() )
+            if (pWriteAcc->HasPalette())
             {
                 const sal_uInt16 nOldCount = 1 << GetBitCount();
-                const BitmapPalette& rOldPal = pReadAcc->GetPalette();
+                const BitmapPalette& rOldPalette = pReadAcc->GetPalette();
 
-                aPal.SetEntryCount( 1 << nBitCount );
+                aPalette.SetEntryCount(1 << nBitCount);
 
-                for( sal_uInt16 i = 0; i < nOldCount; i++ )
-                    aPal[ i ] = rOldPal[ i ];
+                for (sal_uInt16 i = 0; i < nOldCount; i++)
+                    aPalette[i] = rOldPalette[i];
 
-                if( pExtColor )
-                    aPal[ aPal.GetEntryCount() - 1 ] = *pExtColor;
+                if (pExtColor)
+                    aPalette[aPalette.GetEntryCount() - 1] = *pExtColor;
 
-                pWriteAcc->SetPalette( aPal );
+                pWriteAcc->SetPalette(aPalette);
 
-                for( long nY = 0L; nY < nHeight; nY++ )
-                    for( long nX = 0L; nX < nWidth; nX++ )
-                        pWriteAcc->SetPixel( nY, nX, pReadAcc->GetPixel( nY, nX ) );
+                for (long nY = 0L; nY < nHeight; nY++)
+                {
+                    for (long nX = 0L; nX < nWidth; nX++)
+                    {
+                        pWriteAcc->SetPixel(nY, nX, pReadAcc->GetPixel(nY, nX));
+                    }
+                }
             }
             else
             {
-                if( pReadAcc->HasPalette() )
+                if (pReadAcc->HasPalette())
                 {
-                    for( long nY = 0L; nY < nHeight; nY++ )
-                        for( long nX = 0L; nX < nWidth; nX++ )
-                            pWriteAcc->SetPixel( nY, nX, pReadAcc->GetPaletteColor( pReadAcc->GetPixelIndex( nY, nX ) ) );
+                    for (long nY = 0L; nY < nHeight; nY++)
+                    {
+                        for (long nX = 0L; nX < nWidth; nX++)
+                        {
+                            pWriteAcc->SetPixel(nY, nX, pReadAcc->GetPaletteColor(pReadAcc->GetPixelIndex(nY, nX)));
+                        }
+                    }
                 }
                 else
                 {
-                    for( long nY = 0L; nY < nHeight; nY++ )
-                        for( long nX = 0L; nX < nWidth; nX++ )
-                            pWriteAcc->SetPixel( nY, nX, pReadAcc->GetPixel( nY, nX ) );
+                    for (long nY = 0L; nY < nHeight; nY++)
+                    {
+                        for (long nX = 0L; nX < nWidth; nX++)
+                        {
+                            pWriteAcc->SetPixel(nY, nX, pReadAcc->GetPixel(nY, nX));
+                        }
+                    }
                 }
             }
-
-            aNewBmp.ReleaseAccess( pWriteAcc );
             bRet = true;
         }
 
-        ReleaseAccess( pReadAcc );
-
-        if( bRet )
+        if (bRet)
         {
-            const MapMode aMap( maPrefMapMode );
-            const Size aSize( maPrefSize );
+            const MapMode aMap(maPrefMapMode);
+            const Size aSize(maPrefSize);
 
             *this = aNewBmp;
 
@@ -662,116 +670,115 @@ bool Bitmap::ImplConvertUp( sal_uInt16 nBitCount, Color* pExtColor )
     return bRet;
 }
 
-bool Bitmap::ImplConvertDown( sal_uInt16 nBitCount, Color* pExtColor )
+bool Bitmap::ImplConvertDown(sal_uInt16 nBitCount, Color* pExtColor)
 {
-    DBG_ASSERT( nBitCount <= GetBitCount(), "New BitCount must be lower ( or equal when pExtColor is set )!" );
+    DBG_ASSERT(nBitCount <= GetBitCount(), "New BitCount must be lower ( or equal when pExtColor is set )!");
 
-    BitmapReadAccess* pReadAcc = AcquireReadAccess();
+    Bitmap::ScopedReadAccess pReadAcc(*this);
     bool bRet = false;
 
-    if( pReadAcc )
+    if (pReadAcc)
     {
-        BitmapPalette aPal;
-        Bitmap aNewBmp( GetSizePixel(), nBitCount, &aPal );
-        BitmapWriteAccess* pWriteAcc = aNewBmp.AcquireWriteAccess();
+        BitmapPalette aPalette;
+        Bitmap aNewBmp(GetSizePixel(), nBitCount, &aPalette);
+        Bitmap::ScopedWriteAccess pWriteAcc(aNewBmp);
 
-        if( pWriteAcc )
+        if (pWriteAcc)
         {
             const sal_uInt16 nCount = 1 << nBitCount;
             const long nWidth = pWriteAcc->Width();
             const long nWidth1 = nWidth - 1L;
             const long nHeight = pWriteAcc->Height();
-            Octree aOctree( *pReadAcc, pExtColor ? ( nCount - 1 ) : nCount );
-            InverseColorMap aColorMap( aPal = aOctree.GetPalette() );
+            Octree aOctree(*pReadAcc, pExtColor ? (nCount - 1) : nCount);
+            aPalette = aOctree.GetPalette();
+            InverseColorMap aColorMap(aPalette);
             BitmapColor aColor;
             ImpErrorQuad aErrQuad;
-            boost::scoped_array<ImpErrorQuad> pErrQuad1(new ImpErrorQuad[ nWidth ]);
-            boost::scoped_array<ImpErrorQuad> pErrQuad2(new ImpErrorQuad[ nWidth ]);
-            ImpErrorQuad* pQLine1 = pErrQuad1.get();
-            ImpErrorQuad* pQLine2 = 0;
+            std::vector<ImpErrorQuad> pErrQuad1(nWidth);
+            std::vector<ImpErrorQuad> pErrQuad2(nWidth);
+            ImpErrorQuad* pQLine1 = pErrQuad1.data();
+            ImpErrorQuad* pQLine2 = NULL;
             long nYTmp = 0L;
             sal_uInt8 cIndex;
             bool bQ1 = true;
 
-            if( pExtColor )
+            if (pExtColor)
             {
-                aPal.SetEntryCount( aPal.GetEntryCount() + 1 );
-                aPal[ aPal.GetEntryCount() - 1 ] = *pExtColor;
+                aPalette.SetEntryCount(aPalette.GetEntryCount() + 1);
+                aPalette[aPalette.GetEntryCount() - 1] = *pExtColor;
             }
 
             // set Black/White always, if we have enough space
-            if( aPal.GetEntryCount() < ( nCount - 1 ) )
+            if (aPalette.GetEntryCount() < (nCount - 1))
             {
-                aPal.SetEntryCount( aPal.GetEntryCount() + 2 );
-                aPal[ aPal.GetEntryCount() - 2 ] = Color( COL_BLACK );
-                aPal[ aPal.GetEntryCount() - 1 ] = Color( COL_WHITE );
+                aPalette.SetEntryCount(aPalette.GetEntryCount() + 2);
+                aPalette[aPalette.GetEntryCount() - 2] = Color(COL_BLACK);
+                aPalette[aPalette.GetEntryCount() - 1] = Color(COL_WHITE);
             }
 
-            pWriteAcc->SetPalette( aPal );
+            pWriteAcc->SetPalette(aPalette);
 
-            for( long nY = 0L; nY < std::min( nHeight, 2L ); nY++, nYTmp++ )
+            for (long nY = 0L; nY < std::min(nHeight, 2L); nY++, nYTmp++)
             {
-                pQLine2 = !nY ? pErrQuad1.get() : pErrQuad2.get();
-                for( long nX = 0L; nX < nWidth; nX++ )
+                pQLine2 = !nY ? pErrQuad1.data() : pErrQuad2.data();
+                for (long nX = 0L; nX < nWidth; nX++)
                 {
-                    if( pReadAcc->HasPalette() )
-                        pQLine2[ nX ] = pReadAcc->GetPaletteColor( pReadAcc->GetPixelIndex( nYTmp, nX ) );
+                    if (pReadAcc->HasPalette())
+                        pQLine2[nX] = pReadAcc->GetPaletteColor(pReadAcc->GetPixelIndex(nYTmp, nX));
                     else
-                        pQLine2[ nX ] = pReadAcc->GetPixel( nYTmp, nX );
+                        pQLine2[nX] = pReadAcc->GetPixel(nYTmp, nX);
                 }
             }
 
-            for( long nY = 0L; nY < nHeight; nY++, nYTmp++ )
+            for (long nY = 0L; nY < nHeight; nY++, nYTmp++)
             {
                 // first pixel in the line
-                cIndex = (sal_uInt8) aColorMap.GetBestPaletteIndex( pQLine1[ 0 ].ImplGetColor() );
-                pWriteAcc->SetPixelIndex( nY, 0, cIndex );
+                cIndex = (sal_uInt8) aColorMap.GetBestPaletteIndex(pQLine1[0].ImplGetColor());
+                pWriteAcc->SetPixelIndex(nY, 0, cIndex);
 
                 long nX;
-                for( nX = 1L; nX < nWidth1; nX++ )
+                for (nX = 1L; nX < nWidth1; nX++)
                 {
-                    cIndex = (sal_uInt8) aColorMap.GetBestPaletteIndex( aColor = pQLine1[ nX ].ImplGetColor() );
-                    aErrQuad = ( ImpErrorQuad( aColor ) -= pWriteAcc->GetPaletteColor( cIndex ) );
-                    pQLine1[ ++nX ].ImplAddColorError7( aErrQuad );
-                    pQLine2[ nX-- ].ImplAddColorError1( aErrQuad );
-                    pQLine2[ nX-- ].ImplAddColorError5( aErrQuad );
-                    pQLine2[ nX++ ].ImplAddColorError3( aErrQuad );
-                    pWriteAcc->SetPixelIndex( nY, nX, cIndex );
+                    aColor = pQLine1[nX].ImplGetColor();
+                    cIndex = static_cast<sal_uInt8>(aColorMap.GetBestPaletteIndex(aColor));
+                    aErrQuad = (ImpErrorQuad(aColor) -= pWriteAcc->GetPaletteColor(cIndex));
+                    pQLine1[++nX].ImplAddColorError7(aErrQuad);
+                    pQLine2[nX--].ImplAddColorError1(aErrQuad);
+                    pQLine2[nX--].ImplAddColorError5(aErrQuad);
+                    pQLine2[nX++].ImplAddColorError3(aErrQuad);
+                    pWriteAcc->SetPixelIndex(nY, nX, cIndex);
                 }
 
                 // Last RowPixel
-                if( nX < nWidth )
+                if (nX < nWidth)
                 {
-                    cIndex = (sal_uInt8) aColorMap.GetBestPaletteIndex( pQLine1[ nWidth1 ].ImplGetColor() );
-                    pWriteAcc->SetPixelIndex( nY, nX, cIndex );
+                    cIndex = static_cast<sal_uInt8>(aColorMap.GetBestPaletteIndex(pQLine1[nWidth1].ImplGetColor()));
+                    pWriteAcc->SetPixelIndex(nY, nX, cIndex);
                 }
 
                 // Refill/copy row buffer
                 pQLine1 = pQLine2;
-                pQLine2 = ( bQ1 = !bQ1 ) ? pErrQuad2.get() : pErrQuad1.get();
+                pQLine2 = (bQ1 = !bQ1) ? pErrQuad2.data() : pErrQuad1.data();
 
-                if( nYTmp < nHeight )
+                if (nYTmp < nHeight)
                 {
-                    for( nX = 0L; nX < nWidth; nX++ )
+                    for (nX = 0L; nX < nWidth; nX++)
                     {
-                        if( pReadAcc->HasPalette() )
-                            pQLine2[ nX ] = pReadAcc->GetPaletteColor( pReadAcc->GetPixelIndex( nYTmp, nX ) );
+                        if (pReadAcc->HasPalette())
+                            pQLine2[nX] = pReadAcc->GetPaletteColor(pReadAcc->GetPixelIndex(nYTmp, nX));
                         else
-                            pQLine2[ nX ] = pReadAcc->GetPixel( nYTmp, nX );
+                            pQLine2[nX] = pReadAcc->GetPixel(nYTmp, nX);
                     }
                 }
             }
 
-            aNewBmp.ReleaseAccess( pWriteAcc );
             bRet = true;
         }
 
-        ReleaseAccess( pReadAcc );
-
-        if( bRet )
+        if(bRet)
         {
-            const MapMode aMap( maPrefMapMode );
-            const Size aSize( maPrefSize );
+            const MapMode aMap(maPrefMapMode);
+            const Size aSize(maPrefSize);
 
             *this = aNewBmp;
 


More information about the Libreoffice-commits mailing list