summaryrefslogtreecommitdiff
path: root/vcl/source/gdi/bitmap.cxx
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2016-02-16 10:39:28 +0000
committerCaolán McNamara <caolanm@redhat.com>2016-02-16 16:03:07 +0000
commit3cdb86054c09617cea85dfc24ecbaf9cba376d7b (patch)
tree492627915c07805dec4ad696b363abb131fb40d3 /vcl/source/gdi/bitmap.cxx
parented88e6bf6a492008bd2e03a0e2ccab844fc8511e (diff)
use std shared_ptr for sharing ImpBitmaps
Change-Id: I1a0360096964f6402bd3631f2b3f34bf9595ebc6 Reviewed-on: https://gerrit.libreoffice.org/22394 Reviewed-by: Caolán McNamara <caolanm@redhat.com> Tested-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'vcl/source/gdi/bitmap.cxx')
-rw-r--r--vcl/source/gdi/bitmap.cxx120
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 );
}