• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2016 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #ifndef SkSVGTypes_DEFINED
9 #define SkSVGTypes_DEFINED
10 
11 #include "SkColor.h"
12 #include "SkMatrix.h"
13 #include "SkPoint.h"
14 #include "SkRect.h"
15 #include "SkScalar.h"
16 #include "SkString.h"
17 #include "SkTDArray.h"
18 #include "SkTypes.h"
19 
20 template <typename T>
21 class SkSVGPrimitiveTypeWrapper {
22 public:
23     SkSVGPrimitiveTypeWrapper() = default;
SkSVGPrimitiveTypeWrapper(T v)24     explicit constexpr SkSVGPrimitiveTypeWrapper(T v) : fValue(v) {}
25 
26     SkSVGPrimitiveTypeWrapper(const SkSVGPrimitiveTypeWrapper&)            = default;
27     SkSVGPrimitiveTypeWrapper& operator=(const SkSVGPrimitiveTypeWrapper&) = default;
28     SkSVGPrimitiveTypeWrapper& operator=(const T& v) { fValue = v; return *this; }
29 
30     bool operator==(const SkSVGPrimitiveTypeWrapper<T>& other) const {
31         return fValue == other.fValue;
32     }
33     bool operator!=(const SkSVGPrimitiveTypeWrapper<T>& other) const {
34         return !(*this == other);
35     }
36 
value()37     const T& value() const { return fValue; }
38     operator const T&() const { return fValue; }
39 
40 private:
41     T fValue;
42 };
43 
44 using SkSVGColorType      = SkSVGPrimitiveTypeWrapper<SkColor >;
45 using SkSVGNumberType     = SkSVGPrimitiveTypeWrapper<SkScalar>;
46 using SkSVGStringType     = SkSVGPrimitiveTypeWrapper<SkString>;
47 using SkSVGViewBoxType    = SkSVGPrimitiveTypeWrapper<SkRect  >;
48 using SkSVGTransformType  = SkSVGPrimitiveTypeWrapper<SkMatrix>;
49 using SkSVGPointsType     = SkSVGPrimitiveTypeWrapper<SkTDArray<SkPoint>>;
50 
51 class SkSVGLength {
52 public:
53     enum class Unit {
54         kUnknown,
55         kNumber,
56         kPercentage,
57         kEMS,
58         kEXS,
59         kPX,
60         kCM,
61         kMM,
62         kIN,
63         kPT,
64         kPC,
65     };
66 
SkSVGLength()67     constexpr SkSVGLength()                    : fValue(0), fUnit(Unit::kUnknown) {}
68     explicit constexpr SkSVGLength(SkScalar v, Unit u = Unit::kNumber)
fValue(v)69         : fValue(v), fUnit(u) {}
70     SkSVGLength(const SkSVGLength&)            = default;
71     SkSVGLength& operator=(const SkSVGLength&) = default;
72 
73     bool operator==(const SkSVGLength& other) const {
74         return fUnit == other.fUnit && fValue == other.fValue;
75     }
76     bool operator!=(const SkSVGLength& other) const { return !(*this == other); }
77 
value()78     const SkScalar& value() const { return fValue; }
unit()79     const Unit&     unit()  const { return fUnit;  }
80 
81 private:
82     SkScalar fValue;
83     Unit     fUnit;
84 };
85 
86 class SkSVGPaint {
87 public:
88     enum class Type {
89         kNone,
90         kCurrentColor,
91         kColor,
92         kInherit,
93         kIRI,
94     };
95 
SkSVGPaint()96     SkSVGPaint() : fType(Type::kInherit), fColor(SK_ColorBLACK) {}
SkSVGPaint(Type t)97     explicit SkSVGPaint(Type t) : fType(t), fColor(SK_ColorBLACK) {}
SkSVGPaint(const SkSVGColorType & c)98     explicit SkSVGPaint(const SkSVGColorType& c) : fType(Type::kColor), fColor(c) {}
SkSVGPaint(const SkString & iri)99     explicit SkSVGPaint(const SkString& iri)
100         : fType(Type::kIRI), fColor(SK_ColorBLACK), fIRI(iri) {}
101 
102     SkSVGPaint(const SkSVGPaint&)            = default;
103     SkSVGPaint& operator=(const SkSVGPaint&) = default;
104 
105     bool operator==(const SkSVGPaint& other) const {
106         return fType == other.fType && fColor == other.fColor && fIRI == other.fIRI;
107     }
108     bool operator!=(const SkSVGPaint& other) const { return !(*this == other); }
109 
type()110     Type type() const { return fType; }
color()111     const SkSVGColorType& color() const { SkASSERT(fType == Type::kColor); return fColor; }
iri()112     const SkString& iri() const { SkASSERT(fType == Type::kIRI); return fIRI; }
113 
114 private:
115     Type fType;
116 
117     // Logical union.
118     SkSVGColorType fColor;
119     SkString       fIRI;
120 };
121 
122 class SkSVGClip {
123 public:
124     enum class Type {
125         kNone,
126         kInherit,
127         kIRI,
128     };
129 
SkSVGClip()130     SkSVGClip() : fType(Type::kNone) {}
SkSVGClip(Type t)131     explicit SkSVGClip(Type t) : fType(t)           {}
SkSVGClip(const SkString & iri)132     explicit SkSVGClip(const SkString& iri) : fType(Type::kIRI), fIRI(iri) {}
133 
134     SkSVGClip(const SkSVGClip&)            = default;
135     SkSVGClip& operator=(const SkSVGClip&) = default;
136 
137     bool operator==(const SkSVGClip& other) const {
138         return fType == other.fType && fIRI == other.fIRI;
139     }
140     bool operator!=(const SkSVGClip& other) const { return !(*this == other); }
141 
type()142     Type type() const { return fType; }
iri()143     const SkString& iri() const { SkASSERT(fType == Type::kIRI); return fIRI; }
144 
145 private:
146     Type           fType;
147     SkString       fIRI;
148 };
149 
150 class SkSVGLineCap {
151 public:
152     enum class Type {
153         kButt,
154         kRound,
155         kSquare,
156         kInherit,
157     };
158 
SkSVGLineCap()159     constexpr SkSVGLineCap() : fType(Type::kInherit) {}
SkSVGLineCap(Type t)160     constexpr explicit SkSVGLineCap(Type t) : fType(t) {}
161 
162     SkSVGLineCap(const SkSVGLineCap&)            = default;
163     SkSVGLineCap& operator=(const SkSVGLineCap&) = default;
164 
165     bool operator==(const SkSVGLineCap& other) const { return fType == other.fType; }
166     bool operator!=(const SkSVGLineCap& other) const { return !(*this == other); }
167 
type()168     Type type() const { return fType; }
169 
170 private:
171     Type fType;
172 };
173 
174 class SkSVGLineJoin {
175 public:
176     enum class Type {
177         kMiter,
178         kRound,
179         kBevel,
180         kInherit,
181     };
182 
SkSVGLineJoin()183     constexpr SkSVGLineJoin() : fType(Type::kInherit) {}
SkSVGLineJoin(Type t)184     constexpr explicit SkSVGLineJoin(Type t) : fType(t) {}
185 
186     SkSVGLineJoin(const SkSVGLineJoin&)            = default;
187     SkSVGLineJoin& operator=(const SkSVGLineJoin&) = default;
188 
189     bool operator==(const SkSVGLineJoin& other) const { return fType == other.fType; }
190     bool operator!=(const SkSVGLineJoin& other) const { return !(*this == other); }
191 
type()192     Type type() const { return fType; }
193 
194 private:
195     Type fType;
196 };
197 
198 class SkSVGSpreadMethod {
199 public:
200     // These values must match Skia's SkShader::TileMode enum.
201     enum class Type {
202         kPad,       // kClamp_TileMode
203         kRepeat,    // kRepeat_TileMode
204         kReflect,   // kMirror_TileMode
205     };
206 
SkSVGSpreadMethod()207     constexpr SkSVGSpreadMethod() : fType(Type::kPad) {}
SkSVGSpreadMethod(Type t)208     constexpr explicit SkSVGSpreadMethod(Type t) : fType(t) {}
209 
210     SkSVGSpreadMethod(const SkSVGSpreadMethod&)            = default;
211     SkSVGSpreadMethod& operator=(const SkSVGSpreadMethod&) = default;
212 
213     bool operator==(const SkSVGSpreadMethod& other) const { return fType == other.fType; }
214     bool operator!=(const SkSVGSpreadMethod& other) const { return !(*this == other); }
215 
type()216     Type type() const { return fType; }
217 
218 private:
219     Type fType;
220 };
221 
222 class SkSVGFillRule {
223 public:
224     enum class Type {
225         kNonZero,
226         kEvenOdd,
227         kInherit,
228     };
229 
SkSVGFillRule()230     constexpr SkSVGFillRule() : fType(Type::kInherit) {}
SkSVGFillRule(Type t)231     constexpr explicit SkSVGFillRule(Type t) : fType(t) {}
232 
233     SkSVGFillRule(const SkSVGFillRule&)            = default;
234     SkSVGFillRule& operator=(const SkSVGFillRule&) = default;
235 
236     bool operator==(const SkSVGFillRule& other) const { return fType == other.fType; }
237     bool operator!=(const SkSVGFillRule& other) const { return !(*this == other); }
238 
type()239     Type type() const { return fType; }
240 
241 private:
242     Type fType;
243 };
244 
245 #endif // SkSVGTypes_DEFINED
246