Update rive-cpp to 2.0 version
[platform/core/uifw/rive-tizen.git] / submodule / skia / modules / svg / include / SkSVGValue.h
1 /*
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 "include/core/SkColor.h"
12 #include "include/core/SkMatrix.h"
13 #include "include/core/SkPath.h"
14 #include "include/core/SkTypes.h"
15 #include "include/private/SkNoncopyable.h"
16 #include "modules/svg/include/SkSVGTypes.h"
17
18 class SkSVGValue : public SkNoncopyable {
19 public:
20     enum class Type {
21         kColor,
22         kFilter,
23         kLength,
24         kNumber,
25         kObjectBoundingBoxUnits,
26         kPreserveAspectRatio,
27         kStopColor,
28         kString,
29         kTransform,
30         kViewBox,
31     };
32
33     Type type() const { return fType; }
34
35     template <typename T>
36     const T* as() const {
37         return fType == T::TYPE ? static_cast<const T*>(this) : nullptr;
38     }
39
40 protected:
41     SkSVGValue(Type t) : fType(t) { }
42
43 private:
44     Type fType;
45
46     using INHERITED = SkNoncopyable;
47 };
48
49 template <typename T, SkSVGValue::Type ValueType>
50 class SkSVGWrapperValue final : public SkSVGValue {
51 public:
52     static constexpr Type TYPE = ValueType;
53
54     explicit SkSVGWrapperValue(const T& v)
55         : INHERITED(ValueType)
56         , fWrappedValue(v) { }
57
58     operator const T&() const { return fWrappedValue; }
59     const T* operator->() const { return &fWrappedValue; }
60
61 private:
62     // Stack-only
63     void* operator new(size_t) = delete;
64     void* operator new(size_t, void*) = delete;
65
66     const T& fWrappedValue;
67
68     using INHERITED = SkSVGValue;
69 };
70
71 using SkSVGColorValue        = SkSVGWrapperValue<SkSVGColorType    , SkSVGValue::Type::kColor     >;
72 using SkSVGLengthValue       = SkSVGWrapperValue<SkSVGLength       , SkSVGValue::Type::kLength    >;
73 using SkSVGTransformValue    = SkSVGWrapperValue<SkSVGTransformType, SkSVGValue::Type::kTransform >;
74 using SkSVGViewBoxValue      = SkSVGWrapperValue<SkSVGViewBoxType  , SkSVGValue::Type::kViewBox   >;
75 using SkSVGNumberValue       = SkSVGWrapperValue<SkSVGNumberType   , SkSVGValue::Type::kNumber    >;
76 using SkSVGStringValue       = SkSVGWrapperValue<SkSVGStringType   , SkSVGValue::Type::kString    >;
77 using SkSVGStopColorValue    = SkSVGWrapperValue<SkSVGStopColor    , SkSVGValue::Type::kStopColor >;
78
79 using SkSVGPreserveAspectRatioValue    = SkSVGWrapperValue<SkSVGPreserveAspectRatio,
80                                                            SkSVGValue::Type::kPreserveAspectRatio>;
81
82 using SkSVGObjectBoundingBoxUnitsValue = SkSVGWrapperValue<SkSVGObjectBoundingBoxUnits,
83                                                            SkSVGValue::Type::kObjectBoundingBoxUnits>;
84
85 #endif // SkSVGValue_DEFINED