xref: /aosp_15_r20/external/skia/modules/svg/include/SkSVGTypes.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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 "include/core/SkColor.h"
12 #include "include/core/SkMatrix.h"
13 #include "include/core/SkPath.h"
14 #include "include/core/SkPoint.h"
15 #include "include/core/SkRect.h"
16 #include "include/core/SkRefCnt.h"
17 #include "include/core/SkScalar.h"
18 #include "include/core/SkSpan.h"
19 #include "include/core/SkString.h"
20 #include "include/core/SkTypes.h"
21 
22 #include <optional>
23 #include <vector>
24 
25 using SkSVGColorType     = SkColor;
26 using SkSVGIntegerType   = int;
27 using SkSVGNumberType    = SkScalar;
28 using SkSVGStringType    = SkString;
29 using SkSVGViewBoxType   = SkRect;
30 using SkSVGTransformType = SkMatrix;
31 using SkSVGPointsType    = std::vector<SkPoint>;
32 
33 enum class SkSVGPropertyState {
34     kUnspecified,
35     kInherit,
36     kValue,
37 };
38 
39 // https://www.w3.org/TR/SVG11/intro.html#TermProperty
40 template <typename T, bool kInheritable> class SkSVGProperty {
41 public:
42     using ValueT = T;
43 
SkSVGProperty()44     SkSVGProperty() : fState(SkSVGPropertyState::kUnspecified) {}
45 
SkSVGProperty(SkSVGPropertyState state)46     explicit SkSVGProperty(SkSVGPropertyState state) : fState(state) {}
47 
SkSVGProperty(const T & value)48     explicit SkSVGProperty(const T& value) : fState(SkSVGPropertyState::kValue) {
49         fValue = value;
50     }
51 
SkSVGProperty(T && value)52     explicit SkSVGProperty(T&& value) : fState(SkSVGPropertyState::kValue) {
53         fValue = std::move(value);
54     }
55 
56     template <typename... Args>
init(Args &&...args)57     void init(Args&&... args) {
58         fState = SkSVGPropertyState::kValue;
59         fValue.emplace(std::forward<Args>(args)...);
60     }
61 
isInheritable()62     constexpr bool isInheritable() const { return kInheritable; }
63 
isValue()64     bool isValue() const { return fState == SkSVGPropertyState::kValue; }
65 
getMaybeNull()66     T* getMaybeNull() const {
67         return fValue.has_value() ? &fValue.value() : nullptr;
68     }
69 
set(SkSVGPropertyState state)70     void set(SkSVGPropertyState state) {
71         fState = state;
72         if (fState != SkSVGPropertyState::kValue) {
73             fValue.reset();
74         }
75     }
76 
set(const T & value)77     void set(const T& value) {
78         fState = SkSVGPropertyState::kValue;
79         fValue = value;
80     }
81 
set(T && value)82     void set(T&& value) {
83         fState = SkSVGPropertyState::kValue;
84         fValue = std::move(value);
85     }
86 
87     T* operator->() {
88         SkASSERT(fState == SkSVGPropertyState::kValue);
89         SkASSERT(fValue.has_value());
90         return &fValue.value();
91     }
92 
93     const T* operator->() const {
94         SkASSERT(fState == SkSVGPropertyState::kValue);
95         SkASSERT(fValue.has_value());
96         return &fValue.value();
97     }
98 
99     T& operator*() {
100         SkASSERT(fState == SkSVGPropertyState::kValue);
101         SkASSERT(fValue.has_value());
102         return *fValue;
103     }
104 
105     const T& operator*() const {
106         SkASSERT(fState == SkSVGPropertyState::kValue);
107         SkASSERT(fValue.has_value());
108         return *fValue;
109     }
110 
111 private:
112     SkSVGPropertyState fState;
113     std::optional<T>   fValue;
114 };
115 
116 class SK_API SkSVGLength {
117 public:
118     enum class Unit {
119         kUnknown,
120         kNumber,
121         kPercentage,
122         kEMS,
123         kEXS,
124         kPX,
125         kCM,
126         kMM,
127         kIN,
128         kPT,
129         kPC,
130     };
131 
SkSVGLength()132     constexpr SkSVGLength()                    : fValue(0), fUnit(Unit::kUnknown) {}
133     explicit constexpr SkSVGLength(SkScalar v, Unit u = Unit::kNumber)
fValue(v)134         : fValue(v), fUnit(u) {}
135     SkSVGLength(const SkSVGLength&)            = default;
136     SkSVGLength& operator=(const SkSVGLength&) = default;
137 
138     bool operator==(const SkSVGLength& other) const {
139         return fUnit == other.fUnit && fValue == other.fValue;
140     }
141     bool operator!=(const SkSVGLength& other) const { return !(*this == other); }
142 
value()143     const SkScalar& value() const { return fValue; }
unit()144     const Unit&     unit()  const { return fUnit;  }
145 
146 private:
147     SkScalar fValue;
148     Unit     fUnit;
149 };
150 
151 // https://www.w3.org/TR/SVG11/linking.html#IRIReference
152 class SK_API SkSVGIRI {
153 public:
154     enum class Type {
155         kLocal,
156         kNonlocal,
157         kDataURI,
158     };
159 
SkSVGIRI()160     SkSVGIRI() : fType(Type::kLocal) {}
SkSVGIRI(Type t,const SkSVGStringType & iri)161     SkSVGIRI(Type t, const SkSVGStringType& iri) : fType(t), fIRI(iri) {}
162 
type()163     Type type() const { return fType; }
iri()164     const SkSVGStringType& iri() const { return fIRI; }
165 
166     bool operator==(const SkSVGIRI& other) const {
167         return fType == other.fType && fIRI == other.fIRI;
168     }
169     bool operator!=(const SkSVGIRI& other) const { return !(*this == other); }
170 
171 private:
172     Type fType;
173     SkSVGStringType fIRI;
174 };
175 
176 // https://www.w3.org/TR/SVG11/types.html#InterfaceSVGColor
177 class SK_API SkSVGColor {
178 public:
179     enum class Type {
180         kCurrentColor,
181         kColor,
182         kICCColor,
183     };
184     using Vars = std::vector<SkString>;
185 
SkSVGColor()186     SkSVGColor() : SkSVGColor(SK_ColorBLACK) {}
SkSVGColor(const SkSVGColorType & c)187     explicit SkSVGColor(const SkSVGColorType& c) : fType(Type::kColor), fColor(c), fVars(nullptr) {}
SkSVGColor(Type t,Vars && vars)188     explicit SkSVGColor(Type t, Vars&& vars)
189         : fType(t), fColor(SK_ColorBLACK)
190         , fVars(vars.empty() ? nullptr : new RefCntVars(std::move(vars))) {}
SkSVGColor(const SkSVGColorType & c,Vars && vars)191     explicit SkSVGColor(const SkSVGColorType& c, Vars&& vars)
192         : fType(Type::kColor), fColor(c)
193         , fVars(vars.empty() ? nullptr : new RefCntVars(std::move(vars))) {}
194 
195     SkSVGColor(const SkSVGColor&)            = default;
196     SkSVGColor& operator=(const SkSVGColor&) = default;
197     SkSVGColor(SkSVGColor&&)                 = default;
198     SkSVGColor& operator=(SkSVGColor&&)      = default;
199 
200     bool operator==(const SkSVGColor& other) const {
201         return fType == other.fType && fColor == other.fColor && fVars == other.fVars;
202     }
203     bool operator!=(const SkSVGColor& other) const { return !(*this == other); }
204 
type()205     Type type() const { return fType; }
color()206     const SkSVGColorType& color() const { SkASSERT(fType == Type::kColor); return fColor; }
vars()207     SkSpan<const SkString> vars() const {
208         return fVars ? SkSpan<const SkString>(fVars->fData) : SkSpan<const SkString>();
209     }
vars()210     SkSpan<SkString> vars()       {
211         return fVars ? SkSpan<SkString>(fVars->fData) : SkSpan<SkString>();
212     }
213 
214 private:
215     Type fType;
216     SkSVGColorType fColor;
217     struct RefCntVars : public SkNVRefCnt<RefCntVars> {
RefCntVarsRefCntVars218         RefCntVars(Vars&& vars) : fData(std::move(vars)) {}
219         Vars fData;
220     };
221     sk_sp<RefCntVars> fVars;
222 };
223 
224 class SK_API SkSVGPaint {
225 public:
226     enum class Type {
227         kNone,
228         kColor,
229         kIRI,
230     };
231 
SkSVGPaint()232     SkSVGPaint() : fType(Type::kNone), fColor(SK_ColorBLACK) {}
SkSVGPaint(Type t)233     explicit SkSVGPaint(Type t) : fType(t), fColor(SK_ColorBLACK) {}
SkSVGPaint(SkSVGColor c)234     explicit SkSVGPaint(SkSVGColor c) : fType(Type::kColor), fColor(std::move(c)) {}
SkSVGPaint(const SkSVGIRI & iri,SkSVGColor fallback_color)235     SkSVGPaint(const SkSVGIRI& iri, SkSVGColor fallback_color)
236         : fType(Type::kIRI), fColor(std::move(fallback_color)), fIRI(iri) {}
237 
238     SkSVGPaint(const SkSVGPaint&)            = default;
239     SkSVGPaint& operator=(const SkSVGPaint&) = default;
240     SkSVGPaint(SkSVGPaint&&)                 = default;
241     SkSVGPaint& operator=(SkSVGPaint&&)      = default;
242 
243     bool operator==(const SkSVGPaint& other) const {
244         return fType == other.fType && fColor == other.fColor && fIRI == other.fIRI;
245     }
246     bool operator!=(const SkSVGPaint& other) const { return !(*this == other); }
247 
type()248     Type type() const { return fType; }
color()249     const SkSVGColor& color() const {
250         SkASSERT(fType == Type::kColor || fType == Type::kIRI);
251         return fColor;
252     }
iri()253     const SkSVGIRI& iri() const { SkASSERT(fType == Type::kIRI); return fIRI; }
254 
255 private:
256     Type fType;
257 
258     // Logical union.
259     SkSVGColor fColor;
260     SkSVGIRI   fIRI;
261 };
262 
263 // <funciri> | none (used for clip/mask/filter properties)
264 class SK_API SkSVGFuncIRI {
265 public:
266     enum class Type {
267         kNone,
268         kIRI,
269     };
270 
SkSVGFuncIRI()271     SkSVGFuncIRI() : fType(Type::kNone) {}
SkSVGFuncIRI(Type t)272     explicit SkSVGFuncIRI(Type t) : fType(t) {}
SkSVGFuncIRI(SkSVGIRI && iri)273     explicit SkSVGFuncIRI(SkSVGIRI&& iri) : fType(Type::kIRI), fIRI(std::move(iri)) {}
274 
275     bool operator==(const SkSVGFuncIRI& other) const {
276         return fType == other.fType && fIRI == other.fIRI;
277     }
278     bool operator!=(const SkSVGFuncIRI& other) const { return !(*this == other); }
279 
type()280     Type type() const { return fType; }
iri()281     const SkSVGIRI& iri() const { SkASSERT(fType == Type::kIRI); return fIRI; }
282 
283 private:
284     Type           fType;
285     SkSVGIRI       fIRI;
286 };
287 
288 enum class SkSVGLineCap {
289     kButt,
290     kRound,
291     kSquare,
292 };
293 
294 class SK_API SkSVGLineJoin {
295 public:
296     enum class Type {
297         kMiter,
298         kRound,
299         kBevel,
300         kInherit,
301     };
302 
SkSVGLineJoin()303     constexpr SkSVGLineJoin() : fType(Type::kInherit) {}
SkSVGLineJoin(Type t)304     constexpr explicit SkSVGLineJoin(Type t) : fType(t) {}
305 
306     SkSVGLineJoin(const SkSVGLineJoin&)            = default;
307     SkSVGLineJoin& operator=(const SkSVGLineJoin&) = default;
308 
309     bool operator==(const SkSVGLineJoin& other) const { return fType == other.fType; }
310     bool operator!=(const SkSVGLineJoin& other) const { return !(*this == other); }
311 
type()312     Type type() const { return fType; }
313 
314 private:
315     Type fType;
316 };
317 
318 class SK_API SkSVGSpreadMethod {
319 public:
320     // These values must match Skia's SkShader::TileMode enum.
321     enum class Type {
322         kPad,       // kClamp_TileMode
323         kRepeat,    // kRepeat_TileMode
324         kReflect,   // kMirror_TileMode
325     };
326 
SkSVGSpreadMethod()327     constexpr SkSVGSpreadMethod() : fType(Type::kPad) {}
SkSVGSpreadMethod(Type t)328     constexpr explicit SkSVGSpreadMethod(Type t) : fType(t) {}
329 
330     SkSVGSpreadMethod(const SkSVGSpreadMethod&)            = default;
331     SkSVGSpreadMethod& operator=(const SkSVGSpreadMethod&) = default;
332 
333     bool operator==(const SkSVGSpreadMethod& other) const { return fType == other.fType; }
334     bool operator!=(const SkSVGSpreadMethod& other) const { return !(*this == other); }
335 
type()336     Type type() const { return fType; }
337 
338 private:
339     Type fType;
340 };
341 
342 class SK_API SkSVGFillRule {
343 public:
344     enum class Type {
345         kNonZero,
346         kEvenOdd,
347         kInherit,
348     };
349 
SkSVGFillRule()350     constexpr SkSVGFillRule() : fType(Type::kInherit) {}
SkSVGFillRule(Type t)351     constexpr explicit SkSVGFillRule(Type t) : fType(t) {}
352 
353     SkSVGFillRule(const SkSVGFillRule&)            = default;
354     SkSVGFillRule& operator=(const SkSVGFillRule&) = default;
355 
356     bool operator==(const SkSVGFillRule& other) const { return fType == other.fType; }
357     bool operator!=(const SkSVGFillRule& other) const { return !(*this == other); }
358 
type()359     Type type() const { return fType; }
360 
asFillType()361     SkPathFillType asFillType() const {
362         SkASSERT(fType != Type::kInherit); // should never be called for unresolved values.
363         return fType == Type::kEvenOdd ? SkPathFillType::kEvenOdd : SkPathFillType::kWinding;
364     }
365 
366 private:
367     Type fType;
368 };
369 
370 class SK_API SkSVGVisibility {
371 public:
372     enum class Type {
373         kVisible,
374         kHidden,
375         kCollapse,
376         kInherit,
377     };
378 
SkSVGVisibility()379     constexpr SkSVGVisibility() : fType(Type::kVisible) {}
SkSVGVisibility(Type t)380     constexpr explicit SkSVGVisibility(Type t) : fType(t) {}
381 
382     SkSVGVisibility(const SkSVGVisibility&)            = default;
383     SkSVGVisibility& operator=(const SkSVGVisibility&) = default;
384 
385     bool operator==(const SkSVGVisibility& other) const { return fType == other.fType; }
386     bool operator!=(const SkSVGVisibility& other) const { return !(*this == other); }
387 
type()388     Type type() const { return fType; }
389 
390 private:
391     Type fType;
392 };
393 
394 class SK_API SkSVGDashArray {
395 public:
396     enum class Type {
397         kNone,
398         kDashArray,
399         kInherit,
400     };
401 
SkSVGDashArray()402     SkSVGDashArray()                : fType(Type::kNone) {}
SkSVGDashArray(Type t)403     explicit SkSVGDashArray(Type t) : fType(t) {}
SkSVGDashArray(std::vector<SkSVGLength> && dashArray)404     explicit SkSVGDashArray(std::vector<SkSVGLength>&& dashArray)
405         : fType(Type::kDashArray)
406         , fDashArray(std::move(dashArray)) {}
407 
408     SkSVGDashArray(const SkSVGDashArray&)            = default;
409     SkSVGDashArray& operator=(const SkSVGDashArray&) = default;
410 
411     bool operator==(const SkSVGDashArray& other) const {
412         return fType == other.fType && fDashArray == other.fDashArray;
413     }
414     bool operator!=(const SkSVGDashArray& other) const { return !(*this == other); }
415 
type()416     Type type() const { return fType; }
417 
dashArray()418     const std::vector<SkSVGLength>& dashArray() const { return fDashArray; }
419 
420 private:
421     Type fType;
422     std::vector<SkSVGLength> fDashArray;
423 };
424 
425 class SK_API SkSVGStopColor {
426 public:
427     enum class Type {
428         kColor,
429         kCurrentColor,
430         kICCColor,
431         kInherit,
432     };
433 
SkSVGStopColor()434     SkSVGStopColor() : fType(Type::kColor), fColor(SK_ColorBLACK) {}
SkSVGStopColor(Type t)435     explicit SkSVGStopColor(Type t) : fType(t), fColor(SK_ColorBLACK) {}
SkSVGStopColor(const SkSVGColorType & c)436     explicit SkSVGStopColor(const SkSVGColorType& c) : fType(Type::kColor), fColor(c) {}
437 
438     SkSVGStopColor(const SkSVGStopColor&)            = default;
439     SkSVGStopColor& operator=(const SkSVGStopColor&) = default;
440 
441     bool operator==(const SkSVGStopColor& other) const {
442         return fType == other.fType && fColor == other.fColor;
443     }
444     bool operator!=(const SkSVGStopColor& other) const { return !(*this == other); }
445 
type()446     Type type() const { return fType; }
color()447     const SkSVGColorType& color() const { SkASSERT(fType == Type::kColor); return fColor; }
448 
449 private:
450     Type fType;
451     SkSVGColorType fColor;
452 };
453 
454 class SK_API SkSVGObjectBoundingBoxUnits {
455 public:
456     enum class Type {
457         kUserSpaceOnUse,
458         kObjectBoundingBox,
459     };
460 
SkSVGObjectBoundingBoxUnits()461     SkSVGObjectBoundingBoxUnits() : fType(Type::kUserSpaceOnUse) {}
SkSVGObjectBoundingBoxUnits(Type t)462     explicit SkSVGObjectBoundingBoxUnits(Type t) : fType(t) {}
463 
464     bool operator==(const SkSVGObjectBoundingBoxUnits& other) const {
465         return fType == other.fType;
466     }
467     bool operator!=(const SkSVGObjectBoundingBoxUnits& other) const {
468         return !(*this == other);
469     }
470 
type()471     Type type() const { return fType; }
472 
473 private:
474     Type fType;
475 };
476 
477 class SK_API SkSVGFontFamily {
478 public:
479     enum class Type {
480         kFamily,
481         kInherit,
482     };
483 
SkSVGFontFamily()484     SkSVGFontFamily() : fType(Type::kInherit) {}
SkSVGFontFamily(const char family[])485     explicit SkSVGFontFamily(const char family[])
486         : fType(Type::kFamily)
487         , fFamily(family) {}
488 
489     bool operator==(const SkSVGFontFamily& other) const {
490         return fType == other.fType && fFamily == other.fFamily;
491     }
492     bool operator!=(const SkSVGFontFamily& other) const { return !(*this == other); }
493 
type()494     Type type() const { return fType; }
495 
family()496     const SkString& family() const { return fFamily; }
497 
498 private:
499     Type     fType;
500     SkString fFamily;
501 };
502 
503 class SK_API SkSVGFontStyle {
504 public:
505     enum class Type {
506         kNormal,
507         kItalic,
508         kOblique,
509         kInherit,
510     };
511 
SkSVGFontStyle()512     SkSVGFontStyle() : fType(Type::kInherit) {}
SkSVGFontStyle(Type t)513     explicit SkSVGFontStyle(Type t) : fType(t) {}
514 
515     bool operator==(const SkSVGFontStyle& other) const {
516         return fType == other.fType;
517     }
518     bool operator!=(const SkSVGFontStyle& other) const { return !(*this == other); }
519 
type()520     Type type() const { return fType; }
521 
522 private:
523     Type fType;
524 };
525 
526 class SK_API SkSVGFontSize {
527 public:
528     enum class Type {
529         kLength,
530         kInherit,
531     };
532 
SkSVGFontSize()533     SkSVGFontSize() : fType(Type::kInherit), fSize(0) {}
SkSVGFontSize(const SkSVGLength & s)534     explicit SkSVGFontSize(const SkSVGLength& s)
535         : fType(Type::kLength)
536         , fSize(s) {}
537 
538     bool operator==(const SkSVGFontSize& other) const {
539         return fType == other.fType && fSize == other.fSize;
540     }
541     bool operator!=(const SkSVGFontSize& other) const { return !(*this == other); }
542 
type()543     Type type() const { return fType; }
544 
size()545     const SkSVGLength& size() const { return fSize; }
546 
547 private:
548     Type        fType;
549     SkSVGLength fSize;
550 };
551 
552 class SK_API SkSVGFontWeight {
553 public:
554     enum class Type {
555         k100,
556         k200,
557         k300,
558         k400,
559         k500,
560         k600,
561         k700,
562         k800,
563         k900,
564         kNormal,
565         kBold,
566         kBolder,
567         kLighter,
568         kInherit,
569     };
570 
SkSVGFontWeight()571     SkSVGFontWeight() : fType(Type::kInherit) {}
SkSVGFontWeight(Type t)572     explicit SkSVGFontWeight(Type t) : fType(t) {}
573 
574     bool operator==(const SkSVGFontWeight& other) const {
575         return fType == other.fType;
576     }
577     bool operator!=(const SkSVGFontWeight& other) const { return !(*this == other); }
578 
type()579     Type type() const { return fType; }
580 
581 private:
582     Type fType;
583 };
584 
585 struct SK_API SkSVGPreserveAspectRatio {
586     enum Align : uint8_t {
587         // These values are chosen such that bits [0,1] encode X alignment, and
588         // bits [2,3] encode Y alignment.
589         kXMinYMin = 0x00,
590         kXMidYMin = 0x01,
591         kXMaxYMin = 0x02,
592         kXMinYMid = 0x04,
593         kXMidYMid = 0x05,
594         kXMaxYMid = 0x06,
595         kXMinYMax = 0x08,
596         kXMidYMax = 0x09,
597         kXMaxYMax = 0x0a,
598 
599         kNone     = 0x10,
600     };
601 
602     enum Scale {
603         kMeet,
604         kSlice,
605     };
606 
607     Align fAlign = kXMidYMid;
608     Scale fScale = kMeet;
609 };
610 
611 class SK_API SkSVGTextAnchor {
612 public:
613     enum class Type {
614         kStart,
615         kMiddle,
616         kEnd,
617         kInherit,
618     };
619 
SkSVGTextAnchor()620     SkSVGTextAnchor() : fType(Type::kInherit) {}
SkSVGTextAnchor(Type t)621     explicit SkSVGTextAnchor(Type t) : fType(t) {}
622 
623     bool operator==(const SkSVGTextAnchor& other) const {
624         return fType == other.fType;
625     }
626     bool operator!=(const SkSVGTextAnchor& other) const { return !(*this == other); }
627 
type()628     Type type() const { return fType; }
629 
630 private:
631     Type fType;
632 };
633 
634 // https://www.w3.org/TR/SVG11/filters.html#FilterPrimitiveInAttribute
635 class SK_API SkSVGFeInputType {
636 public:
637     enum class Type {
638         kSourceGraphic,
639         kSourceAlpha,
640         kBackgroundImage,
641         kBackgroundAlpha,
642         kFillPaint,
643         kStrokePaint,
644         kFilterPrimitiveReference,
645         kUnspecified,
646     };
647 
SkSVGFeInputType()648     SkSVGFeInputType() : fType(Type::kUnspecified) {}
SkSVGFeInputType(Type t)649     explicit SkSVGFeInputType(Type t) : fType(t) {}
SkSVGFeInputType(const SkSVGStringType & id)650     explicit SkSVGFeInputType(const SkSVGStringType& id)
651             : fType(Type::kFilterPrimitiveReference), fId(id) {}
652 
653     bool operator==(const SkSVGFeInputType& other) const {
654         return fType == other.fType && fId == other.fId;
655     }
656     bool operator!=(const SkSVGFeInputType& other) const { return !(*this == other); }
657 
id()658     const SkString& id() const {
659         SkASSERT(fType == Type::kFilterPrimitiveReference);
660         return fId;
661     }
662 
type()663     Type type() const { return fType; }
664 
665 private:
666     Type fType;
667     SkString fId;
668 };
669 
670 enum class SkSVGFeColorMatrixType {
671     kMatrix,
672     kSaturate,
673     kHueRotate,
674     kLuminanceToAlpha,
675 };
676 
677 using SkSVGFeColorMatrixValues = std::vector<SkSVGNumberType>;
678 
679 enum class SkSVGFeCompositeOperator {
680     kOver,
681     kIn,
682     kOut,
683     kAtop,
684     kXor,
685     kArithmetic,
686 };
687 
688 class SK_API SkSVGFeTurbulenceBaseFrequency {
689 public:
SkSVGFeTurbulenceBaseFrequency()690     SkSVGFeTurbulenceBaseFrequency() : fFreqX(0), fFreqY(0) {}
SkSVGFeTurbulenceBaseFrequency(SkSVGNumberType freqX,SkSVGNumberType freqY)691     SkSVGFeTurbulenceBaseFrequency(SkSVGNumberType freqX, SkSVGNumberType freqY)
692             : fFreqX(freqX), fFreqY(freqY) {}
693 
freqX()694     SkSVGNumberType freqX() const { return fFreqX; }
freqY()695     SkSVGNumberType freqY() const { return fFreqY; }
696 
697 private:
698     SkSVGNumberType fFreqX;
699     SkSVGNumberType fFreqY;
700 };
701 
702 struct SK_API SkSVGFeTurbulenceType {
703     enum Type {
704         kFractalNoise,
705         kTurbulence,
706     };
707 
708     Type fType;
709 
SkSVGFeTurbulenceTypeSkSVGFeTurbulenceType710     SkSVGFeTurbulenceType() : fType(kTurbulence) {}
SkSVGFeTurbulenceTypeSkSVGFeTurbulenceType711     explicit SkSVGFeTurbulenceType(Type type) : fType(type) {}
712 };
713 
714 enum class SkSVGXmlSpace {
715     kDefault,
716     kPreserve,
717 };
718 
719 enum class SkSVGColorspace {
720     kAuto,
721     kSRGB,
722     kLinearRGB,
723 };
724 
725 // https://www.w3.org/TR/SVG11/painting.html#DisplayProperty
726 enum class SkSVGDisplay {
727     kInline,
728     kNone,
729 };
730 
731 // https://www.w3.org/TR/SVG11/filters.html#TransferFunctionElementAttributes
732 enum class SkSVGFeFuncType {
733     kIdentity,
734     kTable,
735     kDiscrete,
736     kLinear,
737     kGamma,
738 };
739 
740 #endif // SkSVGTypes_DEFINED
741