summaryrefslogtreecommitdiff
path: root/vcl/source/gdi/bmpacc.cxx
diff options
context:
space:
mode:
authorLouis-Francis Ratté-Boulianne <lfrb@collabora.com>2014-12-03 17:02:37 -0500
committerMarkus Mohrhard <markus.mohrhard@collabora.co.uk>2014-12-11 07:57:27 +0100
commit83861ce123c2d7b1ce9c6acfbc0e457662eac944 (patch)
tree18ca72332f1a6dbd7b601d8829bc4b988ed97235 /vcl/source/gdi/bmpacc.cxx
parent9f839e9b3cbdca1511961a85b40d1c6825e43ba1 (diff)
vcl: Add BitmapInfoAccess for bitmaps' metadata access
Change-Id: Iec9f8c7d8f7cded0aef9e017373e44387dc0b05c
Diffstat (limited to 'vcl/source/gdi/bmpacc.cxx')
-rw-r--r--vcl/source/gdi/bmpacc.cxx138
1 files changed, 82 insertions, 56 deletions
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 )
{