[Libreoffice-commits] core.git: include/vcl vcl/source
Mark Page
aptitude at btconnect.com
Mon May 23 11:30:38 UTC 2016
include/vcl/gfxlink.hxx | 98 ++++++-------------
vcl/source/gdi/gfxlink.cxx | 225 +++++++++++++--------------------------------
2 files changed, 95 insertions(+), 228 deletions(-)
New commits:
commit d64431ac5a7bede7661c64e0bd6d46805841e704
Author: Mark Page <aptitude at btconnect.com>
Date: Wed May 18 08:33:33 2016 +0100
Simplify GfxLink using std::shared_ptr to clarify ownership
The functionality has not changed in this class, however the ABI
has changed (this class is DLL Public)
Change-Id: I11005f03e747d56cb59550e071755429390db7a7
Reviewed-on: https://gerrit.libreoffice.org/25081
Tested-by: Jenkins <ci at libreoffice.org>
Reviewed-by: Noel Grandin <noelgrandin at gmail.com>
diff --git a/include/vcl/gfxlink.hxx b/include/vcl/gfxlink.hxx
index 3bdb4b7..aa0e8fe 100644
--- a/include/vcl/gfxlink.hxx
+++ b/include/vcl/gfxlink.hxx
@@ -25,56 +25,10 @@
#include <tools/solar.h>
#include <vcl/dllapi.h>
#include <vcl/mapmod.hxx>
+#include <memory>
class SvStream;
-
-struct ImpBuffer
-{
- sal_uLong mnRefCount;
- sal_uInt8* mpBuffer;
-
- ImpBuffer( sal_uInt8* pBuf ) { mnRefCount = 1UL; mpBuffer = pBuf; }
-
- ~ImpBuffer() { delete[] mpBuffer; }
-};
-
-
-struct ImpSwap
-{
- OUString maURL;
- sal_uLong mnDataSize;
- sal_uLong mnRefCount;
-
- ImpSwap( sal_uInt8* pData, sal_uLong nDataSize );
- ~ImpSwap();
-
- sal_uInt8* GetData() const;
-
- bool IsSwapped() const { return maURL.getLength() > 0; }
-
- void WriteTo( SvStream& rOStm ) const;
-};
-
-
-struct ImpGfxLink
-{
- MapMode maPrefMapMode;
- Size maPrefSize;
- bool mbPrefMapModeValid;
- bool mbPrefSizeValid;
-
- ImpGfxLink() :
- maPrefMapMode(),
- maPrefSize(),
- mbPrefMapModeValid( false ),
- mbPrefSizeValid( false )
- {}
-};
-
-//#endif // __PRIVATE
-
-
enum GfxLinkType
{
GFX_LINK_TYPE_NONE = 0,
@@ -88,7 +42,6 @@ enum GfxLinkType
GFX_LINK_TYPE_NATIVE_PCT = 8, // Don't forget to update the following defines
GFX_LINK_TYPE_NATIVE_SVG = 9, // Don't forget to update the following defines
GFX_LINK_TYPE_NATIVE_MOV = 10, // Don't forget to update the following defines
- // #i15508# added BMP type support
GFX_LINK_TYPE_NATIVE_BMP = 11, // Don't forget to update the following defines
GFX_LINK_TYPE_USER = 0xffff
};
@@ -96,49 +49,58 @@ enum GfxLinkType
#define GFX_LINK_FIRST_NATIVE_ID GFX_LINK_TYPE_NATIVE_GIF
#define GFX_LINK_LAST_NATIVE_ID GFX_LINK_TYPE_NATIVE_BMP
-
-struct ImpBuffer;
-struct ImpSwap;
-struct ImpGfxLink;
class Graphic;
class VCL_DLLPUBLIC GfxLink
{
private:
- GfxLinkType meType;
- ImpBuffer* mpBuf;
- ImpSwap* mpSwap;
- sal_uInt32 mnBufSize;
- sal_uInt32 mnUserId;
- ImpGfxLink* mpImpData;
+ struct SwapOutData
+ {
+ SwapOutData(const OUString &aURL);
+ ~SwapOutData();
- SAL_DLLPRIVATE void ImplCopy( const GfxLink& rGfxLink );
+ OUString maURL; // File is removed in the destructor
+ };
+
+ GfxLinkType meType = GFX_LINK_TYPE_NONE;
+ sal_uInt32 mnUserId = 0;
+
+ std::shared_ptr<sal_uInt8> mpSwapInData;
+ std::shared_ptr<SwapOutData> mpSwapOutData;
+
+ sal_uInt32 mnSwapInDataSize = 0;
+ MapMode maPrefMapMode;
+ Size maPrefSize;
+ bool mbPrefMapModeValid = false;
+ bool mbPrefSizeValid = false;
+
+ SAL_DLLPRIVATE std::shared_ptr<sal_uInt8> GetSwapInData() const;
public:
GfxLink();
- GfxLink( const GfxLink& );
+
+ // pBuff = The Graphic data. This class takes ownership of this
GfxLink( sal_uInt8* pBuf, sal_uInt32 nBufSize, GfxLinkType nType );
~GfxLink();
- GfxLink& operator=( const GfxLink& );
- bool IsEqual( const GfxLink& ) const;
+ bool IsEqual( const GfxLink& ) const;
GfxLinkType GetType() const { return meType;}
void SetUserId( sal_uInt32 nUserId ) { mnUserId = nUserId; }
sal_uInt32 GetUserId() const { return mnUserId; }
- sal_uInt32 GetDataSize() const { return mnBufSize;}
+ sal_uInt32 GetDataSize() const { return mnSwapInDataSize;}
const sal_uInt8* GetData() const;
- const Size& GetPrefSize() const { return mpImpData->maPrefSize;}
+ const Size& GetPrefSize() const { return maPrefSize;}
void SetPrefSize( const Size& rPrefSize );
- bool IsPrefSizeValid() { return mpImpData->mbPrefSizeValid;}
+ bool IsPrefSizeValid() { return mbPrefSizeValid;}
- const MapMode& GetPrefMapMode() const { return mpImpData->maPrefMapMode;}
+ const MapMode& GetPrefMapMode() const { return maPrefMapMode;}
void SetPrefMapMode( const MapMode& rPrefMapMode );
- bool IsPrefMapModeValid() { return mpImpData->mbPrefMapModeValid;}
+ bool IsPrefMapModeValid() { return mbPrefMapModeValid;}
bool IsNative() const;
@@ -148,7 +110,7 @@ public:
void SwapOut();
void SwapIn();
- bool IsSwappedOut() const { return( mpSwap != nullptr ); }
+ bool IsSwappedOut() const { return( bool(mpSwapOutData) ); }
public:
diff --git a/vcl/source/gdi/gfxlink.cxx b/vcl/source/gdi/gfxlink.cxx
index 266c8a4..5b87fb3 100644
--- a/vcl/source/gdi/gfxlink.cxx
+++ b/vcl/source/gdi/gfxlink.cxx
@@ -30,67 +30,29 @@
#include <com/sun/star/ucb/CommandAbortedException.hpp>
#include <memory>
-GfxLink::GfxLink() :
- meType ( GFX_LINK_TYPE_NONE ),
- mpBuf ( nullptr ),
- mpSwap ( nullptr ),
- mnBufSize ( 0 ),
- mnUserId ( 0UL ),
- mpImpData ( new ImpGfxLink )
+GfxLink::GfxLink()
{
}
-GfxLink::GfxLink( const GfxLink& rGfxLink ) :
- mpImpData( new ImpGfxLink )
-{
- ImplCopy( rGfxLink );
-}
-
-GfxLink::GfxLink( sal_uInt8* pBuf, sal_uInt32 nSize, GfxLinkType nType ) :
- mpImpData( new ImpGfxLink )
+GfxLink::GfxLink( sal_uInt8* pBuf, sal_uInt32 nSize, GfxLinkType nType )
{
DBG_ASSERT( pBuf != nullptr && nSize,
"GfxLink::GfxLink(): empty/NULL buffer given" );
meType = nType;
- mnBufSize = nSize;
- mpSwap = nullptr;
- mnUserId = 0UL;
- mpBuf = new ImpBuffer( pBuf );
+ mnSwapInDataSize = nSize;
+ mpSwapInData = std::shared_ptr<sal_uInt8>(pBuf);
}
GfxLink::~GfxLink()
{
- if( mpBuf && !( --mpBuf->mnRefCount ) )
- delete mpBuf;
-
- if( mpSwap && !( --mpSwap->mnRefCount ) )
- delete mpSwap;
-
- delete mpImpData;
-}
-
-GfxLink& GfxLink::operator=( const GfxLink& rGfxLink )
-{
- if( &rGfxLink != this )
- {
- if ( mpBuf && !( --mpBuf->mnRefCount ) )
- delete mpBuf;
-
- if( mpSwap && !( --mpSwap->mnRefCount ) )
- delete mpSwap;
-
- ImplCopy( rGfxLink );
- }
-
- return *this;
}
bool GfxLink::IsEqual( const GfxLink& rGfxLink ) const
{
bool bIsEqual = false;
- if ( ( mnBufSize == rGfxLink.mnBufSize ) && ( meType == rGfxLink.meType ) )
+ if ( ( mnSwapInDataSize == rGfxLink.mnSwapInDataSize ) && ( meType == rGfxLink.meType ) )
{
const sal_uInt8* pSource = GetData();
const sal_uInt8* pDest = rGfxLink.GetData();
@@ -106,22 +68,6 @@ bool GfxLink::IsEqual( const GfxLink& rGfxLink ) const
return bIsEqual;
}
-void GfxLink::ImplCopy( const GfxLink& rGfxLink )
-{
- mnBufSize = rGfxLink.mnBufSize;
- meType = rGfxLink.meType;
- mpBuf = rGfxLink.mpBuf;
- mpSwap = rGfxLink.mpSwap;
- mnUserId = rGfxLink.mnUserId;
- *mpImpData = *rGfxLink.mpImpData;
-
- if( mpBuf )
- mpBuf->mnRefCount++;
-
- if( mpSwap )
- mpSwap->mnRefCount++;
-}
-
bool GfxLink::IsNative() const
{
@@ -134,21 +80,21 @@ const sal_uInt8* GfxLink::GetData() const
if( IsSwappedOut() )
const_cast<GfxLink*>(this)->SwapIn();
- return( mpBuf ? mpBuf->mpBuffer : nullptr );
+ return( mpSwapInData.get() );
}
void GfxLink::SetPrefSize( const Size& rPrefSize )
{
- mpImpData->maPrefSize = rPrefSize;
- mpImpData->mbPrefSizeValid = true;
+ maPrefSize = rPrefSize;
+ mbPrefSizeValid = true;
}
void GfxLink::SetPrefMapMode( const MapMode& rPrefMapMode )
{
- mpImpData->maPrefMapMode = rPrefMapMode;
- mpImpData->mbPrefMapModeValid = true;
+ maPrefMapMode = rPrefMapMode;
+ mbPrefMapModeValid = true;
}
@@ -156,7 +102,7 @@ bool GfxLink::LoadNative( Graphic& rGraphic )
{
bool bRet = false;
- if( IsNative() && mnBufSize )
+ if( IsNative() && mnSwapInDataSize )
{
const sal_uInt8* pData = GetData();
@@ -165,15 +111,12 @@ bool GfxLink::LoadNative( Graphic& rGraphic )
SvMemoryStream aMemStm;
ConvertDataFormat nCvtType;
- aMemStm.SetBuffer( const_cast<sal_uInt8*>(pData), mnBufSize, mnBufSize );
+ aMemStm.SetBuffer( const_cast<sal_uInt8*>(pData), mnSwapInDataSize, mnSwapInDataSize );
switch( meType )
{
case GFX_LINK_TYPE_NATIVE_GIF: nCvtType = ConvertDataFormat::GIF; break;
-
- // #i15508# added BMP type for better exports (reload when swapped - checked, works)
case GFX_LINK_TYPE_NATIVE_BMP: nCvtType = ConvertDataFormat::BMP; break;
-
case GFX_LINK_TYPE_NATIVE_JPG: nCvtType = ConvertDataFormat::JPG; break;
case GFX_LINK_TYPE_NATIVE_PNG: nCvtType = ConvertDataFormat::PNG; break;
case GFX_LINK_TYPE_NATIVE_TIF: nCvtType = ConvertDataFormat::TIF; break;
@@ -195,21 +138,29 @@ bool GfxLink::LoadNative( Graphic& rGraphic )
void GfxLink::SwapOut()
{
- if( !IsSwappedOut() && mpBuf )
+ if( !IsSwappedOut() && mpSwapInData && mnSwapInDataSize )
{
- mpSwap = new ImpSwap( mpBuf->mpBuffer, mnBufSize );
+ ::utl::TempFile aTempFile;
- if( !mpSwap->IsSwapped() )
- {
- delete mpSwap;
- mpSwap = nullptr;
- }
- else
+ OUString aURL = aTempFile.GetURL();
+
+ if( !aURL.isEmpty() )
{
- if( !( --mpBuf->mnRefCount ) )
- delete mpBuf;
+ std::shared_ptr<GfxLink::SwapOutData> pSwapOut;
+ pSwapOut = std::make_shared<SwapOutData>(aURL); // aURL is removed in the destructor
+ std::unique_ptr<SvStream> xOStm(::utl::UcbStreamHelper::CreateStream( aURL, STREAM_READWRITE | StreamMode::SHARE_DENYWRITE ));
+ if( xOStm )
+ {
+ xOStm->Write( mpSwapInData.get(), mnSwapInDataSize );
+ bool bError = ( ERRCODE_NONE != xOStm->GetError() );
+ xOStm.reset();
- mpBuf = nullptr;
+ if( !bError )
+ {
+ mpSwapOutData = pSwapOut;
+ mpSwapInData.reset();
+ }
+ }
}
}
}
@@ -218,12 +169,12 @@ void GfxLink::SwapIn()
{
if( IsSwappedOut() )
{
- mpBuf = new ImpBuffer( mpSwap->GetData() );
-
- if( !( --mpSwap->mnRefCount ) )
- delete mpSwap;
-
- mpSwap = nullptr;
+ auto pData = GetSwapInData();
+ if (pData)
+ {
+ mpSwapInData = pData;
+ mpSwapOutData.reset();
+ }
}
}
@@ -231,10 +182,9 @@ bool GfxLink::ExportNative( SvStream& rOStream ) const
{
if( GetDataSize() )
{
- if( IsSwappedOut() )
- mpSwap->WriteTo( rOStream );
- else if( GetData() )
- rOStream.Write( GetData(), GetDataSize() );
+ auto pData = GetSwapInData();
+ if (pData)
+ rOStream.Write( pData.get(), mnSwapInDataSize );
}
return ( rOStream.GetError() == ERRCODE_NONE );
@@ -255,10 +205,9 @@ SvStream& WriteGfxLink( SvStream& rOStream, const GfxLink& rGfxLink )
if( rGfxLink.GetDataSize() )
{
- if( rGfxLink.IsSwappedOut() )
- rGfxLink.mpSwap->WriteTo( rOStream );
- else if( rGfxLink.GetData() )
- rOStream.Write( rGfxLink.GetData(), rGfxLink.GetDataSize() );
+ auto pData = rGfxLink.GetSwapInData();
+ if (pData)
+ rOStream.Write( pData.get(), rGfxLink.mnSwapInDataSize );
}
return rOStream;
@@ -270,8 +219,7 @@ SvStream& ReadGfxLink( SvStream& rIStream, GfxLink& rGfxLink)
MapMode aMapMode;
sal_uInt32 nSize;
sal_uInt32 nUserId;
- sal_uInt16 nType;
- sal_uInt8* pBuf;
+ sal_uInt16 nType;
bool bMapAndSizeValid( false );
std::unique_ptr<VersionCompat> pCompat(new VersionCompat( rIStream, StreamMode::READ ));
@@ -287,7 +235,7 @@ SvStream& ReadGfxLink( SvStream& rIStream, GfxLink& rGfxLink)
pCompat.reset(); // destructor writes stuff into the header
- pBuf = new sal_uInt8[ nSize ];
+ sal_uInt8* pBuf = new sal_uInt8[ nSize ];
rIStream.Read( pBuf, nSize );
rGfxLink = GfxLink( pBuf, nSize, (GfxLinkType) nType );
@@ -302,83 +250,40 @@ SvStream& ReadGfxLink( SvStream& rIStream, GfxLink& rGfxLink)
return rIStream;
}
-ImpSwap::ImpSwap( sal_uInt8* pData, sal_uLong nDataSize ) :
- mnDataSize( nDataSize ),
- mnRefCount( 1UL )
+GfxLink::SwapOutData::SwapOutData(const OUString &aURL) : maURL(aURL)
{
- if( pData && mnDataSize )
- {
- ::utl::TempFile aTempFile;
-
- maURL = aTempFile.GetURL();
- if( !maURL.isEmpty() )
- {
- std::unique_ptr<SvStream> xOStm(::utl::UcbStreamHelper::CreateStream( maURL, STREAM_READWRITE | StreamMode::SHARE_DENYWRITE ));
- if( xOStm )
- {
- xOStm->Write( pData, mnDataSize );
- bool bError = ( ERRCODE_NONE != xOStm->GetError() );
- xOStm.reset();
-
- if( bError )
- {
- osl_removeFile( maURL.pData );
- maURL.clear();
- }
- }
- }
- }
}
-ImpSwap::~ImpSwap()
+GfxLink::SwapOutData::~SwapOutData()
{
- if( IsSwapped() )
+ if( maURL.getLength() > 0 )
osl_removeFile( maURL.pData );
}
-sal_uInt8* ImpSwap::GetData() const
+std::shared_ptr<sal_uInt8> GfxLink::GetSwapInData() const
{
- sal_uInt8* pData;
+ if( !IsSwappedOut() )
+ return mpSwapInData;
+
+ std::shared_ptr<sal_uInt8> pData;
- if( IsSwapped() )
+ std::unique_ptr<SvStream> xIStm(::utl::UcbStreamHelper::CreateStream( mpSwapOutData->maURL, STREAM_READWRITE ));
+ if( xIStm )
{
- std::unique_ptr<SvStream> xIStm(::utl::UcbStreamHelper::CreateStream( maURL, STREAM_READWRITE ));
- if( xIStm )
+ pData = std::shared_ptr<sal_uInt8>(new sal_uInt8[ mnSwapInDataSize ]);
+ xIStm->Read( pData.get(), mnSwapInDataSize );
+ bool bError = ( ERRCODE_NONE != xIStm->GetError() );
+ sal_Size nActReadSize = xIStm->Tell();
+ if (nActReadSize != mnSwapInDataSize)
{
- pData = new sal_uInt8[ mnDataSize ];
- xIStm->Read( pData, mnDataSize );
- bool bError = ( ERRCODE_NONE != xIStm->GetError() );
- sal_Size nActReadSize = xIStm->Tell();
- if (nActReadSize != mnDataSize)
- {
- bError = true;
- }
- xIStm.reset();
-
- if( bError )
- {
- delete[] pData;
- pData = nullptr;
- }
+ bError = true;
}
- else
- pData = nullptr;
- }
- else
- pData = nullptr;
+ xIStm.reset();
- return pData;
-}
-
-void ImpSwap::WriteTo( SvStream& rOStm ) const
-{
- sal_uInt8* pData = GetData();
-
- if( pData )
- {
- rOStm.Write( pData, mnDataSize );
- delete[] pData;
+ if( bError )
+ pData.reset();
}
+ return pData;
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
More information about the Libreoffice-commits
mailing list