blob: 8e58b0672ad2ba2e6526f2985ffb9d99b1592f9e [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"
13#include "SkPath.h"
fmalitabffc2562016-08-03 10:21:11 -070014#include "SkSVGTypes.h"
fmalita6ceef3d2016-07-26 18:46:34 -070015#include "SkTypes.h"
16
17class SkSVGValue : public SkNoncopyable {
18public:
19 enum class Type {
Florin Malitace8840e2016-12-08 09:26:47 -050020 kClip,
fmalitabffc2562016-08-03 10:21:11 -070021 kColor,
Florin Malitae932d4b2016-12-01 13:35:11 -050022 kFillRule,
fmalitabffc2562016-08-03 10:21:11 -070023 kLength,
fmalita2d961e02016-08-11 09:16:29 -070024 kLineCap,
25 kLineJoin,
26 kNumber,
27 kPaint,
fmalitabffc2562016-08-03 10:21:11 -070028 kPath,
fmalita5b31f322016-08-12 12:15:33 -070029 kPoints,
fmalitacecd6172016-09-13 12:56:11 -070030 kSpreadMethod,
fmalita28d5b722016-09-12 17:06:47 -070031 kString,
fmalitabffc2562016-08-03 10:21:11 -070032 kTransform,
fmalita397a5172016-08-08 11:38:55 -070033 kViewBox,
fmalita6ceef3d2016-07-26 18:46:34 -070034 };
35
36 Type type() const { return fType; }
37
38 template <typename T>
39 const T* as() const {
40 return fType == T::TYPE ? static_cast<const T*>(this) : nullptr;
41 }
42
43protected:
44 SkSVGValue(Type t) : fType(t) { }
45
46private:
47 Type fType;
fmalitabffc2562016-08-03 10:21:11 -070048
49 typedef SkNoncopyable INHERITED;
fmalita6ceef3d2016-07-26 18:46:34 -070050};
51
fmalita397a5172016-08-08 11:38:55 -070052template <typename T, SkSVGValue::Type ValueType>
fmalita6ceef3d2016-07-26 18:46:34 -070053class SkSVGWrapperValue final : public SkSVGValue {
54public:
55 static constexpr Type TYPE = ValueType;
56
fmalita397a5172016-08-08 11:38:55 -070057 explicit SkSVGWrapperValue(const T& v)
fmalita6ceef3d2016-07-26 18:46:34 -070058 : INHERITED(ValueType)
59 , fWrappedValue(v) { }
60
fmalita397a5172016-08-08 11:38:55 -070061 operator const T&() const { return fWrappedValue; }
fmalita2d961e02016-08-11 09:16:29 -070062 const T* operator->() const { return &fWrappedValue; }
fmalita6ceef3d2016-07-26 18:46:34 -070063
64private:
fmalita397a5172016-08-08 11:38:55 -070065 // Stack-only
66 void* operator new(size_t) = delete;
67 void* operator new(size_t, void*) = delete;
68
69 const T& fWrappedValue;
fmalita6ceef3d2016-07-26 18:46:34 -070070
fmalitabffc2562016-08-03 10:21:11 -070071 typedef SkSVGValue INHERITED;
fmalita6ceef3d2016-07-26 18:46:34 -070072};
73
Florin Malitace8840e2016-12-08 09:26:47 -050074using SkSVGClipValue = SkSVGWrapperValue<SkSVGClip , SkSVGValue::Type::kClip >;
fmalitacecd6172016-09-13 12:56:11 -070075using SkSVGColorValue = SkSVGWrapperValue<SkSVGColorType , SkSVGValue::Type::kColor >;
Florin Malitae932d4b2016-12-01 13:35:11 -050076using SkSVGFillRuleValue = SkSVGWrapperValue<SkSVGFillRule , SkSVGValue::Type::kFillRule >;
fmalitacecd6172016-09-13 12:56:11 -070077using SkSVGLengthValue = SkSVGWrapperValue<SkSVGLength , SkSVGValue::Type::kLength >;
78using SkSVGPathValue = SkSVGWrapperValue<SkPath , SkSVGValue::Type::kPath >;
79using SkSVGTransformValue = SkSVGWrapperValue<SkSVGTransformType, SkSVGValue::Type::kTransform>;
80using SkSVGViewBoxValue = SkSVGWrapperValue<SkSVGViewBoxType , SkSVGValue::Type::kViewBox >;
81using SkSVGPaintValue = SkSVGWrapperValue<SkSVGPaint , SkSVGValue::Type::kPaint >;
82using SkSVGLineCapValue = SkSVGWrapperValue<SkSVGLineCap , SkSVGValue::Type::kLineCap >;
83using SkSVGLineJoinValue = SkSVGWrapperValue<SkSVGLineJoin , SkSVGValue::Type::kLineJoin >;
84using SkSVGNumberValue = SkSVGWrapperValue<SkSVGNumberType , SkSVGValue::Type::kNumber >;
85using SkSVGPointsValue = SkSVGWrapperValue<SkSVGPointsType , SkSVGValue::Type::kPoints >;
86using SkSVGStringValue = SkSVGWrapperValue<SkSVGStringType , SkSVGValue::Type::kString >;
87using SkSVGSpreadMethodValue = SkSVGWrapperValue<SkSVGSpreadMethod ,
88 SkSVGValue::Type::kSpreadMethod>;
fmalita6ceef3d2016-07-26 18:46:34 -070089
90#endif // SkSVGValue_DEFINED