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 18class SkSVGValue : public SkNoncopyable { 19public: 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 33 Type type() const { return fType; } 34 35 template <typename T> 36 const T* as() const { 37 return fType == T::TYPE ? static_cast<const T*>(this) : nullptr; 38 } 39 40protected: 41 SkSVGValue(Type t) : fType(t) { } 42 43private: 44 Type fType; 45 46 using INHERITED = SkNoncopyable; 47}; 48 49template <typename T, SkSVGValue::Type ValueType> 50class SkSVGWrapperValue final : public SkSVGValue { 51public: 52 static constexpr Type TYPE = ValueType; 53 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 61private: 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 71using SkSVGColorValue = SkSVGWrapperValue<SkSVGColorType , SkSVGValue::Type::kColor >; 72using SkSVGLengthValue = SkSVGWrapperValue<SkSVGLength , SkSVGValue::Type::kLength >; 73using SkSVGTransformValue = SkSVGWrapperValue<SkSVGTransformType, SkSVGValue::Type::kTransform >; 74using SkSVGViewBoxValue = SkSVGWrapperValue<SkSVGViewBoxType , SkSVGValue::Type::kViewBox >; 75using SkSVGNumberValue = SkSVGWrapperValue<SkSVGNumberType , SkSVGValue::Type::kNumber >; 76using SkSVGStringValue = SkSVGWrapperValue<SkSVGStringType , SkSVGValue::Type::kString >; 77using SkSVGStopColorValue = SkSVGWrapperValue<SkSVGStopColor , SkSVGValue::Type::kStopColor >; 78 79using SkSVGPreserveAspectRatioValue = SkSVGWrapperValue<SkSVGPreserveAspectRatio, 80 SkSVGValue::Type::kPreserveAspectRatio>; 81 82using SkSVGObjectBoundingBoxUnitsValue = SkSVGWrapperValue<SkSVGObjectBoundingBoxUnits, 83 SkSVGValue::Type::kObjectBoundingBoxUnits>; 84 85#endif // SkSVGValue_DEFINED 86