diff options
author | Louis-Francis Ratté-Boulianne <lfrb@collabora.com> | 2014-12-03 17:02:37 -0500 |
---|---|---|
committer | Markus Mohrhard <markus.mohrhard@googlemail.com> | 2014-12-15 22:47:05 +0100 |
commit | 313e89f9fbb1aa0da148d4d75be649327d67d8f7 (patch) | |
tree | f73303acb395df982ac2fc6d42aad04949a502a1 /vcl/source | |
parent | e2b093f66e2613ad1a85c662159f57df4bc96a67 (diff) |
vcl: Add BitmapInfoAccess for bitmaps' metadata access
Change-Id: Iec9f8c7d8f7cded0aef9e017373e44387dc0b05c
Diffstat (limited to 'vcl/source')
-rw-r--r-- | vcl/source/gdi/bitmap.cxx | 23 | ||||
-rw-r--r-- | vcl/source/gdi/bmpacc.cxx | 138 | ||||
-rw-r--r-- | vcl/source/gdi/impbmp.cxx | 10 |
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; } |