summaryrefslogtreecommitdiff
path: root/vcl/source
diff options
context:
space:
mode:
authorLouis-Francis Ratté-Boulianne <lfrb@collabora.com>2014-12-03 17:02:37 -0500
committerMarkus Mohrhard <markus.mohrhard@googlemail.com>2014-12-15 22:47:05 +0100
commit313e89f9fbb1aa0da148d4d75be649327d67d8f7 (patch)
treef73303acb395df982ac2fc6d42aad04949a502a1 /vcl/source
parente2b093f66e2613ad1a85c662159f57df4bc96a67 (diff)
vcl: Add BitmapInfoAccess for bitmaps' metadata access
Change-Id: Iec9f8c7d8f7cded0aef9e017373e44387dc0b05c
Diffstat (limited to 'vcl/source')
-rw-r--r--vcl/source/gdi/bitmap.cxx23
-rw-r--r--vcl/source/gdi/bmpacc.cxx138
-rw-r--r--vcl/source/gdi/impbmp.cxx10
3 files changed, 105 insertions, 66 deletions
diff --git a/vcl/source/gdi/bitmap.cxx b/vcl/source/gdi/bitmap.cxx
index 9b24f4c881a9..486fb86380e5 100644
--- a/vcl/source/gdi/bitmap.cxx
+++ b/vcl/source/gdi/bitmap.cxx
@@ -275,12 +275,12 @@ bool Bitmap::HasGreyPalette() const
const sal_uInt16 nBitCount = GetBitCount();
bool bRet = nBitCount == 1;
- BitmapReadAccess* pRAcc = ( (Bitmap*) this )->AcquireReadAccess();
+ BitmapInfoAccess* pIAcc = ( (Bitmap*) this )->AcquireInfoAccess();
- if( pRAcc )
+ if( pIAcc )
{
- bRet = pRAcc->HasPalette() && pRAcc->GetPalette().IsGreyPalette();
- ( (Bitmap*) this )->ReleaseAccess( pRAcc );
+ bRet = pIAcc->HasPalette() && pIAcc->GetPalette().IsGreyPalette();
+ ( (Bitmap*) this )->ReleaseAccess( pIAcc );
}
return bRet;
@@ -399,6 +399,19 @@ void Bitmap::ImplSetImpBitmap( ImpBitmap* pImpBmp )
}
}
+BitmapInfoAccess* Bitmap::AcquireInfoAccess()
+{
+ BitmapInfoAccess* pInfoAccess = new BitmapInfoAccess( *this );
+
+ if( !*pInfoAccess )
+ {
+ delete pInfoAccess;
+ pInfoAccess = NULL;
+ }
+
+ return pInfoAccess;
+}
+
BitmapReadAccess* Bitmap::AcquireReadAccess()
{
BitmapReadAccess* pReadAccess = new BitmapReadAccess( *this );
@@ -425,7 +438,7 @@ BitmapWriteAccess* Bitmap::AcquireWriteAccess()
return pWriteAccess;
}
-void Bitmap::ReleaseAccess( BitmapReadAccess* pBitmapAccess )
+void Bitmap::ReleaseAccess( BitmapInfoAccess* pBitmapAccess )
{
delete pBitmapAccess;
}
diff --git a/vcl/source/gdi/bmpacc.cxx b/vcl/source/gdi/bmpacc.cxx
index 0b6a48b2406e..9e4994c5dda4 100644
--- a/vcl/source/gdi/bmpacc.cxx
+++ b/vcl/source/gdi/bmpacc.cxx
@@ -27,32 +27,26 @@
#include <string.h>
-BitmapReadAccess::BitmapReadAccess( Bitmap& rBitmap, bool bModify ) :
+BitmapInfoAccess::BitmapInfoAccess( Bitmap& rBitmap, BitmapAccessMode nMode ) :
mpBuffer ( NULL ),
- mpScanBuf ( NULL ),
- mFncGetPixel ( NULL ),
- mFncSetPixel ( NULL ),
- mbModify ( bModify )
+ mnAccessMode ( nMode )
{
ImplCreate( rBitmap );
}
-BitmapReadAccess::BitmapReadAccess( Bitmap& rBitmap ) :
+BitmapInfoAccess::BitmapInfoAccess( Bitmap& rBitmap ) :
mpBuffer ( NULL ),
- mpScanBuf ( NULL ),
- mFncGetPixel ( NULL ),
- mFncSetPixel ( NULL ),
- mbModify ( false )
+ mnAccessMode ( BITMAP_INFO_ACCESS )
{
ImplCreate( rBitmap );
}
-BitmapReadAccess::~BitmapReadAccess()
+BitmapInfoAccess::~BitmapInfoAccess()
{
ImplDestroy();
}
-void BitmapReadAccess::ImplCreate( Bitmap& rBitmap )
+void BitmapInfoAccess::ImplCreate( Bitmap& rBitmap )
{
ImpBitmap* pImpBmp = rBitmap.ImplGetImpBitmap();
@@ -60,18 +54,19 @@ void BitmapReadAccess::ImplCreate( Bitmap& rBitmap )
if( pImpBmp )
{
- if( mbModify && !maBitmap.ImplGetImpBitmap() )
+ if( mnAccessMode == BITMAP_WRITE_ACCESS && !maBitmap.ImplGetImpBitmap() )
{
rBitmap.ImplMakeUnique();
pImpBmp = rBitmap.ImplGetImpBitmap();
}
else
{
- DBG_ASSERT( !mbModify || pImpBmp->ImplGetRefCount() == 2,
+ DBG_ASSERT( mnAccessMode != BITMAP_WRITE_ACCESS ||
+ pImpBmp->ImplGetRefCount() == 2,
"Unpredictable results: bitmap is referenced more than once!" );
}
- mpBuffer = pImpBmp->ImplAcquireBuffer( !mbModify );
+ mpBuffer = pImpBmp->ImplAcquireBuffer( mnAccessMode );
if( !mpBuffer )
{
@@ -81,59 +76,95 @@ void BitmapReadAccess::ImplCreate( Bitmap& rBitmap )
{
pImpBmp = pNewImpBmp;
rBitmap.ImplSetImpBitmap( pImpBmp );
- mpBuffer = pImpBmp->ImplAcquireBuffer( !mbModify );
+ mpBuffer = pImpBmp->ImplAcquireBuffer( mnAccessMode );
}
else
delete pNewImpBmp;
}
- if( mpBuffer )
- {
- const long nHeight = mpBuffer->mnHeight;
- Scanline pTmpLine = mpBuffer->mpBits;
+ maBitmap = rBitmap;
+ }
+}
- mpScanBuf = new Scanline[ nHeight ];
- maColorMask = mpBuffer->maColorMask;
+void BitmapInfoAccess::ImplDestroy()
+{
+ ImpBitmap* pImpBmp = maBitmap.ImplGetImpBitmap();
- if( BMP_SCANLINE_ADJUSTMENT( mpBuffer->mnFormat ) == BMP_FORMAT_TOP_DOWN )
- {
- for( long nY = 0L; nY < nHeight; nY++, pTmpLine += mpBuffer->mnScanlineSize )
- mpScanBuf[ nY ] = pTmpLine;
- }
- else
- {
- for( long nY = nHeight - 1; nY >= 0; nY--, pTmpLine += mpBuffer->mnScanlineSize )
- mpScanBuf[ nY ] = pTmpLine;
- }
+ if( mpBuffer && pImpBmp )
+ {
+ pImpBmp->ImplReleaseBuffer( mpBuffer, mnAccessMode );
+ mpBuffer = NULL;
+ }
+}
- if( !ImplSetAccessPointers( BMP_SCANLINE_FORMAT( mpBuffer->mnFormat ) ) )
- {
- delete[] mpScanBuf;
- mpScanBuf = NULL;
+sal_uInt16 BitmapInfoAccess::GetBestPaletteIndex( const BitmapColor& rBitmapColor ) const
+{
+ return( HasPalette() ? mpBuffer->maPalette.GetBestIndex( rBitmapColor ) : 0 );
+}
- pImpBmp->ImplReleaseBuffer( mpBuffer, !mbModify );
- mpBuffer = NULL;
- }
- else
- maBitmap = rBitmap;
- }
- }
+BitmapReadAccess::BitmapReadAccess( Bitmap& rBitmap, BitmapAccessMode nMode ) :
+ BitmapInfoAccess( rBitmap, nMode ),
+ mpScanBuf ( NULL ),
+ mFncGetPixel ( NULL ),
+ mFncSetPixel ( NULL )
+{
+ ImplInitScanBuffer( rBitmap );
}
-void BitmapReadAccess::ImplDestroy()
+BitmapReadAccess::BitmapReadAccess( Bitmap& rBitmap ) :
+ BitmapInfoAccess( rBitmap, BITMAP_READ_ACCESS ),
+ mpScanBuf ( NULL ),
+ mFncGetPixel ( NULL ),
+ mFncSetPixel ( NULL )
{
- ImpBitmap* pImpBmp = maBitmap.ImplGetImpBitmap();
+ ImplInitScanBuffer( rBitmap );
+}
- delete[] mpScanBuf;
- mpScanBuf = NULL;
+BitmapReadAccess::~BitmapReadAccess()
+{
+ ImplClearScanBuffer();
+}
- if( mpBuffer && pImpBmp )
+void BitmapReadAccess::ImplInitScanBuffer( Bitmap& rBitmap )
+{
+ ImpBitmap* pImpBmp = rBitmap.ImplGetImpBitmap();
+
+ if( pImpBmp && mpBuffer )
{
- pImpBmp->ImplReleaseBuffer( mpBuffer, !mbModify );
- mpBuffer = NULL;
+ const long nHeight = mpBuffer->mnHeight;
+ Scanline pTmpLine = mpBuffer->mpBits;
+
+ mpScanBuf = new Scanline[ nHeight ];
+ maColorMask = mpBuffer->maColorMask;
+
+ if( BMP_SCANLINE_ADJUSTMENT( mpBuffer->mnFormat ) == BMP_FORMAT_TOP_DOWN )
+ {
+ for( long nY = 0L; nY < nHeight; nY++, pTmpLine += mpBuffer->mnScanlineSize )
+ mpScanBuf[ nY ] = pTmpLine;
+ }
+ else
+ {
+ for( long nY = nHeight - 1; nY >= 0; nY--, pTmpLine += mpBuffer->mnScanlineSize )
+ mpScanBuf[ nY ] = pTmpLine;
+ }
+
+ if( !ImplSetAccessPointers( BMP_SCANLINE_FORMAT( mpBuffer->mnFormat ) ) )
+ {
+ delete[] mpScanBuf;
+ mpScanBuf = NULL;
+
+ pImpBmp->ImplReleaseBuffer( mpBuffer, mnAccessMode );
+ mpBuffer = NULL;
+ }
}
}
+void BitmapReadAccess::ImplClearScanBuffer()
+{
+ delete[] mpScanBuf;
+ mpScanBuf = NULL;
+}
+
bool BitmapReadAccess::ImplSetAccessPointers( sal_uLong nFormat )
{
bool bRet = true;
@@ -273,11 +304,6 @@ void BitmapReadAccess::ImplZeroInitUnusedBits()
}
}
-sal_uInt16 BitmapReadAccess::GetBestPaletteIndex( const BitmapColor& rBitmapColor ) const
-{
- return( HasPalette() ? mpBuffer->maPalette.GetBestIndex( rBitmapColor ) : 0 );
-}
-
BitmapColor BitmapReadAccess::GetInterpolatedColorWithFallback( double fY, double fX, const BitmapColor& rFallback ) const
{
// ask directly doubles >= 0.0 here to avoid rounded values of 0 at small negative
@@ -386,7 +412,7 @@ BitmapColor BitmapReadAccess::GetColorWithFallback( double fY, double fX, const
}
BitmapWriteAccess::BitmapWriteAccess( Bitmap& rBitmap ) :
- BitmapReadAccess( rBitmap, true ),
+ BitmapReadAccess( rBitmap, BITMAP_WRITE_ACCESS ),
mpLineColor ( NULL ),
mpFillColor ( NULL )
{
diff --git a/vcl/source/gdi/impbmp.cxx b/vcl/source/gdi/impbmp.cxx
index 5a478453f684..4f4684d98e57 100644
--- a/vcl/source/gdi/impbmp.cxx
+++ b/vcl/source/gdi/impbmp.cxx
@@ -80,16 +80,16 @@ sal_uInt16 ImpBitmap::ImplGetBitCount() const
return( ( nBitCount <= 1 ) ? 1 : ( nBitCount <= 4 ) ? 4 : ( nBitCount <= 8 ) ? 8 : 24 );
}
-BitmapBuffer* ImpBitmap::ImplAcquireBuffer( bool bReadOnly )
+BitmapBuffer* ImpBitmap::ImplAcquireBuffer( BitmapAccessMode nMode )
{
- return mpSalBitmap->AcquireBuffer( bReadOnly );
+ return mpSalBitmap->AcquireBuffer( nMode );
}
-void ImpBitmap::ImplReleaseBuffer( BitmapBuffer* pBuffer, bool bReadOnly )
+void ImpBitmap::ImplReleaseBuffer( BitmapBuffer* pBuffer, BitmapAccessMode nMode )
{
- mpSalBitmap->ReleaseBuffer( pBuffer, bReadOnly );
+ mpSalBitmap->ReleaseBuffer( pBuffer, nMode );
- if( !bReadOnly )
+ if( nMode == BITMAP_WRITE_ACCESS )
mnChecksum = 0;
}