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