blob: 0160af0371878c34a45a2e83bd8a7bceb17e9cdd [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 {
fmalitabffc2562016-08-03 10:21:11 -070020 kColor,
21 kLength,
fmalita2d961e02016-08-11 09:16:29 -070022 kLineCap,
23 kLineJoin,
24 kNumber,
25 kPaint,
fmalitabffc2562016-08-03 10:21:11 -070026 kPath,
fmalita5b31f322016-08-12 12:15:33 -070027 kPoints,
fmalitacecd6172016-09-13 12:56:11 -070028 kSpreadMethod,
fmalita28d5b722016-09-12 17:06:47 -070029 kString,
fmalitabffc2562016-08-03 10:21:11 -070030 kTransform,
fmalita397a5172016-08-08 11:38:55 -070031 kViewBox,
fmalita6ceef3d2016-07-26 18:46:34 -070032 };
33
34 Type type() const { return fType; }
35
36 template <typename T>
37 const T* as() const {
38 return fType == T::TYPE ? static_cast<const T*>(this) : nullptr;
39 }
40
41protected:
42 SkSVGValue(Type t) : fType(t) { }
43
44private:
45 Type fType;
fmalitabffc2562016-08-03 10:21:11 -070046
47 typedef SkNoncopyable INHERITED;
fmalita6ceef3d2016-07-26 18:46:34 -070048};
49
fmalita397a5172016-08-08 11:38:55 -070050template <typename T, SkSVGValue::Type ValueType>
fmalita6ceef3d2016-07-26 18:46:34 -070051class SkSVGWrapperValue final : public SkSVGValue {
52public:
53 static constexpr Type TYPE = ValueType;
54
fmalita397a5172016-08-08 11:38:55 -070055 explicit SkSVGWrapperValue(const T& v)
fmalita6ceef3d2016-07-26 18:46:34 -070056 : INHERITED(ValueType)
57 , fWrappedValue(v) { }
58
fmalita397a5172016-08-08 11:38:55 -070059 operator const T&() const { return fWrappedValue; }
fmalita2d961e02016-08-11 09:16:29 -070060 const T* operator->() const { return &fWrappedValue; }
fmalita6ceef3d2016-07-26 18:46:34 -070061
62private:
fmalita397a5172016-08-08 11:38:55 -070063 // Stack-only
64 void* operator new(size_t) = delete;
65 void* operator new(size_t, void*) = delete;
66
67 const T& fWrappedValue;
fmalita6ceef3d2016-07-26 18:46:34 -070068
fmalitabffc2562016-08-03 10:21:11 -070069 typedef SkSVGValue INHERITED;
fmalita6ceef3d2016-07-26 18:46:34 -070070};
71
fmalitacecd6172016-09-13 12:56:11 -070072using SkSVGColorValue = SkSVGWrapperValue<SkSVGColorType , SkSVGValue::Type::kColor >;
73using SkSVGLengthValue = SkSVGWrapperValue<SkSVGLength , SkSVGValue::Type::kLength >;
74using SkSVGPathValue = SkSVGWrapperValue<SkPath , SkSVGValue::Type::kPath >;
75using SkSVGTransformValue = SkSVGWrapperValue<SkSVGTransformType, SkSVGValue::Type::kTransform>;
76using SkSVGViewBoxValue = SkSVGWrapperValue<SkSVGViewBoxType , SkSVGValue::Type::kViewBox >;
77using SkSVGPaintValue = SkSVGWrapperValue<SkSVGPaint , SkSVGValue::Type::kPaint >;
78using SkSVGLineCapValue = SkSVGWrapperValue<SkSVGLineCap , SkSVGValue::Type::kLineCap >;
79using SkSVGLineJoinValue = SkSVGWrapperValue<SkSVGLineJoin , SkSVGValue::Type::kLineJoin >;
80using SkSVGNumberValue = SkSVGWrapperValue<SkSVGNumberType , SkSVGValue::Type::kNumber >;
81using SkSVGPointsValue = SkSVGWrapperValue<SkSVGPointsType , SkSVGValue::Type::kPoints >;
82using SkSVGStringValue = SkSVGWrapperValue<SkSVGStringType , SkSVGValue::Type::kString >;
83using SkSVGSpreadMethodValue = SkSVGWrapperValue<SkSVGSpreadMethod ,
84 SkSVGValue::Type::kSpreadMethod>;
fmalita6ceef3d2016-07-26 18:46:34 -070085
86#endif // SkSVGValue_DEFINED