• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
type()33     Type type() const { return fType; }
34 
35     template <typename T>
as()36     const T* as() const {
37         return fType == T::TYPE ? static_cast<const T*>(this) : nullptr;
38     }
39 
40 protected:
SkSVGValue(Type t)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 
SkSVGWrapperValue(const T & v)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
86