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