blob: d58d845b872e1b19bf8ca60b0fc0f25fa0eb42f3 [file] [log] [blame]
fmalita6ceef3d2016-07-26 18:46:34 -07001/*
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 "SkColor.h"
12#include "SkMatrix.h"
Mike Klein2d9e5432018-12-04 07:29:03 -050013#include "SkNoncopyable.h"
fmalita6ceef3d2016-07-26 18:46:34 -070014#include "SkPath.h"
fmalitabffc2562016-08-03 10:21:11 -070015#include "SkSVGTypes.h"
fmalita6ceef3d2016-07-26 18:46:34 -070016#include "SkTypes.h"
17
18class SkSVGValue : public SkNoncopyable {
19public:
20 enum class Type {
Florin Malitace8840e2016-12-08 09:26:47 -050021 kClip,
fmalitabffc2562016-08-03 10:21:11 -070022 kColor,
Florin Malitaf543a602017-10-13 14:07:44 -040023 kDashArray,
Florin Malitae932d4b2016-12-01 13:35:11 -050024 kFillRule,
fmalitabffc2562016-08-03 10:21:11 -070025 kLength,
fmalita2d961e02016-08-11 09:16:29 -070026 kLineCap,
27 kLineJoin,
28 kNumber,
29 kPaint,
fmalitabffc2562016-08-03 10:21:11 -070030 kPath,
fmalita5b31f322016-08-12 12:15:33 -070031 kPoints,
fmalitacecd6172016-09-13 12:56:11 -070032 kSpreadMethod,
fmalita28d5b722016-09-12 17:06:47 -070033 kString,
fmalitabffc2562016-08-03 10:21:11 -070034 kTransform,
fmalita397a5172016-08-08 11:38:55 -070035 kViewBox,
Florin Malitaffe6ae42017-10-12 11:33:28 -040036 kVisibility,
fmalita6ceef3d2016-07-26 18:46:34 -070037 };
38
39 Type type() const { return fType; }
40
41 template <typename T>
42 const T* as() const {
43 return fType == T::TYPE ? static_cast<const T*>(this) : nullptr;
44 }
45
46protected:
47 SkSVGValue(Type t) : fType(t) { }
48
49private:
50 Type fType;
fmalitabffc2562016-08-03 10:21:11 -070051
52 typedef SkNoncopyable INHERITED;
fmalita6ceef3d2016-07-26 18:46:34 -070053};
54
fmalita397a5172016-08-08 11:38:55 -070055template <typename T, SkSVGValue::Type ValueType>
fmalita6ceef3d2016-07-26 18:46:34 -070056class SkSVGWrapperValue final : public SkSVGValue {
57public:
58 static constexpr Type TYPE = ValueType;
59
fmalita397a5172016-08-08 11:38:55 -070060 explicit SkSVGWrapperValue(const T& v)
fmalita6ceef3d2016-07-26 18:46:34 -070061 : INHERITED(ValueType)
62 , fWrappedValue(v) { }
63
fmalita397a5172016-08-08 11:38:55 -070064 operator const T&() const { return fWrappedValue; }
fmalita2d961e02016-08-11 09:16:29 -070065 const T* operator->() const { return &fWrappedValue; }
fmalita6ceef3d2016-07-26 18:46:34 -070066
67private:
fmalita397a5172016-08-08 11:38:55 -070068 // Stack-only
69 void* operator new(size_t) = delete;
70 void* operator new(size_t, void*) = delete;
71
72 const T& fWrappedValue;
fmalita6ceef3d2016-07-26 18:46:34 -070073
fmalitabffc2562016-08-03 10:21:11 -070074 typedef SkSVGValue INHERITED;
fmalita6ceef3d2016-07-26 18:46:34 -070075};
76
Florin Malitaffe6ae42017-10-12 11:33:28 -040077using SkSVGClipValue = SkSVGWrapperValue<SkSVGClip , SkSVGValue::Type::kClip >;
78using SkSVGColorValue = SkSVGWrapperValue<SkSVGColorType , SkSVGValue::Type::kColor >;
79using SkSVGFillRuleValue = SkSVGWrapperValue<SkSVGFillRule , SkSVGValue::Type::kFillRule >;
80using SkSVGLengthValue = SkSVGWrapperValue<SkSVGLength , SkSVGValue::Type::kLength >;
81using SkSVGPathValue = SkSVGWrapperValue<SkPath , SkSVGValue::Type::kPath >;
82using SkSVGTransformValue = SkSVGWrapperValue<SkSVGTransformType, SkSVGValue::Type::kTransform >;
83using SkSVGViewBoxValue = SkSVGWrapperValue<SkSVGViewBoxType , SkSVGValue::Type::kViewBox >;
84using SkSVGPaintValue = SkSVGWrapperValue<SkSVGPaint , SkSVGValue::Type::kPaint >;
85using SkSVGLineCapValue = SkSVGWrapperValue<SkSVGLineCap , SkSVGValue::Type::kLineCap >;
86using SkSVGLineJoinValue = SkSVGWrapperValue<SkSVGLineJoin , SkSVGValue::Type::kLineJoin >;
87using SkSVGNumberValue = SkSVGWrapperValue<SkSVGNumberType , SkSVGValue::Type::kNumber >;
88using SkSVGPointsValue = SkSVGWrapperValue<SkSVGPointsType , SkSVGValue::Type::kPoints >;
89using SkSVGStringValue = SkSVGWrapperValue<SkSVGStringType , SkSVGValue::Type::kString >;
fmalitacecd6172016-09-13 12:56:11 -070090using SkSVGSpreadMethodValue = SkSVGWrapperValue<SkSVGSpreadMethod ,
91 SkSVGValue::Type::kSpreadMethod>;
Florin Malitaffe6ae42017-10-12 11:33:28 -040092using SkSVGVisibilityValue = SkSVGWrapperValue<SkSVGVisibility , SkSVGValue::Type::kVisibility>;
Florin Malitaf543a602017-10-13 14:07:44 -040093using SkSVGDashArrayValue = SkSVGWrapperValue<SkSVGDashArray , SkSVGValue::Type::kDashArray >;
fmalita6ceef3d2016-07-26 18:46:34 -070094
95#endif // SkSVGValue_DEFINED