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 "SkColor.h" 12 #include "SkMatrix.h" 13 #include "SkNoncopyable.h" 14 #include "SkPath.h" 15 #include "SkSVGTypes.h" 16 #include "SkTypes.h" 17 18 class SkSVGValue : public SkNoncopyable { 19 public: 20 enum class Type { 21 kClip, 22 kColor, 23 kDashArray, 24 kFillRule, 25 kLength, 26 kLineCap, 27 kLineJoin, 28 kNumber, 29 kPaint, 30 kPath, 31 kPoints, 32 kSpreadMethod, 33 kString, 34 kTransform, 35 kViewBox, 36 kVisibility, 37 }; 38 type()39 Type type() const { return fType; } 40 41 template <typename T> as()42 const T* as() const { 43 return fType == T::TYPE ? static_cast<const T*>(this) : nullptr; 44 } 45 46 protected: SkSVGValue(Type t)47 SkSVGValue(Type t) : fType(t) { } 48 49 private: 50 Type fType; 51 52 typedef SkNoncopyable INHERITED; 53 }; 54 55 template <typename T, SkSVGValue::Type ValueType> 56 class SkSVGWrapperValue final : public SkSVGValue { 57 public: 58 static constexpr Type TYPE = ValueType; 59 SkSVGWrapperValue(const T & v)60 explicit SkSVGWrapperValue(const T& v) 61 : INHERITED(ValueType) 62 , fWrappedValue(v) { } 63 64 operator const T&() const { return fWrappedValue; } 65 const T* operator->() const { return &fWrappedValue; } 66 67 private: 68 // Stack-only 69 void* operator new(size_t) = delete; 70 void* operator new(size_t, void*) = delete; 71 72 const T& fWrappedValue; 73 74 typedef SkSVGValue INHERITED; 75 }; 76 77 using SkSVGClipValue = SkSVGWrapperValue<SkSVGClip , SkSVGValue::Type::kClip >; 78 using SkSVGColorValue = SkSVGWrapperValue<SkSVGColorType , SkSVGValue::Type::kColor >; 79 using SkSVGFillRuleValue = SkSVGWrapperValue<SkSVGFillRule , SkSVGValue::Type::kFillRule >; 80 using SkSVGLengthValue = SkSVGWrapperValue<SkSVGLength , SkSVGValue::Type::kLength >; 81 using SkSVGPathValue = SkSVGWrapperValue<SkPath , SkSVGValue::Type::kPath >; 82 using SkSVGTransformValue = SkSVGWrapperValue<SkSVGTransformType, SkSVGValue::Type::kTransform >; 83 using SkSVGViewBoxValue = SkSVGWrapperValue<SkSVGViewBoxType , SkSVGValue::Type::kViewBox >; 84 using SkSVGPaintValue = SkSVGWrapperValue<SkSVGPaint , SkSVGValue::Type::kPaint >; 85 using SkSVGLineCapValue = SkSVGWrapperValue<SkSVGLineCap , SkSVGValue::Type::kLineCap >; 86 using SkSVGLineJoinValue = SkSVGWrapperValue<SkSVGLineJoin , SkSVGValue::Type::kLineJoin >; 87 using SkSVGNumberValue = SkSVGWrapperValue<SkSVGNumberType , SkSVGValue::Type::kNumber >; 88 using SkSVGPointsValue = SkSVGWrapperValue<SkSVGPointsType , SkSVGValue::Type::kPoints >; 89 using SkSVGStringValue = SkSVGWrapperValue<SkSVGStringType , SkSVGValue::Type::kString >; 90 using SkSVGSpreadMethodValue = SkSVGWrapperValue<SkSVGSpreadMethod , 91 SkSVGValue::Type::kSpreadMethod>; 92 using SkSVGVisibilityValue = SkSVGWrapperValue<SkSVGVisibility , SkSVGValue::Type::kVisibility>; 93 using SkSVGDashArrayValue = SkSVGWrapperValue<SkSVGDashArray , SkSVGValue::Type::kDashArray >; 94 95 #endif // SkSVGValue_DEFINED 96