Line data Source code
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 : #ifndef INCLUDED_FILTER_SOURCE_SVG_GFXTYPES_HXX
10 : #define INCLUDED_FILTER_SOURCE_SVG_GFXTYPES_HXX
11 :
12 : #include <basegfx/range/b2drange.hxx>
13 : #include <basegfx/matrix/b2dhommatrix.hxx>
14 : #include <basegfx/polygon/b2dlinegeometry.hxx>
15 :
16 : #include <boost/unordered_set.hpp>
17 : #include <boost/unordered_map.hpp>
18 : #include <rtl/ustring.hxx>
19 :
20 : namespace svgi
21 : {
22 :
23 : struct ARGBColor
24 : {
25 0 : double toDoubleColor( sal_uInt8 val ) const { return val/255.0; }
26 :
27 0 : ARGBColor() : a(1.0), r(0.0), g(0.0), b(0.0)
28 0 : {}
29 0 : explicit ARGBColor(double fGrey) : a(1.0), r(fGrey), g(fGrey), b(fGrey)
30 0 : {}
31 : ARGBColor( double r_, double g_, double b_ ) :
32 : a(1.0), r(r_), g(g_), b(b_)
33 : {}
34 : ARGBColor( double a_, double r_, double g_, double b_ ) :
35 : a(a_), r(r_), g(g_), b(b_)
36 : {}
37 0 : ARGBColor( int r_, int g_, int b_ ) :
38 : a(1.0),
39 0 : r(toDoubleColor(sal::static_int_cast<sal_uInt8>(r_))),
40 0 : g(toDoubleColor(sal::static_int_cast<sal_uInt8>(g_))),
41 0 : b(toDoubleColor(sal::static_int_cast<sal_uInt8>(b_)))
42 0 : {}
43 : ARGBColor( int a_, int r_, int g_, int b_ ) :
44 : a(toDoubleColor(sal::static_int_cast<sal_uInt8>(a_))),
45 : r(toDoubleColor(sal::static_int_cast<sal_uInt8>(r_))),
46 : g(toDoubleColor(sal::static_int_cast<sal_uInt8>(g_))),
47 : b(toDoubleColor(sal::static_int_cast<sal_uInt8>(b_)))
48 : {}
49 : double a;
50 : double r;
51 : double g;
52 : double b;
53 : };
54 0 : inline bool operator==( const ARGBColor& rLHS, const ARGBColor& rRHS )
55 0 : { return rLHS.a==rRHS.a && rLHS.r==rRHS.r && rLHS.g==rRHS.g && rLHS.b==rRHS.b; }
56 0 : inline bool operator!=( const ARGBColor& rLHS, const ARGBColor& rRHS )
57 0 : { return !(rLHS==rRHS); }
58 :
59 : struct GradientStop
60 : {
61 0 : GradientStop() : maStopColor(), mnStopPosition(0.0)
62 0 : {}
63 : ARGBColor maStopColor;
64 : double mnStopPosition;
65 : };
66 : inline bool operator==( const GradientStop& rLHS, const GradientStop& rRHS )
67 : { return rLHS.mnStopPosition==rRHS.mnStopPosition && rLHS.maStopColor==rRHS.maStopColor; }
68 :
69 0 : struct Gradient
70 : {
71 : enum GradientType { LINEAR, RADIAL};
72 : std::vector<sal_Size> maStops;
73 : basegfx::B2DHomMatrix maTransform;
74 : GradientType meType;
75 : union
76 : {
77 : double test;
78 : struct
79 : {
80 : double mfX1;
81 : double mfX2;
82 : double mfY1;
83 : double mfY2;
84 : } linear;
85 : struct
86 : {
87 : double mfCX;
88 : double mfCY;
89 : double mfFX;
90 : double mfFY;
91 : double mfR;
92 : } radial;
93 : } maCoords;
94 : sal_Int32 mnId;
95 : bool mbBoundingBoxUnits;
96 :
97 : // explicit Gradient(GradientType eType) : maStops(), maTransform(), meType(eType), maCoords.mfCX(0.0), maCoords.mfCY(0.0), maCoords.mfFX(0.0), maCoords.mfFY(0.0), maCoords.mfR(0.0), mnId(0), mbBoundingBoxUnits(false)
98 0 : explicit Gradient(GradientType eType) : maStops(), maTransform(), meType(eType), mnId(0), mbBoundingBoxUnits(false)
99 : {
100 0 : maCoords.radial.mfCX = 0.0;
101 0 : maCoords.radial.mfCY = 0.0;
102 0 : maCoords.radial.mfFX = 0.0;
103 0 : maCoords.radial.mfFY = 0.0;
104 0 : maCoords.radial.mfR = 0.0;
105 0 : }
106 : };
107 :
108 0 : inline bool operator==( const Gradient& rLHS, const Gradient& rRHS )
109 : {
110 0 : if( rLHS.meType != rRHS.meType )
111 0 : return false;
112 0 : if( rLHS.meType == Gradient::LINEAR )
113 0 : return rLHS.mbBoundingBoxUnits==rRHS.mbBoundingBoxUnits && rLHS.maStops==rRHS.maStops &&
114 0 : rLHS.maCoords.linear.mfX1 == rRHS.maCoords.linear.mfX1 && rLHS.maCoords.linear.mfX2 == rRHS.maCoords.linear.mfX2 &&
115 0 : rLHS.maCoords.linear.mfY1 == rRHS.maCoords.linear.mfY1 && rLHS.maCoords.linear.mfY2 == rRHS.maCoords.linear.mfY2;
116 : else
117 0 : return rLHS.mbBoundingBoxUnits==rRHS.mbBoundingBoxUnits && rLHS.maStops==rRHS.maStops &&
118 0 : rLHS.maCoords.radial.mfCX == rRHS.maCoords.radial.mfCX && rLHS.maCoords.radial.mfCY == rRHS.maCoords.radial.mfCY &&
119 0 : rLHS.maCoords.radial.mfFX == rRHS.maCoords.radial.mfFX && rLHS.maCoords.radial.mfFY == rRHS.maCoords.radial.mfFY &&
120 0 : rLHS.maCoords.radial.mfR == rRHS.maCoords.radial.mfR;
121 : }
122 :
123 : enum PaintType
124 : {
125 : NONE,
126 : SOLID,
127 : GRADIENT,
128 : DASH
129 : };
130 :
131 : enum FillRule
132 : {
133 : NON_ZERO,
134 : EVEN_ODD
135 : };
136 :
137 : enum TextAlign
138 : {
139 : BEFORE,
140 : CENTER,
141 : AFTER
142 : };
143 :
144 : enum CapStyle
145 : {
146 : BUTT,
147 : RECT,
148 : ROUND
149 : };
150 :
151 0 : struct State
152 : {
153 0 : State() :
154 : maCTM(),
155 : maTransform(),
156 : maViewport(),
157 : maViewBox(),
158 : mbIsText(false),
159 : maFontFamily(), // app-default
160 : mnFontSize(12),
161 : maFontStyle("normal"),
162 : maFontVariant("normal"),
163 : mnFontWeight(400.0),
164 : meTextAnchor(BEFORE),
165 : meTextDisplayAlign(BEFORE),
166 : mnTextLineIncrement(0.0),
167 : maCurrentColor(1.0),
168 : mbVisibility(true),
169 : meFillType(SOLID),
170 : mnFillOpacity(1.0),
171 : mnOpacity(1.0),
172 : meStrokeType(NONE),
173 : mnStrokeOpacity(1.0),
174 : meViewportFillType(NONE),
175 : mnViewportFillOpacity(1.0),
176 : maFillColor(0.0),
177 : maFillGradient(Gradient::LINEAR),
178 : meFillRule(NON_ZERO),
179 : maStrokeColor(0.0),
180 : maStrokeGradient(Gradient::LINEAR),
181 : maDashArray(),
182 : mnDashOffset(0.0),
183 : meLineCap(BUTT),
184 : meLineJoin(basegfx::B2DLINEJOIN_MITER),
185 : mnMiterLimit(4.0),
186 : mnStrokeWidth(1.0),
187 : maViewportFillColor(1.0),
188 : maViewportFillGradient(Gradient::LINEAR),
189 0 : mnStyleId(0)
190 0 : {}
191 :
192 : basegfx::B2DHomMatrix maCTM;
193 : basegfx::B2DHomMatrix maTransform;
194 : basegfx::B2DRange maViewport;
195 : basegfx::B2DRange maViewBox;
196 :
197 : bool mbIsText;
198 : OUString maFontFamily;
199 : /** Absolute: xx-small=6.94 | x-small=8.33 | small=10 | medium=12 | large=14.4 | x-large=17.28 | xx-large=20.736
200 :
201 : Relative(to parent): larger (enlarge by 1.2)
202 : smaller (shrink by 1.2)
203 :
204 : */
205 : double mnFontSize;
206 : OUString maFontStyle;
207 : OUString maFontVariant;
208 : double mnFontWeight;
209 :
210 : TextAlign meTextAnchor; // text-anchor
211 : TextAlign meTextDisplayAlign; // display-align
212 : double mnTextLineIncrement; // 0.0 means auto
213 :
214 : ARGBColor maCurrentColor;
215 : bool mbVisibility;
216 :
217 : PaintType meFillType;
218 : double mnFillOpacity;
219 : double mnOpacity;
220 : PaintType meStrokeType;
221 : double mnStrokeOpacity;
222 : PaintType meViewportFillType;
223 : double mnViewportFillOpacity;
224 :
225 : ARGBColor maFillColor;
226 : Gradient maFillGradient;
227 : FillRule meFillRule;
228 :
229 : ARGBColor maStrokeColor;
230 : Gradient maStrokeGradient;
231 : std::vector<double> maDashArray;
232 : double mnDashOffset;
233 : CapStyle meLineCap;
234 : basegfx::B2DLineJoin meLineJoin;
235 : double mnMiterLimit;
236 : double mnStrokeWidth;
237 :
238 : ARGBColor maViewportFillColor;
239 : Gradient maViewportFillGradient;
240 :
241 : sal_Int32 mnStyleId;
242 : };
243 :
244 0 : inline bool operator==(const State& rLHS, const State& rRHS )
245 : {
246 0 : return rLHS.maCTM==rRHS.maCTM &&
247 0 : rLHS.maTransform==rRHS.maTransform &&
248 0 : rLHS.maViewport==rRHS.maViewport &&
249 0 : rLHS.maViewBox==rRHS.maViewBox &&
250 0 : rLHS.mbIsText==rRHS.mbIsText &&
251 0 : rLHS.maFontFamily==rRHS.maFontFamily &&
252 0 : rLHS.mnFontSize==rRHS.mnFontSize &&
253 0 : rLHS.maFontStyle==rRHS.maFontStyle &&
254 0 : rLHS.maFontVariant==rRHS.maFontVariant &&
255 0 : rLHS.mnFontWeight==rRHS.mnFontWeight &&
256 0 : rLHS.meTextAnchor==rRHS.meTextAnchor &&
257 0 : rLHS.meTextDisplayAlign==rRHS.meTextDisplayAlign &&
258 0 : rLHS.mnTextLineIncrement==rRHS.mnTextLineIncrement &&
259 0 : rLHS.maCurrentColor==rRHS.maCurrentColor &&
260 0 : rLHS.mbVisibility==rRHS.mbVisibility &&
261 0 : rLHS.meFillType==rRHS.meFillType &&
262 0 : rLHS.mnFillOpacity==rRHS.mnFillOpacity &&
263 0 : rLHS.mnOpacity==rRHS.mnOpacity &&
264 0 : rLHS.meStrokeType==rRHS.meStrokeType &&
265 0 : rLHS.mnStrokeOpacity==rRHS.mnStrokeOpacity &&
266 0 : rLHS.meViewportFillType==rRHS.meViewportFillType &&
267 0 : rLHS.mnViewportFillOpacity==rRHS.mnViewportFillOpacity &&
268 0 : rLHS.maFillColor==rRHS.maFillColor &&
269 0 : rLHS.maFillGradient==rRHS.maFillGradient &&
270 0 : rLHS.meFillRule==rRHS.meFillRule &&
271 0 : rLHS.maStrokeColor==rRHS.maStrokeColor &&
272 0 : rLHS.maStrokeGradient==rRHS.maStrokeGradient &&
273 0 : rLHS.maDashArray==rRHS.maDashArray &&
274 0 : rLHS.mnDashOffset==rRHS.mnDashOffset &&
275 0 : rLHS.meLineCap==rRHS.meLineCap &&
276 0 : rLHS.meLineJoin==rRHS.meLineJoin &&
277 0 : rLHS.mnMiterLimit==rRHS.mnMiterLimit &&
278 0 : rLHS.mnStrokeWidth==rRHS.mnStrokeWidth &&
279 0 : rLHS.maViewportFillColor==rRHS.maViewportFillColor &&
280 0 : rLHS.maViewportFillGradient==rRHS.maViewportFillGradient;
281 : }
282 :
283 : struct StateHash
284 : {
285 0 : size_t operator()(const State& rState ) const
286 : {
287 0 : return size_t(rState.maCTM.get( 0, 0 ))
288 0 : ^ size_t(rState.maCTM.get( 1, 0 ))
289 0 : ^ size_t(rState.maCTM.get( 0, 1 ))
290 0 : ^ size_t(rState.maCTM.get( 1, 1 ))
291 0 : ^ size_t(rState.maCTM.get( 0, 2 ))
292 0 : ^ size_t(rState.maCTM.get( 1, 2 ))
293 0 : ^ size_t(rState.maViewport.getWidth())
294 0 : ^ size_t(rState.maViewport.getHeight())
295 0 : ^ size_t(rState.maViewBox.getWidth())
296 0 : ^ size_t(rState.maViewBox.getHeight())
297 0 : ^ size_t(rState.mbIsText)
298 0 : ^ size_t(rState.maFontFamily.hashCode())
299 0 : ^ size_t(rState.mnFontSize)
300 0 : ^ size_t(rState.maFontStyle.hashCode())
301 0 : ^ size_t(rState.maFontVariant.hashCode())
302 0 : ^ size_t(rState.mnFontWeight)
303 0 : ^ size_t(rState.meTextAnchor)
304 0 : ^ size_t(rState.meTextDisplayAlign)
305 0 : ^ size_t(rState.mnTextLineIncrement)
306 0 : ^ size_t(rState.mbVisibility)
307 0 : ^ size_t(rState.meFillType)
308 0 : ^ size_t(rState.mnFillOpacity)
309 0 : ^ size_t(rState.mnOpacity)
310 0 : ^ size_t(rState.meStrokeType)
311 0 : ^ size_t(rState.mnStrokeOpacity)
312 0 : ^ size_t(rState.meViewportFillType)
313 0 : ^ size_t(rState.mnViewportFillOpacity)
314 0 : ^ size_t(rState.maFillColor.a)
315 0 : ^ size_t(rState.maFillColor.r)
316 0 : ^ size_t(rState.maFillColor.g)
317 0 : ^ size_t(rState.maFillColor.b)
318 0 : ^ size_t(rState.maFillGradient.maStops.size())
319 0 : ^ size_t(rState.meFillRule)
320 0 : ^ size_t(rState.maStrokeColor.a)
321 0 : ^ size_t(rState.maStrokeColor.r)
322 0 : ^ size_t(rState.maStrokeColor.g)
323 0 : ^ size_t(rState.maStrokeColor.b)
324 0 : ^ size_t(rState.maStrokeGradient.maStops.size())
325 0 : ^ size_t(rState.maDashArray.size())
326 0 : ^ size_t(rState.mnDashOffset)
327 0 : ^ size_t(rState.meLineCap)
328 0 : ^ size_t(rState.meLineJoin)
329 0 : ^ size_t(rState.mnMiterLimit)
330 0 : ^ size_t(rState.mnStrokeWidth)
331 0 : ^ size_t(rState.maViewportFillColor.a)
332 0 : ^ size_t(rState.maViewportFillColor.r)
333 0 : ^ size_t(rState.maViewportFillColor.g)
334 0 : ^ size_t(rState.maViewportFillColor.b)
335 0 : ^ size_t(rState.maViewportFillGradient.maStops.size());
336 : }
337 : };
338 :
339 : typedef boost::unordered_set<State, StateHash> StatePool;
340 : typedef boost::unordered_map<sal_Int32, State> StateMap;
341 :
342 : } // namespace svgi
343 :
344 : #endif
345 :
346 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|