summaryrefslogtreecommitdiff
path: root/basegfx
diff options
context:
space:
mode:
authorArmin Le Grand <Armin.Le.Grand@cib.de>2018-09-06 18:15:02 +0200
committerArmin Le Grand <Armin.Le.Grand@cib.de>2018-09-13 08:49:35 +0200
commit7034311dce663c895577267110baadbec312d491 (patch)
tree8c1d712cbfb1b15dc492e6e724b6b22892914249 /basegfx
parentd92b0efe58b77247e1e5292c1a989baa934df797 (diff)
Support buffering SystemDependent GraphicData (II)
In this step I have changed all calls that use a B2DPolyPolygon and do filled graphics, added support for providing needed transformation which will -if supported- be used. Added buffering of SystemDependentData at B2DPolyPolygon for that purpose, see comments describing the current possibilities in the Gdiplus implementation. Moved lifetime creation/cleanup of SystemDependentDataManager to ImplSVData due to cleanup problems in the clang build Tried to use a std::unique_ptr to hold the instance of a SystemDependentDataBuffer at ImplSVData and cleanup inside DeInitVCL() right before ::ImplDeInitScheduler. This works in principle, but scheduler shutdown triggers ProcessEventsToIdle which leads to repaints and re-creates the buffer. Will now do exactly as was done with GdiPlusBuffer before, a simple local static incarnation and a call to SetStatic() in constructor Splitted SystemDependentDataBuffer and Timer due to different LifeTimes. Timer needs to be destructed earlier than SystemDependentDataBuffer, before Scheduler::ImplDeInitScheduler() is called from DeInitVCL() Change-Id: I2134e4346a183a4cee1be3428c51541cc8867c11 Reviewed-on: https://gerrit.libreoffice.org/60102 Tested-by: Jenkins Reviewed-by: Armin Le Grand <Armin.Le.Grand@cib.de>
Diffstat (limited to 'basegfx')
-rw-r--r--basegfx/source/polygon/b2dpolygon.cxx3
-rw-r--r--basegfx/source/polygon/b2dpolypolygon.cxx69
2 files changed, 66 insertions, 6 deletions
diff --git a/basegfx/source/polygon/b2dpolygon.cxx b/basegfx/source/polygon/b2dpolygon.cxx
index c94f262d6600..3638424a52e4 100644
--- a/basegfx/source/polygon/b2dpolygon.cxx
+++ b/basegfx/source/polygon/b2dpolygon.cxx
@@ -467,7 +467,8 @@ private:
public:
ImplBufferedData()
- : mpDefaultSubdivision(),
+ : basegfx::SystemDependentDataHolder(),
+ mpDefaultSubdivision(),
mpB2DRange()
{
}
diff --git a/basegfx/source/polygon/b2dpolypolygon.cxx b/basegfx/source/polygon/b2dpolypolygon.cxx
index a1ac5301c178..0901eafee63b 100644
--- a/basegfx/source/polygon/b2dpolypolygon.cxx
+++ b/basegfx/source/polygon/b2dpolypolygon.cxx
@@ -22,22 +22,63 @@
#include <basegfx/polygon/b2dpolygon.hxx>
#include <basegfx/polygon/b2dpolypolygontools.hxx>
#include <basegfx/matrix/b2dhommatrix.hxx>
-
+#include <basegfx/utils/systemdependentdata.hxx>
#include <functional>
#include <algorithm>
class ImplB2DPolyPolygon
{
- basegfx::B2DPolygonVector maPolygons;
+ basegfx::B2DPolygonVector maPolygons;
+ std::unique_ptr< basegfx::SystemDependentDataHolder > mpSystemDependentDataHolder;
public:
- ImplB2DPolyPolygon() : maPolygons()
+ ImplB2DPolyPolygon()
+ : maPolygons(),
+ mpSystemDependentDataHolder()
+ {
+ }
+
+ explicit ImplB2DPolyPolygon(const ImplB2DPolyPolygon& rSource)
+ : maPolygons(rSource.maPolygons),
+ mpSystemDependentDataHolder()
+ {
+ }
+
+ explicit ImplB2DPolyPolygon(const basegfx::B2DPolygon& rToBeCopied)
+ : maPolygons(1,rToBeCopied),
+ mpSystemDependentDataHolder()
+ {
+ }
+
+ ImplB2DPolyPolygon& operator=(const ImplB2DPolyPolygon& rSource)
+ {
+ if (this != &rSource)
+ {
+ maPolygons = rSource.maPolygons;
+ mpSystemDependentDataHolder.reset();
+ }
+
+ return *this;
+ }
+
+ void addOrReplaceSystemDependentData(basegfx::SystemDependentData_SharedPtr& rData)
{
+ if(!mpSystemDependentDataHolder)
+ {
+ mpSystemDependentDataHolder.reset(new basegfx::SystemDependentDataHolder());
+ }
+
+ mpSystemDependentDataHolder->addOrReplaceSystemDependentData(rData);
}
- explicit ImplB2DPolyPolygon(const basegfx::B2DPolygon& rToBeCopied) :
- maPolygons(1,rToBeCopied)
+ basegfx::SystemDependentData_SharedPtr getSystemDependentData(size_t hash_code) const
{
+ if(!mpSystemDependentDataHolder)
+ {
+ return basegfx::SystemDependentData_SharedPtr();
+ }
+
+ return mpSystemDependentDataHolder->getSystemDependentData(hash_code);
}
bool operator==(const ImplB2DPolyPolygon& rPolygonList) const
@@ -385,6 +426,24 @@ namespace basegfx
{
return mpPolyPolygon->end();
}
+
+ void B2DPolyPolygon::addOrReplaceSystemDependentDataInternal(SystemDependentData_SharedPtr& rData) const
+ {
+ // Need to get ImplB2DPolyPolygon* from cow_wrapper *without*
+ // calling make_unique() here - we do not want to
+ // 'modify' the ImplB2DPolyPolygon, but add buffered data that
+ // is valid for all referencing instances
+ const B2DPolyPolygon* pMe(this);
+ const ImplB2DPolyPolygon* pMyImpl(pMe->mpPolyPolygon.get());
+
+ const_cast<ImplB2DPolyPolygon*>(pMyImpl)->addOrReplaceSystemDependentData(rData);
+ }
+
+ SystemDependentData_SharedPtr B2DPolyPolygon::getSystemDependantDataInternal(size_t hash_code) const
+ {
+ return mpPolyPolygon->getSystemDependentData(hash_code);
+ }
+
} // end of namespace basegfx
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */