Kaydet (Commit) 23dfb9e1 authored tarafından Xisco Fauli's avatar Xisco Fauli Kaydeden (comit) Thorsten Behrens

tdf#62525 vcl: use cow_wrapper for mapmod

Change-Id: I25ddaeb051f171388bb490a23bf03dbaf0add281
Reviewed-on: https://gerrit.libreoffice.org/24438Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarThorsten Behrens <Thorsten.Behrens@CIB.de>
üst 2cf939b2
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#include <vcl/dllapi.h> #include <vcl/dllapi.h>
#include <tools/mapunit.hxx> #include <tools/mapunit.hxx>
#include <o3tl/cow_wrapper.hxx>
class Point; class Point;
class Fraction; class Fraction;
...@@ -36,19 +37,12 @@ class VCL_DLLPUBLIC MapMode ...@@ -36,19 +37,12 @@ class VCL_DLLPUBLIC MapMode
public: public:
struct ImplMapMode; struct ImplMapMode;
private: MapMode();
ImplMapMode* mpImplMapMode; MapMode( const MapMode& rMapMode );
MapMode( MapUnit eUnit );
SAL_DLLPRIVATE void ImplMakeUnique(); MapMode( MapUnit eUnit, const Point& rLogicOrg,
SAL_DLLPRIVATE bool IsSimple() const; const Fraction& rScaleX, const Fraction& rScaleY );
~MapMode();
public:
MapMode();
MapMode( const MapMode& rMapMode );
MapMode( MapUnit eUnit );
MapMode( MapUnit eUnit, const Point& rLogicOrg,
const Fraction& rScaleX, const Fraction& rScaleY );
~MapMode();
void SetMapUnit( MapUnit eUnit ); void SetMapUnit( MapUnit eUnit );
MapUnit GetMapUnit() const; MapUnit GetMapUnit() const;
...@@ -72,6 +66,13 @@ public: ...@@ -72,6 +66,13 @@ public:
friend VCL_DLLPUBLIC SvStream& ReadMapMode( SvStream& rIStm, MapMode& rMapMode ); friend VCL_DLLPUBLIC SvStream& ReadMapMode( SvStream& rIStm, MapMode& rMapMode );
friend VCL_DLLPUBLIC SvStream& WriteMapMode( SvStream& rOStm, const MapMode& rMapMode ); friend VCL_DLLPUBLIC SvStream& WriteMapMode( SvStream& rOStm, const MapMode& rMapMode );
typedef o3tl::cow_wrapper< ImplMapMode > ImplType;
private:
ImplType mpImplMapMode;
SAL_DLLPRIVATE bool IsSimple() const;
}; };
#endif // INCLUDED_VCL_MAPMOD_HXX #endif // INCLUDED_VCL_MAPMOD_HXX
......
...@@ -24,10 +24,10 @@ ...@@ -24,10 +24,10 @@
#include <tools/stream.hxx> #include <tools/stream.hxx>
#include <tools/vcompat.hxx> #include <tools/vcompat.hxx>
#include <tools/debug.hxx> #include <tools/debug.hxx>
#include <rtl/instance.hxx>
struct MapMode::ImplMapMode struct MapMode::ImplMapMode
{ {
sal_uLong mnRefCount;
MapUnit meUnit; MapUnit meUnit;
Point maOrigin; Point maOrigin;
// NOTE: these Fraction must NOT have more than 32 bits precision // NOTE: these Fraction must NOT have more than 32 bits precision
...@@ -38,13 +38,10 @@ struct MapMode::ImplMapMode ...@@ -38,13 +38,10 @@ struct MapMode::ImplMapMode
Fraction maScaleY; Fraction maScaleY;
bool mbSimple; bool mbSimple;
friend SvStream& ReadImplMapMode(SvStream& rIStm, ImplMapMode& rMapMode);
friend SvStream& WriteImplMapMode(SvStream& rOStm, const ImplMapMode& rMapMode);
static ImplMapMode* ImplGetStaticMapMode( MapUnit eUnit );
ImplMapMode(); ImplMapMode();
ImplMapMode(const ImplMapMode& rImpMapMode); ImplMapMode(const ImplMapMode& rImpMapMode);
bool operator==( const ImplMapMode& rImpMapMode ) const;
}; };
MapMode::ImplMapMode::ImplMapMode() : MapMode::ImplMapMode::ImplMapMode() :
...@@ -52,157 +49,81 @@ MapMode::ImplMapMode::ImplMapMode() : ...@@ -52,157 +49,81 @@ MapMode::ImplMapMode::ImplMapMode() :
maScaleX( 1, 1 ), maScaleX( 1, 1 ),
maScaleY( 1, 1 ) maScaleY( 1, 1 )
{ {
mnRefCount = 1;
meUnit = MAP_PIXEL; meUnit = MAP_PIXEL;
mbSimple = false; mbSimple = true;
} }
MapMode::ImplMapMode::ImplMapMode( const ImplMapMode& rImplMapMode ) : MapMode::ImplMapMode::ImplMapMode( const ImplMapMode& rImplMapMode ) :
meUnit( rImplMapMode.meUnit ),
maOrigin( rImplMapMode.maOrigin ), maOrigin( rImplMapMode.maOrigin ),
maScaleX( rImplMapMode.maScaleX ), maScaleX( rImplMapMode.maScaleX ),
maScaleY( rImplMapMode.maScaleY ) maScaleY( rImplMapMode.maScaleY )
{ {
mnRefCount = 1;
meUnit = rImplMapMode.meUnit;
mbSimple = false;
}
SvStream& ReadImplMapMode(SvStream& rIStm, MapMode::ImplMapMode& rImplMapMode)
{
VersionCompat aCompat( rIStm, StreamMode::READ );
sal_uInt16 nTmp16;
rIStm.ReadUInt16( nTmp16 ); rImplMapMode.meUnit = (MapUnit) nTmp16;
ReadPair( rIStm, rImplMapMode.maOrigin );
ReadFraction( rIStm, rImplMapMode.maScaleX );
ReadFraction( rIStm, rImplMapMode.maScaleY );
rIStm.ReadCharAsBool( rImplMapMode.mbSimple );
return rIStm;
} }
SvStream& WriteImplMapMode(SvStream& rOStm, const MapMode::ImplMapMode& rImplMapMode) bool MapMode::ImplMapMode::operator==( const ImplMapMode& rImpMapMode ) const
{ {
VersionCompat aCompat( rOStm, StreamMode::WRITE, 1 ); if (meUnit == rImpMapMode.meUnit
&& maOrigin == rImpMapMode.maOrigin
rOStm.WriteUInt16( rImplMapMode.meUnit ); && maScaleX == rImpMapMode.maScaleX
WritePair( rOStm, rImplMapMode.maOrigin ); && maScaleY == rImpMapMode.maScaleY)
WriteFraction( rOStm, rImplMapMode.maScaleX ); return true;
WriteFraction( rOStm, rImplMapMode.maScaleY ); return false;
rOStm.WriteBool( rImplMapMode.mbSimple );
return rOStm;
}
MapMode::ImplMapMode *
MapMode::ImplMapMode::ImplGetStaticMapMode(MapUnit eUnit)
{
static long aStaticImplMapModeAry[(MAP_LASTENUMDUMMY)*sizeof(ImplMapMode)/sizeof(long)];
// #i19496 check for out-of-bounds
if( eUnit >= MAP_LASTENUMDUMMY )
return reinterpret_cast<ImplMapMode*>(aStaticImplMapModeAry);
ImplMapMode* pImplMapMode = reinterpret_cast<ImplMapMode*>(aStaticImplMapModeAry)+eUnit;
if ( !pImplMapMode->mbSimple )
{
Fraction aDefFraction( 1, 1 );
pImplMapMode->maScaleX = aDefFraction;
pImplMapMode->maScaleY = aDefFraction;
pImplMapMode->meUnit = eUnit;
pImplMapMode->mbSimple = true;
}
return pImplMapMode;
} }
inline void MapMode::ImplMakeUnique() namespace
{ {
// If there are other references, copy struct theGlobalDefault :
if ( mpImplMapMode->mnRefCount != 1 ) public rtl::Static< MapMode::ImplType, theGlobalDefault > {};
{
if ( mpImplMapMode->mnRefCount )
mpImplMapMode->mnRefCount--;
mpImplMapMode = new ImplMapMode( *mpImplMapMode );
}
} }
MapMode::MapMode() MapMode::MapMode() : mpImplMapMode(theGlobalDefault::get())
{ {
mpImplMapMode = ImplMapMode::ImplGetStaticMapMode( MAP_PIXEL );
} }
MapMode::MapMode( const MapMode& rMapMode ) MapMode::MapMode( const MapMode& rMapMode ) : mpImplMapMode( rMapMode.mpImplMapMode )
{ {
DBG_ASSERT( rMapMode.mpImplMapMode->mnRefCount < 0xFFFFFFFE, "MapMode: RefCount overflow" );
// Take over Shared Instance Data and increment refcount
mpImplMapMode = rMapMode.mpImplMapMode;
// RefCount == 0 for static objects
if ( mpImplMapMode->mnRefCount )
mpImplMapMode->mnRefCount++;
} }
MapMode::MapMode( MapUnit eUnit ) MapMode::MapMode( MapUnit eUnit ) : mpImplMapMode()
{ {
mpImplMapMode->meUnit = eUnit;
mpImplMapMode = ImplMapMode::ImplGetStaticMapMode( eUnit );
} }
MapMode::MapMode( MapUnit eUnit, const Point& rLogicOrg, MapMode::MapMode( MapUnit eUnit, const Point& rLogicOrg,
const Fraction& rScaleX, const Fraction& rScaleY ) const Fraction& rScaleX, const Fraction& rScaleY )
{ {
mpImplMapMode = new ImplMapMode;
mpImplMapMode->meUnit = eUnit; mpImplMapMode->meUnit = eUnit;
mpImplMapMode->maOrigin = rLogicOrg; mpImplMapMode->maOrigin = rLogicOrg;
mpImplMapMode->maScaleX = rScaleX; mpImplMapMode->maScaleX = rScaleX;
mpImplMapMode->maScaleY = rScaleY; mpImplMapMode->maScaleY = rScaleY;
mpImplMapMode->maScaleX.ReduceInaccurate(32); mpImplMapMode->maScaleX.ReduceInaccurate(32);
mpImplMapMode->maScaleY.ReduceInaccurate(32); mpImplMapMode->maScaleY.ReduceInaccurate(32);
mpImplMapMode->mbSimple = false;
} }
MapMode::~MapMode() MapMode::~MapMode()
{ {
// If it's not static ImpData and it's the last reference, delete it,
// else decrement refcounter
if ( mpImplMapMode->mnRefCount )
{
if ( mpImplMapMode->mnRefCount == 1 )
delete mpImplMapMode;
else
mpImplMapMode->mnRefCount--;
}
} }
void MapMode::SetMapUnit( MapUnit eUnit ) void MapMode::SetMapUnit( MapUnit eUnit )
{ {
ImplMakeUnique();
mpImplMapMode->meUnit = eUnit; mpImplMapMode->meUnit = eUnit;
} }
void MapMode::SetOrigin( const Point& rLogicOrg ) void MapMode::SetOrigin( const Point& rLogicOrg )
{ {
ImplMakeUnique();
mpImplMapMode->maOrigin = rLogicOrg; mpImplMapMode->maOrigin = rLogicOrg;
} }
void MapMode::SetScaleX( const Fraction& rScaleX ) void MapMode::SetScaleX( const Fraction& rScaleX )
{ {
ImplMakeUnique();
mpImplMapMode->maScaleX = rScaleX; mpImplMapMode->maScaleX = rScaleX;
mpImplMapMode->maScaleX.ReduceInaccurate(32); mpImplMapMode->maScaleX.ReduceInaccurate(32);
} }
void MapMode::SetScaleY( const Fraction& rScaleY ) void MapMode::SetScaleY( const Fraction& rScaleY )
{ {
ImplMakeUnique();
mpImplMapMode->maScaleY = rScaleY; mpImplMapMode->maScaleY = rScaleY;
mpImplMapMode->maScaleY.ReduceInaccurate(32); mpImplMapMode->maScaleY.ReduceInaccurate(32);
} }
...@@ -255,68 +176,45 @@ double MapMode::GetUnitMultiplier() const ...@@ -255,68 +176,45 @@ double MapMode::GetUnitMultiplier() const
MapMode& MapMode::operator=( const MapMode& rMapMode ) MapMode& MapMode::operator=( const MapMode& rMapMode )
{ {
DBG_ASSERT( rMapMode.mpImplMapMode->mnRefCount < 0xFFFFFFFE, "MapMode: RefCount overflow" );
// First increment refcount so that we can reference ourselves
// RefCount == 0 for static objects
if ( rMapMode.mpImplMapMode->mnRefCount )
rMapMode.mpImplMapMode->mnRefCount++;
// If it's not static ImpData and it's the last reference, delete it,
// else decrement refcounter
if ( mpImplMapMode->mnRefCount )
{
if ( mpImplMapMode->mnRefCount == 1 )
delete mpImplMapMode;
else
mpImplMapMode->mnRefCount--;
}
mpImplMapMode = rMapMode.mpImplMapMode; mpImplMapMode = rMapMode.mpImplMapMode;
return *this; return *this;
} }
bool MapMode::operator==( const MapMode& rMapMode ) const bool MapMode::operator==( const MapMode& rMapMode ) const
{ {
return mpImplMapMode == rMapMode.mpImplMapMode;
if ( mpImplMapMode == rMapMode.mpImplMapMode )
return true;
if ( (mpImplMapMode->meUnit == rMapMode.mpImplMapMode->meUnit) &&
(mpImplMapMode->maOrigin == rMapMode.mpImplMapMode->maOrigin) &&
(mpImplMapMode->maScaleX == rMapMode.mpImplMapMode->maScaleX) &&
(mpImplMapMode->maScaleY == rMapMode.mpImplMapMode->maScaleY) )
return true;
else
return false;
} }
bool MapMode::IsDefault() const bool MapMode::IsDefault() const
{ {
return mpImplMapMode.same_object(theGlobalDefault::get());
ImplMapMode* pDefMapMode = ImplMapMode::ImplGetStaticMapMode( MAP_PIXEL );
if ( mpImplMapMode == pDefMapMode )
return true;
if ( (mpImplMapMode->meUnit == pDefMapMode->meUnit) &&
(mpImplMapMode->maOrigin == pDefMapMode->maOrigin) &&
(mpImplMapMode->maScaleX == pDefMapMode->maScaleX) &&
(mpImplMapMode->maScaleY == pDefMapMode->maScaleY) )
return true;
else
return false;
} }
SvStream& ReadMapMode( SvStream& rIStm, MapMode& rMapMode ) SvStream& ReadMapMode( SvStream& rIStm, MapMode& rMapMode )
{ {
rMapMode.ImplMakeUnique(); VersionCompat aCompat( rIStm, StreamMode::READ );
return ReadImplMapMode( rIStm, *rMapMode.mpImplMapMode ); sal_uInt16 nTmp16;
rIStm.ReadUInt16( nTmp16 ); rMapMode.mpImplMapMode->meUnit = (MapUnit) nTmp16;
ReadPair( rIStm, rMapMode.mpImplMapMode->maOrigin );
ReadFraction( rIStm, rMapMode.mpImplMapMode->maScaleX );
ReadFraction( rIStm, rMapMode.mpImplMapMode->maScaleY );
rIStm.ReadCharAsBool( rMapMode.mpImplMapMode->mbSimple );
return rIStm;
} }
SvStream& WriteMapMode( SvStream& rOStm, const MapMode& rMapMode ) SvStream& WriteMapMode( SvStream& rOStm, const MapMode& rMapMode )
{ {
return WriteImplMapMode( rOStm, *rMapMode.mpImplMapMode ); VersionCompat aCompat( rOStm, StreamMode::WRITE, 1 );
rOStm.WriteUInt16( rMapMode.mpImplMapMode->meUnit );
WritePair( rOStm, rMapMode.mpImplMapMode->maOrigin );
WriteFraction( rOStm, rMapMode.mpImplMapMode->maScaleX );
WriteFraction( rOStm, rMapMode.mpImplMapMode->maScaleY );
rOStm.WriteBool( rMapMode.mpImplMapMode->mbSimple );
return rOStm;
} }
......
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