summaryrefslogtreecommitdiff
path: root/drawinglayer/source/primitive2d/svggradientprimitive2d.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'drawinglayer/source/primitive2d/svggradientprimitive2d.cxx')
-rw-r--r--drawinglayer/source/primitive2d/svggradientprimitive2d.cxx73
1 files changed, 41 insertions, 32 deletions
diff --git a/drawinglayer/source/primitive2d/svggradientprimitive2d.cxx b/drawinglayer/source/primitive2d/svggradientprimitive2d.cxx
index 5295cbedc37d..24f979ce2c9d 100644
--- a/drawinglayer/source/primitive2d/svggradientprimitive2d.cxx
+++ b/drawinglayer/source/primitive2d/svggradientprimitive2d.cxx
@@ -31,6 +31,7 @@
#include <osl/diagnose.h>
#include <sal/log.hxx>
#include <cmath>
+#include <utility>
#include <vcl/skia/SkiaHelper.hxx>
using namespace com::sun::star;
@@ -62,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());
@@ -83,19 +84,20 @@ namespace drawinglayer::primitive2d
{
Primitive2DContainer aContent { xRef };
- xRef = Primitive2DReference(
+ xRef =
new UnifiedTransparencePrimitive2D(
std::move(aContent),
- 1.0 - fOpacity));
+ 1.0 - fOpacity);
}
- rContainer.push_back(xRef);
+ return xRef;
}
}
else
{
OSL_ENSURE(false, "Single gradient entry construction without entry (!)");
}
+ return nullptr;
}
void SvgGradientHelper::checkPreconditions()
@@ -304,18 +306,17 @@ namespace drawinglayer::primitive2d
}
}
- void SvgGradientHelper::createResult(
- Primitive2DContainer& rContainer,
- const Primitive2DContainer& rTargetColor,
- const Primitive2DContainer& rTargetOpacity,
+ Primitive2DReference SvgGradientHelper::createResult(
+ Primitive2DContainer aTargetColor,
+ Primitive2DContainer aTargetOpacity,
const basegfx::B2DHomMatrix& rUnitGradientToObject,
bool bInvert) const
{
- Primitive2DContainer aTargetColorEntries(rTargetColor.maybeInvert(bInvert));
- Primitive2DContainer aTargetOpacityEntries(rTargetOpacity.maybeInvert(bInvert));
+ Primitive2DContainer aTargetColorEntries(aTargetColor.maybeInvert(bInvert));
+ Primitive2DContainer aTargetOpacityEntries(aTargetOpacity.maybeInvert(bInvert));
if(aTargetColorEntries.empty())
- return;
+ return nullptr;
Primitive2DReference xRefContent;
@@ -336,20 +337,20 @@ namespace drawinglayer::primitive2d
std::move(aTargetColorEntries));
}
- rContainer.push_back(new MaskPrimitive2D(
+ return new MaskPrimitive2D(
getPolyPolygon(),
- Primitive2DContainer { xRefContent }));
+ Primitive2DContainer { xRefContent });
}
SvgGradientHelper::SvgGradientHelper(
- const basegfx::B2DHomMatrix& rGradientTransform,
- const basegfx::B2DPolyPolygon& rPolyPolygon,
+ basegfx::B2DHomMatrix aGradientTransform,
+ basegfx::B2DPolyPolygon aPolyPolygon,
SvgGradientEntryVector&& rGradientEntries,
const basegfx::B2DPoint& rStart,
bool bUseUnitCoordinates,
SpreadMethod aSpreadMethod)
- : maGradientTransform(rGradientTransform),
- maPolyPolygon(rPolyPolygon),
+ : maGradientTransform(std::move(aGradientTransform)),
+ maPolyPolygon(std::move(aPolyPolygon)),
maGradientEntries(std::move(rGradientEntries)),
maStart(rStart),
maSpreadMethod(aSpreadMethod),
@@ -465,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())
{
@@ -475,7 +476,7 @@ namespace drawinglayer::primitive2d
if(getSingleEntry())
{
// fill with last existing color
- createSingleGradientEntryFill(rContainer);
+ return createSingleGradientEntryFill();
}
else if(getCreatesContent())
{
@@ -538,7 +539,7 @@ namespace drawinglayer::primitive2d
Primitive2DContainer aTargetColor;
Primitive2DContainer aTargetOpacity;
- if(basegfx::fTools::more(aUnitRange.getWidth(), 0.0))
+ if(aUnitRange.getWidth() > 0.0)
{
// add a pre-multiply to aUnitGradientToObject to allow
// multiplication of the polygon(xl, 0.0, xr, 1.0)
@@ -555,8 +556,9 @@ namespace drawinglayer::primitive2d
aUnitRange.getMaxX());
}
- createResult(rContainer, aTargetColor, aTargetOpacity, aUnitGradientToObject);
+ return createResult(std::move(aTargetColor), std::move(aTargetOpacity), aUnitGradientToObject);
}
+ return nullptr;
}
SvgLinearGradientPrimitive2D::SvgLinearGradientPrimitive2D(
@@ -687,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())
{
@@ -697,7 +699,7 @@ namespace drawinglayer::primitive2d
if(getSingleEntry())
{
// fill with last existing color
- createSingleGradientEntryFill(rContainer);
+ return createSingleGradientEntryFill();
}
else if(getCreatesContent())
{
@@ -781,8 +783,9 @@ namespace drawinglayer::primitive2d
fMax);
}
- createResult(rContainer, aTargetColor, aTargetOpacity, aUnitGradientToObject, true);
+ return createResult(std::move(aTargetColor), std::move(aTargetOpacity), aUnitGradientToObject, true);
}
+ return nullptr;
}
SvgRadialGradientPrimitive2D::SvgRadialGradientPrimitive2D(
@@ -859,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());
@@ -898,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(
@@ -952,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());
@@ -969,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;
@@ -998,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(