diff options
author | Noel Grandin <noelgrandin@gmail.com> | 2024-02-04 13:15:01 +0200 |
---|---|---|
committer | Noel Grandin <noel.grandin@collabora.co.uk> | 2024-02-12 11:36:05 +0100 |
commit | 3b83c6ac804cf7adcea036d1fb7dda113a72f457 (patch) | |
tree | 8f1af5f06f236a1dcb9ca313f3dedd3aa8c16390 /drawinglayer/source/primitive2d/svggradientprimitive2d.cxx | |
parent | 582ef812702413dbe7fb0f132bca3e3e4c2e1d40 (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/primitive2d/svggradientprimitive2d.cxx')
-rw-r--r-- | drawinglayer/source/primitive2d/svggradientprimitive2d.cxx | 50 |
1 files changed, 29 insertions, 21 deletions
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( |