xref: /aosp_15_r20/external/skia/modules/svg/include/SkSVGValue.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2016 Google Inc.
3*c8dee2aaSAndroid Build Coastguard Worker  *
4*c8dee2aaSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker  * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker  */
7*c8dee2aaSAndroid Build Coastguard Worker 
8*c8dee2aaSAndroid Build Coastguard Worker #ifndef SkSVGValue_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker #define SkSVGValue_DEFINED
10*c8dee2aaSAndroid Build Coastguard Worker 
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColor.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkMatrix.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPath.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkNoncopyable.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "modules/svg/include/SkSVGTypes.h"
17*c8dee2aaSAndroid Build Coastguard Worker 
18*c8dee2aaSAndroid Build Coastguard Worker class SK_API SkSVGValue : public SkNoncopyable {
19*c8dee2aaSAndroid Build Coastguard Worker public:
20*c8dee2aaSAndroid Build Coastguard Worker     enum class Type {
21*c8dee2aaSAndroid Build Coastguard Worker         kColor,
22*c8dee2aaSAndroid Build Coastguard Worker         kFilter,
23*c8dee2aaSAndroid Build Coastguard Worker         kLength,
24*c8dee2aaSAndroid Build Coastguard Worker         kNumber,
25*c8dee2aaSAndroid Build Coastguard Worker         kObjectBoundingBoxUnits,
26*c8dee2aaSAndroid Build Coastguard Worker         kPreserveAspectRatio,
27*c8dee2aaSAndroid Build Coastguard Worker         kStopColor,
28*c8dee2aaSAndroid Build Coastguard Worker         kString,
29*c8dee2aaSAndroid Build Coastguard Worker         kTransform,
30*c8dee2aaSAndroid Build Coastguard Worker         kViewBox,
31*c8dee2aaSAndroid Build Coastguard Worker     };
32*c8dee2aaSAndroid Build Coastguard Worker 
type()33*c8dee2aaSAndroid Build Coastguard Worker     Type type() const { return fType; }
34*c8dee2aaSAndroid Build Coastguard Worker 
35*c8dee2aaSAndroid Build Coastguard Worker     template <typename T>
as()36*c8dee2aaSAndroid Build Coastguard Worker     const T* as() const {
37*c8dee2aaSAndroid Build Coastguard Worker         return fType == T::TYPE ? static_cast<const T*>(this) : nullptr;
38*c8dee2aaSAndroid Build Coastguard Worker     }
39*c8dee2aaSAndroid Build Coastguard Worker 
40*c8dee2aaSAndroid Build Coastguard Worker protected:
SkSVGValue(Type t)41*c8dee2aaSAndroid Build Coastguard Worker     SkSVGValue(Type t) : fType(t) { }
42*c8dee2aaSAndroid Build Coastguard Worker 
43*c8dee2aaSAndroid Build Coastguard Worker private:
44*c8dee2aaSAndroid Build Coastguard Worker     Type fType;
45*c8dee2aaSAndroid Build Coastguard Worker 
46*c8dee2aaSAndroid Build Coastguard Worker     using INHERITED = SkNoncopyable;
47*c8dee2aaSAndroid Build Coastguard Worker };
48*c8dee2aaSAndroid Build Coastguard Worker 
49*c8dee2aaSAndroid Build Coastguard Worker template <typename T, SkSVGValue::Type ValueType>
50*c8dee2aaSAndroid Build Coastguard Worker class SK_API SkSVGWrapperValue final : public SkSVGValue {
51*c8dee2aaSAndroid Build Coastguard Worker public:
52*c8dee2aaSAndroid Build Coastguard Worker     static constexpr Type TYPE = ValueType;
53*c8dee2aaSAndroid Build Coastguard Worker 
SkSVGWrapperValue(const T & v)54*c8dee2aaSAndroid Build Coastguard Worker     explicit SkSVGWrapperValue(const T& v)
55*c8dee2aaSAndroid Build Coastguard Worker         : INHERITED(ValueType)
56*c8dee2aaSAndroid Build Coastguard Worker         , fWrappedValue(v) { }
57*c8dee2aaSAndroid Build Coastguard Worker 
58*c8dee2aaSAndroid Build Coastguard Worker     operator const T&() const { return fWrappedValue; }
59*c8dee2aaSAndroid Build Coastguard Worker     const T* operator->() const { return &fWrappedValue; }
60*c8dee2aaSAndroid Build Coastguard Worker 
61*c8dee2aaSAndroid Build Coastguard Worker private:
62*c8dee2aaSAndroid Build Coastguard Worker     // Stack-only
63*c8dee2aaSAndroid Build Coastguard Worker     void* operator new(size_t) = delete;
64*c8dee2aaSAndroid Build Coastguard Worker     void* operator new(size_t, void*) = delete;
65*c8dee2aaSAndroid Build Coastguard Worker 
66*c8dee2aaSAndroid Build Coastguard Worker     const T& fWrappedValue;
67*c8dee2aaSAndroid Build Coastguard Worker 
68*c8dee2aaSAndroid Build Coastguard Worker     using INHERITED = SkSVGValue;
69*c8dee2aaSAndroid Build Coastguard Worker };
70*c8dee2aaSAndroid Build Coastguard Worker 
71*c8dee2aaSAndroid Build Coastguard Worker using SkSVGColorValue        = SkSVGWrapperValue<SkSVGColorType    , SkSVGValue::Type::kColor     >;
72*c8dee2aaSAndroid Build Coastguard Worker using SkSVGLengthValue       = SkSVGWrapperValue<SkSVGLength       , SkSVGValue::Type::kLength    >;
73*c8dee2aaSAndroid Build Coastguard Worker using SkSVGTransformValue    = SkSVGWrapperValue<SkSVGTransformType, SkSVGValue::Type::kTransform >;
74*c8dee2aaSAndroid Build Coastguard Worker using SkSVGViewBoxValue      = SkSVGWrapperValue<SkSVGViewBoxType  , SkSVGValue::Type::kViewBox   >;
75*c8dee2aaSAndroid Build Coastguard Worker using SkSVGNumberValue       = SkSVGWrapperValue<SkSVGNumberType   , SkSVGValue::Type::kNumber    >;
76*c8dee2aaSAndroid Build Coastguard Worker using SkSVGStringValue       = SkSVGWrapperValue<SkSVGStringType   , SkSVGValue::Type::kString    >;
77*c8dee2aaSAndroid Build Coastguard Worker using SkSVGStopColorValue    = SkSVGWrapperValue<SkSVGStopColor    , SkSVGValue::Type::kStopColor >;
78*c8dee2aaSAndroid Build Coastguard Worker 
79*c8dee2aaSAndroid Build Coastguard Worker using SkSVGPreserveAspectRatioValue    = SkSVGWrapperValue<SkSVGPreserveAspectRatio,
80*c8dee2aaSAndroid Build Coastguard Worker                                                            SkSVGValue::Type::kPreserveAspectRatio>;
81*c8dee2aaSAndroid Build Coastguard Worker 
82*c8dee2aaSAndroid Build Coastguard Worker using SkSVGObjectBoundingBoxUnitsValue = SkSVGWrapperValue<SkSVGObjectBoundingBoxUnits,
83*c8dee2aaSAndroid Build Coastguard Worker                                                            SkSVGValue::Type::kObjectBoundingBoxUnits>;
84*c8dee2aaSAndroid Build Coastguard Worker 
85*c8dee2aaSAndroid Build Coastguard Worker #endif // SkSVGValue_DEFINED
86