e932d4b3a9
There's a bit of friction with this attribute, because per spec it is an inherited presentation attribute, but in Skia it is part of the actual SkPath state. So we must add some plumbing to SkSVGShape & friends to allow overriding the fill type at render-time. R=robertphillips@google.com,stephana@google.com Change-Id: I9c926d653c6211beb3914bffac50d4349dbdd2c0 Reviewed-on: https://skia-review.googlesource.com/5415 Reviewed-by: Mike Reed <reed@google.com> Commit-Queue: Florin Malita <fmalita@chromium.org>
89 lines
2.8 KiB
C++
89 lines
2.8 KiB
C++
/*
|
|
* Copyright 2016 Google Inc.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license that can be
|
|
* found in the LICENSE file.
|
|
*/
|
|
|
|
#ifndef SkSVGValue_DEFINED
|
|
#define SkSVGValue_DEFINED
|
|
|
|
#include "SkColor.h"
|
|
#include "SkMatrix.h"
|
|
#include "SkPath.h"
|
|
#include "SkSVGTypes.h"
|
|
#include "SkTypes.h"
|
|
|
|
class SkSVGValue : public SkNoncopyable {
|
|
public:
|
|
enum class Type {
|
|
kColor,
|
|
kFillRule,
|
|
kLength,
|
|
kLineCap,
|
|
kLineJoin,
|
|
kNumber,
|
|
kPaint,
|
|
kPath,
|
|
kPoints,
|
|
kSpreadMethod,
|
|
kString,
|
|
kTransform,
|
|
kViewBox,
|
|
};
|
|
|
|
Type type() const { return fType; }
|
|
|
|
template <typename T>
|
|
const T* as() const {
|
|
return fType == T::TYPE ? static_cast<const T*>(this) : nullptr;
|
|
}
|
|
|
|
protected:
|
|
SkSVGValue(Type t) : fType(t) { }
|
|
|
|
private:
|
|
Type fType;
|
|
|
|
typedef SkNoncopyable INHERITED;
|
|
};
|
|
|
|
template <typename T, SkSVGValue::Type ValueType>
|
|
class SkSVGWrapperValue final : public SkSVGValue {
|
|
public:
|
|
static constexpr Type TYPE = ValueType;
|
|
|
|
explicit SkSVGWrapperValue(const T& v)
|
|
: INHERITED(ValueType)
|
|
, fWrappedValue(v) { }
|
|
|
|
operator const T&() const { return fWrappedValue; }
|
|
const T* operator->() const { return &fWrappedValue; }
|
|
|
|
private:
|
|
// Stack-only
|
|
void* operator new(size_t) = delete;
|
|
void* operator new(size_t, void*) = delete;
|
|
|
|
const T& fWrappedValue;
|
|
|
|
typedef SkSVGValue INHERITED;
|
|
};
|
|
|
|
using SkSVGColorValue = SkSVGWrapperValue<SkSVGColorType , SkSVGValue::Type::kColor >;
|
|
using SkSVGFillRuleValue = SkSVGWrapperValue<SkSVGFillRule , SkSVGValue::Type::kFillRule >;
|
|
using SkSVGLengthValue = SkSVGWrapperValue<SkSVGLength , SkSVGValue::Type::kLength >;
|
|
using SkSVGPathValue = SkSVGWrapperValue<SkPath , SkSVGValue::Type::kPath >;
|
|
using SkSVGTransformValue = SkSVGWrapperValue<SkSVGTransformType, SkSVGValue::Type::kTransform>;
|
|
using SkSVGViewBoxValue = SkSVGWrapperValue<SkSVGViewBoxType , SkSVGValue::Type::kViewBox >;
|
|
using SkSVGPaintValue = SkSVGWrapperValue<SkSVGPaint , SkSVGValue::Type::kPaint >;
|
|
using SkSVGLineCapValue = SkSVGWrapperValue<SkSVGLineCap , SkSVGValue::Type::kLineCap >;
|
|
using SkSVGLineJoinValue = SkSVGWrapperValue<SkSVGLineJoin , SkSVGValue::Type::kLineJoin >;
|
|
using SkSVGNumberValue = SkSVGWrapperValue<SkSVGNumberType , SkSVGValue::Type::kNumber >;
|
|
using SkSVGPointsValue = SkSVGWrapperValue<SkSVGPointsType , SkSVGValue::Type::kPoints >;
|
|
using SkSVGStringValue = SkSVGWrapperValue<SkSVGStringType , SkSVGValue::Type::kString >;
|
|
using SkSVGSpreadMethodValue = SkSVGWrapperValue<SkSVGSpreadMethod ,
|
|
SkSVGValue::Type::kSpreadMethod>;
|
|
|
|
#endif // SkSVGValue_DEFINED
|