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