2 * Copyright 2016 Google Inc.
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
8 #ifndef SkSVGValue_DEFINED
9 #define SkSVGValue_DEFINED
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"
18 class SkSVGValue : public SkNoncopyable {
25 kObjectBoundingBoxUnits,
33 Type type() const { return fType; }
37 return fType == T::TYPE ? static_cast<const T*>(this) : nullptr;
41 SkSVGValue(Type t) : fType(t) { }
46 using INHERITED = SkNoncopyable;
49 template <typename T, SkSVGValue::Type ValueType>
50 class SkSVGWrapperValue final : public SkSVGValue {
52 static constexpr Type TYPE = ValueType;
54 explicit SkSVGWrapperValue(const T& v)
55 : INHERITED(ValueType)
56 , fWrappedValue(v) { }
58 operator const T&() const { return fWrappedValue; }
59 const T* operator->() const { return &fWrappedValue; }
63 void* operator new(size_t) = delete;
64 void* operator new(size_t, void*) = delete;
66 const T& fWrappedValue;
68 using INHERITED = SkSVGValue;
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 >;
79 using SkSVGPreserveAspectRatioValue = SkSVGWrapperValue<SkSVGPreserveAspectRatio,
80 SkSVGValue::Type::kPreserveAspectRatio>;
82 using SkSVGObjectBoundingBoxUnitsValue = SkSVGWrapperValue<SkSVGObjectBoundingBoxUnits,
83 SkSVGValue::Type::kObjectBoundingBoxUnits>;
85 #endif // SkSVGValue_DEFINED