summaryrefslogtreecommitdiff
path: root/drawinglayer/source
diff options
context:
space:
mode:
authorNoel Grandin <noelgrandin@gmail.com>2024-02-04 13:15:01 +0200
committerNoel Grandin <noel.grandin@collabora.co.uk>2024-02-12 11:36:05 +0100
commit3b83c6ac804cf7adcea036d1fb7dda113a72f457 (patch)
tree8f1af5f06f236a1dcb9ca313f3dedd3aa8c16390 /drawinglayer/source
parent582ef812702413dbe7fb0f132bca3e3e4c2e1d40 (diff)
make BufferedDecompositionPrimitive2D store a Primitive2DReference..
.. instead of a Primitive2DContainer. The container very frequently contains only a single item, since the decomposition method often sticks only a single top-level node in there, so it turns out to be a net loss overall, memory consumption-wise. Also, if we return a single Primitive2DReference from a BufferedDecomposition, that maximises the sharing of data between the BufferedDecomposition objects at the bottom of the decomposed tree, and objects higher up. Change-Id: Iaf272e60e2997299cc35a1bd209c51b6b79e9a8b Reviewed-on: https://gerrit.libreoffice.org/c/core/+/162976 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Diffstat (limited to 'drawinglayer/source')
-rw-r--r--drawinglayer/source/primitive2d/BufferedDecompositionPrimitive2D.cxx17
-rw-r--r--drawinglayer/source/primitive2d/PolyPolygonGradientPrimitive2D.cxx7
-rw-r--r--drawinglayer/source/primitive2d/PolyPolygonGraphicPrimitive2D.cxx12
-rw-r--r--drawinglayer/source/primitive2d/PolyPolygonHairlinePrimitive2D.cxx9
-rw-r--r--drawinglayer/source/primitive2d/PolyPolygonHatchPrimitive2D.cxx7
-rw-r--r--drawinglayer/source/primitive2d/PolyPolygonMarkerPrimitive2D.cxx9
-rw-r--r--drawinglayer/source/primitive2d/PolyPolygonSelectionPrimitive2D.cxx8
-rw-r--r--drawinglayer/source/primitive2d/PolyPolygonStrokePrimitive2D.cxx9
-rw-r--r--drawinglayer/source/primitive2d/backgroundcolorprimitive2d.cxx14
-rw-r--r--drawinglayer/source/primitive2d/borderlineprimitive2d.cxx17
-rw-r--r--drawinglayer/source/primitive2d/controlprimitive2d.cxx10
-rw-r--r--drawinglayer/source/primitive2d/discretebitmapprimitive2d.cxx8
-rw-r--r--drawinglayer/source/primitive2d/discreteshadowprimitive2d.cxx8
-rw-r--r--drawinglayer/source/primitive2d/embedded3dprimitive2d.cxx4
-rw-r--r--drawinglayer/source/primitive2d/epsprimitive2d.cxx7
-rw-r--r--drawinglayer/source/primitive2d/fillgradientprimitive2d.cxx28
-rw-r--r--drawinglayer/source/primitive2d/fillgraphicprimitive2d.cxx14
-rw-r--r--drawinglayer/source/primitive2d/fillhatchprimitive2d.cxx12
-rw-r--r--drawinglayer/source/primitive2d/graphicprimitive2d.cxx12
-rw-r--r--drawinglayer/source/primitive2d/gridprimitive2d.cxx23
-rw-r--r--drawinglayer/source/primitive2d/helplineprimitive2d.cxx24
-rw-r--r--drawinglayer/source/primitive2d/markerarrayprimitive2d.cxx11
-rw-r--r--drawinglayer/source/primitive2d/mediaprimitive2d.cxx4
-rw-r--r--drawinglayer/source/primitive2d/metafileprimitive2d.cxx8
-rw-r--r--drawinglayer/source/primitive2d/pagepreviewprimitive2d.cxx8
-rw-r--r--drawinglayer/source/primitive2d/patternfillprimitive2d.cxx14
-rw-r--r--drawinglayer/source/primitive2d/polygonprimitive2d.cxx60
-rw-r--r--drawinglayer/source/primitive2d/primitivetools2d.cxx28
-rw-r--r--drawinglayer/source/primitive2d/sceneprimitive2d.cxx23
-rw-r--r--drawinglayer/source/primitive2d/svggradientprimitive2d.cxx50
-rw-r--r--drawinglayer/source/primitive2d/textdecoratedprimitive2d.cxx134
-rw-r--r--drawinglayer/source/primitive2d/texteffectprimitive2d.cxx39
-rw-r--r--drawinglayer/source/primitive2d/textlineprimitive2d.cxx16
-rw-r--r--drawinglayer/source/primitive2d/textprimitive2d.cxx17
-rw-r--r--drawinglayer/source/primitive2d/textstrikeoutprimitive2d.cxx17
-rw-r--r--drawinglayer/source/primitive2d/wallpaperprimitive2d.cxx9
-rw-r--r--drawinglayer/source/primitive2d/wrongspellprimitive2d.cxx4
-rw-r--r--drawinglayer/source/processor2d/baseprocessor2d.cxx3
-rw-r--r--drawinglayer/source/tools/wmfemfhelper.cxx8
39 files changed, 385 insertions, 327 deletions
diff --git a/drawinglayer/source/primitive2d/BufferedDecompositionPrimitive2D.cxx b/drawinglayer/source/primitive2d/BufferedDecompositionPrimitive2D.cxx
index 92d32a4dd73a..61eb34251913 100644
--- a/drawinglayer/source/primitive2d/BufferedDecompositionPrimitive2D.cxx
+++ b/drawinglayer/source/primitive2d/BufferedDecompositionPrimitive2D.cxx
@@ -53,10 +53,10 @@ namespace drawinglayer::primitive2d
{
void flushBufferedDecomposition(BufferedDecompositionPrimitive2D& rTarget)
{
- rTarget.setBuffered2DDecomposition(Primitive2DContainer());
+ rTarget.setBuffered2DDecomposition(nullptr);
}
-const Primitive2DContainer& BufferedDecompositionPrimitive2D::getBuffered2DDecomposition() const
+const Primitive2DReference& BufferedDecompositionPrimitive2D::getBuffered2DDecomposition() const
{
if (0 != maCallbackSeconds && maCallbackTimer.is())
{
@@ -67,7 +67,7 @@ const Primitive2DContainer& BufferedDecompositionPrimitive2D::getBuffered2DDecom
return maBuffered2DDecomposition;
}
-void BufferedDecompositionPrimitive2D::setBuffered2DDecomposition(Primitive2DContainer&& rNew)
+void BufferedDecompositionPrimitive2D::setBuffered2DDecomposition(Primitive2DReference rNew)
{
if (0 == maCallbackSeconds)
{
@@ -78,7 +78,7 @@ void BufferedDecompositionPrimitive2D::setBuffered2DDecomposition(Primitive2DCon
if (maCallbackTimer.is())
{
- if (rNew.empty())
+ if (!rNew)
{
// stop timer
maCallbackTimer->stop();
@@ -91,7 +91,7 @@ void BufferedDecompositionPrimitive2D::setBuffered2DDecomposition(Primitive2DCon
maCallbackTimer->start();
}
}
- else if (!rNew.empty())
+ else if (rNew)
{
// decomposition defined/set/changed, init & start timer
maCallbackTimer.set(new LocalCallbackTimer(*this));
@@ -126,12 +126,11 @@ void BufferedDecompositionPrimitive2D::get2DDecomposition(
Primitive2DDecompositionVisitor& rVisitor,
const geometry::ViewInformation2D& rViewInformation) const
{
- if (getBuffered2DDecomposition().empty())
+ if (!getBuffered2DDecomposition())
{
- Primitive2DContainer aNewSequence;
- create2DDecomposition(aNewSequence, rViewInformation);
+ Primitive2DReference aNew = create2DDecomposition(rViewInformation);
const_cast<BufferedDecompositionPrimitive2D*>(this)->setBuffered2DDecomposition(
- std::move(aNewSequence));
+ std::move(aNew));
}
if (0 == maCallbackSeconds)
diff --git a/drawinglayer/source/primitive2d/PolyPolygonGradientPrimitive2D.cxx b/drawinglayer/source/primitive2d/PolyPolygonGradientPrimitive2D.cxx
index c6e700f28fe3..4fe3321e62f8 100644
--- a/drawinglayer/source/primitive2d/PolyPolygonGradientPrimitive2D.cxx
+++ b/drawinglayer/source/primitive2d/PolyPolygonGradientPrimitive2D.cxx
@@ -29,8 +29,8 @@ using namespace com::sun::star;
namespace drawinglayer::primitive2d
{
-void PolyPolygonGradientPrimitive2D::create2DDecomposition(
- Primitive2DContainer& rContainer, const geometry::ViewInformation2D& /*rViewInformation*/) const
+Primitive2DReference PolyPolygonGradientPrimitive2D::create2DDecomposition(
+ const geometry::ViewInformation2D& /*rViewInformation*/) const
{
if (!getFillGradient().isDefault())
{
@@ -41,8 +41,9 @@ void PolyPolygonGradientPrimitive2D::create2DDecomposition(
Primitive2DContainer aSubSequence{ pNewGradient };
// create mask primitive
- rContainer.push_back(new MaskPrimitive2D(getB2DPolyPolygon(), std::move(aSubSequence)));
+ return new MaskPrimitive2D(getB2DPolyPolygon(), std::move(aSubSequence));
}
+ return nullptr;
}
PolyPolygonGradientPrimitive2D::PolyPolygonGradientPrimitive2D(
diff --git a/drawinglayer/source/primitive2d/PolyPolygonGraphicPrimitive2D.cxx b/drawinglayer/source/primitive2d/PolyPolygonGraphicPrimitive2D.cxx
index 328e98896240..31a7acb03d7c 100644
--- a/drawinglayer/source/primitive2d/PolyPolygonGraphicPrimitive2D.cxx
+++ b/drawinglayer/source/primitive2d/PolyPolygonGraphicPrimitive2D.cxx
@@ -31,24 +31,24 @@ using namespace com::sun::star;
namespace drawinglayer::primitive2d
{
-void PolyPolygonGraphicPrimitive2D::create2DDecomposition(
- Primitive2DContainer& rContainer, const geometry::ViewInformation2D& /*rViewInformation*/) const
+Primitive2DReference PolyPolygonGraphicPrimitive2D::create2DDecomposition(
+ const geometry::ViewInformation2D& /*rViewInformation*/) const
{
if (getFillGraphic().isDefault())
- return;
+ return nullptr;
const Graphic& rGraphic = getFillGraphic().getGraphic();
const GraphicType aType(rGraphic.GetType());
// is there a bitmap or a metafile (do we have content)?
if (GraphicType::Bitmap != aType && GraphicType::GdiMetafile != aType)
- return;
+ return nullptr;
const Size aPrefSize(rGraphic.GetPrefSize());
// does content have a size?
if (!(aPrefSize.Width() && aPrefSize.Height()))
- return;
+ return nullptr;
// create SubSequence with FillGraphicPrimitive2D based on polygon range
const basegfx::B2DRange aOutRange(getB2DPolyPolygon().getB2DRange());
@@ -93,7 +93,7 @@ void PolyPolygonGraphicPrimitive2D::create2DDecomposition(
}
// embed to mask primitive
- rContainer.push_back(new MaskPrimitive2D(getB2DPolyPolygon(), Primitive2DContainer{ xSubRef }));
+ return new MaskPrimitive2D(getB2DPolyPolygon(), Primitive2DContainer{ xSubRef });
}
PolyPolygonGraphicPrimitive2D::PolyPolygonGraphicPrimitive2D(
diff --git a/drawinglayer/source/primitive2d/PolyPolygonHairlinePrimitive2D.cxx b/drawinglayer/source/primitive2d/PolyPolygonHairlinePrimitive2D.cxx
index 8f6ad15abb9e..88b15160e2c0 100644
--- a/drawinglayer/source/primitive2d/PolyPolygonHairlinePrimitive2D.cxx
+++ b/drawinglayer/source/primitive2d/PolyPolygonHairlinePrimitive2D.cxx
@@ -19,6 +19,7 @@
#include <drawinglayer/primitive2d/PolyPolygonHairlinePrimitive2D.hxx>
#include <drawinglayer/primitive2d/PolygonHairlinePrimitive2D.hxx>
+#include <drawinglayer/primitive2d/groupprimitive2d.hxx>
#include <basegfx/polygon/b2dpolypolygontools.hxx>
#include <drawinglayer/primitive2d/drawinglayer_primitivetypes2d.hxx>
@@ -28,17 +29,19 @@ using namespace com::sun::star;
namespace drawinglayer::primitive2d
{
-void PolyPolygonHairlinePrimitive2D::create2DDecomposition(
- Primitive2DContainer& rContainer, const geometry::ViewInformation2D& /*rViewInformation*/) const
+Primitive2DReference PolyPolygonHairlinePrimitive2D::create2DDecomposition(
+ const geometry::ViewInformation2D& /*rViewInformation*/) const
{
const basegfx::B2DPolyPolygon aPolyPolygon(getB2DPolyPolygon());
const sal_uInt32 nCount(aPolyPolygon.count());
+ Primitive2DContainer aContainer;
for (sal_uInt32 a(0); a < nCount; a++)
{
- rContainer.push_back(
+ aContainer.push_back(
new PolygonHairlinePrimitive2D(aPolyPolygon.getB2DPolygon(a), getBColor()));
}
+ return new GroupPrimitive2D(std::move(aContainer));
}
PolyPolygonHairlinePrimitive2D::PolyPolygonHairlinePrimitive2D(basegfx::B2DPolyPolygon aPolyPolygon,
diff --git a/drawinglayer/source/primitive2d/PolyPolygonHatchPrimitive2D.cxx b/drawinglayer/source/primitive2d/PolyPolygonHatchPrimitive2D.cxx
index 79fcd78cc99b..2379e54e3de8 100644
--- a/drawinglayer/source/primitive2d/PolyPolygonHatchPrimitive2D.cxx
+++ b/drawinglayer/source/primitive2d/PolyPolygonHatchPrimitive2D.cxx
@@ -29,8 +29,8 @@ using namespace com::sun::star;
namespace drawinglayer::primitive2d
{
-void PolyPolygonHatchPrimitive2D::create2DDecomposition(
- Primitive2DContainer& rContainer, const geometry::ViewInformation2D& /*rViewInformation*/) const
+Primitive2DReference PolyPolygonHatchPrimitive2D::create2DDecomposition(
+ const geometry::ViewInformation2D& /*rViewInformation*/) const
{
if (!getFillHatch().isDefault())
{
@@ -41,8 +41,9 @@ void PolyPolygonHatchPrimitive2D::create2DDecomposition(
Primitive2DContainer aSubSequence{ pNewHatch };
// create mask primitive
- rContainer.push_back(new MaskPrimitive2D(getB2DPolyPolygon(), std::move(aSubSequence)));
+ return new MaskPrimitive2D(getB2DPolyPolygon(), std::move(aSubSequence));
}
+ return nullptr;
}
PolyPolygonHatchPrimitive2D::PolyPolygonHatchPrimitive2D(
diff --git a/drawinglayer/source/primitive2d/PolyPolygonMarkerPrimitive2D.cxx b/drawinglayer/source/primitive2d/PolyPolygonMarkerPrimitive2D.cxx
index a8ee5e5d25de..9c9e3b1ae81f 100644
--- a/drawinglayer/source/primitive2d/PolyPolygonMarkerPrimitive2D.cxx
+++ b/drawinglayer/source/primitive2d/PolyPolygonMarkerPrimitive2D.cxx
@@ -19,6 +19,7 @@
#include <drawinglayer/primitive2d/PolyPolygonMarkerPrimitive2D.hxx>
#include <drawinglayer/primitive2d/PolygonMarkerPrimitive2D.hxx>
+#include <drawinglayer/primitive2d/groupprimitive2d.hxx>
#include <basegfx/polygon/b2dpolypolygontools.hxx>
#include <drawinglayer/primitive2d/drawinglayer_primitivetypes2d.hxx>
@@ -28,18 +29,20 @@ using namespace com::sun::star;
namespace drawinglayer::primitive2d
{
-void PolyPolygonMarkerPrimitive2D::create2DDecomposition(
- Primitive2DContainer& rContainer, const geometry::ViewInformation2D& /*rViewInformation*/) const
+Primitive2DReference PolyPolygonMarkerPrimitive2D::create2DDecomposition(
+ const geometry::ViewInformation2D& /*rViewInformation*/) const
{
const basegfx::B2DPolyPolygon aPolyPolygon(getB2DPolyPolygon());
const sal_uInt32 nCount(aPolyPolygon.count());
+ Primitive2DContainer aContainer;
for (sal_uInt32 a(0); a < nCount; a++)
{
- rContainer.push_back(new PolygonMarkerPrimitive2D(aPolyPolygon.getB2DPolygon(a),
+ aContainer.push_back(new PolygonMarkerPrimitive2D(aPolyPolygon.getB2DPolygon(a),
getRGBColorA(), getRGBColorB(),
getDiscreteDashLength()));
}
+ return new GroupPrimitive2D(std::move(aContainer));
}
PolyPolygonMarkerPrimitive2D::PolyPolygonMarkerPrimitive2D(basegfx::B2DPolyPolygon aPolyPolygon,
diff --git a/drawinglayer/source/primitive2d/PolyPolygonSelectionPrimitive2D.cxx b/drawinglayer/source/primitive2d/PolyPolygonSelectionPrimitive2D.cxx
index 3da2116fc2a8..a5595a4bcaeb 100644
--- a/drawinglayer/source/primitive2d/PolyPolygonSelectionPrimitive2D.cxx
+++ b/drawinglayer/source/primitive2d/PolyPolygonSelectionPrimitive2D.cxx
@@ -31,11 +31,11 @@ using namespace com::sun::star;
namespace drawinglayer::primitive2d
{
-void PolyPolygonSelectionPrimitive2D::create2DDecomposition(
- Primitive2DContainer& rContainer, const geometry::ViewInformation2D& /*rViewInformation*/) const
+Primitive2DReference PolyPolygonSelectionPrimitive2D::create2DDecomposition(
+ const geometry::ViewInformation2D& /*rViewInformation*/) const
{
if (getTransparence() >= 1.0 || !getB2DPolyPolygon().count())
- return;
+ return nullptr;
Primitive2DContainer aRetval;
@@ -67,7 +67,7 @@ void PolyPolygonSelectionPrimitive2D::create2DDecomposition(
aRetval = Primitive2DContainer{ aTrans };
}
- rContainer.append(std::move(aRetval));
+ return new GroupPrimitive2D(std::move(aRetval));
}
PolyPolygonSelectionPrimitive2D::PolyPolygonSelectionPrimitive2D(
diff --git a/drawinglayer/source/primitive2d/PolyPolygonStrokePrimitive2D.cxx b/drawinglayer/source/primitive2d/PolyPolygonStrokePrimitive2D.cxx
index 2ee13898711e..9c32d8853d8d 100644
--- a/drawinglayer/source/primitive2d/PolyPolygonStrokePrimitive2D.cxx
+++ b/drawinglayer/source/primitive2d/PolyPolygonStrokePrimitive2D.cxx
@@ -22,23 +22,26 @@
#include <basegfx/polygon/b2dpolypolygontools.hxx>
#include <drawinglayer/primitive2d/drawinglayer_primitivetypes2d.hxx>
#include <drawinglayer/primitive2d/PolygonStrokePrimitive2D.hxx>
+#include <drawinglayer/primitive2d/groupprimitive2d.hxx>
#include <utility>
using namespace com::sun::star;
namespace drawinglayer::primitive2d
{
-void PolyPolygonStrokePrimitive2D::create2DDecomposition(
- Primitive2DContainer& rContainer, const geometry::ViewInformation2D& /*rViewInformation*/) const
+Primitive2DReference PolyPolygonStrokePrimitive2D::create2DDecomposition(
+ const geometry::ViewInformation2D& /*rViewInformation*/) const
{
const basegfx::B2DPolyPolygon aPolyPolygon(getB2DPolyPolygon());
const sal_uInt32 nCount(aPolyPolygon.count());
+ Primitive2DContainer aContainer;
for (sal_uInt32 a(0); a < nCount; a++)
{
- rContainer.push_back(new PolygonStrokePrimitive2D(
+ aContainer.push_back(new PolygonStrokePrimitive2D(
aPolyPolygon.getB2DPolygon(a), getLineAttribute(), getStrokeAttribute()));
}
+ return new GroupPrimitive2D(std::move(aContainer));
}
PolyPolygonStrokePrimitive2D::PolyPolygonStrokePrimitive2D(
diff --git a/drawinglayer/source/primitive2d/backgroundcolorprimitive2d.cxx b/drawinglayer/source/primitive2d/backgroundcolorprimitive2d.cxx
index c3759be5b918..ea1b2a56942a 100644
--- a/drawinglayer/source/primitive2d/backgroundcolorprimitive2d.cxx
+++ b/drawinglayer/source/primitive2d/backgroundcolorprimitive2d.cxx
@@ -31,15 +31,15 @@ using namespace com::sun::star;
namespace drawinglayer::primitive2d
{
- void BackgroundColorPrimitive2D::create2DDecomposition(Primitive2DContainer& rContainer, const geometry::ViewInformation2D& rViewInformation) const
+ Primitive2DReference BackgroundColorPrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& rViewInformation) const
{
// transparency invalid or completely transparent, done
if(getTransparency() < 0.0 || getTransparency() >= 1.0)
- return;
+ return nullptr;
// no viewport, not visible, done
if(rViewInformation.getViewport().isEmpty())
- return;
+ return nullptr;
// create decompose geometry
const basegfx::B2DPolygon aOutline(basegfx::utils::createPolygonFromRect(rViewInformation.getViewport()));
@@ -55,7 +55,7 @@ namespace drawinglayer::primitive2d
getTransparency());
}
- rContainer.push_back(aDecompose);
+ return aDecompose;
}
BackgroundColorPrimitive2D::BackgroundColorPrimitive2D(
@@ -86,13 +86,13 @@ namespace drawinglayer::primitive2d
void BackgroundColorPrimitive2D::get2DDecomposition(Primitive2DDecompositionVisitor& rVisitor, const geometry::ViewInformation2D& rViewInformation) const
{
- if(!getBuffered2DDecomposition().empty() && (maLastViewport != rViewInformation.getViewport()))
+ if(getBuffered2DDecomposition() && (maLastViewport != rViewInformation.getViewport()))
{
// conditions of last local decomposition have changed, delete
- const_cast< BackgroundColorPrimitive2D* >(this)->setBuffered2DDecomposition(Primitive2DContainer());
+ const_cast< BackgroundColorPrimitive2D* >(this)->setBuffered2DDecomposition(nullptr);
}
- if(getBuffered2DDecomposition().empty())
+ if(!getBuffered2DDecomposition())
{
// remember ViewRange
const_cast< BackgroundColorPrimitive2D* >(this)->maLastViewport = rViewInformation.getViewport();
diff --git a/drawinglayer/source/primitive2d/borderlineprimitive2d.cxx b/drawinglayer/source/primitive2d/borderlineprimitive2d.cxx
index 68eed1864828..3ea94f1aefbb 100644
--- a/drawinglayer/source/primitive2d/borderlineprimitive2d.cxx
+++ b/drawinglayer/source/primitive2d/borderlineprimitive2d.cxx
@@ -23,6 +23,7 @@
#include <basegfx/polygon/b2dpolygon.hxx>
#include <drawinglayer/primitive2d/PolyPolygonColorPrimitive2D.hxx>
#include <drawinglayer/primitive2d/PolygonStrokePrimitive2D.hxx>
+#include <drawinglayer/primitive2d/groupprimitive2d.hxx>
#include <rtl/math.hxx>
#include <algorithm>
@@ -113,10 +114,10 @@ namespace drawinglayer::primitive2d
return fRetval;
}
- void BorderLinePrimitive2D::create2DDecomposition(Primitive2DContainer& rContainer, const geometry::ViewInformation2D& /*rViewInformation*/) const
+ Primitive2DReference BorderLinePrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& /*rViewInformation*/) const
{
if (getStart().equal(getEnd()) || getBorderLines().empty())
- return;
+ return nullptr;
// get data and vectors
basegfx::B2DVector aVector(getEnd() - getStart());
@@ -125,6 +126,7 @@ namespace drawinglayer::primitive2d
const double fFullWidth(getFullWidth());
double fOffset(fFullWidth * -0.5);
+ Primitive2DContainer aContainer;
for(const auto& candidate : maBorderLines)
{
const double fWidth(candidate.getLineAttribute().getWidth());
@@ -142,7 +144,7 @@ namespace drawinglayer::primitive2d
// start and end extends lead to an edge perpendicular to the line, so we can just use
// a PolygonStrokePrimitive2D for representation
addPolygonStrokePrimitive2D(
- rContainer,
+ aContainer,
aStart - (aVector * candidate.getStartLeft()),
aEnd + (aVector * candidate.getEndLeft()),
candidate.getLineAttribute(),
@@ -163,7 +165,7 @@ namespace drawinglayer::primitive2d
aPolygon.append(aEnd + aHalfLineOffset + (aVector * candidate.getEndRight()));
aPolygon.append(aStart + aHalfLineOffset - (aVector * candidate.getStartRight()));
- rContainer.push_back(
+ aContainer.push_back(
new PolyPolygonColorPrimitive2D(
basegfx::B2DPolyPolygon(aPolygon),
candidate.getLineAttribute().getColor()));
@@ -198,7 +200,7 @@ namespace drawinglayer::primitive2d
aPolygon.append(aStart + aHalfLineOffset - (aVector * candidate.getStartRight()));
}
- rContainer.push_back(
+ aContainer.push_back(
new PolyPolygonColorPrimitive2D(
basegfx::B2DPolyPolygon(aPolygon),
candidate.getLineAttribute().getColor()));
@@ -227,7 +229,7 @@ namespace drawinglayer::primitive2d
aPolygon.append(aEnd + aHalfLineOffset + (aVector * fMin));
aPolygon.append(aEnd - aHalfLineOffset + (aVector * fMin));
- rContainer.push_back(
+ aContainer.push_back(
new PolyPolygonColorPrimitive2D(
basegfx::B2DPolyPolygon(aPolygon),
candidate.getLineAttribute().getColor()));
@@ -237,7 +239,7 @@ namespace drawinglayer::primitive2d
}
addPolygonStrokePrimitive2D(
- rContainer,
+ aContainer,
aStrokeStart,
aStrokeEnd,
candidate.getLineAttribute(),
@@ -248,6 +250,7 @@ namespace drawinglayer::primitive2d
fOffset += fWidth;
}
+ return new GroupPrimitive2D(std::move(aContainer));
}
bool BorderLinePrimitive2D::isHorizontalOrVertical(const geometry::ViewInformation2D& rViewInformation) const
diff --git a/drawinglayer/source/primitive2d/controlprimitive2d.cxx b/drawinglayer/source/primitive2d/controlprimitive2d.cxx
index fc6f69be521d..730e522dc6f6 100644
--- a/drawinglayer/source/primitive2d/controlprimitive2d.cxx
+++ b/drawinglayer/source/primitive2d/controlprimitive2d.cxx
@@ -224,7 +224,7 @@ namespace drawinglayer::primitive2d
return xRetval;
}
- void ControlPrimitive2D::create2DDecomposition(Primitive2DContainer& rContainer, const geometry::ViewInformation2D& rViewInformation) const
+ Primitive2DReference ControlPrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& rViewInformation) const
{
// try to create a bitmap decomposition. If that fails for some reason,
// at least create a replacement decomposition.
@@ -235,7 +235,7 @@ namespace drawinglayer::primitive2d
xReference = createPlaceholderDecomposition();
}
- rContainer.push_back(xReference);
+ return xReference;
}
ControlPrimitive2D::ControlPrimitive2D(
@@ -319,16 +319,16 @@ namespace drawinglayer::primitive2d
// destroy existing decomposition. To detect change, use size of unit size in view coordinates
const basegfx::B2DVector aNewScaling(rViewInformation.getObjectToViewTransformation() * basegfx::B2DVector(1.0, 1.0));
- if(!getBuffered2DDecomposition().empty())
+ if(getBuffered2DDecomposition())
{
if(!maLastViewScaling.equal(aNewScaling))
{
// conditions of last local decomposition have changed, delete
- const_cast< ControlPrimitive2D* >(this)->setBuffered2DDecomposition(Primitive2DContainer());
+ const_cast< ControlPrimitive2D* >(this)->setBuffered2DDecomposition(nullptr);
}
}
- if(getBuffered2DDecomposition().empty())
+ if(!getBuffered2DDecomposition())
{
// remember ViewTransformation
const_cast< ControlPrimitive2D* >(this)->maLastViewScaling = aNewScaling;
diff --git a/drawinglayer/source/primitive2d/discretebitmapprimitive2d.cxx b/drawinglayer/source/primitive2d/discretebitmapprimitive2d.cxx
index 7ec7040ff2a1..66dcfcb403e1 100644
--- a/drawinglayer/source/primitive2d/discretebitmapprimitive2d.cxx
+++ b/drawinglayer/source/primitive2d/discretebitmapprimitive2d.cxx
@@ -25,14 +25,14 @@
namespace drawinglayer::primitive2d
{
- void DiscreteBitmapPrimitive2D::create2DDecomposition(Primitive2DContainer& rContainer, const geometry::ViewInformation2D& /*rViewInformation*/) const
+ Primitive2DReference DiscreteBitmapPrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& /*rViewInformation*/) const
{
// use getViewTransformation() and getObjectTransformation() from
// ObjectAndViewTransformationDependentPrimitive2D to create a BitmapPrimitive2D
// with the correct mapping
if(getBitmapEx().IsEmpty())
- return;
+ return nullptr;
// get discrete size
const Size& rSizePixel = getBitmapEx().GetSizePixel();
@@ -64,10 +64,10 @@ namespace drawinglayer::primitive2d
aObjectTransform = aInverseObjectTransformation * aObjectTransform;
// create BitmapPrimitive2D with now object-local coordinate data
- rContainer.push_back(
+ return
new BitmapPrimitive2D(
getBitmapEx(),
- aObjectTransform));
+ aObjectTransform);
}
DiscreteBitmapPrimitive2D::DiscreteBitmapPrimitive2D(
diff --git a/drawinglayer/source/primitive2d/discreteshadowprimitive2d.cxx b/drawinglayer/source/primitive2d/discreteshadowprimitive2d.cxx
index dfeade98e8c7..1ff96ce60886 100644
--- a/drawinglayer/source/primitive2d/discreteshadowprimitive2d.cxx
+++ b/drawinglayer/source/primitive2d/discreteshadowprimitive2d.cxx
@@ -151,12 +151,12 @@ namespace drawinglayer::primitive2d
namespace drawinglayer::primitive2d
{
- void DiscreteShadowPrimitive2D::create2DDecomposition(Primitive2DContainer& rContainer, const geometry::ViewInformation2D& /*rViewInformation*/) const
+ Primitive2DReference DiscreteShadowPrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& /*rViewInformation*/) const
{
Primitive2DContainer xRetval;
if(getDiscreteShadow().getBitmapEx().IsEmpty())
- return;
+ return nullptr;
const sal_Int32 nQuarter((getDiscreteShadow().getBitmapEx().GetSizePixel().Width() - 3) >> 2);
const basegfx::B2DVector aScale(getTransform() * basegfx::B2DVector(1.0, 1.0));
@@ -250,10 +250,10 @@ namespace drawinglayer::primitive2d
fBorderY + fSingleY));
// put all in object transformation to get to target positions
- rContainer.push_back(
+ return
new TransformPrimitive2D(
getTransform(),
- std::move(xRetval)));
+ std::move(xRetval));
}
DiscreteShadowPrimitive2D::DiscreteShadowPrimitive2D(
diff --git a/drawinglayer/source/primitive2d/embedded3dprimitive2d.cxx b/drawinglayer/source/primitive2d/embedded3dprimitive2d.cxx
index 96fd4e86dbf4..6c7ebd113a43 100644
--- a/drawinglayer/source/primitive2d/embedded3dprimitive2d.cxx
+++ b/drawinglayer/source/primitive2d/embedded3dprimitive2d.cxx
@@ -59,13 +59,13 @@ namespace drawinglayer::primitive2d
return !maShadowPrimitives.empty();
}
- void Embedded3DPrimitive2D::create2DDecomposition(Primitive2DContainer& rContainer, const geometry::ViewInformation2D& rViewInformation) const
+ Primitive2DReference Embedded3DPrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& rViewInformation) const
{
// use info to create a yellow 2d rectangle, similar to empty 3d scenes and/or groups
const basegfx::B2DRange aLocal2DRange(getB2DRange(rViewInformation));
basegfx::B2DPolygon aOutline(basegfx::utils::createPolygonFromRect(aLocal2DRange));
const basegfx::BColor aYellow(1.0, 1.0, 0.0);
- rContainer.push_back(new PolygonHairlinePrimitive2D(std::move(aOutline), aYellow));
+ return new PolygonHairlinePrimitive2D(std::move(aOutline), aYellow);
}
Embedded3DPrimitive2D::Embedded3DPrimitive2D(
diff --git a/drawinglayer/source/primitive2d/epsprimitive2d.cxx b/drawinglayer/source/primitive2d/epsprimitive2d.cxx
index 249bd3abaab1..760d5d764c41 100644
--- a/drawinglayer/source/primitive2d/epsprimitive2d.cxx
+++ b/drawinglayer/source/primitive2d/epsprimitive2d.cxx
@@ -24,7 +24,7 @@
namespace drawinglayer::primitive2d
{
- void EpsPrimitive2D::create2DDecomposition(Primitive2DContainer& rContainer, const geometry::ViewInformation2D& /*rViewInformation*/) const
+ Primitive2DReference EpsPrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& /*rViewInformation*/) const
{
const GDIMetaFile& rSubstituteContent = getMetaFile();
@@ -34,11 +34,12 @@ namespace drawinglayer::primitive2d
// To really use the Eps data, a renderer has to know and interpret this primitive
// directly.
- rContainer.push_back(
+ return
new MetafilePrimitive2D(
getEpsTransform(),
- rSubstituteContent));
+ rSubstituteContent);
}
+ return nullptr;
}
EpsPrimitive2D::EpsPrimitive2D(
diff --git a/drawinglayer/source/primitive2d/fillgradientprimitive2d.cxx b/drawinglayer/source/primitive2d/fillgradientprimitive2d.cxx
index f39daccc4320..1166c8950881 100644
--- a/drawinglayer/source/primitive2d/fillgradientprimitive2d.cxx
+++ b/drawinglayer/source/primitive2d/fillgradientprimitive2d.cxx
@@ -23,6 +23,7 @@
#include <texture/texture.hxx>
#include <drawinglayer/primitive2d/PolyPolygonColorPrimitive2D.hxx>
#include <drawinglayer/primitive2d/drawinglayer_primitivetypes2d.hxx>
+#include <drawinglayer/primitive2d/groupprimitive2d.hxx>
#include <utility>
#include <algorithm>
@@ -141,19 +142,20 @@ namespace drawinglayer::primitive2d
}
}
- void FillGradientPrimitive2D::createFill(Primitive2DContainer& rContainer, bool bOverlapping) const
+ Primitive2DReference FillGradientPrimitive2D::createFill(bool bOverlapping) const
{
+ Primitive2DContainer aContainer;
if (bOverlapping)
{
// OverlappingFill: create solid fill with outmost color
- rContainer.push_back(
+ aContainer.push_back(
new PolyPolygonColorPrimitive2D(
basegfx::B2DPolyPolygon(
basegfx::utils::createPolygonFromRect(getOutputRange())),
getOuterColor()));
// create solid fill steps by providing callback as lambda
- auto aCallback([&rContainer,this](
+ auto aCallback([&aContainer,this](
const basegfx::B2DHomMatrix& rMatrix,
const basegfx::BColor& rColor)
{
@@ -162,7 +164,7 @@ namespace drawinglayer::primitive2d
aNewPoly.transform(rMatrix);
// create solid fill
- rContainer.push_back(
+ aContainer.push_back(
new PolyPolygonColorPrimitive2D(
basegfx::B2DPolyPolygon(aNewPoly),
rColor));
@@ -179,7 +181,7 @@ namespace drawinglayer::primitive2d
// not really a gradient, we need to create a start primitive
// entry using the single color and the covered area
const basegfx::B2DRange aOutmostRange(getOutputRange());
- rContainer.push_back(
+ aContainer.push_back(
new PolyPolygonColorPrimitive2D(
basegfx::B2DPolyPolygon(basegfx::utils::createPolygonFromRect(aOutmostRange)),
getOuterColor()));
@@ -190,11 +192,11 @@ namespace drawinglayer::primitive2d
basegfx::B2DPolyPolygon aCombinedPolyPoly;
basegfx::BColor aLastColor;
- auto aCallback([&rContainer,&aCombinedPolyPoly,&aLastColor,this](
+ auto aCallback([&aContainer,&aCombinedPolyPoly,&aLastColor,this](
const basegfx::B2DHomMatrix& rMatrix,
const basegfx::BColor& rColor)
{
- if (rContainer.empty())
+ if (aContainer.empty())
{
// 1st callback, init CombinedPolyPoly & create 1st entry
basegfx::B2DRange aOutmostRange(getOutputRange());
@@ -211,7 +213,7 @@ namespace drawinglayer::primitive2d
aCombinedPolyPoly.append(aFirstPoly);
// create first primitive
- rContainer.push_back(
+ aContainer.push_back(
new PolyPolygonColorPrimitive2D(
aCombinedPolyPoly,
getOuterColor()));
@@ -232,7 +234,7 @@ namespace drawinglayer::primitive2d
aCombinedPolyPoly.append(aNextPoly);
// create primitive with correct color
- rContainer.push_back(
+ aContainer.push_back(
new PolyPolygonColorPrimitive2D(
aCombinedPolyPoly,
aLastColor));
@@ -247,15 +249,16 @@ namespace drawinglayer::primitive2d
generateMatricesAndColors(aCallback);
// add last inner polygon with last color
- rContainer.push_back(
+ aContainer.push_back(
new PolyPolygonColorPrimitive2D(
aCombinedPolyPoly,
aLastColor));
}
}
+ return new GroupPrimitive2D(std::move(aContainer));
}
- void FillGradientPrimitive2D::create2DDecomposition(Primitive2DContainer& rContainer, const geometry::ViewInformation2D& /*rViewInformation*/) const
+ Primitive2DReference FillGradientPrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& /*rViewInformation*/) const
{
// default creates overlapping fill which works with AntiAliasing and without.
// The non-overlapping version does not create single filled polygons, but
@@ -266,8 +269,9 @@ namespace drawinglayer::primitive2d
if(!getFillGradient().isDefault())
{
- createFill(rContainer, /*bOverlapping*/true);
+ return createFill(/*bOverlapping*/true);
}
+ return nullptr;
}
FillGradientPrimitive2D::FillGradientPrimitive2D(
diff --git a/drawinglayer/source/primitive2d/fillgraphicprimitive2d.cxx b/drawinglayer/source/primitive2d/fillgraphicprimitive2d.cxx
index bc9158687481..a553687e7787 100644
--- a/drawinglayer/source/primitive2d/fillgraphicprimitive2d.cxx
+++ b/drawinglayer/source/primitive2d/fillgraphicprimitive2d.cxx
@@ -34,24 +34,25 @@ using namespace com::sun::star;
namespace drawinglayer::primitive2d
{
- void FillGraphicPrimitive2D::create2DDecomposition(Primitive2DContainer& rContainer, const geometry::ViewInformation2D& /*rViewInformation*/) const
+ Primitive2DReference FillGraphicPrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& /*rViewInformation*/) const
{
const attribute::FillGraphicAttribute& rAttribute = getFillGraphic();
if(rAttribute.isDefault())
- return;
+ return nullptr;
const Graphic& rGraphic = rAttribute.getGraphic();
if(GraphicType::Bitmap != rGraphic.GetType() && GraphicType::GdiMetafile != rGraphic.GetType())
- return;
+ return nullptr;
const Size aSize(rGraphic.GetPrefSize());
if(!(aSize.Width() && aSize.Height()))
- return;
+ return nullptr;
// we have a graphic (bitmap or metafile) with some size
+ Primitive2DContainer aContainer;
if(rAttribute.getTiling())
{
// get object range and create tiling matrices
@@ -73,7 +74,7 @@ namespace drawinglayer::primitive2d
rtl::Reference<GroupPrimitive2D> xGroup = new GroupPrimitive2D(std::move(xSeq));
for(const auto &a : aMatrices)
{
- rContainer.push_back(new TransformPrimitive2D(
+ aContainer.push_back(new TransformPrimitive2D(
getTransformation() * a,
*xGroup));
}
@@ -86,10 +87,11 @@ namespace drawinglayer::primitive2d
rAttribute.getGraphicRange().getRange(),
rAttribute.getGraphicRange().getMinimum()));
- create2DDecompositionOfGraphic(rContainer,
+ create2DDecompositionOfGraphic(aContainer,
rGraphic,
aObjectTransform);
}
+ return new GroupPrimitive2D(std::move(aContainer));
}
FillGraphicPrimitive2D::FillGraphicPrimitive2D(
diff --git a/drawinglayer/source/primitive2d/fillhatchprimitive2d.cxx b/drawinglayer/source/primitive2d/fillhatchprimitive2d.cxx
index 1e86c907c406..c855460824e7 100644
--- a/drawinglayer/source/primitive2d/fillhatchprimitive2d.cxx
+++ b/drawinglayer/source/primitive2d/fillhatchprimitive2d.cxx
@@ -21,6 +21,7 @@
#include <texture/texture.hxx>
#include <drawinglayer/primitive2d/PolygonHairlinePrimitive2D.hxx>
#include <drawinglayer/primitive2d/PolyPolygonColorPrimitive2D.hxx>
+#include <drawinglayer/primitive2d/groupprimitive2d.hxx>
#include <basegfx/polygon/b2dpolygontools.hxx>
#include <basegfx/polygon/b2dpolygon.hxx>
#include <drawinglayer/primitive2d/drawinglayer_primitivetypes2d.hxx>
@@ -33,10 +34,10 @@ using namespace com::sun::star;
namespace drawinglayer::primitive2d
{
- void FillHatchPrimitive2D::create2DDecomposition(Primitive2DContainer& rContainer, const geometry::ViewInformation2D& /*rViewInformation*/) const
+ Primitive2DReference FillHatchPrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& /*rViewInformation*/) const
{
if(getFillHatch().isDefault())
- return;
+ return nullptr;
// create hatch
const basegfx::BColor aHatchColor(getFillHatch().getColor());
@@ -100,12 +101,12 @@ namespace drawinglayer::primitive2d
// prepare return value
const bool bFillBackground(getFillHatch().isFillBackground());
-
+ Primitive2DContainer aContainer;
// evtl. create filled background
if(bFillBackground)
{
// create primitive for background
- rContainer.push_back(
+ aContainer.push_back(
new PolyPolygonColorPrimitive2D(
basegfx::B2DPolyPolygon(
basegfx::utils::createPolygonFromRect(getOutputRange())), getBColor()));
@@ -124,8 +125,9 @@ namespace drawinglayer::primitive2d
aNewLine.append(rMatrix * aEnd);
// create hairline
- rContainer.push_back(new PolygonHairlinePrimitive2D(std::move(aNewLine), aHatchColor));
+ aContainer.push_back(new PolygonHairlinePrimitive2D(std::move(aNewLine), aHatchColor));
}
+ return new GroupPrimitive2D(std::move(aContainer));
}
FillHatchPrimitive2D::FillHatchPrimitive2D(
diff --git a/drawinglayer/source/primitive2d/graphicprimitive2d.cxx b/drawinglayer/source/primitive2d/graphicprimitive2d.cxx
index bcccf3ad9d00..8219d25d59bc 100644
--- a/drawinglayer/source/primitive2d/graphicprimitive2d.cxx
+++ b/drawinglayer/source/primitive2d/graphicprimitive2d.cxx
@@ -31,13 +31,13 @@
namespace drawinglayer::primitive2d
{
-void GraphicPrimitive2D::create2DDecomposition(Primitive2DContainer& rContainer,
- const geometry::ViewInformation2D&) const
+Primitive2DReference
+GraphicPrimitive2D::create2DDecomposition(const geometry::ViewInformation2D&) const
{
if (0 == getGraphicAttr().GetAlpha())
{
// content is invisible, done
- return;
+ return nullptr;
}
// do not apply mirroring from GraphicAttr to the Metafile by calling
@@ -107,7 +107,7 @@ void GraphicPrimitive2D::create2DDecomposition(Primitive2DContainer& rContainer,
if (aRetval.empty())
{
// content is invisible, done
- return;
+ return nullptr;
}
if (isAdjusted || isDrawMode)
@@ -127,7 +127,7 @@ void GraphicPrimitive2D::create2DDecomposition(Primitive2DContainer& rContainer,
if (aRetval.empty())
{
// content is invisible, done
- return;
+ return nullptr;
}
}
@@ -164,7 +164,7 @@ void GraphicPrimitive2D::create2DDecomposition(Primitive2DContainer& rContainer,
getGraphicAttr().GetBottomCrop() * aCropScaleFactor.getY()) };
}
- rContainer.append(std::move(aRetval));
+ return new GroupPrimitive2D(std::move(aRetval));
}
GraphicPrimitive2D::GraphicPrimitive2D(basegfx::B2DHomMatrix aTransform,
diff --git a/drawinglayer/source/primitive2d/gridprimitive2d.cxx b/drawinglayer/source/primitive2d/gridprimitive2d.cxx
index b43d05486dac..1a996188f03c 100644
--- a/drawinglayer/source/primitive2d/gridprimitive2d.cxx
+++ b/drawinglayer/source/primitive2d/gridprimitive2d.cxx
@@ -20,6 +20,7 @@
#include <drawinglayer/primitive2d/gridprimitive2d.hxx>
#include <drawinglayer/primitive2d/pointarrayprimitive2d.hxx>
#include <drawinglayer/primitive2d/markerarrayprimitive2d.hxx>
+#include <drawinglayer/primitive2d/groupprimitive2d.hxx>
#include <drawinglayer/geometry/viewinformation2d.hxx>
#include <drawinglayer/primitive2d/drawinglayer_primitivetypes2d.hxx>
#include <basegfx/matrix/b2dhommatrixtools.hxx>
@@ -31,10 +32,10 @@ using namespace com::sun::star;
namespace drawinglayer::primitive2d
{
- void GridPrimitive2D::create2DDecomposition(Primitive2DContainer& rContainer, const geometry::ViewInformation2D& rViewInformation) const
+ Primitive2DReference GridPrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& rViewInformation) const
{
if(!(!rViewInformation.getViewport().isEmpty() && getWidth() > 0.0 && getHeight() > 0.0))
- return;
+ return nullptr;
// decompose grid matrix to get logic size
basegfx::B2DVector aScale, aTranslate;
@@ -159,7 +160,7 @@ namespace drawinglayer::primitive2d
}
if(aExtendedViewport.isEmpty())
- return;
+ return nullptr;
// prepare point vectors for point and cross markers
std::vector< basegfx::B2DPoint > aPositionsPoint;
@@ -229,25 +230,27 @@ namespace drawinglayer::primitive2d
const sal_uInt32 nCountCross(aPositionsCross.size());
// add PointArrayPrimitive2D if point markers were added
+ Primitive2DContainer aContainer;
if(nCountPoint)
{
- rContainer.push_back(new PointArrayPrimitive2D(std::move(aPositionsPoint), getBColor()));
+ aContainer.push_back(new PointArrayPrimitive2D(std::move(aPositionsPoint), getBColor()));
}
// add MarkerArrayPrimitive2D if cross markers were added
if(!nCountCross)
- return;
+ return new GroupPrimitive2D(std::move(aContainer));
if(!getSubdivisionsX() && !getSubdivisionsY())
{
// no subdivisions, so fall back to points at grid positions, no need to
// visualize a difference between divisions and sub-divisions
- rContainer.push_back(new PointArrayPrimitive2D(std::move(aPositionsCross), getBColor()));
+ aContainer.push_back(new PointArrayPrimitive2D(std::move(aPositionsCross), getBColor()));
}
else
{
- rContainer.push_back(new MarkerArrayPrimitive2D(std::move(aPositionsCross), getCrossMarker()));
+ aContainer.push_back(new MarkerArrayPrimitive2D(std::move(aPositionsCross), getCrossMarker()));
}
+ return new GroupPrimitive2D(std::move(aContainer));
}
GridPrimitive2D::GridPrimitive2D(
@@ -306,16 +309,16 @@ namespace drawinglayer::primitive2d
void GridPrimitive2D::get2DDecomposition(Primitive2DDecompositionVisitor& rVisitor, const geometry::ViewInformation2D& rViewInformation) const
{
- if(!getBuffered2DDecomposition().empty())
+ if(getBuffered2DDecomposition())
{
if(maLastViewport != rViewInformation.getViewport() || maLastObjectToViewTransformation != rViewInformation.getObjectToViewTransformation())
{
// conditions of last local decomposition have changed, delete
- const_cast< GridPrimitive2D* >(this)->setBuffered2DDecomposition(Primitive2DContainer());
+ const_cast< GridPrimitive2D* >(this)->setBuffered2DDecomposition(nullptr);
}
}
- if(getBuffered2DDecomposition().empty())
+ if(!getBuffered2DDecomposition())
{
// remember ViewRange and ViewTransformation
const_cast< GridPrimitive2D* >(this)->maLastObjectToViewTransformation = rViewInformation.getObjectToViewTransformation();
diff --git a/drawinglayer/source/primitive2d/helplineprimitive2d.cxx b/drawinglayer/source/primitive2d/helplineprimitive2d.cxx
index 56d53d8e73fc..047084eb1469 100644
--- a/drawinglayer/source/primitive2d/helplineprimitive2d.cxx
+++ b/drawinglayer/source/primitive2d/helplineprimitive2d.cxx
@@ -23,6 +23,7 @@
#include <drawinglayer/geometry/viewinformation2d.hxx>
#include <drawinglayer/primitive2d/drawinglayer_primitivetypes2d.hxx>
#include <drawinglayer/primitive2d/PolygonMarkerPrimitive2D.hxx>
+#include <drawinglayer/primitive2d/groupprimitive2d.hxx>
using namespace com::sun::star;
@@ -30,14 +31,14 @@ using namespace com::sun::star;
namespace drawinglayer::primitive2d
{
- void HelplinePrimitive2D::create2DDecomposition(Primitive2DContainer& rContainer, const geometry::ViewInformation2D& rViewInformation) const
+ Primitive2DReference HelplinePrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& rViewInformation) const
{
if(rViewInformation.getViewport().isEmpty() || getDirection().equalZero())
- return;
+ return nullptr;
// position to view coordinates, DashLen and DashLen in logic
const basegfx::B2DPoint aViewPosition(rViewInformation.getObjectToViewTransformation() * getPosition());
-
+ Primitive2DReference xRet;
switch(getStyle())
{
default : // HelplineStyle2D::Point
@@ -52,7 +53,7 @@ namespace drawinglayer::primitive2d
aLineA.append(aStartA);
aLineA.append(aEndA);
aLineA.transform(rViewInformation.getInverseObjectToViewTransformation());
- rContainer.push_back(new PolygonMarkerPrimitive2D(std::move(aLineA), getRGBColA(), getRGBColB(), getDiscreteDashLength()));
+ auto xMarker1 = new PolygonMarkerPrimitive2D(std::move(aLineA), getRGBColA(), getRGBColB(), getDiscreteDashLength());
const basegfx::B2DVector aPerpendicularNormalizedDirection(basegfx::getPerpendicular(aNormalizedDirection));
const basegfx::B2DPoint aStartB(aViewPosition - aPerpendicularNormalizedDirection);
@@ -61,8 +62,9 @@ namespace drawinglayer::primitive2d
aLineB.append(aStartB);
aLineB.append(aEndB);
aLineB.transform(rViewInformation.getInverseObjectToViewTransformation());
- rContainer.push_back(new PolygonMarkerPrimitive2D(std::move(aLineB), getRGBColA(), getRGBColB(), getDiscreteDashLength()));
+ auto xMarker2 = new PolygonMarkerPrimitive2D(std::move(aLineB), getRGBColA(), getRGBColB(), getDiscreteDashLength());
+ xRet = new GroupPrimitive2D(Primitive2DContainer{xMarker1, xMarker2});
break;
}
case HelplineStyle2D::Line :
@@ -106,18 +108,20 @@ namespace drawinglayer::primitive2d
{
// clip against visible area
const basegfx::B2DPolyPolygon aResult(basegfx::utils::clipPolygonOnRange(aLine, rViewInformation.getDiscreteViewport(), true, true));
-
+ Primitive2DContainer aContainer;
for(sal_uInt32 a(0); a < aResult.count(); a++)
{
basegfx::B2DPolygon aPart(aResult.getB2DPolygon(a));
aPart.transform(rViewInformation.getInverseObjectToViewTransformation());
- rContainer.push_back(new PolygonMarkerPrimitive2D(std::move(aPart), getRGBColA(), getRGBColB(), getDiscreteDashLength()));
+ aContainer.push_back(new PolygonMarkerPrimitive2D(std::move(aPart), getRGBColA(), getRGBColB(), getDiscreteDashLength()));
}
+ xRet = new GroupPrimitive2D(std::move(aContainer));
}
break;
}
}
+ return xRet;
}
HelplinePrimitive2D::HelplinePrimitive2D(
@@ -155,16 +159,16 @@ namespace drawinglayer::primitive2d
void HelplinePrimitive2D::get2DDecomposition(Primitive2DDecompositionVisitor& rVisitor, const geometry::ViewInformation2D& rViewInformation) const
{
- if(!getBuffered2DDecomposition().empty())
+ if(getBuffered2DDecomposition())
{
if(maLastViewport != rViewInformation.getViewport() || maLastObjectToViewTransformation != rViewInformation.getObjectToViewTransformation())
{
// conditions of last local decomposition have changed, delete
- const_cast< HelplinePrimitive2D* >(this)->setBuffered2DDecomposition(Primitive2DContainer());
+ const_cast< HelplinePrimitive2D* >(this)->setBuffered2DDecomposition(nullptr);
}
}
- if(getBuffered2DDecomposition().empty())
+ if(!getBuffered2DDecomposition())
{
// remember ViewRange and ViewTransformation
const_cast< HelplinePrimitive2D* >(this)->maLastObjectToViewTransformation = rViewInformation.getObjectToViewTransformation();
diff --git a/drawinglayer/source/primitive2d/markerarrayprimitive2d.cxx b/drawinglayer/source/primitive2d/markerarrayprimitive2d.cxx
index 62d1cd5c26ca..1702b16496d8 100644
--- a/drawinglayer/source/primitive2d/markerarrayprimitive2d.cxx
+++ b/drawinglayer/source/primitive2d/markerarrayprimitive2d.cxx
@@ -22,6 +22,7 @@
#include <drawinglayer/geometry/viewinformation2d.hxx>
#include <drawinglayer/primitive2d/drawinglayer_primitivetypes2d.hxx>
#include <drawinglayer/primitive2d/bitmapprimitive2d.hxx>
+#include <drawinglayer/primitive2d/groupprimitive2d.hxx>
#include <toolkit/helper/vclunohelper.hxx>
@@ -30,19 +31,19 @@ using namespace com::sun::star;
namespace drawinglayer::primitive2d
{
- void MarkerArrayPrimitive2D::create2DDecomposition(Primitive2DContainer& rContainer, const geometry::ViewInformation2D& rViewInformation) const
+ Primitive2DReference MarkerArrayPrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& rViewInformation) const
{
const std::vector< basegfx::B2DPoint >& rPositions = getPositions();
const sal_uInt32 nMarkerCount(rPositions.size());
if(!nMarkerCount || getMarker().IsEmpty())
- return;
+ return nullptr;
// get pixel size
Size aBitmapSize(getMarker().GetSizePixel());
if(!(aBitmapSize.Width() && aBitmapSize.Height()))
- return;
+ return nullptr;
// get logic half pixel size
basegfx::B2DVector aLogicHalfSize(rViewInformation.getInverseObjectToViewTransformation() *
@@ -51,6 +52,7 @@ namespace drawinglayer::primitive2d
// use half size for expand
aLogicHalfSize *= 0.5;
+ Primitive2DContainer aContainer;
for(const auto& rPosition : rPositions)
{
const basegfx::B2DRange aRange(rPosition - aLogicHalfSize, rPosition + aLogicHalfSize);
@@ -61,11 +63,12 @@ namespace drawinglayer::primitive2d
aTransform.set(0, 2, aRange.getMinX());
aTransform.set(1, 2, aRange.getMinY());
- rContainer.push_back(
+ aContainer.push_back(
new BitmapPrimitive2D(
getMarker(),
aTransform));
}
+ return new GroupPrimitive2D(std::move(aContainer));
}
MarkerArrayPrimitive2D::MarkerArrayPrimitive2D(
diff --git a/drawinglayer/source/primitive2d/mediaprimitive2d.cxx b/drawinglayer/source/primitive2d/mediaprimitive2d.cxx
index c9a1ef6e1645..eb70c7602c8c 100644
--- a/drawinglayer/source/primitive2d/mediaprimitive2d.cxx
+++ b/drawinglayer/source/primitive2d/mediaprimitive2d.cxx
@@ -32,7 +32,7 @@
namespace drawinglayer::primitive2d
{
- void MediaPrimitive2D::create2DDecomposition(Primitive2DContainer& rContainer, const geometry::ViewInformation2D& rViewInformation) const
+ Primitive2DReference MediaPrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& rViewInformation) const
{
Primitive2DContainer xRetval;
xRetval.resize(1);
@@ -89,7 +89,7 @@ namespace drawinglayer::primitive2d
}
}
- rContainer.append(std::move(xRetval));
+ return new GroupPrimitive2D(std::move(xRetval));
}
MediaPrimitive2D::MediaPrimitive2D(
diff --git a/drawinglayer/source/primitive2d/metafileprimitive2d.cxx b/drawinglayer/source/primitive2d/metafileprimitive2d.cxx
index 67f9fcdad4d3..46ddf6582571 100644
--- a/drawinglayer/source/primitive2d/metafileprimitive2d.cxx
+++ b/drawinglayer/source/primitive2d/metafileprimitive2d.cxx
@@ -31,14 +31,14 @@ using namespace com::sun::star;
namespace drawinglayer::primitive2d
{
- void MetafilePrimitive2D::create2DDecomposition(Primitive2DContainer& rContainer, const geometry::ViewInformation2D& rViewInformation) const
+ Primitive2DReference MetafilePrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& rViewInformation) const
{
// Interpret the Metafile and get the content. There should be only one target, as in the start condition,
// but iterating will be the right thing to do when some push/pop is not closed
Primitive2DContainer xRetval(wmfemfhelper::interpretMetafile(getMetaFile(), rViewInformation));
if(xRetval.empty())
- return;
+ return nullptr;
// get target size
const ::tools::Rectangle aMtfTarget(getMetaFile().GetPrefMapMode().GetOrigin(), getMetaFile().GetPrefSize());
@@ -81,9 +81,7 @@ namespace drawinglayer::primitive2d
aAdaptedTransform,
std::move(xRetval)));
- xRetval = Primitive2DContainer { aEmbeddedTransform };
-
- rContainer.append(std::move(xRetval));
+ return aEmbeddedTransform;
}
MetafilePrimitive2D::MetafilePrimitive2D(
diff --git a/drawinglayer/source/primitive2d/pagepreviewprimitive2d.cxx b/drawinglayer/source/primitive2d/pagepreviewprimitive2d.cxx
index 7e274e78e9c1..447be709185e 100644
--- a/drawinglayer/source/primitive2d/pagepreviewprimitive2d.cxx
+++ b/drawinglayer/source/primitive2d/pagepreviewprimitive2d.cxx
@@ -32,14 +32,14 @@ using namespace com::sun::star;
namespace drawinglayer::primitive2d
{
- void PagePreviewPrimitive2D::create2DDecomposition(Primitive2DContainer& rContainer, const geometry::ViewInformation2D& rViewInformation) const
+ Primitive2DReference PagePreviewPrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& rViewInformation) const
{
Primitive2DContainer aContent(getPageContent());
if(!(!aContent.empty()
&& basegfx::fTools::more(getContentWidth(), 0.0)
&& basegfx::fTools::more(getContentHeight(), 0.0)))
- return;
+ return nullptr;
// the decomposed matrix will be needed
basegfx::B2DVector aScale, aTranslate;
@@ -47,7 +47,7 @@ namespace drawinglayer::primitive2d
getTransform().decompose(aScale, aTranslate, fRotate, fShearX);
if(!(basegfx::fTools::more(aScale.getX(), 0.0) && basegfx::fTools::more(aScale.getY(), 0.0)))
- return;
+ return nullptr;
// check if content overlaps with target size and needs to be embedded with a
// clipping primitive
@@ -98,7 +98,7 @@ namespace drawinglayer::primitive2d
aPageTrans = aCombined * aPageTrans;
// embed in necessary transformation to map from SdrPage to SdrPageObject
- rContainer.push_back(new TransformPrimitive2D(aPageTrans, std::move(aContent)));
+ return new TransformPrimitive2D(aPageTrans, std::move(aContent));
}
PagePreviewPrimitive2D::PagePreviewPrimitive2D(
diff --git a/drawinglayer/source/primitive2d/patternfillprimitive2d.cxx b/drawinglayer/source/primitive2d/patternfillprimitive2d.cxx
index 627de80eec16..516b0042d960 100644
--- a/drawinglayer/source/primitive2d/patternfillprimitive2d.cxx
+++ b/drawinglayer/source/primitive2d/patternfillprimitive2d.cxx
@@ -202,20 +202,20 @@ namespace drawinglayer::primitive2d
nWidth * nHeight);
}
- void PatternFillPrimitive2D::create2DDecomposition(Primitive2DContainer& rContainer, const geometry::ViewInformation2D& rViewInformation) const
+ Primitive2DReference PatternFillPrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& rViewInformation) const
{
Primitive2DContainer aRetval;
if(getChildren().empty())
- return;
+ return nullptr;
if(!(!getReferenceRange().isEmpty() && getReferenceRange().getWidth() > 0.0 && getReferenceRange().getHeight() > 0.0))
- return;
+ return nullptr;
const basegfx::B2DRange aMaskRange(getMask().getB2DRange());
if(!(!aMaskRange.isEmpty() && aMaskRange.getWidth() > 0.0 && aMaskRange.getHeight() > 0.0))
- return;
+ return nullptr;
// create tiling matrices
std::vector< basegfx::B2DHomMatrix > aMatrices;
@@ -252,10 +252,10 @@ namespace drawinglayer::primitive2d
}
// embed result in mask
- rContainer.push_back(
+ return
new MaskPrimitive2D(
getMask(),
- std::move(aRetval)));
+ std::move(aRetval));
}
PatternFillPrimitive2D::PatternFillPrimitive2D(
@@ -341,7 +341,7 @@ namespace drawinglayer::primitive2d
PatternFillPrimitive2D* pThat = const_cast< PatternFillPrimitive2D* >(this);
pThat->mnDiscreteWidth = nW;
pThat->mnDiscreteHeight = nH;
- pThat->setBuffered2DDecomposition(Primitive2DContainer());
+ pThat->setBuffered2DDecomposition(nullptr);
}
// call parent
diff --git a/drawinglayer/source/primitive2d/polygonprimitive2d.cxx b/drawinglayer/source/primitive2d/polygonprimitive2d.cxx
index 435408cd5846..ab6833a44ffa 100644
--- a/drawinglayer/source/primitive2d/polygonprimitive2d.cxx
+++ b/drawinglayer/source/primitive2d/polygonprimitive2d.cxx
@@ -26,6 +26,7 @@
#include <drawinglayer/primitive2d/PolygonWavePrimitive2D.hxx>
#include <drawinglayer/primitive2d/pointarrayprimitive2d.hxx>
#include <drawinglayer/primitive2d/drawinglayer_primitivetypes2d.hxx>
+#include <drawinglayer/primitive2d/groupprimitive2d.hxx>
#include <drawinglayer/geometry/viewinformation2d.hxx>
#include <basegfx/polygon/b2dlinegeometry.hxx>
#include <com/sun/star/drawing/LineCap.hpp>
@@ -207,8 +208,8 @@ void LineRectanglePrimitive2D::get2DDecomposition(
rVisitor.visit(aSequence);
}
-void PolygonMarkerPrimitive2D::create2DDecomposition(
- Primitive2DContainer& rContainer, const geometry::ViewInformation2D& rViewInformation) const
+Primitive2DReference PolygonMarkerPrimitive2D::create2DDecomposition(
+ const geometry::ViewInformation2D& rViewInformation) const
{
// calculate logic DashLength
const basegfx::B2DVector aDashVector(rViewInformation.getInverseObjectToViewTransformation()
@@ -227,14 +228,16 @@ void PolygonMarkerPrimitive2D::create2DDecomposition(
basegfx::utils::applyLineDashing(getB2DPolygon(), aDash, &aDashedPolyPolyA,
&aDashedPolyPolyB, 2.0 * fLogicDashLength);
- rContainer.push_back(
+ Primitive2DContainer aContainer;
+ aContainer.push_back(
new PolyPolygonHairlinePrimitive2D(std::move(aDashedPolyPolyA), getRGBColorA()));
- rContainer.push_back(
+ aContainer.push_back(
new PolyPolygonHairlinePrimitive2D(std::move(aDashedPolyPolyB), getRGBColorB()));
+ return new GroupPrimitive2D(std::move(aContainer));
}
else
{
- rContainer.push_back(new PolygonHairlinePrimitive2D(getB2DPolygon(), getRGBColorA()));
+ return new PolygonHairlinePrimitive2D(getB2DPolygon(), getRGBColorA());
}
}
@@ -295,7 +298,7 @@ void PolygonMarkerPrimitive2D::get2DDecomposition(
{
bool bNeedNewDecomposition(false);
- if (!getBuffered2DDecomposition().empty())
+ if (getBuffered2DDecomposition())
{
if (rViewInformation.getInverseObjectToViewTransformation()
!= maLastInverseObjectToViewTransformation)
@@ -307,11 +310,10 @@ void PolygonMarkerPrimitive2D::get2DDecomposition(
if (bNeedNewDecomposition)
{
// conditions of last local decomposition have changed, delete
- const_cast<PolygonMarkerPrimitive2D*>(this)->setBuffered2DDecomposition(
- Primitive2DContainer());
+ const_cast<PolygonMarkerPrimitive2D*>(this)->setBuffered2DDecomposition(nullptr);
}
- if (getBuffered2DDecomposition().empty())
+ if (!getBuffered2DDecomposition())
{
// remember last used InverseObjectToViewTransformation
PolygonMarkerPrimitive2D* pThat = const_cast<PolygonMarkerPrimitive2D*>(this);
@@ -333,11 +335,11 @@ sal_uInt32 PolygonMarkerPrimitive2D::getPrimitive2DID() const
namespace drawinglayer::primitive2d
{
-void PolygonStrokePrimitive2D::create2DDecomposition(
- Primitive2DContainer& rContainer, const geometry::ViewInformation2D& /*rViewInformation*/) const
+Primitive2DReference PolygonStrokePrimitive2D::create2DDecomposition(
+ const geometry::ViewInformation2D& /*rViewInformation*/) const
{
if (!getB2DPolygon().count())
- return;
+ return nullptr;
// #i102241# try to simplify before usage
const basegfx::B2DPolygon aB2DPolygon(basegfx::utils::simplifyCurveSegments(getB2DPolygon()));
@@ -377,6 +379,7 @@ void PolygonStrokePrimitive2D::create2DDecomposition(
}
// create primitive
+ Primitive2DContainer aContainer;
for (sal_uInt32 b(0); b < aAreaPolyPolygon.count(); b++)
{
// put into single polyPolygon primitives to make clear that this is NOT meant
@@ -384,14 +387,15 @@ void PolygonStrokePrimitive2D::create2DDecomposition(
// melting process may be used here one day.
basegfx::B2DPolyPolygon aNewPolyPolygon(aAreaPolyPolygon.getB2DPolygon(b));
const basegfx::BColor aColor(getLineAttribute().getColor());
- rContainer.push_back(
+ aContainer.push_back(
new PolyPolygonColorPrimitive2D(std::move(aNewPolyPolygon), aColor));
}
+ return new GroupPrimitive2D(std::move(aContainer));
}
else
{
- rContainer.push_back(new PolyPolygonHairlinePrimitive2D(std::move(aHairLinePolyPolygon),
- getLineAttribute().getColor()));
+ return new PolyPolygonHairlinePrimitive2D(std::move(aHairLinePolyPolygon),
+ getLineAttribute().getColor());
}
}
@@ -594,11 +598,11 @@ sal_uInt32 PolygonStrokePrimitive2D::getPrimitive2DID() const
return PRIMITIVE2D_ID_POLYGONSTROKEPRIMITIVE2D;
}
-void PolygonWavePrimitive2D::create2DDecomposition(
- Primitive2DContainer& rContainer, const geometry::ViewInformation2D& /*rViewInformation*/) const
+Primitive2DReference PolygonWavePrimitive2D::create2DDecomposition(
+ const geometry::ViewInformation2D& /*rViewInformation*/) const
{
if (!getB2DPolygon().count())
- return;
+ return nullptr;
const bool bHasWidth(!basegfx::fTools::equalZero(getWaveWidth()));
const bool bHasHeight(!basegfx::fTools::equalZero(getWaveHeight()));
@@ -608,14 +612,14 @@ void PolygonWavePrimitive2D::create2DDecomposition(
// create waveline curve
basegfx::B2DPolygon aWaveline(
basegfx::utils::createWaveline(getB2DPolygon(), getWaveWidth(), getWaveHeight()));
- rContainer.push_back(new PolygonStrokePrimitive2D(std::move(aWaveline), getLineAttribute(),
- getStrokeAttribute()));
+ return new PolygonStrokePrimitive2D(std::move(aWaveline), getLineAttribute(),
+ getStrokeAttribute());
}
else
{
// flat waveline, decompose to simple line primitive
- rContainer.push_back(new PolygonStrokePrimitive2D(getB2DPolygon(), getLineAttribute(),
- getStrokeAttribute()));
+ return new PolygonStrokePrimitive2D(getB2DPolygon(), getLineAttribute(),
+ getStrokeAttribute());
}
}
@@ -697,8 +701,8 @@ sal_uInt32 PolygonWavePrimitive2D::getPrimitive2DID() const
return PRIMITIVE2D_ID_POLYGONWAVEPRIMITIVE2D;
}
-void PolygonStrokeArrowPrimitive2D::create2DDecomposition(
- Primitive2DContainer& rContainer, const geometry::ViewInformation2D& /*rViewInformation*/) const
+Primitive2DReference PolygonStrokeArrowPrimitive2D::create2DDecomposition(
+ const geometry::ViewInformation2D& /*rViewInformation*/) const
{
// copy local polygon, it may be changed
basegfx::B2DPolygon aLocalPolygon(getB2DPolygon());
@@ -748,20 +752,22 @@ void PolygonStrokeArrowPrimitive2D::create2DDecomposition(
}
// add shaft
- rContainer.push_back(new PolygonStrokePrimitive2D(std::move(aLocalPolygon), getLineAttribute(),
+ Primitive2DContainer aContainer;
+ aContainer.push_back(new PolygonStrokePrimitive2D(std::move(aLocalPolygon), getLineAttribute(),
getStrokeAttribute()));
if (aArrowA.count())
{
- rContainer.push_back(
+ aContainer.push_back(
new PolyPolygonColorPrimitive2D(std::move(aArrowA), getLineAttribute().getColor()));
}
if (aArrowB.count())
{
- rContainer.push_back(
+ aContainer.push_back(
new PolyPolygonColorPrimitive2D(std::move(aArrowB), getLineAttribute().getColor()));
}
+ return new GroupPrimitive2D(std::move(aContainer));
}
PolygonStrokeArrowPrimitive2D::PolygonStrokeArrowPrimitive2D(
diff --git a/drawinglayer/source/primitive2d/primitivetools2d.cxx b/drawinglayer/source/primitive2d/primitivetools2d.cxx
index 7c6d426e95a2..04a91fe9b55b 100644
--- a/drawinglayer/source/primitive2d/primitivetools2d.cxx
+++ b/drawinglayer/source/primitive2d/primitivetools2d.cxx
@@ -30,13 +30,13 @@ namespace drawinglayer::primitive2d
const basegfx::B2DVector aDiscreteVector(rViewInformation.getInverseObjectToViewTransformation() * basegfx::B2DVector(1.0, 1.0));
const double fDiscreteUnit(std::min(fabs(aDiscreteVector.getX()), fabs(aDiscreteVector.getY())));
- if(!getBuffered2DDecomposition().empty() && !basegfx::fTools::equal(fDiscreteUnit, getDiscreteUnit()))
+ if(getBuffered2DDecomposition() && !basegfx::fTools::equal(fDiscreteUnit, getDiscreteUnit()))
{
// conditions of last local decomposition have changed, delete
- const_cast< DiscreteMetricDependentPrimitive2D* >(this)->setBuffered2DDecomposition(Primitive2DContainer());
+ const_cast< DiscreteMetricDependentPrimitive2D* >(this)->setBuffered2DDecomposition(nullptr);
}
- if(getBuffered2DDecomposition().empty())
+ if(!getBuffered2DDecomposition())
{
// remember new valid DiscreteUnit
const_cast< DiscreteMetricDependentPrimitive2D* >(this)->mfDiscreteUnit = fDiscreteUnit;
@@ -54,13 +54,13 @@ namespace drawinglayer::primitive2d
// get the current Viewport
const basegfx::B2DRange& rViewport = rViewInformation.getViewport();
- if(!getBuffered2DDecomposition().empty() && !rViewport.equal(getViewport()))
+ if(getBuffered2DDecomposition() && !rViewport.equal(getViewport()))
{
// conditions of last local decomposition have changed, delete
- const_cast< ViewportDependentPrimitive2D* >(this)->setBuffered2DDecomposition(Primitive2DContainer());
+ const_cast< ViewportDependentPrimitive2D* >(this)->setBuffered2DDecomposition(nullptr);
}
- if(getBuffered2DDecomposition().empty())
+ if(!getBuffered2DDecomposition())
{
// remember new valid DiscreteUnit
const_cast< ViewportDependentPrimitive2D* >(this)->maViewport = rViewport;
@@ -75,13 +75,13 @@ namespace drawinglayer::primitive2d
// get the current ViewTransformation
const basegfx::B2DHomMatrix& rViewTransformation = rViewInformation.getViewTransformation();
- if(!getBuffered2DDecomposition().empty() && rViewTransformation != getViewTransformation())
+ if(getBuffered2DDecomposition() && rViewTransformation != getViewTransformation())
{
// conditions of last local decomposition have changed, delete
- const_cast< ViewTransformationDependentPrimitive2D* >(this)->setBuffered2DDecomposition(Primitive2DContainer());
+ const_cast< ViewTransformationDependentPrimitive2D* >(this)->setBuffered2DDecomposition(nullptr);
}
- if(getBuffered2DDecomposition().empty())
+ if(!getBuffered2DDecomposition())
{
// remember new valid ViewTransformation
const_cast< ViewTransformationDependentPrimitive2D* >(this)->maViewTransformation = rViewTransformation;
@@ -96,22 +96,22 @@ namespace drawinglayer::primitive2d
// get the current ViewTransformation
const basegfx::B2DHomMatrix& rViewTransformation = rViewInformation.getViewTransformation();
- if(!getBuffered2DDecomposition().empty() && rViewTransformation != getViewTransformation())
+ if(getBuffered2DDecomposition() && rViewTransformation != getViewTransformation())
{
// conditions of last local decomposition have changed, delete
- const_cast< ObjectAndViewTransformationDependentPrimitive2D* >(this)->setBuffered2DDecomposition(Primitive2DContainer());
+ const_cast< ObjectAndViewTransformationDependentPrimitive2D* >(this)->setBuffered2DDecomposition(nullptr);
}
// get the current ObjectTransformation
const basegfx::B2DHomMatrix& rObjectTransformation = rViewInformation.getObjectTransformation();
- if(!getBuffered2DDecomposition().empty() && rObjectTransformation != getObjectTransformation())
+ if(getBuffered2DDecomposition() && rObjectTransformation != getObjectTransformation())
{
// conditions of last local decomposition have changed, delete
- const_cast< ObjectAndViewTransformationDependentPrimitive2D* >(this)->setBuffered2DDecomposition(Primitive2DContainer());
+ const_cast< ObjectAndViewTransformationDependentPrimitive2D* >(this)->setBuffered2DDecomposition(nullptr);
}
- if(getBuffered2DDecomposition().empty())
+ if(!getBuffered2DDecomposition())
{
// remember new valid ViewTransformation, and ObjectTransformation
const_cast< ObjectAndViewTransformationDependentPrimitive2D* >(this)->maViewTransformation = rViewTransformation;
diff --git a/drawinglayer/source/primitive2d/sceneprimitive2d.cxx b/drawinglayer/source/primitive2d/sceneprimitive2d.cxx
index 8a6943a83924..5dac8e5c7223 100644
--- a/drawinglayer/source/primitive2d/sceneprimitive2d.cxx
+++ b/drawinglayer/source/primitive2d/sceneprimitive2d.cxx
@@ -24,6 +24,7 @@
#include <drawinglayer/attribute/sdrlightattribute3d.hxx>
#include <drawinglayer/primitive2d/bitmapprimitive2d.hxx>
#include <drawinglayer/primitive2d/PolygonHairlinePrimitive2D.hxx>
+#include <drawinglayer/primitive2d/groupprimitive2d.hxx>
#include <processor3d/zbufferprocessor3d.hxx>
#include <processor3d/shadow3dextractor.hxx>
#include <drawinglayer/geometry/viewinformation2d.hxx>
@@ -212,8 +213,9 @@ namespace drawinglayer::primitive2d
}
}
- void ScenePrimitive2D::create2DDecomposition(Primitive2DContainer& rContainer, const geometry::ViewInformation2D& rViewInformation) const
+ Primitive2DReference ScenePrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& rViewInformation) const
{
+ Primitive2DContainer aContainer;
// create 2D shadows from contained 3D primitives. This creates the shadow primitives on demand and tells if
// there are some or not. Do this at start, the shadow might still be visible even when the scene is not
if(impGetShadow3D())
@@ -226,7 +228,7 @@ namespace drawinglayer::primitive2d
if(aViewRange.isEmpty() || aShadow2DRange.overlaps(aViewRange))
{
// add extracted 2d shadows (before 3d scene creations itself)
- rContainer.append(maShadowPrimitives);
+ aContainer.append(maShadowPrimitives);
}
}
@@ -238,7 +240,7 @@ namespace drawinglayer::primitive2d
calculateDiscreteSizes(rViewInformation, aDiscreteRange, aVisibleDiscreteRange, aUnitVisibleRange);
if(aVisibleDiscreteRange.isEmpty())
- return;
+ return new GroupPrimitive2D(std::move(aContainer));
// test if discrete view size (pixel) maybe too big and limit it
double fViewSizeX(aVisibleDiscreteRange.getWidth());
@@ -412,7 +414,7 @@ namespace drawinglayer::primitive2d
}
if(!(nRasterWidth && nRasterHeight))
- return;
+ return new GroupPrimitive2D(std::move(aContainer));
// create view unit buffer
basegfx::BZPixelRaster aBZPixelRaster(
@@ -508,7 +510,7 @@ namespace drawinglayer::primitive2d
const Size aBitmapSizePixel(maOldRenderedBitmap.GetSizePixel());
if(!(aBitmapSizePixel.getWidth() && aBitmapSizePixel.getHeight()))
- return;
+ return new GroupPrimitive2D(std::move(aContainer));
// create transform for the created bitmap in discrete coordinates first.
basegfx::B2DHomMatrix aNew2DTransform;
@@ -522,7 +524,7 @@ namespace drawinglayer::primitive2d
aNew2DTransform *= aInverseOToV;
// create bitmap primitive and add
- rContainer.push_back(
+ aContainer.push_back(
new BitmapPrimitive2D(
maOldRenderedBitmap,
aNew2DTransform));
@@ -534,8 +536,9 @@ namespace drawinglayer::primitive2d
{
basegfx::B2DPolygon aOutline(basegfx::utils::createUnitPolygon());
aOutline.transform(aNew2DTransform);
- rContainer.push_back(new PolygonHairlinePrimitive2D(std::move(aOutline), basegfx::BColor(1.0, 0.0, 0.0)));
+ aContainer.push_back(new PolygonHairlinePrimitive2D(std::move(aOutline), basegfx::BColor(1.0, 0.0, 0.0)));
}
+ return new GroupPrimitive2D(std::move(aContainer));
}
Primitive2DContainer ScenePrimitive2D::getGeometry2D() const
@@ -684,7 +687,7 @@ namespace drawinglayer::primitive2d
bool bNeedNewDecomposition(false);
bool bDiscreteSizesAreCalculated(false);
- if(!getBuffered2DDecomposition().empty())
+ if(getBuffered2DDecomposition())
{
basegfx::B2DRange aVisibleDiscreteRange;
calculateDiscreteSizes(rViewInformation, aDiscreteRange, aVisibleDiscreteRange, aUnitVisibleRange);
@@ -712,10 +715,10 @@ namespace drawinglayer::primitive2d
if(bNeedNewDecomposition)
{
// conditions of last local decomposition have changed, delete
- const_cast< ScenePrimitive2D* >(this)->setBuffered2DDecomposition(Primitive2DContainer());
+ const_cast< ScenePrimitive2D* >(this)->setBuffered2DDecomposition(nullptr);
}
- if(getBuffered2DDecomposition().empty())
+ if(!getBuffered2DDecomposition())
{
if(!bDiscreteSizesAreCalculated)
{
diff --git a/drawinglayer/source/primitive2d/svggradientprimitive2d.cxx b/drawinglayer/source/primitive2d/svggradientprimitive2d.cxx
index 6670ba22b5c3..1bf263a50f71 100644
--- a/drawinglayer/source/primitive2d/svggradientprimitive2d.cxx
+++ b/drawinglayer/source/primitive2d/svggradientprimitive2d.cxx
@@ -63,7 +63,7 @@ namespace
namespace drawinglayer::primitive2d
{
- void SvgGradientHelper::createSingleGradientEntryFill(Primitive2DContainer& rContainer) const
+ Primitive2DReference SvgGradientHelper::createSingleGradientEntryFill() const
{
const SvgGradientEntryVector& rEntries = getGradientEntries();
const sal_uInt32 nCount(rEntries.size());
@@ -90,13 +90,14 @@ namespace drawinglayer::primitive2d
1.0 - fOpacity);
}
- rContainer.push_back(xRef);
+ return xRef;
}
}
else
{
OSL_ENSURE(false, "Single gradient entry construction without entry (!)");
}
+ return nullptr;
}
void SvgGradientHelper::checkPreconditions()
@@ -305,8 +306,7 @@ namespace drawinglayer::primitive2d
}
}
- void SvgGradientHelper::createResult(
- Primitive2DContainer& rContainer,
+ Primitive2DReference SvgGradientHelper::createResult(
Primitive2DContainer aTargetColor,
Primitive2DContainer aTargetOpacity,
const basegfx::B2DHomMatrix& rUnitGradientToObject,
@@ -316,7 +316,7 @@ namespace drawinglayer::primitive2d
Primitive2DContainer aTargetOpacityEntries(aTargetOpacity.maybeInvert(bInvert));
if(aTargetColorEntries.empty())
- return;
+ return nullptr;
Primitive2DReference xRefContent;
@@ -337,9 +337,9 @@ namespace drawinglayer::primitive2d
std::move(aTargetColorEntries));
}
- rContainer.push_back(new MaskPrimitive2D(
+ return new MaskPrimitive2D(
getPolyPolygon(),
- Primitive2DContainer { xRefContent }));
+ Primitive2DContainer { xRefContent });
}
SvgGradientHelper::SvgGradientHelper(
@@ -466,7 +466,7 @@ namespace drawinglayer::primitive2d
}
}
- void SvgLinearGradientPrimitive2D::create2DDecomposition(Primitive2DContainer& rContainer, const geometry::ViewInformation2D& /*rViewInformation*/) const
+ Primitive2DReference SvgLinearGradientPrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& /*rViewInformation*/) const
{
if(!getPreconditionsChecked())
{
@@ -476,7 +476,7 @@ namespace drawinglayer::primitive2d
if(getSingleEntry())
{
// fill with last existing color
- createSingleGradientEntryFill(rContainer);
+ return createSingleGradientEntryFill();
}
else if(getCreatesContent())
{
@@ -556,8 +556,9 @@ namespace drawinglayer::primitive2d
aUnitRange.getMaxX());
}
- createResult(rContainer, std::move(aTargetColor), std::move(aTargetOpacity), aUnitGradientToObject);
+ return createResult(std::move(aTargetColor), std::move(aTargetOpacity), aUnitGradientToObject);
}
+ return nullptr;
}
SvgLinearGradientPrimitive2D::SvgLinearGradientPrimitive2D(
@@ -688,7 +689,7 @@ namespace drawinglayer::primitive2d
}
}
- void SvgRadialGradientPrimitive2D::create2DDecomposition(Primitive2DContainer& rContainer, const geometry::ViewInformation2D& /*rViewInformation*/) const
+ Primitive2DReference SvgRadialGradientPrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& /*rViewInformation*/) const
{
if(!getPreconditionsChecked())
{
@@ -698,7 +699,7 @@ namespace drawinglayer::primitive2d
if(getSingleEntry())
{
// fill with last existing color
- createSingleGradientEntryFill(rContainer);
+ return createSingleGradientEntryFill();
}
else if(getCreatesContent())
{
@@ -782,8 +783,9 @@ namespace drawinglayer::primitive2d
fMax);
}
- createResult(rContainer, std::move(aTargetColor), std::move(aTargetOpacity), aUnitGradientToObject, true);
+ return createResult(std::move(aTargetColor), std::move(aTargetOpacity), aUnitGradientToObject, true);
}
+ return nullptr;
}
SvgRadialGradientPrimitive2D::SvgRadialGradientPrimitive2D(
@@ -860,12 +862,12 @@ namespace drawinglayer::primitive2d
namespace drawinglayer::primitive2d
{
- void SvgLinearAtomPrimitive2D::create2DDecomposition(Primitive2DContainer& rContainer, const geometry::ViewInformation2D& /*rViewInformation*/) const
+ Primitive2DReference SvgLinearAtomPrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& /*rViewInformation*/) const
{
const double fDelta(getOffsetB() - getOffsetA());
if(basegfx::fTools::equalZero(fDelta))
- return;
+ return nullptr;
// use one discrete unit for overlap (one pixel)
const double fDiscreteUnit(getDiscreteUnit());
@@ -899,15 +901,18 @@ namespace drawinglayer::primitive2d
double fUnitScale(0.0);
const double fUnitStep(1.0 / nSteps);
+ Primitive2DContainer aContainer;
+ aContainer.resize(nSteps);
for(sal_uInt32 a(0); a < nSteps; a++, fUnitScale += fUnitStep)
{
basegfx::B2DPolygon aNew(aPolygon);
aNew.transform(basegfx::utils::createTranslateB2DHomMatrix(fDelta * fUnitScale, 0.0));
- rContainer.push_back(new PolyPolygonColorPrimitive2D(
+ aContainer[a] = new PolyPolygonColorPrimitive2D(
basegfx::B2DPolyPolygon(aNew),
- basegfx::interpolate(getColorA(), getColorB(), fUnitScale)));
+ basegfx::interpolate(getColorA(), getColorB(), fUnitScale));
}
+ return new GroupPrimitive2D(std::move(aContainer));
}
SvgLinearAtomPrimitive2D::SvgLinearAtomPrimitive2D(
@@ -953,12 +958,12 @@ namespace drawinglayer::primitive2d
namespace drawinglayer::primitive2d
{
- void SvgRadialAtomPrimitive2D::create2DDecomposition(Primitive2DContainer& rContainer, const geometry::ViewInformation2D& /*rViewInformation*/) const
+ Primitive2DReference SvgRadialAtomPrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& /*rViewInformation*/) const
{
const double fDeltaScale(getScaleB() - getScaleA());
if(basegfx::fTools::equalZero(fDeltaScale))
- return;
+ return nullptr;
// use one discrete unit for overlap (one pixel)
const double fDiscreteUnit(getDiscreteUnit());
@@ -970,6 +975,8 @@ namespace drawinglayer::primitive2d
double fUnitScale(0.0);
const double fUnitStep(1.0 / nSteps);
+ Primitive2DContainer aContainer;
+ aContainer.resize(nSteps);
for(sal_uInt32 a(0); a < nSteps; a++, fUnitScale += fUnitStep)
{
basegfx::B2DHomMatrix aTransform;
@@ -999,10 +1006,11 @@ namespace drawinglayer::primitive2d
basegfx::B2DPolygon aNew(basegfx::utils::createPolygonFromUnitCircle());
aNew.transform(aTransform);
- rContainer.push_back(new PolyPolygonColorPrimitive2D(
+ aContainer[a] = new PolyPolygonColorPrimitive2D(
basegfx::B2DPolyPolygon(aNew),
- basegfx::interpolate(getColorB(), getColorA(), fUnitScale)));
+ basegfx::interpolate(getColorB(), getColorA(), fUnitScale));
}
+ return new GroupPrimitive2D(std::move(aContainer));
}
SvgRadialAtomPrimitive2D::SvgRadialAtomPrimitive2D(
diff --git a/drawinglayer/source/primitive2d/textdecoratedprimitive2d.cxx b/drawinglayer/source/primitive2d/textdecoratedprimitive2d.cxx
index 5498b2124bc9..07181bbf2a17 100644
--- a/drawinglayer/source/primitive2d/textdecoratedprimitive2d.cxx
+++ b/drawinglayer/source/primitive2d/textdecoratedprimitive2d.cxx
@@ -164,7 +164,7 @@ namespace drawinglayer::primitive2d
// TODO: Handle Font Emphasis Above/Below
}
- void TextDecoratedPortionPrimitive2D::create2DDecomposition(Primitive2DContainer& rContainer, const geometry::ViewInformation2D& /*rViewInformation*/) const
+ Primitive2DReference TextDecoratedPortionPrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& /*rViewInformation*/) const
{
if(getWordLineMode())
{
@@ -176,8 +176,7 @@ namespace drawinglayer::primitive2d
if(!aBroken.empty())
{
// was indeed split to several words, use as result
- rContainer.append(std::move(aBroken));
- return;
+ return new GroupPrimitive2D(std::move(aBroken));
}
else
{
@@ -207,68 +206,57 @@ namespace drawinglayer::primitive2d
impCreateGeometryContent(aRetval, aDecTrans, getText(), getTextPosition(), getTextLength(), getDXArray(), getKashidaArray(), aNewFontAttribute);
// Handle Shadow, Outline and TextRelief
- if(!aRetval.empty())
+ if(aRetval.empty())
+ return nullptr;
+
+ // outline AND shadow depend on NO TextRelief (see dialog)
+ const bool bHasTextRelief(TEXT_RELIEF_NONE != getTextRelief());
+ const bool bHasShadow(!bHasTextRelief && getShadow());
+ const bool bHasOutline(!bHasTextRelief && getFontAttribute().getOutline());
+
+ if(bHasShadow || bHasTextRelief || bHasOutline)
{
- // outline AND shadow depend on NO TextRelief (see dialog)
- const bool bHasTextRelief(TEXT_RELIEF_NONE != getTextRelief());
- const bool bHasShadow(!bHasTextRelief && getShadow());
- const bool bHasOutline(!bHasTextRelief && getFontAttribute().getOutline());
+ Primitive2DReference aShadow;
- if(bHasShadow || bHasTextRelief || bHasOutline)
+ if(bHasShadow)
{
- Primitive2DReference aShadow;
+ // create shadow with current content (in aRetval). Text shadow
+ // is constant, relative to font size, rotated with the text and has a
+ // constant color.
+ // shadow parameter values
+ static const double fFactor(1.0 / 24.0);
+ const double fTextShadowOffset(aDecTrans.getScale().getY() * fFactor);
+ static basegfx::BColor aShadowColor(0.3, 0.3, 0.3);
+
+ // prepare shadow transform matrix
+ const basegfx::B2DHomMatrix aShadowTransform(basegfx::utils::createTranslateB2DHomMatrix(
+ fTextShadowOffset, fTextShadowOffset));
+
+ // create shadow primitive
+ aShadow = new ShadowPrimitive2D(
+ aShadowTransform,
+ aShadowColor,
+ 0, // fShadowBlur = 0, there's no blur for text shadow yet.
+ Primitive2DContainer(aRetval));
+ }
- if(bHasShadow)
- {
- // create shadow with current content (in aRetval). Text shadow
- // is constant, relative to font size, rotated with the text and has a
- // constant color.
- // shadow parameter values
- static const double fFactor(1.0 / 24.0);
- const double fTextShadowOffset(aDecTrans.getScale().getY() * fFactor);
- static basegfx::BColor aShadowColor(0.3, 0.3, 0.3);
-
- // prepare shadow transform matrix
- const basegfx::B2DHomMatrix aShadowTransform(basegfx::utils::createTranslateB2DHomMatrix(
- fTextShadowOffset, fTextShadowOffset));
-
- // create shadow primitive
- aShadow = new ShadowPrimitive2D(
- aShadowTransform,
- aShadowColor,
- 0, // fShadowBlur = 0, there's no blur for text shadow yet.
- Primitive2DContainer(aRetval));
- }
+ if(bHasTextRelief)
+ {
+ // create emboss using an own helper primitive since this will
+ // be view-dependent
+ const basegfx::BColor aBBlack(0.0, 0.0, 0.0);
+ const bool bDefaultTextColor(aBBlack == getFontColor());
+ TextEffectStyle2D aTextEffectStyle2D(TextEffectStyle2D::ReliefEmbossed);
- if(bHasTextRelief)
+ if(bDefaultTextColor)
{
- // create emboss using an own helper primitive since this will
- // be view-dependent
- const basegfx::BColor aBBlack(0.0, 0.0, 0.0);
- const bool bDefaultTextColor(aBBlack == getFontColor());
- TextEffectStyle2D aTextEffectStyle2D(TextEffectStyle2D::ReliefEmbossed);
-
- if(bDefaultTextColor)
+ if(TEXT_RELIEF_ENGRAVED == getTextRelief())
{
- if(TEXT_RELIEF_ENGRAVED == getTextRelief())
- {
- aTextEffectStyle2D = TextEffectStyle2D::ReliefEngravedDefault;
- }
- else
- {
- aTextEffectStyle2D = TextEffectStyle2D::ReliefEmbossedDefault;
- }
+ aTextEffectStyle2D = TextEffectStyle2D::ReliefEngravedDefault;
}
else
{
- if(TEXT_RELIEF_ENGRAVED == getTextRelief())
- {
- aTextEffectStyle2D = TextEffectStyle2D::ReliefEngraved;
- }
- else
- {
- aTextEffectStyle2D = TextEffectStyle2D::ReliefEmbossed;
- }
+ aTextEffectStyle2D = TextEffectStyle2D::ReliefEmbossedDefault;
}
aRetval = Primitive2DContainer {
@@ -279,7 +267,7 @@ namespace drawinglayer::primitive2d
aTextEffectStyle2D)
};
}
- else if(bHasOutline)
+ else
{
// create outline using an own helper primitive since this will
// be view-dependent
@@ -292,16 +280,36 @@ namespace drawinglayer::primitive2d
};
}
- if(aShadow.is())
- {
- // put shadow in front if there is one to paint timely before
- // but placed behind content
- aRetval.insert(aRetval.begin(), aShadow);
- }
+ aRetval = Primitive2DContainer {
+ Primitive2DReference(new TextEffectPrimitive2D(
+ std::move(aRetval),
+ aDecTrans.getTranslate(),
+ aDecTrans.getRotate(),
+ aTextEffectStyle2D))
+ };
+ }
+ else if(bHasOutline)
+ {
+ // create outline using an own helper primitive since this will
+ // be view-dependent
+ aRetval = Primitive2DContainer {
+ Primitive2DReference(new TextEffectPrimitive2D(
+ std::move(aRetval),
+ aDecTrans.getTranslate(),
+ aDecTrans.getRotate(),
+ TextEffectStyle2D::Outline))
+ };
+ }
+
+ if(aShadow.is())
+ {
+ // put shadow in front if there is one to paint timely before
+ // but placed behind content
+ aRetval.insert(aRetval.begin(), aShadow);
}
}
- rContainer.append(std::move(aRetval));
+ return new GroupPrimitive2D(std::move(aRetval));
}
TextDecoratedPortionPrimitive2D::TextDecoratedPortionPrimitive2D(
diff --git a/drawinglayer/source/primitive2d/texteffectprimitive2d.cxx b/drawinglayer/source/primitive2d/texteffectprimitive2d.cxx
index dae397e1abd8..df4ea9a692a3 100644
--- a/drawinglayer/source/primitive2d/texteffectprimitive2d.cxx
+++ b/drawinglayer/source/primitive2d/texteffectprimitive2d.cxx
@@ -28,8 +28,8 @@ namespace drawinglayer::primitive2d
{
const double fDiscreteSize(1.1);
-void TextEffectPrimitive2D::create2DDecomposition(
- Primitive2DContainer& rContainer, const geometry::ViewInformation2D& rViewInformation) const
+Primitive2DReference TextEffectPrimitive2D::create2DDecomposition(
+ const geometry::ViewInformation2D& rViewInformation) const
{
// get the distance of one discrete units from target display. Use between 1.0 and sqrt(2) to
// have good results on rotated objects, too
@@ -37,6 +37,7 @@ void TextEffectPrimitive2D::create2DDecomposition(
* basegfx::B2DVector(fDiscreteSize, fDiscreteSize));
const basegfx::B2DVector aDiagonalDistance(aDistance * (1.0 / 1.44));
+ Primitive2DContainer aContainer;
switch (getTextEffectStyle2D())
{
case TextEffectStyle2D::ReliefEmbossed:
@@ -84,14 +85,14 @@ void TextEffectPrimitive2D::create2DDecomposition(
const Primitive2DReference xModifiedColor(new ModifiedColorPrimitive2D(
Primitive2DContainer(getTextContent()), aBColorModifierToGray));
- rContainer.push_back(
+ aContainer.push_back(
new TransformPrimitive2D(aTransform, Primitive2DContainer{ xModifiedColor }));
// add original, too
const basegfx::BColorModifierSharedPtr aBColorModifierToWhite
= std::make_shared<basegfx::BColorModifier_replace>(basegfx::BColor(1.0));
- rContainer.push_back(new ModifiedColorPrimitive2D(
+ aContainer.push_back(new ModifiedColorPrimitive2D(
Primitive2DContainer(getTextContent()), aBColorModifierToWhite));
}
else
@@ -103,11 +104,11 @@ void TextEffectPrimitive2D::create2DDecomposition(
const Primitive2DReference xModifiedColor(new ModifiedColorPrimitive2D(
Primitive2DContainer(getTextContent()), aBColorModifierToGray));
- rContainer.push_back(
+ aContainer.push_back(
new TransformPrimitive2D(aTransform, Primitive2DContainer{ xModifiedColor }));
// add original, too
- rContainer.push_back(new GroupPrimitive2D(Primitive2DContainer(getTextContent())));
+ aContainer.push_back(new GroupPrimitive2D(Primitive2DContainer(getTextContent())));
}
break;
@@ -119,53 +120,54 @@ void TextEffectPrimitive2D::create2DDecomposition(
aTransform.set(0, 2, aDistance.getX());
aTransform.set(1, 2, 0.0);
- rContainer.push_back(
+ aContainer.push_back(
new TransformPrimitive2D(aTransform, Primitive2DContainer(getTextContent())));
aTransform.set(0, 2, aDiagonalDistance.getX());
aTransform.set(1, 2, aDiagonalDistance.getY());
- rContainer.push_back(
+ aContainer.push_back(
new TransformPrimitive2D(aTransform, Primitive2DContainer(getTextContent())));
aTransform.set(0, 2, 0.0);
aTransform.set(1, 2, aDistance.getY());
- rContainer.push_back(
+ aContainer.push_back(
new TransformPrimitive2D(aTransform, Primitive2DContainer(getTextContent())));
aTransform.set(0, 2, -aDiagonalDistance.getX());
aTransform.set(1, 2, aDiagonalDistance.getY());
- rContainer.push_back(
+ aContainer.push_back(
new TransformPrimitive2D(aTransform, Primitive2DContainer(getTextContent())));
aTransform.set(0, 2, -aDistance.getX());
aTransform.set(1, 2, 0.0);
- rContainer.push_back(
+ aContainer.push_back(
new TransformPrimitive2D(aTransform, Primitive2DContainer(getTextContent())));
aTransform.set(0, 2, -aDiagonalDistance.getX());
aTransform.set(1, 2, -aDiagonalDistance.getY());
- rContainer.push_back(
+ aContainer.push_back(
new TransformPrimitive2D(aTransform, Primitive2DContainer(getTextContent())));
aTransform.set(0, 2, 0.0);
aTransform.set(1, 2, -aDistance.getY());
- rContainer.push_back(
+ aContainer.push_back(
new TransformPrimitive2D(aTransform, Primitive2DContainer(getTextContent())));
aTransform.set(0, 2, aDiagonalDistance.getX());
aTransform.set(1, 2, -aDiagonalDistance.getY());
- rContainer.push_back(
+ aContainer.push_back(
new TransformPrimitive2D(aTransform, Primitive2DContainer(getTextContent())));
// at last, place original over it, but force to white
const basegfx::BColorModifierSharedPtr aBColorModifierToWhite
= std::make_shared<basegfx::BColorModifier_replace>(basegfx::BColor(1.0, 1.0, 1.0));
- rContainer.push_back(new ModifiedColorPrimitive2D(
+ aContainer.push_back(new ModifiedColorPrimitive2D(
Primitive2DContainer(getTextContent()), aBColorModifierToWhite));
break;
}
}
+ return new GroupPrimitive2D(std::move(aContainer));
}
TextEffectPrimitive2D::TextEffectPrimitive2D(Primitive2DContainer&& rTextContent,
@@ -213,17 +215,16 @@ void TextEffectPrimitive2D::get2DDecomposition(
Primitive2DDecompositionVisitor& rVisitor,
const geometry::ViewInformation2D& rViewInformation) const
{
- if (!getBuffered2DDecomposition().empty())
+ if (getBuffered2DDecomposition())
{
if (maLastObjectToViewTransformation != rViewInformation.getObjectToViewTransformation())
{
// conditions of last local decomposition have changed, delete
- const_cast<TextEffectPrimitive2D*>(this)->setBuffered2DDecomposition(
- Primitive2DContainer());
+ const_cast<TextEffectPrimitive2D*>(this)->setBuffered2DDecomposition(nullptr);
}
}
- if (getBuffered2DDecomposition().empty())
+ if (!getBuffered2DDecomposition())
{
// remember ViewRange and ViewTransformation
const_cast<TextEffectPrimitive2D*>(this)->maLastObjectToViewTransformation
diff --git a/drawinglayer/source/primitive2d/textlineprimitive2d.cxx b/drawinglayer/source/primitive2d/textlineprimitive2d.cxx
index 988e6a33345d..496af0706520 100644
--- a/drawinglayer/source/primitive2d/textlineprimitive2d.cxx
+++ b/drawinglayer/source/primitive2d/textlineprimitive2d.cxx
@@ -29,10 +29,10 @@
namespace drawinglayer::primitive2d
{
- void TextLinePrimitive2D::create2DDecomposition(Primitive2DContainer& rContainer, const geometry::ViewInformation2D& /*rViewInformation*/) const
+ Primitive2DReference TextLinePrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& /*rViewInformation*/) const
{
if(TEXT_LINE_NONE == getTextLine())
- return;
+ return nullptr;
bool bDoubleLine(false);
bool bWaveLine(false);
@@ -215,11 +215,12 @@ namespace drawinglayer::primitive2d
aNewPrimitive = new PolygonStrokePrimitive2D(std::move(aLine), aLineAttribute, std::move(aStrokeAttribute));
}
- // add primitive
- rContainer.push_back(aNewPrimitive);
-
if(!bDoubleLine)
- return;
+ return aNewPrimitive;
+
+ // add primitive
+ Primitive2DContainer aContainer;
+ aContainer.push_back(aNewPrimitive);
// double line, create 2nd primitive with offset using TransformPrimitive based on
// already created NewPrimitive
@@ -244,7 +245,8 @@ namespace drawinglayer::primitive2d
// add transform primitive
Primitive2DContainer aContent { aNewPrimitive };
- rContainer.push_back( new TransformPrimitive2D(aTransform, std::move(aContent)) );
+ aContainer.push_back(new TransformPrimitive2D(aTransform, std::move(aContent)));
+ return new GroupPrimitive2D(std::move(aContainer));
}
TextLinePrimitive2D::TextLinePrimitive2D(
diff --git a/drawinglayer/source/primitive2d/textprimitive2d.cxx b/drawinglayer/source/primitive2d/textprimitive2d.cxx
index b466446cc5db..676c451a934c 100644
--- a/drawinglayer/source/primitive2d/textprimitive2d.cxx
+++ b/drawinglayer/source/primitive2d/textprimitive2d.cxx
@@ -22,6 +22,7 @@
#include <basegfx/polygon/b2dpolypolygon.hxx>
#include <drawinglayer/primitive2d/PolyPolygonColorPrimitive2D.hxx>
#include <drawinglayer/primitive2d/drawinglayer_primitivetypes2d.hxx>
+#include <drawinglayer/primitive2d/groupprimitive2d.hxx>
#include <primitive2d/texteffectprimitive2d.hxx>
#include <basegfx/matrix/b2dhommatrixtools.hxx>
#include <utility>
@@ -152,13 +153,12 @@ void TextSimplePortionPrimitive2D::getTextOutlinesAndTransformation(
}
}
-void TextSimplePortionPrimitive2D::create2DDecomposition(
- Primitive2DContainer& rContainer, const geometry::ViewInformation2D& /*rViewInformation*/) const
+Primitive2DReference TextSimplePortionPrimitive2D::create2DDecomposition(
+ const geometry::ViewInformation2D& /*rViewInformation*/) const
{
if (!getTextLength())
- return;
+ return nullptr;
- Primitive2DContainer aRetval;
basegfx::B2DPolyPolygonVector aB2DPolyPolyVector;
basegfx::B2DHomMatrix aPolygonTransform;
@@ -169,9 +169,10 @@ void TextSimplePortionPrimitive2D::create2DDecomposition(
const sal_uInt32 nCount(aB2DPolyPolyVector.size());
if (!nCount)
- return;
+ return nullptr;
// alloc space for the primitives
+ Primitive2DContainer aRetval;
aRetval.resize(nCount);
// color-filled polypolygons
@@ -191,11 +192,11 @@ void TextSimplePortionPrimitive2D::create2DDecomposition(
aPolygonTransform.decompose(aScale, aTranslate, fRotate, fShearX);
// create outline text effect with current content and replace
- aRetval = Primitive2DContainer{ new TextEffectPrimitive2D(
- std::move(aRetval), aTranslate, fRotate, TextEffectStyle2D::Outline) };
+ return new TextEffectPrimitive2D(std::move(aRetval), aTranslate, fRotate,
+ TextEffectStyle2D::Outline);
}
- rContainer.append(std::move(aRetval));
+ return new GroupPrimitive2D(std::move(aRetval));
}
TextSimplePortionPrimitive2D::TextSimplePortionPrimitive2D(
diff --git a/drawinglayer/source/primitive2d/textstrikeoutprimitive2d.cxx b/drawinglayer/source/primitive2d/textstrikeoutprimitive2d.cxx
index 7300bc2a70eb..41f7299c4486 100644
--- a/drawinglayer/source/primitive2d/textstrikeoutprimitive2d.cxx
+++ b/drawinglayer/source/primitive2d/textstrikeoutprimitive2d.cxx
@@ -58,7 +58,7 @@ namespace drawinglayer::primitive2d
}
- void TextCharacterStrikeoutPrimitive2D::create2DDecomposition(Primitive2DContainer& rContainer, const geometry::ViewInformation2D& /*rViewInformation*/) const
+ Primitive2DReference TextCharacterStrikeoutPrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& /*rViewInformation*/) const
{
// strikeout with character
const OUString aSingleCharString(getStrikeoutChar());
@@ -90,7 +90,7 @@ namespace drawinglayer::primitive2d
}
auto len = aStrikeoutString.getLength();
- rContainer.push_back(
+ return
new TextSimplePortionPrimitive2D(
getObjectTransformation(),
aStrikeoutString.makeStringAndClear(),
@@ -100,7 +100,7 @@ namespace drawinglayer::primitive2d
{},
getFontAttribute(),
getLocale(),
- getFontColor()));
+ getFontColor());
}
TextCharacterStrikeoutPrimitive2D::TextCharacterStrikeoutPrimitive2D(
@@ -137,7 +137,7 @@ namespace drawinglayer::primitive2d
return PRIMITIVE2D_ID_TEXTCHARACTERSTRIKEOUTPRIMITIVE2D;
}
- void TextGeometryStrikeoutPrimitive2D::create2DDecomposition(Primitive2DContainer& rContainer, const geometry::ViewInformation2D& /*rViewInformation*/) const
+ Primitive2DReference TextGeometryStrikeoutPrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& /*rViewInformation*/) const
{
OSL_ENSURE(TEXT_STRIKEOUT_SLASH != getTextStrikeout() && TEXT_STRIKEOUT_X != getTextStrikeout(),
"Wrong TEXT_STRIKEOUT type; a TextCharacterStrikeoutPrimitive2D should be used (!)");
@@ -191,8 +191,7 @@ namespace drawinglayer::primitive2d
// add primitive
const attribute::LineAttribute aLineAttribute(getFontColor(), fStrikeoutHeight, basegfx::B2DLineJoin::NONE);
- Primitive2DContainer xRetval {
- new PolygonStrokePrimitive2D(std::move(aStrikeoutLine), aLineAttribute) };
+ Primitive2DReference xRetval = new PolygonStrokePrimitive2D(std::move(aStrikeoutLine), aLineAttribute);
if(bDoubleLine)
{
@@ -213,13 +212,13 @@ namespace drawinglayer::primitive2d
aTransform.translate(aTranslate.getX(), aTranslate.getY());
// add transform primitive
- xRetval.push_back(
+ xRetval =
new TransformPrimitive2D(
aTransform,
- Primitive2DContainer(xRetval)));
+ Primitive2DContainer{xRetval});
}
- rContainer.append(std::move(xRetval));
+ return xRetval;
}
TextGeometryStrikeoutPrimitive2D::TextGeometryStrikeoutPrimitive2D(
diff --git a/drawinglayer/source/primitive2d/wallpaperprimitive2d.cxx b/drawinglayer/source/primitive2d/wallpaperprimitive2d.cxx
index 67919e3c5a2a..9e3af10415dd 100644
--- a/drawinglayer/source/primitive2d/wallpaperprimitive2d.cxx
+++ b/drawinglayer/source/primitive2d/wallpaperprimitive2d.cxx
@@ -31,11 +31,11 @@
namespace drawinglayer::primitive2d
{
- void WallpaperBitmapPrimitive2D::create2DDecomposition(Primitive2DContainer& rContainer, const geometry::ViewInformation2D& /*rViewInformation*/) const
+ Primitive2DReference WallpaperBitmapPrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& /*rViewInformation*/) const
{
if(getLocalObjectRange().isEmpty() || getBitmapEx().IsEmpty())
- return;
+ return nullptr;
Primitive2DReference aRetval;
@@ -43,7 +43,7 @@ namespace drawinglayer::primitive2d
const Size& rPixelSize = getBitmapEx().GetSizePixel();
if(rPixelSize.Width() <= 0 || rPixelSize.Height() <= 0)
- return;
+ return nullptr;
if(WallpaperStyle::Scale == getWallpaperStyle())
{
@@ -210,8 +210,7 @@ namespace drawinglayer::primitive2d
}
}
- if (aRetval.is())
- rContainer.push_back(std::move(aRetval));
+ return aRetval;
}
WallpaperBitmapPrimitive2D::WallpaperBitmapPrimitive2D(
diff --git a/drawinglayer/source/primitive2d/wrongspellprimitive2d.cxx b/drawinglayer/source/primitive2d/wrongspellprimitive2d.cxx
index 8ce5948d969a..6084814ae71f 100644
--- a/drawinglayer/source/primitive2d/wrongspellprimitive2d.cxx
+++ b/drawinglayer/source/primitive2d/wrongspellprimitive2d.cxx
@@ -27,7 +27,7 @@
namespace drawinglayer::primitive2d
{
- void WrongSpellPrimitive2D::create2DDecomposition(Primitive2DContainer& rContainer, const geometry::ViewInformation2D& /*rViewInformation*/) const
+ Primitive2DReference WrongSpellPrimitive2D::create2DDecomposition(const geometry::ViewInformation2D& /*rViewInformation*/) const
{
// ATM this decompose is view-independent, what the original VCL-Display is not. To mimic
// the old behaviour here if wanted it is necessary to add get2DDecomposition and implement
@@ -65,7 +65,7 @@ namespace drawinglayer::primitive2d
const attribute::LineAttribute aLineAttribute(getColor());
// create the waveline primitive
- rContainer.push_back(new PolygonWavePrimitive2D(aPolygon, aLineAttribute, fWaveWidth, 0.5 * fWaveWidth));
+ return new PolygonWavePrimitive2D(aPolygon, aLineAttribute, fWaveWidth, 0.5 * fWaveWidth);
}
WrongSpellPrimitive2D::WrongSpellPrimitive2D(
diff --git a/drawinglayer/source/processor2d/baseprocessor2d.cxx b/drawinglayer/source/processor2d/baseprocessor2d.cxx
index f4aec90383ee..13d6b4c63b08 100644
--- a/drawinglayer/source/processor2d/baseprocessor2d.cxx
+++ b/drawinglayer/source/processor2d/baseprocessor2d.cxx
@@ -49,7 +49,8 @@ namespace drawinglayer::processor2d
// Primitive2DDecompositionVisitor
void BaseProcessor2D::visit(const primitive2d::Primitive2DReference& rCandidate)
{
- processBasePrimitive2D(*rCandidate);
+ if (rCandidate)
+ processBasePrimitive2D(*rCandidate);
}
void BaseProcessor2D::visit(const primitive2d::Primitive2DContainer& rContainer)
{
diff --git a/drawinglayer/source/tools/wmfemfhelper.cxx b/drawinglayer/source/tools/wmfemfhelper.cxx
index 775df12733fe..13634c9ad1a5 100644
--- a/drawinglayer/source/tools/wmfemfhelper.cxx
+++ b/drawinglayer/source/tools/wmfemfhelper.cxx
@@ -77,7 +77,7 @@ namespace drawinglayer::primitive2d
{
protected:
/// local decomposition.
- virtual void create2DDecomposition(Primitive2DContainer& rContainer,
+ virtual Primitive2DReference create2DDecomposition(
const geometry::ViewInformation2D& rViewInformation) const override;
public:
@@ -92,14 +92,14 @@ namespace drawinglayer::primitive2d
}
- void NonOverlappingFillGradientPrimitive2D::create2DDecomposition(
- Primitive2DContainer& rContainer,
+ Primitive2DReference NonOverlappingFillGradientPrimitive2D::create2DDecomposition(
const geometry::ViewInformation2D& /*rViewInformation*/) const
{
if (!getFillGradient().isDefault())
{
- createFill(rContainer, false);
+ return createFill(false);
}
+ return nullptr;
}
} // end of namespace