diff options
Diffstat (limited to 'vcl/source/gdi/bitmap.cxx')
-rw-r--r-- | vcl/source/gdi/bitmap.cxx | 120 |
1 files changed, 38 insertions, 82 deletions
diff --git a/vcl/source/gdi/bitmap.cxx b/vcl/source/gdi/bitmap.cxx index f182eb23be15..89369ca3af9b 100644 --- a/vcl/source/gdi/bitmap.cxx +++ b/vcl/source/gdi/bitmap.cxx @@ -34,13 +34,11 @@ #include <salbmp.hxx> #include <memory> -Bitmap::Bitmap() : - mpImpBmp( nullptr ) +Bitmap::Bitmap() { } -Bitmap::Bitmap( const ResId& rResId ) : - mpImpBmp( nullptr ) +Bitmap::Bitmap( const ResId& rResId ) { const BitmapEx aBmpEx( rResId ); @@ -48,26 +46,23 @@ Bitmap::Bitmap( const ResId& rResId ) : *this = aBmpEx.GetBitmap(); } -Bitmap::Bitmap( const Bitmap& rBitmap ) : - maPrefMapMode ( rBitmap.maPrefMapMode ), - maPrefSize ( rBitmap.maPrefSize ) +Bitmap::Bitmap(const Bitmap& rBitmap) + : mxImpBmp(rBitmap.mxImpBmp) + , maPrefMapMode(rBitmap.maPrefMapMode) + , maPrefSize(rBitmap.maPrefSize) { - mpImpBmp = rBitmap.mpImpBmp; - - if ( mpImpBmp ) - mpImpBmp->ImplIncRefCount(); } -Bitmap::Bitmap( SalBitmap* pSalBitmap ) +Bitmap::Bitmap(SalBitmap* pSalBitmap) + : mxImpBmp(new ImpBitmap(pSalBitmap)) + , maPrefMapMode(MapMode(MAP_PIXEL)) + , maPrefSize(mxImpBmp->ImplGetSize()) { - mpImpBmp = new ImpBitmap(pSalBitmap); - maPrefMapMode = MapMode( MAP_PIXEL ); - maPrefSize = mpImpBmp->ImplGetSize(); } Bitmap::Bitmap( const Size& rSizePixel, sal_uInt16 nBitCount, const BitmapPalette* pPal ) { - if( rSizePixel.Width() && rSizePixel.Height() ) + if (rSizePixel.Width() && rSizePixel.Height()) { BitmapPalette aPal; BitmapPalette* pRealPal = nullptr; @@ -121,16 +116,13 @@ Bitmap::Bitmap( const Size& rSizePixel, sal_uInt16 nBitCount, const BitmapPalett pRealPal = const_cast<BitmapPalette*>(pPal); } - mpImpBmp = new ImpBitmap; - mpImpBmp->ImplCreate( rSizePixel, nBitCount, pRealPal ? *pRealPal : aPal ); + mxImpBmp.reset(new ImpBitmap); + mxImpBmp->ImplCreate( rSizePixel, nBitCount, pRealPal ? *pRealPal : aPal ); } - else - mpImpBmp = nullptr; } Bitmap::~Bitmap() { - ImplReleaseRef(); } const BitmapPalette& Bitmap::GetGreyPalette( int nEntries ) @@ -233,12 +225,7 @@ Bitmap& Bitmap::operator=( const Bitmap& rBitmap ) maPrefSize = rBitmap.maPrefSize; maPrefMapMode = rBitmap.maPrefMapMode; - - if ( rBitmap.mpImpBmp ) - rBitmap.mpImpBmp->ImplIncRefCount(); - - ImplReleaseRef(); - mpImpBmp = rBitmap.mpImpBmp; + mxImpBmp = rBitmap.mxImpBmp; return *this; } @@ -246,26 +233,24 @@ Bitmap& Bitmap::operator=( const Bitmap& rBitmap ) bool Bitmap::IsEqual( const Bitmap& rBmp ) const { return(IsSameInstance(rBmp) || // Includes both are nullptr - (rBmp.mpImpBmp && mpImpBmp && mpImpBmp->ImplIsEqual(*rBmp.mpImpBmp))); + (rBmp.mxImpBmp && mxImpBmp && mxImpBmp->ImplIsEqual(*rBmp.mxImpBmp))); } void Bitmap::SetEmpty() { maPrefMapMode = MapMode(); maPrefSize = Size(); - - ImplReleaseRef(); - mpImpBmp = nullptr; + mxImpBmp.reset(); } Size Bitmap::GetSizePixel() const { - return( mpImpBmp ? mpImpBmp->ImplGetSize() : Size() ); + return( mxImpBmp ? mxImpBmp->ImplGetSize() : Size() ); } sal_uInt16 Bitmap::GetBitCount() const { - return( mpImpBmp ? mpImpBmp->ImplGetBitCount() : 0 ); + return( mxImpBmp ? mxImpBmp->ImplGetBitCount() : 0 ); } bool Bitmap::HasGreyPalette() const @@ -288,38 +273,21 @@ BitmapChecksum Bitmap::GetChecksum() const { BitmapChecksum nRet = 0; - if( mpImpBmp ) + if( mxImpBmp ) { - nRet = mpImpBmp->ImplGetChecksum(); + nRet = mxImpBmp->ImplGetChecksum(); } return nRet; } -void Bitmap::ImplReleaseRef() -{ - if( mpImpBmp ) - { - if( mpImpBmp->ImplGetRefCount() > 1UL ) - mpImpBmp->ImplDecRefCount(); - else - { - delete mpImpBmp; - mpImpBmp = nullptr; - } - } -} - void Bitmap::ImplMakeUnique() { - if( mpImpBmp && mpImpBmp->ImplGetRefCount() > 1UL ) + if (mxImpBmp && !mxImpBmp.unique()) { - ImpBitmap* pOldImpBmp = mpImpBmp; - - pOldImpBmp->ImplDecRefCount(); - - mpImpBmp = new ImpBitmap; - mpImpBmp->ImplCreate( *pOldImpBmp ); + std::shared_ptr<ImpBitmap> xOldImpBmp = mxImpBmp; + mxImpBmp.reset(new ImpBitmap); + mxImpBmp->ImplCreate(*xOldImpBmp); } } @@ -345,13 +313,9 @@ void Bitmap::ImplAssignWithSize( const Bitmap& rBitmap ) } -void Bitmap::ImplSetImpBitmap( ImpBitmap* pImpBmp ) +void Bitmap::ImplSetImpBitmap(std::shared_ptr<ImpBitmap> xImpBmp) { - if( pImpBmp != mpImpBmp ) - { - ImplReleaseRef(); - mpImpBmp = pImpBmp; - } + mxImpBmp = xImpBmp; } BitmapInfoAccess* Bitmap::AcquireInfoAccess() @@ -504,7 +468,7 @@ bool Bitmap::Invert() pAcc->SetPixel( nY, nX, pAcc->GetPixel( nY, nX ).Invert() ); } - mpImpBmp->ImplInvalidateChecksum(); + mxImpBmp->ImplInvalidateChecksum(); ReleaseAccess( pAcc ); bRet = true; } @@ -1551,22 +1515,17 @@ bool Bitmap::Replace( const AlphaMask& rAlpha, const Color& rMergeColor ) bool Bitmap::Replace( const Color& rSearchColor, const Color& rReplaceColor, sal_uLong nTol ) { - if( mpImpBmp ) + if( mxImpBmp ) { // implementation specific replace - ImpBitmap* pImpBmp = new ImpBitmap; - - if( pImpBmp->ImplCreate( *mpImpBmp ) && pImpBmp->ImplReplace( rSearchColor, rReplaceColor, nTol ) ) + std::shared_ptr<ImpBitmap> xImpBmp(new ImpBitmap); + if (xImpBmp->ImplCreate(*mxImpBmp) && xImpBmp->ImplReplace(rSearchColor, rReplaceColor, nTol)) { - ImplSetImpBitmap( pImpBmp ); + ImplSetImpBitmap(xImpBmp); maPrefMapMode = MapMode( MAP_PIXEL ); - maPrefSize = pImpBmp->ImplGetSize(); + maPrefSize = xImpBmp->ImplGetSize(); return true; } - else - { - delete pImpBmp; - } } // Bitmaps with 1 bit color depth can cause problems @@ -1733,14 +1692,11 @@ Bitmap Bitmap::CreateDisplayBitmap( OutputDevice* pDisplay ) SalGraphics* pDispGraphics = pDisplay->GetGraphics(); - if( mpImpBmp && pDispGraphics ) + if( mxImpBmp && pDispGraphics ) { - ImpBitmap* pImpDispBmp = new ImpBitmap; - - if( pImpDispBmp->ImplCreate( *mpImpBmp, pDispGraphics ) ) - aDispBmp.ImplSetImpBitmap( pImpDispBmp ); - else - delete pImpDispBmp; + std::shared_ptr<ImpBitmap> xImpDispBmp(new ImpBitmap); + if (xImpDispBmp->ImplCreate(*mxImpBmp, pDispGraphics)) + aDispBmp.ImplSetImpBitmap(xImpDispBmp); } return aDispBmp; @@ -1924,9 +1880,9 @@ bool Bitmap::MakeMono( sal_uInt8 cThreshold ) bool Bitmap::GetSystemData( BitmapSystemData& rData ) const { bool bRet = false; - if( mpImpBmp ) + if (mxImpBmp) { - SalBitmap* pSalBitmap = mpImpBmp->ImplGetSalBitmap(); + SalBitmap* pSalBitmap = mxImpBmp->ImplGetSalBitmap(); if( pSalBitmap ) bRet = pSalBitmap->GetSystemData( rData ); } |