LibreOffice Module drawinglayer (master) 1
svggradientprimitive2d.hxx
Go to the documentation of this file.
1/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2/*
3 * This file is part of the LibreOffice project.
4 *
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 *
9 * This file incorporates work covered by the following license notice:
10 *
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 */
19
20#pragma once
21
28#include <vector>
29
30
31// SvgGradientEntry class
32
34{
37 {
38 private:
39 double mfOffset;
41 double mfOpacity;
42
43 public:
44 SvgGradientEntry(double fOffset, const basegfx::BColor& rColor, double fOpacity)
45 : mfOffset(fOffset),
46 maColor(rColor),
47 mfOpacity(fOpacity)
48 {
49 }
50
51 double getOffset() const { return mfOffset; }
52 const basegfx::BColor& getColor() const { return maColor; }
53 double getOpacity() const { return mfOpacity; }
54
55 bool operator==(const SvgGradientEntry& rCompare) const
56 {
57 return (getOffset() == rCompare.getOffset()
58 && getColor() == rCompare.getColor()
59 && getOpacity() == rCompare.getOpacity());
60 }
61
62 bool operator<(const SvgGradientEntry& rCompare) const
63 {
64 return getOffset() < rCompare.getOffset();
65 }
66 };
67
68 typedef ::std::vector< SvgGradientEntry > SvgGradientEntryVector;
69
70 // SvgGradientHelper class
71
72 enum class SpreadMethod
73 {
74 Pad,
75 Reflect,
76 Repeat
77 };
78
79 /* helper for linear and radial gradient, both get derived from this
80 to share common definitions and functionality
81 **/
82 class SAL_LOPLUGIN_ANNOTATE("crosscast") SvgGradientHelper
83 {
84 private:
86 basegfx::B2DHomMatrix maGradientTransform;
87
90
92 SvgGradientEntryVector maGradientEntries;
93
94 // internal helper for case SpreadMethod::Reflect
95 SvgGradientEntryVector maMirroredGradientEntries;
96
99
101 SpreadMethod maSpreadMethod;
102
103 bool mbPreconditionsChecked : 1;
104 bool mbCreatesContent : 1;
105 bool mbSingleEntry : 1;
106 bool mbFullyOpaque : 1;
107
108 // true = interpret in unit coordinate system -> object aspect ratio will scale result
109 // false = interpret in object coordinate system -> object aspect ratio will not scale result
110 // (related to SVG's gradientUnits (userSpaceOnUse|objectBoundingBox)
111 bool mbUseUnitCoordinates : 1;
112
114 const SvgGradientEntryVector& getMirroredGradientEntries() const;
115 void createMirroredGradientEntries();
116 const SvgGradientEntry& FindEntryLessOrEqual(sal_Int32& rInt, const double fFrac) const;
117 const SvgGradientEntry& FindEntryMore(sal_Int32& rInt,const double fFrac) const;
118
119 protected:
121 void createSingleGradientEntryFill(Primitive2DContainer& rContainer) const;
122 virtual void createAtom(
123 Primitive2DContainer& rTargetColor,
124 Primitive2DContainer& rTargetOpacity,
125 const SvgGradientEntry& rFrom,
126 const SvgGradientEntry& rTo,
127 sal_Int32 nOffsetFrom,
128 sal_Int32 nOffsetTo) const = 0;
129 void createRun(
130 Primitive2DContainer& rTargetColor,
131 Primitive2DContainer& rTargetOpacity,
132 double fStart,
133 double fEnd) const;
134 virtual void checkPreconditions();
135 void createResult(
136 Primitive2DContainer& rContainer,
137 Primitive2DContainer aTargetColor,
138 Primitive2DContainer aTargetOpacity,
139 const basegfx::B2DHomMatrix& rUnitGradientToObject,
140 bool bInvert = false) const;
141 bool getCreatesContent() const { return mbCreatesContent; }
142 bool getSingleEntry() const { return mbSingleEntry; }
143 void setSingleEntry() { mbSingleEntry = true; }
144 bool getPreconditionsChecked() const { return mbPreconditionsChecked; }
145 bool getFullyOpaque() const { return mbFullyOpaque; }
146
147 public:
149 SvgGradientHelper(
150 basegfx::B2DHomMatrix aGradientTransform,
151 basegfx::B2DPolyPolygon aPolyPolygon,
152 SvgGradientEntryVector&& rGradientEntries,
153 const basegfx::B2DPoint& rStart,
154 bool bUseUnitCoordinates,
155 SpreadMethod aSpreadMethod);
156 virtual ~SvgGradientHelper();
157
159 const basegfx::B2DHomMatrix& getGradientTransform() const { return maGradientTransform; }
160 const basegfx::B2DPolyPolygon& getPolyPolygon() const { return maPolyPolygon; }
161 const SvgGradientEntryVector& getGradientEntries() const { return maGradientEntries; }
162 const basegfx::B2DPoint& getStart() const { return maStart; }
163 bool getUseUnitCoordinates() const { return mbUseUnitCoordinates; }
164 SpreadMethod getSpreadMethod() const { return maSpreadMethod; }
165
167 bool operator==(const SvgGradientHelper& rSvgGradientHelper) const;
168 };
169
172 {
173 private:
176
178 virtual void createAtom(
179 Primitive2DContainer& rTargetColor,
180 Primitive2DContainer& rTargetOpacity,
181 const SvgGradientEntry& rFrom,
182 const SvgGradientEntry& rTo,
183 sal_Int32 nOffsetFrom,
184 sal_Int32 nOffsetTo) const override;
185 virtual void checkPreconditions() override;
186
188 virtual void create2DDecomposition(Primitive2DContainer& rContainer, const geometry::ViewInformation2D& rViewInformation) const override;
189
190 public:
193 const basegfx::B2DHomMatrix& rGradientTransform,
194 const basegfx::B2DPolyPolygon& rPolyPolygon,
195 SvgGradientEntryVector&& rGradientEntries,
196 const basegfx::B2DPoint& rStart,
197 const basegfx::B2DPoint& rEnd,
198 bool bUseUnitCoordinates,
199 SpreadMethod aSpreadMethod);
200 virtual ~SvgLinearGradientPrimitive2D() override;
201
203 const basegfx::B2DPoint& getEnd() const { return maEnd; }
204
206 virtual bool operator==(const BasePrimitive2D& rPrimitive) const override;
207
209 virtual basegfx::B2DRange getB2DRange(const geometry::ViewInformation2D& rViewInformation) const override;
210
212 virtual sal_uInt32 getPrimitive2DID() const override;
213 };
214
217 {
218 private:
220 double mfRadius;
221
226
227 bool mbFocalSet : 1;
228
230 virtual void createAtom(
231 Primitive2DContainer& rTargetColor,
232 Primitive2DContainer& rTargetOpacity,
233 const SvgGradientEntry& rFrom,
234 const SvgGradientEntry& rTo,
235 sal_Int32 nOffsetFrom,
236 sal_Int32 nOffsetTo) const override;
237 virtual void checkPreconditions() override;
238
240 virtual void create2DDecomposition(Primitive2DContainer& rContainer, const geometry::ViewInformation2D& rViewInformation) const override;
241
242 public:
245 const basegfx::B2DHomMatrix& rGradientTransform,
246 const basegfx::B2DPolyPolygon& rPolyPolygon,
247 SvgGradientEntryVector&& rGradientEntries,
248 const basegfx::B2DPoint& rStart,
249 double fRadius,
250 bool bUseUnitCoordinates,
251 SpreadMethod aSpreadMethod,
252 const basegfx::B2DPoint* pFocal);
253 virtual ~SvgRadialGradientPrimitive2D() override;
254
256 double getRadius() const { return mfRadius; }
257 const basegfx::B2DPoint& getFocal() const { return maFocal; }
258 bool isFocalSet() const { return mbFocalSet; }
259
261 virtual bool operator==(const BasePrimitive2D& rPrimitive) const override;
262
264 virtual basegfx::B2DRange getB2DRange(const geometry::ViewInformation2D& rViewInformation) const override;
265
267 virtual sal_uInt32 getPrimitive2DID() const override;
268 };
269
270 // SvgLinearAtomPrimitive2D class
271
272 /* basic primitive for a single linear GradientRun in unit coordinates.
273 It's derived from DiscreteMetricDependentPrimitive2D to allow view-dependent
274 decompositions allowing reduced color steps
275 **/
277 {
278 private:
282 double mfOffsetA;
283 double mfOffsetB;
284
286 virtual void create2DDecomposition(Primitive2DContainer& rContainer, const geometry::ViewInformation2D& rViewInformation) const override;
287
288 public:
291 const basegfx::BColor& aColorA, double fOffsetA,
292 const basegfx::BColor& aColorB, double fOffsetB);
293
295 const basegfx::BColor& getColorA() const { return maColorA; }
296 const basegfx::BColor& getColorB() const { return maColorB; }
297 double getOffsetA() const { return mfOffsetA; }
298 double getOffsetB() const { return mfOffsetB; }
299
301 virtual bool operator==(const BasePrimitive2D& rPrimitive) const override;
302
304 virtual sal_uInt32 getPrimitive2DID() const override;
305 };
306
307 // SvgRadialAtomPrimitive2D class
308
309 /* basic primitive for a single radial GradientRun in unit coordinates.
310 It's derived from DiscreteMetricDependentPrimitive2D to allow view-dependent
311 decompositions allowing reduced color steps
312 **/
314 {
315 private:
319 double mfScaleA;
320 double mfScaleB;
321
322 // helper to hold translation vectors when given (for focal)
324 {
327
328 VectorPair(const basegfx::B2DVector& rTranslateA, const basegfx::B2DVector& rTranslateB)
329 : maTranslateA(rTranslateA),
330 maTranslateB(rTranslateB)
331 {
332 }
333 };
334
336 std::unique_ptr<VectorPair> mpTranslate;
337
339 virtual void create2DDecomposition(Primitive2DContainer& rContainer, const geometry::ViewInformation2D& rViewInformation) const override;
340
341 public:
344 const basegfx::BColor& aColorA, double fScaleA, const basegfx::B2DVector& rTranslateA,
345 const basegfx::BColor& aColorB, double fScaleB, const basegfx::B2DVector& rTranslateB);
347 const basegfx::BColor& aColorA, double fScaleA,
348 const basegfx::BColor& aColorB, double fScaleB);
349 virtual ~SvgRadialAtomPrimitive2D() override;
350
352 const basegfx::BColor& getColorA() const { return maColorA; }
353 const basegfx::BColor& getColorB() const { return maColorB; }
354 double getScaleA() const { return mfScaleA; }
355 double getScaleB() const { return mfScaleB; }
356 bool isTranslateSet() const { return (nullptr != mpTranslate); }
357 basegfx::B2DVector getTranslateA() const { if(mpTranslate) return mpTranslate->maTranslateA; return basegfx::B2DVector(); }
358 basegfx::B2DVector getTranslateB() const { if(mpTranslate) return mpTranslate->maTranslateB; return basegfx::B2DVector(); }
359
361 virtual bool operator==(const BasePrimitive2D& rPrimitive) const override;
362
364 virtual sal_uInt32 getPrimitive2DID() const override;
365 };
366} // end of namespace drawinglayer::primitive2d
367
368
369/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
Point maStart
const Point maEnd
a single GradientStop defining a color and opacity at a distance
SvgGradientEntry(double fOffset, const basegfx::BColor &rColor, double fOpacity)
bool operator==(const SvgGradientEntry &rCompare) const
bool operator<(const SvgGradientEntry &rCompare) const
virtual void create2DDecomposition(Primitive2DContainer &rContainer, const geometry::ViewInformation2D &rViewInformation) const override
local decomposition.
const basegfx::BColor & getColorA() const
data read access
basegfx::BColor maColorA
the geometric definition in unit coordinates
SvgLinearAtomPrimitive2D(const basegfx::BColor &aColorA, double fOffsetA, const basegfx::BColor &aColorB, double fOffsetB)
constructor
virtual bool operator==(const BasePrimitive2D &rPrimitive) const override
compare operator
virtual sal_uInt32 getPrimitive2DID() const override
provide unique ID
basegfx::B2DPoint maEnd
the end point for linear gradient
const basegfx::B2DPoint & getEnd() const
data read access
virtual bool operator==(const BasePrimitive2D &rPrimitive) const override
compare operator
std::unique_ptr< VectorPair > mpTranslate
Only used when focal is set.
virtual sal_uInt32 getPrimitive2DID() const override
provide unique ID
virtual void create2DDecomposition(Primitive2DContainer &rContainer, const geometry::ViewInformation2D &rViewInformation) const override
local decomposition.
const basegfx::BColor & getColorA() const
data read access
SvgRadialAtomPrimitive2D(const basegfx::BColor &aColorA, double fScaleA, const basegfx::B2DVector &rTranslateA, const basegfx::BColor &aColorB, double fScaleB, const basegfx::B2DVector &rTranslateB)
constructor
basegfx::BColor maColorA
the geometric definition in unit coordinates
basegfx::B2DPoint maFocal
Focal only used when focal is set at all, see constructors.
#define DRAWINGLAYER_DLLPUBLIC
class SAL_LOPLUGIN_ANNOTATE("crosscast") SvgGradientHelper
::std::vector< SvgGradientEntry > SvgGradientEntryVector
basegfx::B2DPolyPolygon maPolyPolygon
VectorPair(const basegfx::B2DVector &rTranslateA, const basegfx::B2DVector &rTranslateB)
bool operator==(const XclFontData &rLeft, const XclFontData &rRight)