blob: 8e70d9d18ce33b411393e0c33bbd8fbed33b4b57 [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,
Tyler Dennistonb3cafbc2020-10-30 15:00:48 -040025 kFilter,
Florin Malita39fe8c82020-10-20 10:43:03 -040026 kFontFamily,
27 kFontSize,
28 kFontStyle,
29 kFontWeight,
Florin Malitab3418102020-10-15 18:10:29 -040030 kLength,
31 kLineCap,
32 kLineJoin,
33 kNumber,
Tyler Denniston30e327e2020-10-29 16:29:22 -040034 kObjectBoundingBoxUnits,
Florin Malitab3418102020-10-15 18:10:29 -040035 kPaint,
36 kPath,
37 kPoints,
Florin Malita385e7442020-10-21 16:55:46 -040038 kPreserveAspectRatio,
Florin Malitab3418102020-10-15 18:10:29 -040039 kSpreadMethod,
40 kStopColor,
41 kString,
Florin Malita056385b2020-10-27 22:57:56 -040042 kTextAnchor,
Florin Malitab3418102020-10-15 18:10:29 -040043 kTransform,
44 kViewBox,
45 kVisibility,
46 };
47
48 Type type() const { return fType; }
49
50 template <typename T>
51 const T* as() const {
52 return fType == T::TYPE ? static_cast<const T*>(this) : nullptr;
53 }
54
55protected:
56 SkSVGValue(Type t) : fType(t) { }
57
58private:
59 Type fType;
60
61 using INHERITED = SkNoncopyable;
62};
63
64template <typename T, SkSVGValue::Type ValueType>
65class SkSVGWrapperValue final : public SkSVGValue {
66public:
67 static constexpr Type TYPE = ValueType;
68
69 explicit SkSVGWrapperValue(const T& v)
70 : INHERITED(ValueType)
71 , fWrappedValue(v) { }
72
73 operator const T&() const { return fWrappedValue; }
74 const T* operator->() const { return &fWrappedValue; }
75
76private:
77 // Stack-only
78 void* operator new(size_t) = delete;
79 void* operator new(size_t, void*) = delete;
80
81 const T& fWrappedValue;
82
83 using INHERITED = SkSVGValue;
84};
85
86using SkSVGClipValue = SkSVGWrapperValue<SkSVGClip , SkSVGValue::Type::kClip >;
87using SkSVGColorValue = SkSVGWrapperValue<SkSVGColorType , SkSVGValue::Type::kColor >;
88using SkSVGFillRuleValue = SkSVGWrapperValue<SkSVGFillRule , SkSVGValue::Type::kFillRule >;
Tyler Dennistonb3cafbc2020-10-30 15:00:48 -040089using SkSVGFilterValue = SkSVGWrapperValue<SkSVGFilterType , SkSVGValue::Type::kFilter >;
Florin Malitab3418102020-10-15 18:10:29 -040090using SkSVGLengthValue = SkSVGWrapperValue<SkSVGLength , SkSVGValue::Type::kLength >;
91using SkSVGPathValue = SkSVGWrapperValue<SkPath , SkSVGValue::Type::kPath >;
92using SkSVGTransformValue = SkSVGWrapperValue<SkSVGTransformType, SkSVGValue::Type::kTransform >;
93using SkSVGViewBoxValue = SkSVGWrapperValue<SkSVGViewBoxType , SkSVGValue::Type::kViewBox >;
94using SkSVGPaintValue = SkSVGWrapperValue<SkSVGPaint , SkSVGValue::Type::kPaint >;
95using SkSVGLineCapValue = SkSVGWrapperValue<SkSVGLineCap , SkSVGValue::Type::kLineCap >;
96using SkSVGLineJoinValue = SkSVGWrapperValue<SkSVGLineJoin , SkSVGValue::Type::kLineJoin >;
97using SkSVGNumberValue = SkSVGWrapperValue<SkSVGNumberType , SkSVGValue::Type::kNumber >;
98using SkSVGPointsValue = SkSVGWrapperValue<SkSVGPointsType , SkSVGValue::Type::kPoints >;
99using SkSVGStringValue = SkSVGWrapperValue<SkSVGStringType , SkSVGValue::Type::kString >;
100using SkSVGSpreadMethodValue = SkSVGWrapperValue<SkSVGSpreadMethod ,
101 SkSVGValue::Type::kSpreadMethod>;
102using SkSVGStopColorValue = SkSVGWrapperValue<SkSVGStopColor , SkSVGValue::Type::kStopColor >;
103using SkSVGVisibilityValue = SkSVGWrapperValue<SkSVGVisibility , SkSVGValue::Type::kVisibility>;
104using SkSVGDashArrayValue = SkSVGWrapperValue<SkSVGDashArray , SkSVGValue::Type::kDashArray >;
105
Florin Malita39fe8c82020-10-20 10:43:03 -0400106using SkSVGFontFamilyValue = SkSVGWrapperValue<SkSVGFontFamily , SkSVGValue::Type::kFontFamily>;
107using SkSVGFontSizeValue = SkSVGWrapperValue<SkSVGFontSize , SkSVGValue::Type::kFontSize >;
108using SkSVGFontStyleValue = SkSVGWrapperValue<SkSVGFontStyle , SkSVGValue::Type::kFontStyle >;
109using SkSVGFontWeightValue = SkSVGWrapperValue<SkSVGFontWeight , SkSVGValue::Type::kFontWeight>;
Florin Malita056385b2020-10-27 22:57:56 -0400110using SkSVGTextAnchorValue = SkSVGWrapperValue<SkSVGTextAnchor , SkSVGValue::Type::kTextAnchor>;
Florin Malita39fe8c82020-10-20 10:43:03 -0400111
Tyler Denniston30e327e2020-10-29 16:29:22 -0400112using SkSVGPreserveAspectRatioValue = SkSVGWrapperValue<SkSVGPreserveAspectRatio,
113 SkSVGValue::Type::kPreserveAspectRatio>;
114
115using SkSVGObjectBoundingBoxUnitsValue = SkSVGWrapperValue<SkSVGObjectBoundingBoxUnits,
116 SkSVGValue::Type::kObjectBoundingBoxUnits>;
Florin Malita385e7442020-10-21 16:55:46 -0400117
Florin Malitab3418102020-10-15 18:10:29 -0400118#endif // SkSVGValue_DEFINED