Kaydet (Commit) f4637c07 authored tarafından Tomaž Vajngerl's avatar Tomaž Vajngerl Kaydeden (comit) Tomaž Vajngerl

convert Image manual refcounting with std::shader_ptr

Change-Id: I9a086d4a5d2f1b0d1afa3afd155eadcb2ae62ab5
Reviewed-on: https://gerrit.libreoffice.org/30543Reviewed-by: 's avatarTomaž Vajngerl <quikee@gmail.com>
Tested-by: 's avatarTomaž Vajngerl <quikee@gmail.com>
üst 3e610f84
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
#include <com/sun/star/uno/Reference.hxx> #include <com/sun/star/uno/Reference.hxx>
#include <memory>
#include <vector> #include <vector>
struct ImplImage; struct ImplImage;
...@@ -69,7 +70,7 @@ public: ...@@ -69,7 +70,7 @@ public:
private: private:
ImplImage* mpImplData; std::shared_ptr<ImplImage> mpImplData;
SAL_DLLPRIVATE void ImplInit( const BitmapEx& rBmpEx ); SAL_DLLPRIVATE void ImplInit( const BitmapEx& rBmpEx );
}; };
...@@ -122,7 +123,7 @@ public: ...@@ -122,7 +123,7 @@ public:
private: private:
ImplImageList* mpImplData; std::shared_ptr<ImplImageList> mpImplData;
SAL_DLLPRIVATE void ImplInit( sal_uInt16 nItems, const Size &rSize ); SAL_DLLPRIVATE void ImplInit( sal_uInt16 nItems, const Size &rSize );
SAL_DLLPRIVATE sal_uInt16 ImplGetImageId( const OUString& rImageName ) const; SAL_DLLPRIVATE sal_uInt16 ImplGetImageId( const OUString& rImageName ) const;
......
...@@ -40,15 +40,12 @@ ...@@ -40,15 +40,12 @@
#include <rtl/strbuf.hxx> #include <rtl/strbuf.hxx>
#endif #endif
Image::Image() : Image::Image()
mpImplData( nullptr )
{ {
} }
Image::Image( const ResId& rResId ) : Image::Image( const ResId& rResId )
mpImplData( nullptr )
{ {
rResId.SetRT( RSC_IMAGE ); rResId.SetRT( RSC_IMAGE );
ResMgr* pResMgr = rResId.GetResMgr(); ResMgr* pResMgr = rResId.GetResMgr();
...@@ -70,78 +67,60 @@ Image::Image( const ResId& rResId ) : ...@@ -70,78 +67,60 @@ Image::Image( const ResId& rResId ) :
} }
} }
Image::Image( const Image& rImage ) : Image::Image(const Image& rImage)
mpImplData( rImage.mpImplData ) : mpImplData(rImage.mpImplData)
{ {
if( mpImplData )
++mpImplData->mnRefCount;
} }
Image::Image( const BitmapEx& rBitmapEx ) : Image::Image(const BitmapEx& rBitmapEx)
mpImplData( nullptr )
{ {
ImplInit(rBitmapEx);
ImplInit( rBitmapEx );
} }
Image::Image( const Bitmap& rBitmap ) : Image::Image(const Bitmap& rBitmap)
mpImplData( nullptr )
{ {
ImplInit(rBitmap);
ImplInit( rBitmap );
} }
Image::Image( const Bitmap& rBitmap, const Bitmap& rMaskBitmap ) : Image::Image(const Bitmap& rBitmap, const Bitmap& rMaskBitmap)
mpImplData( nullptr )
{ {
const BitmapEx aBitmapEx(rBitmap, rMaskBitmap);
const BitmapEx aBmpEx( rBitmap, rMaskBitmap ); ImplInit(aBitmapEx);
ImplInit( aBmpEx );
} }
Image::Image( const Bitmap& rBitmap, const Color& rColor ) : Image::Image(const Bitmap& rBitmap, const Color& rColor)
mpImplData( nullptr )
{ {
const BitmapEx aBitmapEx(rBitmap, rColor);
const BitmapEx aBmpEx( rBitmap, rColor ); ImplInit(aBitmapEx);
ImplInit( aBmpEx );
} }
Image::Image( const css::uno::Reference< css::graphic::XGraphic >& rxGraphic ) : Image::Image(const css::uno::Reference< css::graphic::XGraphic >& rxGraphic)
mpImplData( nullptr )
{ {
const Graphic aGraphic(rxGraphic);
const Graphic aGraphic( rxGraphic ); ImplInit(aGraphic.GetBitmapEx());
ImplInit( aGraphic.GetBitmapEx() );
} }
Image::Image( const OUString &rFileUrl ) : Image::Image(const OUString & rFileUrl)
mpImplData( nullptr )
{ {
OUString aTmp; OUString aPath;
osl::FileBase::getSystemPathFromFileURL( rFileUrl, aTmp ); osl::FileBase::getSystemPathFromFileURL(rFileUrl, aPath);
Graphic aGraphic; Graphic aGraphic;
const OUString aFilterName( IMP_PNG ); const OUString aFilterName(IMP_PNG);
if( GRFILTER_OK == GraphicFilter::LoadGraphic( aTmp, aFilterName, aGraphic ) ) if (GRFILTER_OK == GraphicFilter::LoadGraphic(aPath, aFilterName, aGraphic))
{ {
ImplInit( aGraphic.GetBitmapEx() ); ImplInit(aGraphic.GetBitmapEx());
} }
} }
Image::~Image() Image::~Image()
{ {
if( mpImplData && ( 0 == --mpImplData->mnRefCount ) )
delete mpImplData;
} }
void Image::ImplInit(const BitmapEx& rBitmapEx) void Image::ImplInit(const BitmapEx& rBitmapEx)
{ {
if (!rBitmapEx.IsEmpty()) if (!rBitmapEx.IsEmpty())
{ {
mpImplData = new ImplImage; mpImplData.reset(new ImplImage);
mpImplData->mpBitmapEx.reset(new BitmapEx(rBitmapEx)); mpImplData->mpBitmapEx.reset(new BitmapEx(rBitmapEx));
} }
} }
...@@ -177,21 +156,13 @@ css::uno::Reference< css::graphic::XGraphic > Image::GetXGraphic() const ...@@ -177,21 +156,13 @@ css::uno::Reference< css::graphic::XGraphic > Image::GetXGraphic() const
return aGraphic.GetXGraphic(); return aGraphic.GetXGraphic();
} }
Image& Image::operator=( const Image& rImage ) Image& Image::operator=(const Image& rImage)
{ {
if( rImage.mpImplData )
++rImage.mpImplData->mnRefCount;
if( mpImplData && ( 0 == --mpImplData->mnRefCount ) )
delete mpImplData;
mpImplData = rImage.mpImplData; mpImplData = rImage.mpImplData;
return *this; return *this;
} }
Image& Image::operator=( Image&& rImage ) Image& Image::operator=(Image&& rImage)
{ {
std::swap(mpImplData, rImage.mpImplData); std::swap(mpImplData, rImage.mpImplData);
return *this; return *this;
...@@ -213,7 +184,7 @@ bool Image::operator==(const Image& rImage) const ...@@ -213,7 +184,7 @@ bool Image::operator==(const Image& rImage) const
void Image::Draw(OutputDevice* pOutDev, const Point& rPos, DrawImageFlags nStyle, const Size* pSize) void Image::Draw(OutputDevice* pOutDev, const Point& rPos, DrawImageFlags nStyle, const Size* pSize)
{ {
if (mpImplData == nullptr || !mpImplData->mpBitmapEx || if (!mpImplData || !mpImplData->mpBitmapEx ||
(!pOutDev->IsDeviceOutputNecessary() && pOutDev->GetConnectMetaFile() == nullptr)) (!pOutDev->IsDeviceOutputNecessary() && pOutDev->GetConnectMetaFile() == nullptr))
return; return;
......
...@@ -33,13 +33,11 @@ ...@@ -33,13 +33,11 @@
#include <vcl/implimagetree.hxx> #include <vcl/implimagetree.hxx>
#include <image.h> #include <image.h>
ImageList::ImageList() : ImageList::ImageList()
mpImplData( nullptr )
{ {
} }
ImageList::ImageList( const ResId& rResId ) : ImageList::ImageList(const ResId& rResId)
mpImplData( nullptr )
{ {
SAL_INFO( "vcl.gdi", "vcl: ImageList::ImageList( const ResId& rResId )" ); SAL_INFO( "vcl.gdi", "vcl: ImageList::ImageList( const ResId& rResId )" );
...@@ -76,9 +74,8 @@ ImageList::ImageList( const ResId& rResId ) : ...@@ -76,9 +74,8 @@ ImageList::ImageList( const ResId& rResId ) :
} }
} }
ImageList::ImageList( const std::vector< OUString >& rNameVector, ImageList::ImageList(const std::vector< OUString >& rNameVector,
const OUString& rPrefix) : const OUString& rPrefix)
mpImplData( nullptr )
{ {
SAL_INFO( "vcl.gdi", "vcl: ImageList::ImageList(const vector< OUString >& ..." ); SAL_INFO( "vcl.gdi", "vcl: ImageList::ImageList(const vector< OUString >& ..." );
...@@ -91,29 +88,24 @@ ImageList::ImageList( const std::vector< OUString >& rNameVector, ...@@ -91,29 +88,24 @@ ImageList::ImageList( const std::vector< OUString >& rNameVector,
} }
} }
ImageList::ImageList( const ImageList& rImageList ) : ImageList::ImageList( const ImageList& rImageList )
mpImplData( rImageList.mpImplData ) : mpImplData(rImageList.mpImplData)
{ {
if( mpImplData )
++mpImplData->mnRefCount;
} }
ImageList::ImageList( ImageList&& rImageList ) : ImageList::ImageList( ImageList&& rImageList )
mpImplData( rImageList.mpImplData ) : mpImplData(rImageList.mpImplData)
{ {
rImageList.mpImplData = nullptr; rImageList.mpImplData.reset();
} }
ImageList::~ImageList() ImageList::~ImageList()
{ {
if( mpImplData && ( 0 == --mpImplData->mnRefCount ) )
delete mpImplData;
} }
void ImageList::ImplInit( sal_uInt16 nItems, const Size &rSize ) void ImageList::ImplInit( sal_uInt16 nItems, const Size &rSize )
{ {
mpImplData = new ImplImageList; mpImplData.reset(new ImplImageList);
mpImplData->maImages.reserve( nItems ); mpImplData->maImages.reserve( nItems );
mpImplData->maImageSize = rSize; mpImplData->maImageSize = rSize;
} }
...@@ -202,7 +194,6 @@ void ImageList::InsertFromHorizontalBitmap( const ResId& rResId, ...@@ -202,7 +194,6 @@ void ImageList::InsertFromHorizontalBitmap( const ResId& rResId,
sal_uInt16 ImageList::ImplGetImageId( const OUString& rImageName ) const sal_uInt16 ImageList::ImplGetImageId( const OUString& rImageName ) const
{ {
ImageAryData *pImg = mpImplData->maNameHash[ rImageName ]; ImageAryData *pImg = mpImplData->maNameHash[ rImageName ];
if( pImg ) if( pImg )
return pImg->mnId; return pImg->mnId;
...@@ -236,7 +227,6 @@ void ImageList::ReplaceImage( const OUString& rImageName, const Image& rImage ) ...@@ -236,7 +227,6 @@ void ImageList::ReplaceImage( const OUString& rImageName, const Image& rImage )
void ImageList::RemoveImage( sal_uInt16 nId ) void ImageList::RemoveImage( sal_uInt16 nId )
{ {
for( size_t i = 0; i < mpImplData->maImages.size(); ++i ) for( size_t i = 0; i < mpImplData->maImages.size(); ++i )
{ {
if( mpImplData->maImages[ i ]->mnId == nId ) if( mpImplData->maImages[ i ]->mnId == nId )
...@@ -294,7 +284,6 @@ Image ImageList::GetImage( const OUString& rImageName ) const ...@@ -294,7 +284,6 @@ Image ImageList::GetImage( const OUString& rImageName ) const
sal_uInt16 ImageList::GetImageCount() const sal_uInt16 ImageList::GetImageCount() const
{ {
return mpImplData ? static_cast< sal_uInt16 >( mpImplData->maImages.size() ) : 0; return mpImplData ? static_cast< sal_uInt16 >( mpImplData->maImages.size() ) : 0;
} }
...@@ -320,7 +309,6 @@ bool ImageList::HasImageAtPos( sal_uInt16 nId ) const ...@@ -320,7 +309,6 @@ bool ImageList::HasImageAtPos( sal_uInt16 nId ) const
sal_uInt16 ImageList::GetImagePos( const OUString& rImageName ) const sal_uInt16 ImageList::GetImagePos( const OUString& rImageName ) const
{ {
if( mpImplData && !rImageName.isEmpty() ) if( mpImplData && !rImageName.isEmpty() )
{ {
for( size_t i = 0; i < mpImplData->maImages.size(); i++ ) for( size_t i = 0; i < mpImplData->maImages.size(); i++ )
...@@ -335,7 +323,6 @@ sal_uInt16 ImageList::GetImagePos( const OUString& rImageName ) const ...@@ -335,7 +323,6 @@ sal_uInt16 ImageList::GetImagePos( const OUString& rImageName ) const
sal_uInt16 ImageList::GetImageId( sal_uInt16 nPos ) const sal_uInt16 ImageList::GetImageId( sal_uInt16 nPos ) const
{ {
if( mpImplData && (nPos < GetImageCount()) ) if( mpImplData && (nPos < GetImageCount()) )
return mpImplData->maImages[ nPos ]->mnId; return mpImplData->maImages[ nPos ]->mnId;
...@@ -344,7 +331,6 @@ sal_uInt16 ImageList::GetImageId( sal_uInt16 nPos ) const ...@@ -344,7 +331,6 @@ sal_uInt16 ImageList::GetImageId( sal_uInt16 nPos ) const
OUString ImageList::GetImageName( sal_uInt16 nPos ) const OUString ImageList::GetImageName( sal_uInt16 nPos ) const
{ {
if( mpImplData && (nPos < GetImageCount()) ) if( mpImplData && (nPos < GetImageCount()) )
return mpImplData->maImages[ nPos ]->maName; return mpImplData->maImages[ nPos ]->maName;
...@@ -370,7 +356,6 @@ void ImageList::GetImageNames( std::vector< OUString >& rNames ) const ...@@ -370,7 +356,6 @@ void ImageList::GetImageNames( std::vector< OUString >& rNames ) const
Size ImageList::GetImageSize() const Size ImageList::GetImageSize() const
{ {
Size aRet; Size aRet;
if( mpImplData ) if( mpImplData )
...@@ -390,32 +375,19 @@ Size ImageList::GetImageSize() const ...@@ -390,32 +375,19 @@ Size ImageList::GetImageSize() const
ImageList& ImageList::operator=( const ImageList& rImageList ) ImageList& ImageList::operator=( const ImageList& rImageList )
{ {
if( rImageList.mpImplData )
++rImageList.mpImplData->mnRefCount;
if( mpImplData && ( 0 == --mpImplData->mnRefCount ) )
delete mpImplData;
mpImplData = rImageList.mpImplData; mpImplData = rImageList.mpImplData;
return *this; return *this;
} }
ImageList& ImageList::operator=( ImageList&& rImageList ) ImageList& ImageList::operator=( ImageList&& rImageList )
{ {
if( mpImplData && ( 0 == --mpImplData->mnRefCount ) )
delete mpImplData;
mpImplData = rImageList.mpImplData; mpImplData = rImageList.mpImplData;
rImageList.mpImplData = nullptr; rImageList.mpImplData = nullptr;
return *this; return *this;
} }
bool ImageList::operator==( const ImageList& rImageList ) const bool ImageList::operator==( const ImageList& rImageList ) const
{ {
bool bRet = false; bool bRet = false;
if( rImageList.mpImplData == mpImplData ) if( rImageList.mpImplData == mpImplData )
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment