blob: d994f6489095e3e4ea8d39ef914409d35585f5ec [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 Malitaf543a602017-10-13 14:07:44 -040022 kDashArray,
Florin Malitae932d4b2016-12-01 13:35:11 -050023 kFillRule,
fmalitabffc2562016-08-03 10:21:11 -070024 kLength,
fmalita2d961e02016-08-11 09:16:29 -070025 kLineCap,
26 kLineJoin,
27 kNumber,
28 kPaint,
fmalitabffc2562016-08-03 10:21:11 -070029 kPath,
fmalita5b31f322016-08-12 12:15:33 -070030 kPoints,
fmalitacecd6172016-09-13 12:56:11 -070031 kSpreadMethod,
fmalita28d5b722016-09-12 17:06:47 -070032 kString,
fmalitabffc2562016-08-03 10:21:11 -070033 kTransform,
fmalita397a5172016-08-08 11:38:55 -070034 kViewBox,
Florin Malitaffe6ae42017-10-12 11:33:28 -040035 kVisibility,
fmalita6ceef3d2016-07-26 18:46:34 -070036 };
37
38 Type type() const { return fType; }
39
40 template <typename T>
41 const T* as() const {
42 return fType == T::TYPE ? static_cast<const T*>(this) : nullptr;
43 }
44
45protected:
46 SkSVGValue(Type t) : fType(t) { }
47
48private:
49 Type fType;
fmalitabffc2562016-08-03 10:21:11 -070050
51 typedef SkNoncopyable INHERITED;
fmalita6ceef3d2016-07-26 18:46:34 -070052};
53
fmalita397a5172016-08-08 11:38:55 -070054template <typename T, SkSVGValue::Type ValueType>
fmalita6ceef3d2016-07-26 18:46:34 -070055class SkSVGWrapperValue final : public SkSVGValue {
56public:
57 static constexpr Type TYPE = ValueType;
58
fmalita397a5172016-08-08 11:38:55 -070059 explicit SkSVGWrapperValue(const T& v)
fmalita6ceef3d2016-07-26 18:46:34 -070060 : INHERITED(ValueType)
61 , fWrappedValue(v) { }
62
fmalita397a5172016-08-08 11:38:55 -070063 operator const T&() const { return fWrappedValue; }
fmalita2d961e02016-08-11 09:16:29 -070064 const T* operator->() const { return &fWrappedValue; }
fmalita6ceef3d2016-07-26 18:46:34 -070065
66private:
fmalita397a5172016-08-08 11:38:55 -070067 // Stack-only
68 void* operator new(size_t) = delete;
69 void* operator new(size_t, void*) = delete;
70
71 const T& fWrappedValue;
fmalita6ceef3d2016-07-26 18:46:34 -070072
fmalitabffc2562016-08-03 10:21:11 -070073 typedef SkSVGValue INHERITED;
fmalita6ceef3d2016-07-26 18:46:34 -070074};
75
Florin Malitaffe6ae42017-10-12 11:33:28 -040076using SkSVGClipValue = SkSVGWrapperValue<SkSVGClip , SkSVGValue::Type::kClip >;
77using SkSVGColorValue = SkSVGWrapperValue<SkSVGColorType , SkSVGValue::Type::kColor >;
78using SkSVGFillRuleValue = SkSVGWrapperValue<SkSVGFillRule , SkSVGValue::Type::kFillRule >;
79using SkSVGLengthValue = SkSVGWrapperValue<SkSVGLength , SkSVGValue::Type::kLength >;
80using SkSVGPathValue = SkSVGWrapperValue<SkPath , SkSVGValue::Type::kPath >;
81using SkSVGTransformValue = SkSVGWrapperValue<SkSVGTransformType, SkSVGValue::Type::kTransform >;
82using SkSVGViewBoxValue = SkSVGWrapperValue<SkSVGViewBoxType , SkSVGValue::Type::kViewBox >;
83using SkSVGPaintValue = SkSVGWrapperValue<SkSVGPaint , SkSVGValue::Type::kPaint >;
84using SkSVGLineCapValue = SkSVGWrapperValue<SkSVGLineCap , SkSVGValue::Type::kLineCap >;
85using SkSVGLineJoinValue = SkSVGWrapperValue<SkSVGLineJoin , SkSVGValue::Type::kLineJoin >;
86using SkSVGNumberValue = SkSVGWrapperValue<SkSVGNumberType , SkSVGValue::Type::kNumber >;
87using SkSVGPointsValue = SkSVGWrapperValue<SkSVGPointsType , SkSVGValue::Type::kPoints >;
88using SkSVGStringValue = SkSVGWrapperValue<SkSVGStringType , SkSVGValue::Type::kString >;
fmalitacecd6172016-09-13 12:56:11 -070089using SkSVGSpreadMethodValue = SkSVGWrapperValue<SkSVGSpreadMethod ,
90 SkSVGValue::Type::kSpreadMethod>;
Florin Malitaffe6ae42017-10-12 11:33:28 -040091using SkSVGVisibilityValue = SkSVGWrapperValue<SkSVGVisibility , SkSVGValue::Type::kVisibility>;
Florin Malitaf543a602017-10-13 14:07:44 -040092using SkSVGDashArrayValue = SkSVGWrapperValue<SkSVGDashArray , SkSVGValue::Type::kDashArray >;
fmalita6ceef3d2016-07-26 18:46:34 -070093
94#endif // SkSVGValue_DEFINED