blob: 791bf32659fac6a9c074c38b22a4510e1b30455f [file] [log] [blame]
Florin Malitaf4403e72020-04-10 14:14:04 +00001/*
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 "experimental/svg/model/SkSVGTypes.h"
12#include "include/core/SkColor.h"
13#include "include/core/SkMatrix.h"
14#include "include/core/SkPath.h"
15#include "include/core/SkTypes.h"
16#include "include/private/SkNoncopyable.h"
17
18class SkSVGValue : public SkNoncopyable {
19public:
20 enum class Type {
21 kClip,
22 kColor,
23 kDashArray,
24 kFillRule,
25 kLength,
26 kLineCap,
27 kLineJoin,
28 kNumber,
29 kPaint,
30 kPath,
31 kPoints,
32 kSpreadMethod,
Tyler Denniston308c0722020-04-14 10:53:41 -040033 kStopColor,
Florin Malitaf4403e72020-04-10 14:14:04 +000034 kString,
35 kTransform,
36 kViewBox,
37 kVisibility,
38 };
39
40 Type type() const { return fType; }
41
42 template <typename T>
43 const T* as() const {
44 return fType == T::TYPE ? static_cast<const T*>(this) : nullptr;
45 }
46
47protected:
48 SkSVGValue(Type t) : fType(t) { }
49
50private:
51 Type fType;
52
John Stiles7571f9e2020-09-02 22:42:33 -040053 using INHERITED = SkNoncopyable;
Florin Malitaf4403e72020-04-10 14:14:04 +000054};
55
56template <typename T, SkSVGValue::Type ValueType>
57class SkSVGWrapperValue final : public SkSVGValue {
58public:
59 static constexpr Type TYPE = ValueType;
60
61 explicit SkSVGWrapperValue(const T& v)
62 : INHERITED(ValueType)
63 , fWrappedValue(v) { }
64
65 operator const T&() const { return fWrappedValue; }
66 const T* operator->() const { return &fWrappedValue; }
67
68private:
69 // Stack-only
70 void* operator new(size_t) = delete;
71 void* operator new(size_t, void*) = delete;
72
73 const T& fWrappedValue;
74
John Stiles7571f9e2020-09-02 22:42:33 -040075 using INHERITED = SkSVGValue;
Florin Malitaf4403e72020-04-10 14:14:04 +000076};
77
78using SkSVGClipValue = SkSVGWrapperValue<SkSVGClip , SkSVGValue::Type::kClip >;
79using SkSVGColorValue = SkSVGWrapperValue<SkSVGColorType , SkSVGValue::Type::kColor >;
80using SkSVGFillRuleValue = SkSVGWrapperValue<SkSVGFillRule , SkSVGValue::Type::kFillRule >;
81using SkSVGLengthValue = SkSVGWrapperValue<SkSVGLength , SkSVGValue::Type::kLength >;
82using SkSVGPathValue = SkSVGWrapperValue<SkPath , SkSVGValue::Type::kPath >;
83using SkSVGTransformValue = SkSVGWrapperValue<SkSVGTransformType, SkSVGValue::Type::kTransform >;
84using SkSVGViewBoxValue = SkSVGWrapperValue<SkSVGViewBoxType , SkSVGValue::Type::kViewBox >;
85using SkSVGPaintValue = SkSVGWrapperValue<SkSVGPaint , SkSVGValue::Type::kPaint >;
86using SkSVGLineCapValue = SkSVGWrapperValue<SkSVGLineCap , SkSVGValue::Type::kLineCap >;
87using SkSVGLineJoinValue = SkSVGWrapperValue<SkSVGLineJoin , SkSVGValue::Type::kLineJoin >;
88using SkSVGNumberValue = SkSVGWrapperValue<SkSVGNumberType , SkSVGValue::Type::kNumber >;
89using SkSVGPointsValue = SkSVGWrapperValue<SkSVGPointsType , SkSVGValue::Type::kPoints >;
90using SkSVGStringValue = SkSVGWrapperValue<SkSVGStringType , SkSVGValue::Type::kString >;
91using SkSVGSpreadMethodValue = SkSVGWrapperValue<SkSVGSpreadMethod ,
92 SkSVGValue::Type::kSpreadMethod>;
Tyler Denniston308c0722020-04-14 10:53:41 -040093using SkSVGStopColorValue = SkSVGWrapperValue<SkSVGStopColor , SkSVGValue::Type::kStopColor >;
Florin Malitaf4403e72020-04-10 14:14:04 +000094using SkSVGVisibilityValue = SkSVGWrapperValue<SkSVGVisibility , SkSVGValue::Type::kVisibility>;
95using SkSVGDashArrayValue = SkSVGWrapperValue<SkSVGDashArray , SkSVGValue::Type::kDashArray >;
96
97#endif // SkSVGValue_DEFINED