blob: 9c9f2517112ff6617e3444f191f54f9af561ed08 [file] [log] [blame]
Florin Malitab3418102020-10-15 18:10:29 -04001/*
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 SkSVGValue_DEFINED
9#define SkSVGValue_DEFINED
10
11#include "include/core/SkColor.h"
12#include "include/core/SkMatrix.h"
13#include "include/core/SkPath.h"
14#include "include/core/SkTypes.h"
15#include "include/private/SkNoncopyable.h"
16#include "modules/svg/include/SkSVGTypes.h"
17
18class SkSVGValue : public SkNoncopyable {
19public:
20 enum class Type {
21 kClip,
22 kColor,
23 kDashArray,
24 kFillRule,
Florin Malita39fe8c82020-10-20 10:43:03 -040025 kFontFamily,
26 kFontSize,
27 kFontStyle,
28 kFontWeight,
Tyler Dennistonab76ab42020-10-21 15:08:45 -040029 kGradientUnits,
Florin Malitab3418102020-10-15 18:10:29 -040030 kLength,
31 kLineCap,
32 kLineJoin,
33 kNumber,
34 kPaint,
35 kPath,
36 kPoints,
37 kSpreadMethod,
38 kStopColor,
39 kString,
40 kTransform,
41 kViewBox,
42 kVisibility,
43 };
44
45 Type type() const { return fType; }
46
47 template <typename T>
48 const T* as() const {
49 return fType == T::TYPE ? static_cast<const T*>(this) : nullptr;
50 }
51
52protected:
53 SkSVGValue(Type t) : fType(t) { }
54
55private:
56 Type fType;
57
58 using INHERITED = SkNoncopyable;
59};
60
61template <typename T, SkSVGValue::Type ValueType>
62class SkSVGWrapperValue final : public SkSVGValue {
63public:
64 static constexpr Type TYPE = ValueType;
65
66 explicit SkSVGWrapperValue(const T& v)
67 : INHERITED(ValueType)
68 , fWrappedValue(v) { }
69
70 operator const T&() const { return fWrappedValue; }
71 const T* operator->() const { return &fWrappedValue; }
72
73private:
74 // Stack-only
75 void* operator new(size_t) = delete;
76 void* operator new(size_t, void*) = delete;
77
78 const T& fWrappedValue;
79
80 using INHERITED = SkSVGValue;
81};
82
83using SkSVGClipValue = SkSVGWrapperValue<SkSVGClip , SkSVGValue::Type::kClip >;
84using SkSVGColorValue = SkSVGWrapperValue<SkSVGColorType , SkSVGValue::Type::kColor >;
85using SkSVGFillRuleValue = SkSVGWrapperValue<SkSVGFillRule , SkSVGValue::Type::kFillRule >;
86using SkSVGLengthValue = SkSVGWrapperValue<SkSVGLength , SkSVGValue::Type::kLength >;
87using SkSVGPathValue = SkSVGWrapperValue<SkPath , SkSVGValue::Type::kPath >;
88using SkSVGTransformValue = SkSVGWrapperValue<SkSVGTransformType, SkSVGValue::Type::kTransform >;
89using SkSVGViewBoxValue = SkSVGWrapperValue<SkSVGViewBoxType , SkSVGValue::Type::kViewBox >;
90using SkSVGPaintValue = SkSVGWrapperValue<SkSVGPaint , SkSVGValue::Type::kPaint >;
91using SkSVGLineCapValue = SkSVGWrapperValue<SkSVGLineCap , SkSVGValue::Type::kLineCap >;
92using SkSVGLineJoinValue = SkSVGWrapperValue<SkSVGLineJoin , SkSVGValue::Type::kLineJoin >;
93using SkSVGNumberValue = SkSVGWrapperValue<SkSVGNumberType , SkSVGValue::Type::kNumber >;
94using SkSVGPointsValue = SkSVGWrapperValue<SkSVGPointsType , SkSVGValue::Type::kPoints >;
95using SkSVGStringValue = SkSVGWrapperValue<SkSVGStringType , SkSVGValue::Type::kString >;
96using SkSVGSpreadMethodValue = SkSVGWrapperValue<SkSVGSpreadMethod ,
97 SkSVGValue::Type::kSpreadMethod>;
98using SkSVGStopColorValue = SkSVGWrapperValue<SkSVGStopColor , SkSVGValue::Type::kStopColor >;
Tyler Dennistonab76ab42020-10-21 15:08:45 -040099using SkSVGGradientUnitsValue= SkSVGWrapperValue<SkSVGGradientUnits,
100 SkSVGValue::Type::kGradientUnits>;
Florin Malitab3418102020-10-15 18:10:29 -0400101using SkSVGVisibilityValue = SkSVGWrapperValue<SkSVGVisibility , SkSVGValue::Type::kVisibility>;
102using SkSVGDashArrayValue = SkSVGWrapperValue<SkSVGDashArray , SkSVGValue::Type::kDashArray >;
103
Florin Malita39fe8c82020-10-20 10:43:03 -0400104using SkSVGFontFamilyValue = SkSVGWrapperValue<SkSVGFontFamily , SkSVGValue::Type::kFontFamily>;
105using SkSVGFontSizeValue = SkSVGWrapperValue<SkSVGFontSize , SkSVGValue::Type::kFontSize >;
106using SkSVGFontStyleValue = SkSVGWrapperValue<SkSVGFontStyle , SkSVGValue::Type::kFontStyle >;
107using SkSVGFontWeightValue = SkSVGWrapperValue<SkSVGFontWeight , SkSVGValue::Type::kFontWeight>;
108
Florin Malitab3418102020-10-15 18:10:29 -0400109#endif // SkSVGValue_DEFINED