blob: 0040179f94fe9731f238b82d7d369bfff4ea2337 [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,
Florin Malitab3418102020-10-15 18:10:29 -040029 kLength,
30 kLineCap,
31 kLineJoin,
32 kNumber,
Tyler Denniston30e327e2020-10-29 16:29:22 -040033 kObjectBoundingBoxUnits,
Florin Malitab3418102020-10-15 18:10:29 -040034 kPaint,
35 kPath,
36 kPoints,
Florin Malita385e7442020-10-21 16:55:46 -040037 kPreserveAspectRatio,
Florin Malitab3418102020-10-15 18:10:29 -040038 kSpreadMethod,
39 kStopColor,
40 kString,
Florin Malita056385b2020-10-27 22:57:56 -040041 kTextAnchor,
Florin Malitab3418102020-10-15 18:10:29 -040042 kTransform,
43 kViewBox,
44 kVisibility,
45 };
46
47 Type type() const { return fType; }
48
49 template <typename T>
50 const T* as() const {
51 return fType == T::TYPE ? static_cast<const T*>(this) : nullptr;
52 }
53
54protected:
55 SkSVGValue(Type t) : fType(t) { }
56
57private:
58 Type fType;
59
60 using INHERITED = SkNoncopyable;
61};
62
63template <typename T, SkSVGValue::Type ValueType>
64class SkSVGWrapperValue final : public SkSVGValue {
65public:
66 static constexpr Type TYPE = ValueType;
67
68 explicit SkSVGWrapperValue(const T& v)
69 : INHERITED(ValueType)
70 , fWrappedValue(v) { }
71
72 operator const T&() const { return fWrappedValue; }
73 const T* operator->() const { return &fWrappedValue; }
74
75private:
76 // Stack-only
77 void* operator new(size_t) = delete;
78 void* operator new(size_t, void*) = delete;
79
80 const T& fWrappedValue;
81
82 using INHERITED = SkSVGValue;
83};
84
85using SkSVGClipValue = SkSVGWrapperValue<SkSVGClip , SkSVGValue::Type::kClip >;
86using SkSVGColorValue = SkSVGWrapperValue<SkSVGColorType , SkSVGValue::Type::kColor >;
87using SkSVGFillRuleValue = SkSVGWrapperValue<SkSVGFillRule , SkSVGValue::Type::kFillRule >;
88using SkSVGLengthValue = SkSVGWrapperValue<SkSVGLength , SkSVGValue::Type::kLength >;
89using SkSVGPathValue = SkSVGWrapperValue<SkPath , SkSVGValue::Type::kPath >;
90using SkSVGTransformValue = SkSVGWrapperValue<SkSVGTransformType, SkSVGValue::Type::kTransform >;
91using SkSVGViewBoxValue = SkSVGWrapperValue<SkSVGViewBoxType , SkSVGValue::Type::kViewBox >;
92using SkSVGPaintValue = SkSVGWrapperValue<SkSVGPaint , SkSVGValue::Type::kPaint >;
93using SkSVGLineCapValue = SkSVGWrapperValue<SkSVGLineCap , SkSVGValue::Type::kLineCap >;
94using SkSVGLineJoinValue = SkSVGWrapperValue<SkSVGLineJoin , SkSVGValue::Type::kLineJoin >;
95using SkSVGNumberValue = SkSVGWrapperValue<SkSVGNumberType , SkSVGValue::Type::kNumber >;
96using SkSVGPointsValue = SkSVGWrapperValue<SkSVGPointsType , SkSVGValue::Type::kPoints >;
97using SkSVGStringValue = SkSVGWrapperValue<SkSVGStringType , SkSVGValue::Type::kString >;
98using SkSVGSpreadMethodValue = SkSVGWrapperValue<SkSVGSpreadMethod ,
99 SkSVGValue::Type::kSpreadMethod>;
100using SkSVGStopColorValue = SkSVGWrapperValue<SkSVGStopColor , SkSVGValue::Type::kStopColor >;
101using 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>;
Florin Malita056385b2020-10-27 22:57:56 -0400108using SkSVGTextAnchorValue = SkSVGWrapperValue<SkSVGTextAnchor , SkSVGValue::Type::kTextAnchor>;
Florin Malita39fe8c82020-10-20 10:43:03 -0400109
Tyler Denniston30e327e2020-10-29 16:29:22 -0400110using SkSVGPreserveAspectRatioValue = SkSVGWrapperValue<SkSVGPreserveAspectRatio,
111 SkSVGValue::Type::kPreserveAspectRatio>;
112
113using SkSVGObjectBoundingBoxUnitsValue = SkSVGWrapperValue<SkSVGObjectBoundingBoxUnits,
114 SkSVGValue::Type::kObjectBoundingBoxUnits>;
Florin Malita385e7442020-10-21 16:55:46 -0400115
Florin Malitab3418102020-10-15 18:10:29 -0400116#endif // SkSVGValue_DEFINED