Reland "[svg] Relocate out of experimental"

Move the SVG rendering code to modules/svg, and componentize.
Also split into include/src/utils.

As external clients still reference the old header locations,
introduce temporary forwarding headers to facilitate the migration.

This reverts commit d6cf56fd34.

TBR=

Change-Id: Ibadd7c8dc0464ec0c27841530ade0c2098305d20
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/327344
Commit-Queue: Florin Malita <fmalita@google.com>
Reviewed-by: Florin Malita <fmalita@google.com>
This commit is contained in:
Florin Malita 2020-10-15 18:10:29 -04:00 committed by Skia Commit-Bot
parent f1b53836b7
commit b3418103e9
101 changed files with 2097 additions and 1733 deletions

View File

@ -1801,8 +1801,8 @@ if (skia_enable_tools) {
defines += [ "SK_TOOLS_REQUIRE_RESOURCES" ]
}
deps = [
":experimental_svg_model",
":flags",
"modules/svg",
]
public_deps = [ ":gpu_tool_utils" ]
}
@ -1866,7 +1866,6 @@ if (skia_enable_tools) {
sources -= [ "//tests/FontMgrFontConfigTest.cpp" ]
}
deps = [
":experimental_svg_model",
":flags",
":skia",
":skvm_builders",
@ -1876,6 +1875,7 @@ if (skia_enable_tools) {
"modules/skparagraph:tests",
"modules/sksg:tests",
"modules/skshaper",
"modules/svg",
"//third_party/absl",
"//third_party/libpng",
"//third_party/libwebp",
@ -1901,52 +1901,6 @@ if (skia_enable_tools) {
]
}
# TODO(fmalita): componentize & relocate
test_lib("experimental_svg_model") {
if (skia_use_expat) {
sources = [
"experimental/svg/model/SkSVGAttribute.cpp",
"experimental/svg/model/SkSVGAttributeParser.cpp",
"experimental/svg/model/SkSVGCircle.cpp",
"experimental/svg/model/SkSVGClipPath.cpp",
"experimental/svg/model/SkSVGContainer.cpp",
"experimental/svg/model/SkSVGDOM.cpp",
"experimental/svg/model/SkSVGEllipse.cpp",
"experimental/svg/model/SkSVGGradient.cpp",
"experimental/svg/model/SkSVGLine.cpp",
"experimental/svg/model/SkSVGLinearGradient.cpp",
"experimental/svg/model/SkSVGNode.cpp",
"experimental/svg/model/SkSVGPath.cpp",
"experimental/svg/model/SkSVGPattern.cpp",
"experimental/svg/model/SkSVGPoly.cpp",
"experimental/svg/model/SkSVGRadialGradient.cpp",
"experimental/svg/model/SkSVGRect.cpp",
"experimental/svg/model/SkSVGRenderContext.cpp",
"experimental/svg/model/SkSVGSVG.cpp",
"experimental/svg/model/SkSVGShape.cpp",
"experimental/svg/model/SkSVGStop.cpp",
"experimental/svg/model/SkSVGText.cpp",
"experimental/svg/model/SkSVGTransformableNode.cpp",
"experimental/svg/model/SkSVGUse.cpp",
"experimental/svg/model/SkSVGValue.cpp",
]
deps = [
":skia",
":xml",
]
}
}
if (skia_use_expat && !skia_use_wuffs) {
test_app("svg_tool") {
sources = [ "experimental/svg/utils/SvgTool.cpp" ]
deps = [
":experimental_svg_model",
":flags",
]
}
}
test_lib("experimental_xform") {
sources = [
"experimental/xform/SkShape.cpp",
@ -1960,6 +1914,9 @@ if (skia_enable_tools) {
test_app("skottie_tool") {
deps = [ "modules/skottie:tool" ]
}
test_app("svg_tool") {
deps = [ "modules/svg:tool" ]
}
}
test_app("make_skqp_model") {
@ -1975,13 +1932,13 @@ if (skia_enable_tools) {
}
public_deps = [ ":tool_utils" ]
deps = [
":experimental_svg_model",
":flags",
":gpu_tool_utils",
":xml",
"modules/audioplayer",
"modules/skparagraph:samples",
"modules/skshaper",
"modules/svg",
]
}
test_lib("hash_and_encode") {
@ -2015,7 +1972,6 @@ if (skia_enable_tools) {
deps = [
":common_flags_aa",
":common_flags_gpu",
":experimental_svg_model",
":flags",
":gm",
":gpu_tool_utils",
@ -2026,6 +1982,7 @@ if (skia_enable_tools) {
":trace",
"modules/skottie",
"modules/skottie:utils",
"modules/svg",
]
}
test_app("dm") {
@ -2040,7 +1997,6 @@ if (skia_enable_tools) {
":common_flags_config",
":common_flags_gpu",
":common_flags_images",
":experimental_svg_model",
":flags",
":gm",
":gpu_tool_utils",
@ -2052,6 +2008,7 @@ if (skia_enable_tools) {
"experimental/skrive",
"modules/skottie",
"modules/skottie:utils",
"modules/svg",
]
}
}
@ -2078,7 +2035,6 @@ if (skia_enable_tools) {
":common_flags_config",
":common_flags_gpu",
":common_flags_images",
":experimental_svg_model",
":flags",
":gm",
":gpu_tool_utils",
@ -2087,6 +2043,7 @@ if (skia_enable_tools) {
":trace",
"modules/skparagraph",
"modules/skshaper",
"modules/svg",
]
}
@ -2578,7 +2535,6 @@ if (skia_enable_tools) {
deps = [
":common_flags_gpu",
":experimental_svg_model",
":flags",
":gm",
":gpu_tool_utils",
@ -2593,6 +2549,7 @@ if (skia_enable_tools) {
"modules/skottie",
"modules/skottie:utils",
"modules/sksg:samples",
"modules/svg",
"//third_party/imgui",
]
if (skia_use_experimental_xform) {
@ -2783,7 +2740,7 @@ if (skia_enable_tools) {
"tools/fonts/TestSVGTypeface.cpp",
"tools/fonts/TestTypeface.cpp",
]
deps = [ ":experimental_svg_model" ]
deps = [ "modules/svg" ]
}
libfuzzer_app("region_set_path") {
@ -2803,7 +2760,7 @@ if (skia_enable_tools) {
"tools/fonts/TestSVGTypeface.cpp",
"tools/fonts/TestTypeface.cpp",
]
deps = [ ":experimental_svg_model" ]
deps = [ "modules/svg" ]
}
libfuzzer_app("path_deserialize") {
@ -2840,7 +2797,7 @@ if (skia_enable_tools) {
"tools/fonts/TestTypeface.cpp",
]
deps = [
":experimental_svg_model",
"modules/svg",
"//third_party/libpng",
]
}
@ -2914,7 +2871,7 @@ if (skia_enable_tools) {
"tools/fonts/TestTypeface.cpp",
]
deps = [
":experimental_svg_model",
"modules/svg",
"//third_party/libpng",
]
}
@ -2941,7 +2898,7 @@ if (skia_enable_tools) {
"tools/fonts/TestTypeface.cpp",
]
deps = [
":experimental_svg_model",
"modules/svg",
"//third_party/libpng",
]
}
@ -2967,7 +2924,7 @@ if (skia_enable_tools) {
"tools/fonts/TestTypeface.cpp",
]
deps = [
":experimental_svg_model",
"modules/svg",
"//third_party/libpng",
]
}
@ -2991,7 +2948,7 @@ if (skia_enable_tools) {
"tools/fonts/TestTypeface.cpp",
]
deps = [
":experimental_svg_model",
"modules/svg",
"//third_party/libpng",
]
}
@ -3029,8 +2986,8 @@ if (skia_enable_tools) {
"tools/fonts/TestTypeface.cpp",
]
deps = [
":experimental_svg_model",
"modules/skottie:skottie",
"modules/svg",
]
}
@ -3084,7 +3041,7 @@ if (skia_enable_tools) {
libfuzzer_app("svg_dom") {
sources = [ "fuzz/oss_fuzz/FuzzSVG.cpp" ]
deps = [ ":experimental_svg_model" ]
deps = [ "modules/svg" ]
}
libfuzzer_app("skruntimeeffect") {

View File

@ -48,7 +48,7 @@
#include "tools/trace/SkDebugfTracer.h"
#ifdef SK_XML
#include "experimental/svg/model/SkSVGDOM.h"
#include "modules/svg/include/SkSVGDOM.h"
#endif // SK_XML
#ifdef SK_ENABLE_ANDROID_UTILS

View File

@ -71,8 +71,8 @@
#endif
#if defined(SK_XML)
#include "experimental/svg/model/SkSVGDOM.h"
#include "include/svg/SkSVGCanvas.h"
#include "modules/svg/include/SkSVGDOM.h"
#include "src/xml/SkXMLWriter.h"
#endif
@ -2339,8 +2339,8 @@ Result ViaPicture::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkS
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
#ifdef TEST_VIA_SVG
#include "experimental/svg/model/SkSVGDOM.h"
#include "include/svg/SkSVGCanvas.h"
#include "modules/svg/include/SkSVGDOM.h"
#include "src/xml/SkXMLWriter.h"
Result ViaSVG::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkString* log) const {

View File

@ -1,99 +1,10 @@
/*
* Copyright 2016 Google Inc.
* Copyright 2020 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkSVGAttribute_DEFINED
#define SkSVGAttribute_DEFINED
// Transitional forwarding header. To be removed.
#include "modules/svg/include/SkSVGAttribute.h"
#include "experimental/svg/model/SkSVGTypes.h"
#include "src/core/SkTLazy.h"
class SkSVGRenderContext;
enum class SkSVGAttribute {
kClipPath,
kClipRule,
kColor,
kCx, // <circle>, <ellipse>, <radialGradient>: center x position
kCy, // <circle>, <ellipse>, <radialGradient>: center y position
kD,
kFill,
kFillOpacity,
kFillRule,
kFontFamily,
kFontSize,
kFontStyle,
kFontWeight,
kFx, // <radialGradient>: focal point x position
kFy, // <radialGradient>: focal point y position
kGradientTransform,
kHeight,
kHref,
kOffset,
kOpacity,
kPatternTransform,
kPoints,
kR, // <circle>, <radialGradient>: radius
kRx, // <ellipse>,<rect>: horizontal (corner) radius
kRy, // <ellipse>,<rect>: vertical (corner) radius
kSpreadMethod,
kStopColor,
kStopOpacity,
kStroke,
kStrokeDashArray,
kStrokeDashOffset,
kStrokeOpacity,
kStrokeLineCap,
kStrokeLineJoin,
kStrokeMiterLimit,
kStrokeWidth,
kTransform,
kText,
kTextAnchor,
kViewBox,
kVisibility,
kWidth,
kX,
kX1, // <line>: first endpoint x
kX2, // <line>: second endpoint x
kY,
kY1, // <line>: first endpoint y
kY2, // <line>: second endpoint y
kUnknown,
};
struct SkSVGPresentationAttributes {
static SkSVGPresentationAttributes MakeInitial();
// TODO: SkTLazy adds an extra ptr per attribute; refactor to reduce overhead.
SkTLazy<SkSVGPaint> fFill;
SkTLazy<SkSVGNumberType> fFillOpacity;
SkTLazy<SkSVGFillRule> fFillRule;
SkTLazy<SkSVGFillRule> fClipRule;
SkTLazy<SkSVGPaint> fStroke;
SkTLazy<SkSVGDashArray> fStrokeDashArray;
SkTLazy<SkSVGLength> fStrokeDashOffset;
SkTLazy<SkSVGLineCap> fStrokeLineCap;
SkTLazy<SkSVGLineJoin> fStrokeLineJoin;
SkTLazy<SkSVGNumberType> fStrokeMiterLimit;
SkTLazy<SkSVGNumberType> fStrokeOpacity;
SkTLazy<SkSVGLength> fStrokeWidth;
SkTLazy<SkSVGVisibility> fVisibility;
SkTLazy<SkSVGColorType> fColor;
// TODO(tdenniston): add SkSVGStopColor
// uninherited
SkTLazy<SkSVGNumberType> fOpacity;
SkTLazy<SkSVGClip> fClipPath;
};
#endif // SkSVGAttribute_DEFINED

View File

@ -1,76 +1,10 @@
/*
* Copyright 2016 Google Inc.
* Copyright 2020 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkSVGAttributeParser_DEFINED
#define SkSVGAttributeParser_DEFINED
// Transitional forwarding header. To be removed.
#include "modules/svg/include/SkSVGAttributeParser.h"
#include "experimental/svg/model/SkSVGTypes.h"
#include "include/private/SkNoncopyable.h"
class SkSVGAttributeParser : public SkNoncopyable {
public:
SkSVGAttributeParser(const char[]);
bool parseColor(SkSVGColorType*);
bool parseClipPath(SkSVGClip*);
bool parseFillRule(SkSVGFillRule*);
bool parseNumber(SkSVGNumberType*);
bool parseLength(SkSVGLength*);
bool parseViewBox(SkSVGViewBoxType*);
bool parseTransform(SkSVGTransformType*);
bool parsePaint(SkSVGPaint*);
bool parseLineCap(SkSVGLineCap*);
bool parseLineJoin(SkSVGLineJoin*);
bool parsePoints(SkSVGPointsType*);
bool parseIRI(SkSVGStringType*);
bool parseSpreadMethod(SkSVGSpreadMethod*);
bool parseStopColor(SkSVGStopColor*);
bool parseVisibility(SkSVGVisibility*);
bool parseDashArray(SkSVGDashArray*);
private:
// Stack-only
void* operator new(size_t) = delete;
void* operator new(size_t, void*) = delete;
template <typename F>
bool advanceWhile(F func);
bool parseWSToken();
bool parseEOSToken();
bool parseSepToken();
bool parseCommaWspToken();
bool parseExpectedStringToken(const char*);
bool parseScalarToken(SkScalar*);
bool parseHexToken(uint32_t*);
bool parseLengthUnitToken(SkSVGLength::Unit*);
bool parseNamedColorToken(SkColor*);
bool parseHexColorToken(SkColor*);
bool parseColorComponentToken(int32_t*);
bool parseRGBColorToken(SkColor*);
bool parseFuncIRI(SkSVGStringType*);
// Transform helpers
bool parseMatrixToken(SkMatrix*);
bool parseTranslateToken(SkMatrix*);
bool parseScaleToken(SkMatrix*);
bool parseRotateToken(SkMatrix*);
bool parseSkewXToken(SkMatrix*);
bool parseSkewYToken(SkMatrix*);
// Parses a sequence of 'WS* <prefix> WS* (<nested>)', where the nested sequence
// is handled by the passed functor.
template <typename Func, typename T>
bool parseParenthesized(const char* prefix, Func, T* result);
// The current position in the input string.
const char* fCurPos;
using INHERITED = SkNoncopyable;
};
#endif // SkSVGAttributeParser_DEFINED

View File

@ -1,46 +1,10 @@
/*
* Copyright 2016 Google Inc.
* Copyright 2020 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkSVGCircle_DEFINED
#define SkSVGCircle_DEFINED
// Transitional forwarding header. To be removed.
#include "modules/svg/include/SkSVGCircle.h"
#include "experimental/svg/model/SkSVGShape.h"
#include "experimental/svg/model/SkSVGTypes.h"
struct SkPoint;
class SkSVGCircle final : public SkSVGShape {
public:
~SkSVGCircle() override = default;
static sk_sp<SkSVGCircle> Make() { return sk_sp<SkSVGCircle>(new SkSVGCircle()); }
void setCx(const SkSVGLength&);
void setCy(const SkSVGLength&);
void setR(const SkSVGLength&);
protected:
void onSetAttribute(SkSVGAttribute, const SkSVGValue&) override;
void onDraw(SkCanvas*, const SkSVGLengthContext&, const SkPaint&,
SkPathFillType) const override;
SkPath onAsPath(const SkSVGRenderContext&) const override;
private:
SkSVGCircle();
// resolve and return the center and radius values
std::tuple<SkPoint, SkScalar> resolve(const SkSVGLengthContext&) const;
SkSVGLength fCx = SkSVGLength(0);
SkSVGLength fCy = SkSVGLength(0);
SkSVGLength fR = SkSVGLength(0);
using INHERITED = SkSVGShape;
};
#endif // SkSVGCircle_DEFINED

View File

@ -1,26 +1,10 @@
/*
* Copyright 2016 Google Inc.
* Copyright 2020 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkSVGClipPath_DEFINED
#define SkSVGClipPath_DEFINED
// Transitional forwarding header. To be removed.
#include "modules/svg/include/SkSVGClipPath.h"
#include "experimental/svg/model/SkSVGHiddenContainer.h"
#include "experimental/svg/model/SkSVGTypes.h"
class SkSVGClipPath final : public SkSVGHiddenContainer {
public:
static sk_sp<SkSVGClipPath> Make() {
return sk_sp<SkSVGClipPath>(new SkSVGClipPath());
}
private:
SkSVGClipPath();
using INHERITED = SkSVGHiddenContainer;
};
#endif // SkSVGClipPath_DEFINED

View File

@ -1,36 +1,10 @@
/*
* Copyright 2016 Google Inc.
* Copyright 2020 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkSVGContainer_DEFINED
#define SkSVGContainer_DEFINED
// Transitional forwarding header. To be removed.
#include "modules/svg/include/SkSVGContainer.h"
#include "experimental/svg/model/SkSVGTransformableNode.h"
#include "include/private/SkTArray.h"
class SkSVGContainer : public SkSVGTransformableNode {
public:
~SkSVGContainer() override = default;
void appendChild(sk_sp<SkSVGNode>) override;
protected:
explicit SkSVGContainer(SkSVGTag);
void onRender(const SkSVGRenderContext&) const override;
SkPath onAsPath(const SkSVGRenderContext&) const override;
bool hasChildren() const final;
// TODO: add some sort of child iterator, and hide the container.
SkSTArray<1, sk_sp<SkSVGNode>, true> fChildren;
private:
using INHERITED = SkSVGTransformableNode;
};
#endif // SkSVGContainer_DEFINED

View File

@ -1,48 +1,10 @@
/*
* Copyright 2016 Google Inc.
* Copyright 2020 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkSVGDOM_DEFINED
#define SkSVGDOM_DEFINED
// Transitional forwarding header. To be removed.
#include "modules/svg/include/SkSVGDOM.h"
#include "experimental/svg/model/SkSVGIDMapper.h"
#include "include/core/SkRefCnt.h"
#include "include/core/SkSize.h"
#include "include/private/SkTemplates.h"
class SkCanvas;
class SkDOM;
class SkStream;
class SkSVGNode;
class SkSVGDOM : public SkRefCnt {
public:
SkSVGDOM();
static sk_sp<SkSVGDOM> MakeFromDOM(const SkDOM&);
static sk_sp<SkSVGDOM> MakeFromStream(SkStream&);
const SkSize& containerSize() const;
void setContainerSize(const SkSize&);
void setRoot(sk_sp<SkSVGNode>);
// Returns the node with the given id, or nullptr if not found.
sk_sp<SkSVGNode>* findNodeById(const char* id);
void render(SkCanvas*) const;
private:
SkSize intrinsicSize() const;
SkSize fContainerSize;
sk_sp<SkSVGNode> fRoot;
SkSVGIDMapper fIDMapper;
using INHERITED = SkRefCnt;
};
#endif // SkSVGDOM_DEFINED

View File

@ -1,23 +1,10 @@
/*
* Copyright 2016 Google Inc.
* Copyright 2020 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkSVGDefs_DEFINED
#define SkSVGDefs_DEFINED
// Transitional forwarding header. To be removed.
#include "modules/svg/include/SkSVGDefs.h"
#include "experimental/svg/model/SkSVGHiddenContainer.h"
class SkSVGDefs : public SkSVGHiddenContainer {
public:
static sk_sp<SkSVGDefs> Make() { return sk_sp<SkSVGDefs>(new SkSVGDefs()); }
private:
SkSVGDefs() : INHERITED(SkSVGTag::kDefs) {}
using INHERITED = SkSVGHiddenContainer;
};
#endif // SkSVGDefs_DEFINED

View File

@ -1,47 +1,10 @@
/*
* Copyright 2016 Google Inc.
* Copyright 2020 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkSVGEllipse_DEFINED
#define SkSVGEllipse_DEFINED
// Transitional forwarding header. To be removed.
#include "modules/svg/include/SkSVGEllipse.h"
#include "experimental/svg/model/SkSVGShape.h"
#include "experimental/svg/model/SkSVGTypes.h"
struct SkRect;
class SkSVGEllipse final : public SkSVGShape {
public:
~SkSVGEllipse() override = default;
static sk_sp<SkSVGEllipse> Make() { return sk_sp<SkSVGEllipse>(new SkSVGEllipse()); }
void setCx(const SkSVGLength&);
void setCy(const SkSVGLength&);
void setRx(const SkSVGLength&);
void setRy(const SkSVGLength&);
protected:
void onSetAttribute(SkSVGAttribute, const SkSVGValue&) override;
void onDraw(SkCanvas*, const SkSVGLengthContext&, const SkPaint&,
SkPathFillType) const override;
SkPath onAsPath(const SkSVGRenderContext&) const override;
private:
SkSVGEllipse();
SkRect resolve(const SkSVGLengthContext&) const;
SkSVGLength fCx = SkSVGLength(0);
SkSVGLength fCy = SkSVGLength(0);
SkSVGLength fRx = SkSVGLength(0);
SkSVGLength fRy = SkSVGLength(0);
using INHERITED = SkSVGShape;
};
#endif // SkSVGEllipse_DEFINED

View File

@ -1,23 +1,10 @@
/*
* Copyright 2016 Google Inc.
* Copyright 2020 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkSVGG_DEFINED
#define SkSVGG_DEFINED
// Transitional forwarding header. To be removed.
#include "modules/svg/include/SkSVGG.h"
#include "experimental/svg/model/SkSVGContainer.h"
class SkSVGG : public SkSVGContainer {
public:
static sk_sp<SkSVGG> Make() { return sk_sp<SkSVGG>(new SkSVGG()); }
private:
SkSVGG() : INHERITED(SkSVGTag::kG) { }
using INHERITED = SkSVGContainer;
};
#endif // SkSVGG_DEFINED

View File

@ -1,51 +1,10 @@
/*
* Copyright 2017 Google Inc.
* Copyright 2020 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkSVGGradient_DEFINED
#define SkSVGGradient_DEFINED
// Transitional forwarding header. To be removed.
#include "modules/svg/include/SkSVGGradient.h"
#include "experimental/svg/model/SkSVGHiddenContainer.h"
#include "experimental/svg/model/SkSVGTypes.h"
#include "include/core/SkShader.h"
class SkMatrix;
class SkSVGRenderContext;
class SkSVGStop;
class SkSVGGradient : public SkSVGHiddenContainer {
public:
~SkSVGGradient() override = default;
void setHref(const SkSVGStringType&);
void setGradientTransform(const SkSVGTransformType&);
void setSpreadMethod(const SkSVGSpreadMethod&);
protected:
explicit SkSVGGradient(SkSVGTag t) : INHERITED(t) {}
void onSetAttribute(SkSVGAttribute, const SkSVGValue&) override;
bool onAsPaint(const SkSVGRenderContext&, SkPaint*) const final;
virtual sk_sp<SkShader> onMakeShader(const SkSVGRenderContext&,
const SkColor*, const SkScalar*, int count,
SkTileMode, const SkMatrix& localMatrix) const = 0;
private:
using StopPositionArray = SkSTArray<2, SkScalar, true>;
using StopColorArray = SkSTArray<2, SkColor, true>;
void collectColorStops(const SkSVGRenderContext&, StopPositionArray*, StopColorArray*) const;
SkColor resolveStopColor(const SkSVGRenderContext&, const SkSVGStop&) const;
SkSVGStringType fHref;
SkSVGTransformType fGradientTransform = SkSVGTransformType(SkMatrix::I());
SkSVGSpreadMethod fSpreadMethod = SkSVGSpreadMethod(SkSVGSpreadMethod::Type::kPad);
using INHERITED = SkSVGHiddenContainer;
};
#endif // SkSVGGradient_DEFINED

View File

@ -1,23 +1,10 @@
/*
* Copyright 2016 Google Inc.
* Copyright 2020 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkSVGHiddenContainer_DEFINED
#define SkSVGHiddenContainer_DEFINED
// Transitional forwarding header. To be removed.
#include "modules/svg/include/SkSVGHiddenContainer.h"
#include "experimental/svg/model/SkSVGContainer.h"
class SkSVGHiddenContainer : public SkSVGContainer {
protected:
explicit SkSVGHiddenContainer(SkSVGTag t) : INHERITED(t) {}
void onRender(const SkSVGRenderContext&) const final {}
private:
using INHERITED = SkSVGContainer;
};
#endif // SkSVGHiddenContainer_DEFINED

View File

@ -1,19 +1,10 @@
/*
* Copyright 2016 Google Inc.
* Copyright 2020 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkSVGIDMapper_DEFINED
#define SkSVGIDMapper_DEFINED
// Transitional forwarding header. To be removed.
#include "modules/svg/include/SkSVGIDMapper.h"
#include "include/core/SkRefCnt.h"
#include "include/private/SkTHash.h"
class SkString;
class SkSVGNode;
using SkSVGIDMapper = SkTHashMap<SkString, sk_sp<SkSVGNode>>;
#endif // SkSVGIDMapper_DEFINED

View File

@ -1,48 +1,10 @@
/*
* Copyright 2016 Google Inc.
* Copyright 2020 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkSVGLine_DEFINED
#define SkSVGLine_DEFINED
// Transitional forwarding header. To be removed.
#include "modules/svg/include/SkSVGLine.h"
#include "experimental/svg/model/SkSVGShape.h"
#include "experimental/svg/model/SkSVGTypes.h"
struct SkPoint;
class SkSVGLine final : public SkSVGShape {
public:
~SkSVGLine() override = default;
static sk_sp<SkSVGLine> Make() { return sk_sp<SkSVGLine>(new SkSVGLine()); }
void setX1(const SkSVGLength&);
void setY1(const SkSVGLength&);
void setX2(const SkSVGLength&);
void setY2(const SkSVGLength&);
protected:
void onSetAttribute(SkSVGAttribute, const SkSVGValue&) override;
void onDraw(SkCanvas*, const SkSVGLengthContext&, const SkPaint&,
SkPathFillType) const override;
SkPath onAsPath(const SkSVGRenderContext&) const override;
private:
SkSVGLine();
// resolve and return the two endpoints
std::tuple<SkPoint, SkPoint> resolve(const SkSVGLengthContext&) const;
SkSVGLength fX1 = SkSVGLength(0);
SkSVGLength fY1 = SkSVGLength(0);
SkSVGLength fX2 = SkSVGLength(0);
SkSVGLength fY2 = SkSVGLength(0);
using INHERITED = SkSVGShape;
};
#endif // SkSVGLine_DEFINED

View File

@ -1,43 +1,10 @@
/*
* Copyright 2016 Google Inc.
* Copyright 2020 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkSVGLinearGradient_DEFINED
#define SkSVGLinearGradient_DEFINED
// Transitional forwarding header. To be removed.
#include "modules/svg/include/SkSVGLinearGradient.h"
#include "experimental/svg/model/SkSVGGradient.h"
#include "experimental/svg/model/SkSVGTypes.h"
class SkSVGLinearGradient final : public SkSVGGradient {
public:
~SkSVGLinearGradient() override = default;
static sk_sp<SkSVGLinearGradient> Make() {
return sk_sp<SkSVGLinearGradient>(new SkSVGLinearGradient());
}
void setX1(const SkSVGLength&);
void setY1(const SkSVGLength&);
void setX2(const SkSVGLength&);
void setY2(const SkSVGLength&);
protected:
void onSetAttribute(SkSVGAttribute, const SkSVGValue&) override;
sk_sp<SkShader> onMakeShader(const SkSVGRenderContext&,
const SkColor*, const SkScalar*, int count,
SkTileMode, const SkMatrix&) const override;
private:
SkSVGLinearGradient();
SkSVGLength fX1 = SkSVGLength(0 , SkSVGLength::Unit::kPercentage);
SkSVGLength fY1 = SkSVGLength(0 , SkSVGLength::Unit::kPercentage);
SkSVGLength fX2 = SkSVGLength(100, SkSVGLength::Unit::kPercentage);
SkSVGLength fY2 = SkSVGLength(0 , SkSVGLength::Unit::kPercentage);
using INHERITED = SkSVGGradient;
};
#endif // SkSVGLinearGradient_DEFINED

View File

@ -1,103 +1,10 @@
/*
* Copyright 2016 Google Inc.
* Copyright 2020 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkSVGNode_DEFINED
#define SkSVGNode_DEFINED
// Transitional forwarding header. To be removed.
#include "modules/svg/include/SkSVGNode.h"
#include "experimental/svg/model/SkSVGAttribute.h"
#include "include/core/SkRefCnt.h"
class SkCanvas;
class SkMatrix;
class SkPaint;
class SkPath;
class SkSVGRenderContext;
class SkSVGValue;
enum class SkSVGTag {
kCircle,
kClipPath,
kDefs,
kEllipse,
kG,
kLine,
kLinearGradient,
kPath,
kPattern,
kPolygon,
kPolyline,
kRadialGradient,
kRect,
kStop,
kSvg,
kText,
kUse
};
class SkSVGNode : public SkRefCnt {
public:
~SkSVGNode() override;
SkSVGTag tag() const { return fTag; }
virtual void appendChild(sk_sp<SkSVGNode>) = 0;
void render(const SkSVGRenderContext&) const;
bool asPaint(const SkSVGRenderContext&, SkPaint*) const;
SkPath asPath(const SkSVGRenderContext&) const;
void setAttribute(SkSVGAttribute, const SkSVGValue&);
bool setAttribute(const char* attributeName, const char* attributeValue);
void setClipPath(const SkSVGClip&);
void setClipRule(const SkSVGFillRule&);
void setColor(const SkSVGColorType&);
void setFill(const SkSVGPaint&);
void setFillOpacity(const SkSVGNumberType&);
void setFillRule(const SkSVGFillRule&);
void setOpacity(const SkSVGNumberType&);
void setStroke(const SkSVGPaint&);
void setStrokeDashArray(const SkSVGDashArray&);
void setStrokeDashOffset(const SkSVGLength&);
void setStrokeOpacity(const SkSVGNumberType&);
void setStrokeLineCap(const SkSVGLineCap&);
void setStrokeLineJoin(const SkSVGLineJoin&);
void setStrokeMiterLimit(const SkSVGNumberType&);
void setStrokeWidth(const SkSVGLength&);
void setVisibility(const SkSVGVisibility&);
protected:
SkSVGNode(SkSVGTag);
// Called before onRender(), to apply local attributes to the context. Unlike onRender(),
// onPrepareToRender() bubbles up the inheritance chain: overriders should always call
// INHERITED::onPrepareToRender(), unless they intend to short-circuit rendering
// (return false).
// Implementations are expected to return true if rendering is to continue, or false if
// the node/subtree rendering is disabled.
virtual bool onPrepareToRender(SkSVGRenderContext*) const;
virtual void onRender(const SkSVGRenderContext&) const = 0;
virtual bool onAsPaint(const SkSVGRenderContext&, SkPaint*) const { return false; }
virtual SkPath onAsPath(const SkSVGRenderContext&) const = 0;
virtual void onSetAttribute(SkSVGAttribute, const SkSVGValue&);
virtual bool hasChildren() const { return false; }
private:
SkSVGTag fTag;
// FIXME: this should be sparse
SkSVGPresentationAttributes fPresentationAttributes;
using INHERITED = SkRefCnt;
};
#endif // SkSVGNode_DEFINED

View File

@ -1,37 +1,10 @@
/*
* Copyright 2016 Google Inc.
* Copyright 2020 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkSVGPath_DEFINED
#define SkSVGPath_DEFINED
// Transitional forwarding header. To be removed.
#include "modules/svg/include/SkSVGPath.h"
#include "experimental/svg/model/SkSVGShape.h"
#include "include/core/SkPath.h"
class SkSVGPath final : public SkSVGShape {
public:
~SkSVGPath() override = default;
static sk_sp<SkSVGPath> Make() { return sk_sp<SkSVGPath>(new SkSVGPath()); }
void setPath(const SkPath& path) { fPath = path; }
protected:
void onSetAttribute(SkSVGAttribute, const SkSVGValue&) override;
void onDraw(SkCanvas*, const SkSVGLengthContext&, const SkPaint&,
SkPathFillType) const override;
SkPath onAsPath(const SkSVGRenderContext&) const override;
private:
SkSVGPath();
mutable SkPath fPath; // mutated in onDraw(), to apply inherited fill types.
using INHERITED = SkSVGShape;
};
#endif // SkSVGPath_DEFINED

View File

@ -1,59 +1,10 @@
/*
* Copyright 2017 Google Inc.
* Copyright 2020 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkSVGPattern_DEFINED
#define SkSVGPattern_DEFINED
// Transitional forwarding header. To be removed.
#include "modules/svg/include/SkSVGPattern.h"
#include "experimental/svg/model/SkSVGHiddenContainer.h"
#include "experimental/svg/model/SkSVGTypes.h"
class SkSVGRenderContext;
class SkSVGPattern final : public SkSVGHiddenContainer {
public:
~SkSVGPattern() override = default;
static sk_sp<SkSVGPattern> Make() {
return sk_sp<SkSVGPattern>(new SkSVGPattern());
}
void setX(const SkSVGLength&);
void setY(const SkSVGLength&);
void setWidth(const SkSVGLength&);
void setHeight(const SkSVGLength&);
void setHref(const SkSVGStringType&);
void setPatternTransform(const SkSVGTransformType&);
protected:
SkSVGPattern();
void onSetAttribute(SkSVGAttribute, const SkSVGValue&) override;
bool onAsPaint(const SkSVGRenderContext&, SkPaint*) const override;
private:
struct PatternAttributes {
SkTLazy<SkSVGLength> fX,
fY,
fWidth,
fHeight;
SkTLazy<SkSVGTransformType> fPatternTransform;
} fAttributes;
SkSVGStringType fHref;
const SkSVGPattern* resolveHref(const SkSVGRenderContext&, PatternAttributes*) const;
const SkSVGPattern* hrefTarget(const SkSVGRenderContext&) const;
// TODO:
// - patternUnits
// - patternContentUnits
using INHERITED = SkSVGHiddenContainer;
};
#endif // SkSVGPattern_DEFINED

View File

@ -1,45 +1,10 @@
/*
* Copyright 2016 Google Inc.
* Copyright 2020 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkSVGPoly_DEFINED
#define SkSVGPoly_DEFINED
// Transitional forwarding header. To be removed.
#include "modules/svg/include/SkSVGPoly.h"
#include "experimental/svg/model/SkSVGShape.h"
#include "include/core/SkPath.h"
// Handles <polygon> and <polyline> elements.
class SkSVGPoly final : public SkSVGShape {
public:
~SkSVGPoly() override = default;
static sk_sp<SkSVGPoly> MakePolygon() {
return sk_sp<SkSVGPoly>(new SkSVGPoly(SkSVGTag::kPolygon));
}
static sk_sp<SkSVGPoly> MakePolyline() {
return sk_sp<SkSVGPoly>(new SkSVGPoly(SkSVGTag::kPolyline));
}
void setPoints(const SkSVGPointsType&);
protected:
void onSetAttribute(SkSVGAttribute, const SkSVGValue&) override;
void onDraw(SkCanvas*, const SkSVGLengthContext&, const SkPaint&,
SkPathFillType) const override;
SkPath onAsPath(const SkSVGRenderContext&) const override;
private:
SkSVGPoly(SkSVGTag);
mutable SkPath fPath; // mutated in onDraw(), to apply inherited fill types.
using INHERITED = SkSVGShape;
};
#endif // SkSVGPoly_DEFINED

View File

@ -1,46 +1,10 @@
/*
* Copyright 2017 Google Inc.
* Copyright 2020 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkSVGRadialGradient_DEFINED
#define SkSVGRadialGradient_DEFINED
// Transitional forwarding header. To be removed.
#include "modules/svg/include/SkSVGRadialGradient.h"
#include "experimental/svg/model/SkSVGGradient.h"
#include "experimental/svg/model/SkSVGTypes.h"
class SkSVGRadialGradient final : public SkSVGGradient {
public:
~SkSVGRadialGradient() override = default;
static sk_sp<SkSVGRadialGradient> Make() {
return sk_sp<SkSVGRadialGradient>(new SkSVGRadialGradient());
}
void setCx(const SkSVGLength&);
void setCy(const SkSVGLength&);
void setR(const SkSVGLength&);
void setFx(const SkSVGLength&);
void setFy(const SkSVGLength&);
protected:
void onSetAttribute(SkSVGAttribute, const SkSVGValue&) override;
sk_sp<SkShader> onMakeShader(const SkSVGRenderContext&,
const SkColor*, const SkScalar*, int count,
SkTileMode, const SkMatrix&) const override;
private:
SkSVGRadialGradient();
SkSVGLength fCx = SkSVGLength(50, SkSVGLength::Unit::kPercentage);
SkSVGLength fCy = SkSVGLength(50, SkSVGLength::Unit::kPercentage);
SkSVGLength fR = SkSVGLength(50, SkSVGLength::Unit::kPercentage);
SkTLazy<SkSVGLength> fFx;
SkTLazy<SkSVGLength> fFy;
using INHERITED = SkSVGGradient;
};
#endif // SkSVGRadialGradient_DEFINED

View File

@ -1,54 +1,10 @@
/*
* Copyright 2016 Google Inc.
* Copyright 2020 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkSVGRect_DEFINED
#define SkSVGRect_DEFINED
// Transitional forwarding header. To be removed.
#include "modules/svg/include/SkSVGRect.h"
#include "experimental/svg/model/SkSVGShape.h"
#include "experimental/svg/model/SkSVGTypes.h"
class SkRRect;
class SkSVGRect final : public SkSVGShape {
public:
~SkSVGRect() override = default;
static sk_sp<SkSVGRect> Make() { return sk_sp<SkSVGRect>(new SkSVGRect()); }
void setX(const SkSVGLength&);
void setY(const SkSVGLength&);
void setWidth(const SkSVGLength&);
void setHeight(const SkSVGLength&);
void setRx(const SkSVGLength&);
void setRy(const SkSVGLength&);
protected:
void onSetAttribute(SkSVGAttribute, const SkSVGValue&) override;
void onDraw(SkCanvas*, const SkSVGLengthContext&, const SkPaint&,
SkPathFillType) const override;
SkPath onAsPath(const SkSVGRenderContext&) const override;
private:
SkSVGRect();
SkRRect resolve(const SkSVGLengthContext&) const;
SkSVGLength fX = SkSVGLength(0);
SkSVGLength fY = SkSVGLength(0);
SkSVGLength fWidth = SkSVGLength(0);
SkSVGLength fHeight = SkSVGLength(0);
// The x radius for rounded rects.
SkSVGLength fRx = SkSVGLength(0);
// The y radius for rounded rects.
SkSVGLength fRy = SkSVGLength(0);
using INHERITED = SkSVGShape;
};
#endif // SkSVGRect_DEFINED

View File

@ -1,144 +1,10 @@
/*
* Copyright 2016 Google Inc.
* Copyright 2020 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkSVGRenderContext_DEFINED
#define SkSVGRenderContext_DEFINED
// Transitional forwarding header. To be removed.
#include "modules/svg/include/SkSVGRenderContext.h"
#include "experimental/svg/model/SkSVGAttribute.h"
#include "experimental/svg/model/SkSVGIDMapper.h"
#include "include/core/SkPaint.h"
#include "include/core/SkPath.h"
#include "include/core/SkRect.h"
#include "include/core/SkSize.h"
#include "include/core/SkTypes.h"
#include "src/core/SkTLazy.h"
class SkCanvas;
class SkSVGLength;
class SkSVGLengthContext {
public:
SkSVGLengthContext(const SkSize& viewport, SkScalar dpi = 90)
: fViewport(viewport), fDPI(dpi) {}
enum class LengthType {
kHorizontal,
kVertical,
kOther,
};
const SkSize& viewPort() const { return fViewport; }
void setViewPort(const SkSize& viewport) { fViewport = viewport; }
SkScalar resolve(const SkSVGLength&, LengthType) const;
SkRect resolveRect(const SkSVGLength& x, const SkSVGLength& y,
const SkSVGLength& w, const SkSVGLength& h) const;
private:
SkSize fViewport;
SkScalar fDPI;
};
struct SkSVGPresentationContext {
SkSVGPresentationContext();
SkSVGPresentationContext(const SkSVGPresentationContext&) = default;
SkSVGPresentationContext& operator=(const SkSVGPresentationContext&) = default;
// Inherited presentation attributes, computed for the current node.
SkSVGPresentationAttributes fInherited;
// Cached paints, reflecting the current presentation attributes.
SkPaint fFillPaint;
SkPaint fStrokePaint;
};
class SkSVGRenderContext {
public:
SkSVGRenderContext(SkCanvas*, const SkSVGIDMapper&, const SkSVGLengthContext&,
const SkSVGPresentationContext&);
SkSVGRenderContext(const SkSVGRenderContext&);
SkSVGRenderContext(const SkSVGRenderContext&, SkCanvas*);
~SkSVGRenderContext();
const SkSVGLengthContext& lengthContext() const { return *fLengthContext; }
SkSVGLengthContext* writableLengthContext() { return fLengthContext.writable(); }
const SkSVGPresentationContext& presentationContext() const { return *fPresentationContext; }
SkCanvas* canvas() const { return fCanvas; }
void saveOnce();
enum ApplyFlags {
kLeaf = 1 << 0, // the target node doesn't have descendants
};
void applyPresentationAttributes(const SkSVGPresentationAttributes&, uint32_t flags);
// Scoped wrapper that temporarily clears the original node reference.
class BorrowedNode {
public:
explicit BorrowedNode(sk_sp<SkSVGNode>* node)
: fOwner(node) {
if (fOwner) {
fBorrowed = std::move(*fOwner);
*fOwner = nullptr;
}
}
~BorrowedNode() {
if (fOwner) {
*fOwner = std::move(fBorrowed);
}
}
const SkSVGNode* get() const { return fBorrowed.get(); }
const SkSVGNode* operator->() const { return fBorrowed.get(); }
const SkSVGNode& operator*() const { return *fBorrowed; }
operator bool() const { return !!fBorrowed; }
private:
// noncopyable
BorrowedNode(const BorrowedNode&) = delete;
BorrowedNode& operator=(BorrowedNode&) = delete;
sk_sp<SkSVGNode>* fOwner;
sk_sp<SkSVGNode> fBorrowed;
};
// Note: the id->node association is cleared for the lifetime of the returned value
// (effectively breaks reference cycles, assuming appropriate return value scoping).
BorrowedNode findNodeById(const SkString&) const;
const SkPaint* fillPaint() const;
const SkPaint* strokePaint() const;
// The local computed clip path (not inherited).
const SkPath* clipPath() const { return fClipPath.getMaybeNull(); }
private:
// Stack-only
void* operator new(size_t) = delete;
void* operator new(size_t, void*) = delete;
SkSVGRenderContext& operator=(const SkSVGRenderContext&) = delete;
void applyOpacity(SkScalar opacity, uint32_t flags);
void applyClip(const SkSVGClip&);
void updatePaintsWithCurrentColor(const SkSVGPresentationAttributes&);
const SkSVGIDMapper& fIDMapper;
SkTCopyOnFirstWrite<SkSVGLengthContext> fLengthContext;
SkTCopyOnFirstWrite<SkSVGPresentationContext> fPresentationContext;
SkCanvas* fCanvas;
// The save count on 'fCanvas' at construction time.
// A restoreToCount() will be issued on destruction.
int fCanvasSaveCount;
// clipPath, if present for the current context (not inherited).
SkTLazy<SkPath> fClipPath;
};
#endif // SkSVGRenderContext_DEFINED

View File

@ -1,49 +1,10 @@
/*
* Copyright 2016 Google Inc.
* Copyright 2020 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkSVGSVG_DEFINED
#define SkSVGSVG_DEFINED
// Transitional forwarding header. To be removed.
#include "modules/svg/include/SkSVGSVG.h"
#include "experimental/svg/model/SkSVGContainer.h"
#include "experimental/svg/model/SkSVGTypes.h"
#include "src/core/SkTLazy.h"
class SkSVGLengthContext;
class SkSVGSVG : public SkSVGContainer {
public:
~SkSVGSVG() override = default;
static sk_sp<SkSVGSVG> Make() { return sk_sp<SkSVGSVG>(new SkSVGSVG()); }
void setX(const SkSVGLength&);
void setY(const SkSVGLength&);
void setWidth(const SkSVGLength&);
void setHeight(const SkSVGLength&);
void setViewBox(const SkSVGViewBoxType&);
SkSize intrinsicSize(const SkSVGLengthContext&) const;
protected:
bool onPrepareToRender(SkSVGRenderContext*) const override;
void onSetAttribute(SkSVGAttribute, const SkSVGValue&) override;
private:
SkSVGSVG();
SkSVGLength fX = SkSVGLength(0);
SkSVGLength fY = SkSVGLength(0);
SkSVGLength fWidth = SkSVGLength(100, SkSVGLength::Unit::kPercentage);
SkSVGLength fHeight = SkSVGLength(100, SkSVGLength::Unit::kPercentage);
SkTLazy<SkSVGViewBoxType> fViewBox;
using INHERITED = SkSVGContainer;
};
#endif // SkSVGSVG_DEFINED

View File

@ -1,35 +1,10 @@
/*
* Copyright 2016 Google Inc.
* Copyright 2020 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkSVGShape_DEFINED
#define SkSVGShape_DEFINED
// Transitional forwarding header. To be removed.
#include "modules/svg/include/SkSVGShape.h"
#include "experimental/svg/model/SkSVGTransformableNode.h"
#include "include/core/SkPath.h"
class SkSVGLengthContext;
class SkPaint;
class SkSVGShape : public SkSVGTransformableNode {
public:
~SkSVGShape() override = default;
void appendChild(sk_sp<SkSVGNode>) override;
protected:
SkSVGShape(SkSVGTag);
void onRender(const SkSVGRenderContext&) const final;
virtual void onDraw(SkCanvas*, const SkSVGLengthContext&, const SkPaint&,
SkPathFillType) const = 0;
private:
using INHERITED = SkSVGTransformableNode;
};
#endif // SkSVGShape_DEFINED

View File

@ -1,44 +1,10 @@
/*
* Copyright 2016 Google Inc.
* Copyright 2020 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkSVGStop_DEFINED
#define SkSVGStop_DEFINED
// Transitional forwarding header. To be removed.
#include "modules/svg/include/SkSVGStop.h"
#include "experimental/svg/model/SkSVGHiddenContainer.h"
#include "experimental/svg/model/SkSVGTypes.h"
class SkSVGLengthContext;
class SkSVGStop : public SkSVGHiddenContainer {
public:
~SkSVGStop() override = default;
static sk_sp<SkSVGStop> Make() {
return sk_sp<SkSVGStop>(new SkSVGStop());
}
const SkSVGLength& offset() const { return fOffset; }
const SkSVGStopColor& stopColor() const { return fStopColor; }
const SkSVGNumberType& stopOpacity() const { return fStopOpacity; }
void setOffset(const SkSVGLength&);
void setStopColor(const SkSVGStopColor&);
void setStopOpacity(const SkSVGNumberType&);
protected:
void onSetAttribute(SkSVGAttribute, const SkSVGValue&) override;
private:
SkSVGStop();
SkSVGLength fOffset = SkSVGLength(0 , SkSVGLength::Unit::kPercentage);
SkSVGStopColor fStopColor = SkSVGStopColor(SK_ColorBLACK);
SkSVGNumberType fStopOpacity = SkSVGNumberType(1);
using INHERITED = SkSVGHiddenContainer;
};
#endif // SkSVGStop_DEFINED

View File

@ -1,57 +1,10 @@
/*
* Copyright 2019 Google Inc.
* Copyright 2020 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkSVGText_DEFINED
#define SkSVGText_DEFINED
// Transitional forwarding header. To be removed.
#include "modules/svg/include/SkSVGText.h"
#include "experimental/svg/model/SkSVGShape.h"
#include "experimental/svg/model/SkSVGTypes.h"
#include "include/core/SkFont.h"
#include "include/utils/SkTextUtils.h"
class SkRRect;
class SkSVGText final : public SkSVGShape {
public:
~SkSVGText() override = default;
static sk_sp<SkSVGText> Make() {
return sk_sp<SkSVGText>(new SkSVGText()); }
void setX(const SkSVGLength&);
void setY(const SkSVGLength&);
void setFontFamily(const SkSVGStringType&);
void setFontSize(const SkSVGLength&);
void setFontStyle(const SkSVGStringType&);
void setFontWeight(const SkSVGStringType&);
void setText(const SkSVGStringType&);
void setTextAnchor(const SkSVGStringType&);
protected:
void onSetAttribute(SkSVGAttribute, const SkSVGValue&) override;
void onDraw(SkCanvas*, const SkSVGLengthContext&, const SkPaint&,
SkPathFillType) const override;
SkPath onAsPath(const SkSVGRenderContext&) const override;
void loadFont();
private:
SkSVGText();
SkSVGLength fX = SkSVGLength(0);
SkSVGLength fY = SkSVGLength(0);
SkSVGStringType fText;
sk_sp<SkTypeface> fTypeface;
SkSVGLength fFontSize;
SkSVGStringType fFontFamily;
SkSVGStringType fFontStyle;
SkSVGStringType fFontWeight;
SkTextUtils::Align fTextAlign = SkTextUtils::Align::kLeft_Align;
using INHERITED = SkSVGShape;
};
#endif // SkSVGText_DEFINED

View File

@ -1,36 +1,10 @@
/*
* Copyright 2016 Google Inc.
* Copyright 2020 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkSVGTransformableNode_DEFINED
#define SkSVGTransformableNode_DEFINED
// Transitional forwarding header. To be removed.
#include "modules/svg/include/SkSVGTransformableNode.h"
#include "experimental/svg/model/SkSVGNode.h"
#include "include/core/SkMatrix.h"
class SkSVGTransformableNode : public SkSVGNode {
public:
~SkSVGTransformableNode() override = default;
void setTransform(const SkSVGTransformType& t) { fTransform = t; }
protected:
SkSVGTransformableNode(SkSVGTag);
bool onPrepareToRender(SkSVGRenderContext*) const override;
void onSetAttribute(SkSVGAttribute, const SkSVGValue&) override;
void mapToParent(SkPath*) const;
private:
// FIXME: should be sparse
SkSVGTransformType fTransform;
using INHERITED = SkSVGNode;
};
#endif // SkSVGTransformableNode_DEFINED

View File

@ -1,311 +1,10 @@
/*
* Copyright 2016 Google Inc.
* Copyright 2020 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkSVGTypes_DEFINED
#define SkSVGTypes_DEFINED
// Transitional forwarding header. To be removed.
#include "modules/svg/include/SkSVGTypes.h"
#include "include/core/SkColor.h"
#include "include/core/SkMatrix.h"
#include "include/core/SkPath.h"
#include "include/core/SkPoint.h"
#include "include/core/SkRect.h"
#include "include/core/SkScalar.h"
#include "include/core/SkString.h"
#include "include/core/SkTypes.h"
#include "include/private/SkTDArray.h"
using SkSVGColorType = SkColor;
using SkSVGNumberType = SkScalar;
using SkSVGStringType = SkString;
using SkSVGViewBoxType = SkRect;
using SkSVGTransformType = SkMatrix;
using SkSVGPointsType = SkTDArray<SkPoint>;
class SkSVGLength {
public:
enum class Unit {
kUnknown,
kNumber,
kPercentage,
kEMS,
kEXS,
kPX,
kCM,
kMM,
kIN,
kPT,
kPC,
};
constexpr SkSVGLength() : fValue(0), fUnit(Unit::kUnknown) {}
explicit constexpr SkSVGLength(SkScalar v, Unit u = Unit::kNumber)
: fValue(v), fUnit(u) {}
SkSVGLength(const SkSVGLength&) = default;
SkSVGLength& operator=(const SkSVGLength&) = default;
bool operator==(const SkSVGLength& other) const {
return fUnit == other.fUnit && fValue == other.fValue;
}
bool operator!=(const SkSVGLength& other) const { return !(*this == other); }
const SkScalar& value() const { return fValue; }
const Unit& unit() const { return fUnit; }
private:
SkScalar fValue;
Unit fUnit;
};
class SkSVGPaint {
public:
enum class Type {
kNone,
kCurrentColor,
kColor,
kInherit,
kIRI,
};
SkSVGPaint() : fType(Type::kInherit), fColor(SK_ColorBLACK) {}
explicit SkSVGPaint(Type t) : fType(t), fColor(SK_ColorBLACK) {}
explicit SkSVGPaint(const SkSVGColorType& c) : fType(Type::kColor), fColor(c) {}
explicit SkSVGPaint(const SkString& iri)
: fType(Type::kIRI), fColor(SK_ColorBLACK), fIRI(iri) {}
SkSVGPaint(const SkSVGPaint&) = default;
SkSVGPaint& operator=(const SkSVGPaint&) = default;
bool operator==(const SkSVGPaint& other) const {
return fType == other.fType && fColor == other.fColor && fIRI == other.fIRI;
}
bool operator!=(const SkSVGPaint& other) const { return !(*this == other); }
Type type() const { return fType; }
const SkSVGColorType& color() const { SkASSERT(fType == Type::kColor); return fColor; }
const SkString& iri() const { SkASSERT(fType == Type::kIRI); return fIRI; }
private:
Type fType;
// Logical union.
SkSVGColorType fColor;
SkString fIRI;
};
class SkSVGClip {
public:
enum class Type {
kNone,
kInherit,
kIRI,
};
SkSVGClip() : fType(Type::kNone) {}
explicit SkSVGClip(Type t) : fType(t) {}
explicit SkSVGClip(const SkString& iri) : fType(Type::kIRI), fIRI(iri) {}
SkSVGClip(const SkSVGClip&) = default;
SkSVGClip& operator=(const SkSVGClip&) = default;
bool operator==(const SkSVGClip& other) const {
return fType == other.fType && fIRI == other.fIRI;
}
bool operator!=(const SkSVGClip& other) const { return !(*this == other); }
Type type() const { return fType; }
const SkString& iri() const { SkASSERT(fType == Type::kIRI); return fIRI; }
private:
Type fType;
SkString fIRI;
};
class SkSVGLineCap {
public:
enum class Type {
kButt,
kRound,
kSquare,
kInherit,
};
constexpr SkSVGLineCap() : fType(Type::kInherit) {}
constexpr explicit SkSVGLineCap(Type t) : fType(t) {}
SkSVGLineCap(const SkSVGLineCap&) = default;
SkSVGLineCap& operator=(const SkSVGLineCap&) = default;
bool operator==(const SkSVGLineCap& other) const { return fType == other.fType; }
bool operator!=(const SkSVGLineCap& other) const { return !(*this == other); }
Type type() const { return fType; }
private:
Type fType;
};
class SkSVGLineJoin {
public:
enum class Type {
kMiter,
kRound,
kBevel,
kInherit,
};
constexpr SkSVGLineJoin() : fType(Type::kInherit) {}
constexpr explicit SkSVGLineJoin(Type t) : fType(t) {}
SkSVGLineJoin(const SkSVGLineJoin&) = default;
SkSVGLineJoin& operator=(const SkSVGLineJoin&) = default;
bool operator==(const SkSVGLineJoin& other) const { return fType == other.fType; }
bool operator!=(const SkSVGLineJoin& other) const { return !(*this == other); }
Type type() const { return fType; }
private:
Type fType;
};
class SkSVGSpreadMethod {
public:
// These values must match Skia's SkShader::TileMode enum.
enum class Type {
kPad, // kClamp_TileMode
kRepeat, // kRepeat_TileMode
kReflect, // kMirror_TileMode
};
constexpr SkSVGSpreadMethod() : fType(Type::kPad) {}
constexpr explicit SkSVGSpreadMethod(Type t) : fType(t) {}
SkSVGSpreadMethod(const SkSVGSpreadMethod&) = default;
SkSVGSpreadMethod& operator=(const SkSVGSpreadMethod&) = default;
bool operator==(const SkSVGSpreadMethod& other) const { return fType == other.fType; }
bool operator!=(const SkSVGSpreadMethod& other) const { return !(*this == other); }
Type type() const { return fType; }
private:
Type fType;
};
class SkSVGFillRule {
public:
enum class Type {
kNonZero,
kEvenOdd,
kInherit,
};
constexpr SkSVGFillRule() : fType(Type::kInherit) {}
constexpr explicit SkSVGFillRule(Type t) : fType(t) {}
SkSVGFillRule(const SkSVGFillRule&) = default;
SkSVGFillRule& operator=(const SkSVGFillRule&) = default;
bool operator==(const SkSVGFillRule& other) const { return fType == other.fType; }
bool operator!=(const SkSVGFillRule& other) const { return !(*this == other); }
Type type() const { return fType; }
SkPathFillType asFillType() const {
SkASSERT(fType != Type::kInherit); // should never be called for unresolved values.
return fType == Type::kEvenOdd ? SkPathFillType::kEvenOdd : SkPathFillType::kWinding;
}
private:
Type fType;
};
class SkSVGVisibility {
public:
enum class Type {
kVisible,
kHidden,
kCollapse,
kInherit,
};
constexpr SkSVGVisibility() : fType(Type::kVisible) {}
constexpr explicit SkSVGVisibility(Type t) : fType(t) {}
SkSVGVisibility(const SkSVGVisibility&) = default;
SkSVGVisibility& operator=(const SkSVGVisibility&) = default;
bool operator==(const SkSVGVisibility& other) const { return fType == other.fType; }
bool operator!=(const SkSVGVisibility& other) const { return !(*this == other); }
Type type() const { return fType; }
private:
Type fType;
};
class SkSVGDashArray {
public:
enum class Type {
kNone,
kDashArray,
kInherit,
};
SkSVGDashArray() : fType(Type::kNone) {}
explicit SkSVGDashArray(Type t) : fType(t) {}
explicit SkSVGDashArray(SkTDArray<SkSVGLength>&& dashArray)
: fType(Type::kDashArray)
, fDashArray(std::move(dashArray)) {}
SkSVGDashArray(const SkSVGDashArray&) = default;
SkSVGDashArray& operator=(const SkSVGDashArray&) = default;
bool operator==(const SkSVGDashArray& other) const {
return fType == other.fType && fDashArray == other.fDashArray;
}
bool operator!=(const SkSVGDashArray& other) const { return !(*this == other); }
Type type() const { return fType; }
const SkTDArray<SkSVGLength>& dashArray() const { return fDashArray; }
private:
Type fType;
SkTDArray<SkSVGLength> fDashArray;
};
class SkSVGStopColor {
public:
enum class Type {
kColor,
kCurrentColor,
kICCColor,
kInherit,
};
SkSVGStopColor() : fType(Type::kColor), fColor(SK_ColorBLACK) {}
explicit SkSVGStopColor(Type t) : fType(t), fColor(SK_ColorBLACK) {}
explicit SkSVGStopColor(const SkSVGColorType& c) : fType(Type::kColor), fColor(c) {}
SkSVGStopColor(const SkSVGStopColor&) = default;
SkSVGStopColor& operator=(const SkSVGStopColor&) = default;
bool operator==(const SkSVGStopColor& other) const {
return fType == other.fType && fColor == other.fColor;
}
bool operator!=(const SkSVGStopColor& other) const { return !(*this == other); }
Type type() const { return fType; }
const SkSVGColorType& color() const { SkASSERT(fType == Type::kColor); return fColor; }
private:
Type fType;
SkSVGColorType fColor;
};
#endif // SkSVGTypes_DEFINED

View File

@ -1,47 +1,10 @@
/*
* Copyright 2017 Google Inc.
* Copyright 2020 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkSVGUse_DEFINED
#define SkSVGUse_DEFINED
// Transitional forwarding header. To be removed.
#include "modules/svg/include/SkSVGUse.h"
#include "experimental/svg/model/SkSVGTransformableNode.h"
#include "experimental/svg/model/SkSVGTypes.h"
/**
* Implements support for <use> (reference) elements.
* (https://www.w3.org/TR/SVG11/struct.html#UseElement)
*/
class SkSVGUse final : public SkSVGTransformableNode {
public:
~SkSVGUse() override = default;
static sk_sp<SkSVGUse> Make() { return sk_sp<SkSVGUse>(new SkSVGUse()); }
void appendChild(sk_sp<SkSVGNode>) override;
void setHref(const SkSVGStringType&);
void setX(const SkSVGLength&);
void setY(const SkSVGLength&);
protected:
void onSetAttribute(SkSVGAttribute, const SkSVGValue&) override;
bool onPrepareToRender(SkSVGRenderContext*) const override;
void onRender(const SkSVGRenderContext&) const override;
SkPath onAsPath(const SkSVGRenderContext&) const override;
private:
SkSVGUse();
SkSVGStringType fHref;
SkSVGLength fX = SkSVGLength(0);
SkSVGLength fY = SkSVGLength(0);
using INHERITED = SkSVGTransformableNode;
};
#endif // SkSVGUse_DEFINED

View File

@ -1,97 +1,10 @@
/*
* Copyright 2016 Google Inc.
* Copyright 2020 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
// Transitional forwarding header. To be removed.
#include "modules/svg/include/SkSVGValue.h"
#include "experimental/svg/model/SkSVGTypes.h"
#include "include/core/SkColor.h"
#include "include/core/SkMatrix.h"
#include "include/core/SkPath.h"
#include "include/core/SkTypes.h"
#include "include/private/SkNoncopyable.h"
class SkSVGValue : public SkNoncopyable {
public:
enum class Type {
kClip,
kColor,
kDashArray,
kFillRule,
kLength,
kLineCap,
kLineJoin,
kNumber,
kPaint,
kPath,
kPoints,
kSpreadMethod,
kStopColor,
kString,
kTransform,
kViewBox,
kVisibility,
};
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;
using INHERITED = SkNoncopyable;
};
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;
using INHERITED = SkSVGValue;
};
using SkSVGClipValue = SkSVGWrapperValue<SkSVGClip , SkSVGValue::Type::kClip >;
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>;
using SkSVGStopColorValue = SkSVGWrapperValue<SkSVGStopColor , SkSVGValue::Type::kStopColor >;
using SkSVGVisibilityValue = SkSVGWrapperValue<SkSVGVisibility , SkSVGValue::Type::kVisibility>;
using SkSVGDashArrayValue = SkSVGWrapperValue<SkSVGDashArray , SkSVGValue::Type::kDashArray >;
#endif // SkSVGValue_DEFINED

View File

@ -5,10 +5,10 @@
* found in the LICENSE file.
*/
#include "experimental/svg/model/SkSVGDOM.h"
#include "include/core/SkData.h"
#include "include/core/SkStream.h"
#include "include/core/SkSurface.h"
#include "modules/svg/include/SkSVGDOM.h"
void FuzzSVG(sk_sp<SkData> bytes) {
uint8_t w = 100;

View File

@ -37,7 +37,7 @@ def GrabDependentValues(js, name, value_type, list_to_extend, exclude):
for dep in js['targets'][name]['deps']:
if 'modules' in dep:
skip = True
for include in ['skshaper', 'skparagraph']:
for include in ['skshaper', 'skparagraph', 'svg']:
if include in dep:
skip = False
if skip:

View File

@ -26,6 +26,7 @@ declare_args() {
skia_enable_skrive = true
skia_enable_sksl_interpreter = is_skia_dev_build
skia_enable_skvm_jit_when_possible = is_skia_dev_build
skia_enable_svg = true
skia_enable_tools = is_skia_dev_build
skia_enable_gpu_debug_layers = is_skia_dev_build && is_debug
skia_generate_workarounds = false

View File

@ -85,8 +85,8 @@ if (skia_enable_skottie) {
]
deps = [
"../..:experimental_svg_model",
"../..:skia",
"../svg",
]
public_deps = [ ":skottie" ]

43
modules/svg/BUILD.gn Normal file
View File

@ -0,0 +1,43 @@
# Copyright 2020 Google Inc.
#
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import("../../gn/skia.gni")
if (skia_enable_svg) {
config("public_config") {
defines = [ "SK_ENABLE_SVG" ]
include_dirs = [ "include" ]
}
component("svg") {
check_includes = false
import("svg.gni")
public_configs = [ ":public_config" ]
public = skia_svg_public
sources = skia_svg_sources
configs += [ "../../:skia_private" ]
deps = [ "../..:skia" ]
}
if (skia_enable_tools && defined(is_skia_standalone)) {
source_set("tool") {
check_includes = false
testonly = true
configs += [ "../..:skia_private" ]
sources = [ "utils/SvgTool.cpp" ]
deps = [
"../..:flags",
"../..:skia",
]
public_deps = [ ":svg" ]
}
}
} else {
group("svg") {
}
}

View File

@ -0,0 +1,99 @@
/*
* 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 SkSVGAttribute_DEFINED
#define SkSVGAttribute_DEFINED
#include "modules/svg/include/SkSVGTypes.h"
#include "src/core/SkTLazy.h"
class SkSVGRenderContext;
enum class SkSVGAttribute {
kClipPath,
kClipRule,
kColor,
kCx, // <circle>, <ellipse>, <radialGradient>: center x position
kCy, // <circle>, <ellipse>, <radialGradient>: center y position
kD,
kFill,
kFillOpacity,
kFillRule,
kFontFamily,
kFontSize,
kFontStyle,
kFontWeight,
kFx, // <radialGradient>: focal point x position
kFy, // <radialGradient>: focal point y position
kGradientTransform,
kHeight,
kHref,
kOffset,
kOpacity,
kPatternTransform,
kPoints,
kR, // <circle>, <radialGradient>: radius
kRx, // <ellipse>,<rect>: horizontal (corner) radius
kRy, // <ellipse>,<rect>: vertical (corner) radius
kSpreadMethod,
kStopColor,
kStopOpacity,
kStroke,
kStrokeDashArray,
kStrokeDashOffset,
kStrokeOpacity,
kStrokeLineCap,
kStrokeLineJoin,
kStrokeMiterLimit,
kStrokeWidth,
kTransform,
kText,
kTextAnchor,
kViewBox,
kVisibility,
kWidth,
kX,
kX1, // <line>: first endpoint x
kX2, // <line>: second endpoint x
kY,
kY1, // <line>: first endpoint y
kY2, // <line>: second endpoint y
kUnknown,
};
struct SkSVGPresentationAttributes {
static SkSVGPresentationAttributes MakeInitial();
// TODO: SkTLazy adds an extra ptr per attribute; refactor to reduce overhead.
SkTLazy<SkSVGPaint> fFill;
SkTLazy<SkSVGNumberType> fFillOpacity;
SkTLazy<SkSVGFillRule> fFillRule;
SkTLazy<SkSVGFillRule> fClipRule;
SkTLazy<SkSVGPaint> fStroke;
SkTLazy<SkSVGDashArray> fStrokeDashArray;
SkTLazy<SkSVGLength> fStrokeDashOffset;
SkTLazy<SkSVGLineCap> fStrokeLineCap;
SkTLazy<SkSVGLineJoin> fStrokeLineJoin;
SkTLazy<SkSVGNumberType> fStrokeMiterLimit;
SkTLazy<SkSVGNumberType> fStrokeOpacity;
SkTLazy<SkSVGLength> fStrokeWidth;
SkTLazy<SkSVGVisibility> fVisibility;
SkTLazy<SkSVGColorType> fColor;
// TODO(tdenniston): add SkSVGStopColor
// uninherited
SkTLazy<SkSVGNumberType> fOpacity;
SkTLazy<SkSVGClip> fClipPath;
};
#endif // SkSVGAttribute_DEFINED

View File

@ -0,0 +1,76 @@
/*
* 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 SkSVGAttributeParser_DEFINED
#define SkSVGAttributeParser_DEFINED
#include "include/private/SkNoncopyable.h"
#include "modules/svg/include/SkSVGTypes.h"
class SkSVGAttributeParser : public SkNoncopyable {
public:
SkSVGAttributeParser(const char[]);
bool parseColor(SkSVGColorType*);
bool parseClipPath(SkSVGClip*);
bool parseFillRule(SkSVGFillRule*);
bool parseNumber(SkSVGNumberType*);
bool parseLength(SkSVGLength*);
bool parseViewBox(SkSVGViewBoxType*);
bool parseTransform(SkSVGTransformType*);
bool parsePaint(SkSVGPaint*);
bool parseLineCap(SkSVGLineCap*);
bool parseLineJoin(SkSVGLineJoin*);
bool parsePoints(SkSVGPointsType*);
bool parseIRI(SkSVGStringType*);
bool parseSpreadMethod(SkSVGSpreadMethod*);
bool parseStopColor(SkSVGStopColor*);
bool parseVisibility(SkSVGVisibility*);
bool parseDashArray(SkSVGDashArray*);
private:
// Stack-only
void* operator new(size_t) = delete;
void* operator new(size_t, void*) = delete;
template <typename F>
bool advanceWhile(F func);
bool parseWSToken();
bool parseEOSToken();
bool parseSepToken();
bool parseCommaWspToken();
bool parseExpectedStringToken(const char*);
bool parseScalarToken(SkScalar*);
bool parseHexToken(uint32_t*);
bool parseLengthUnitToken(SkSVGLength::Unit*);
bool parseNamedColorToken(SkColor*);
bool parseHexColorToken(SkColor*);
bool parseColorComponentToken(int32_t*);
bool parseRGBColorToken(SkColor*);
bool parseFuncIRI(SkSVGStringType*);
// Transform helpers
bool parseMatrixToken(SkMatrix*);
bool parseTranslateToken(SkMatrix*);
bool parseScaleToken(SkMatrix*);
bool parseRotateToken(SkMatrix*);
bool parseSkewXToken(SkMatrix*);
bool parseSkewYToken(SkMatrix*);
// Parses a sequence of 'WS* <prefix> WS* (<nested>)', where the nested sequence
// is handled by the passed functor.
template <typename Func, typename T>
bool parseParenthesized(const char* prefix, Func, T* result);
// The current position in the input string.
const char* fCurPos;
using INHERITED = SkNoncopyable;
};
#endif // SkSVGAttributeParser_DEFINED

View File

@ -0,0 +1,46 @@
/*
* 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 SkSVGCircle_DEFINED
#define SkSVGCircle_DEFINED
#include "modules/svg/include/SkSVGShape.h"
#include "modules/svg/include/SkSVGTypes.h"
struct SkPoint;
class SkSVGCircle final : public SkSVGShape {
public:
~SkSVGCircle() override = default;
static sk_sp<SkSVGCircle> Make() { return sk_sp<SkSVGCircle>(new SkSVGCircle()); }
void setCx(const SkSVGLength&);
void setCy(const SkSVGLength&);
void setR(const SkSVGLength&);
protected:
void onSetAttribute(SkSVGAttribute, const SkSVGValue&) override;
void onDraw(SkCanvas*, const SkSVGLengthContext&, const SkPaint&,
SkPathFillType) const override;
SkPath onAsPath(const SkSVGRenderContext&) const override;
private:
SkSVGCircle();
// resolve and return the center and radius values
std::tuple<SkPoint, SkScalar> resolve(const SkSVGLengthContext&) const;
SkSVGLength fCx = SkSVGLength(0);
SkSVGLength fCy = SkSVGLength(0);
SkSVGLength fR = SkSVGLength(0);
using INHERITED = SkSVGShape;
};
#endif // SkSVGCircle_DEFINED

View File

@ -0,0 +1,26 @@
/*
* 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 SkSVGClipPath_DEFINED
#define SkSVGClipPath_DEFINED
#include "modules/svg/include/SkSVGHiddenContainer.h"
#include "modules/svg/include/SkSVGTypes.h"
class SkSVGClipPath final : public SkSVGHiddenContainer {
public:
static sk_sp<SkSVGClipPath> Make() {
return sk_sp<SkSVGClipPath>(new SkSVGClipPath());
}
private:
SkSVGClipPath();
using INHERITED = SkSVGHiddenContainer;
};
#endif // SkSVGClipPath_DEFINED

View File

@ -0,0 +1,36 @@
/*
* 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 SkSVGContainer_DEFINED
#define SkSVGContainer_DEFINED
#include "include/private/SkTArray.h"
#include "modules/svg/include/SkSVGTransformableNode.h"
class SkSVGContainer : public SkSVGTransformableNode {
public:
~SkSVGContainer() override = default;
void appendChild(sk_sp<SkSVGNode>) override;
protected:
explicit SkSVGContainer(SkSVGTag);
void onRender(const SkSVGRenderContext&) const override;
SkPath onAsPath(const SkSVGRenderContext&) const override;
bool hasChildren() const final;
// TODO: add some sort of child iterator, and hide the container.
SkSTArray<1, sk_sp<SkSVGNode>, true> fChildren;
private:
using INHERITED = SkSVGTransformableNode;
};
#endif // SkSVGContainer_DEFINED

View File

@ -0,0 +1,48 @@
/*
* 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 SkSVGDOM_DEFINED
#define SkSVGDOM_DEFINED
#include "include/core/SkRefCnt.h"
#include "include/core/SkSize.h"
#include "include/private/SkTemplates.h"
#include "modules/svg/include/SkSVGIDMapper.h"
class SkCanvas;
class SkDOM;
class SkStream;
class SkSVGNode;
class SkSVGDOM : public SkRefCnt {
public:
SkSVGDOM();
static sk_sp<SkSVGDOM> MakeFromDOM(const SkDOM&);
static sk_sp<SkSVGDOM> MakeFromStream(SkStream&);
const SkSize& containerSize() const;
void setContainerSize(const SkSize&);
void setRoot(sk_sp<SkSVGNode>);
// Returns the node with the given id, or nullptr if not found.
sk_sp<SkSVGNode>* findNodeById(const char* id);
void render(SkCanvas*) const;
private:
SkSize intrinsicSize() const;
SkSize fContainerSize;
sk_sp<SkSVGNode> fRoot;
SkSVGIDMapper fIDMapper;
using INHERITED = SkRefCnt;
};
#endif // SkSVGDOM_DEFINED

View File

@ -0,0 +1,23 @@
/*
* 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 SkSVGDefs_DEFINED
#define SkSVGDefs_DEFINED
#include "modules/svg/include/SkSVGHiddenContainer.h"
class SkSVGDefs : public SkSVGHiddenContainer {
public:
static sk_sp<SkSVGDefs> Make() { return sk_sp<SkSVGDefs>(new SkSVGDefs()); }
private:
SkSVGDefs() : INHERITED(SkSVGTag::kDefs) {}
using INHERITED = SkSVGHiddenContainer;
};
#endif // SkSVGDefs_DEFINED

View File

@ -0,0 +1,47 @@
/*
* 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 SkSVGEllipse_DEFINED
#define SkSVGEllipse_DEFINED
#include "modules/svg/include/SkSVGShape.h"
#include "modules/svg/include/SkSVGTypes.h"
struct SkRect;
class SkSVGEllipse final : public SkSVGShape {
public:
~SkSVGEllipse() override = default;
static sk_sp<SkSVGEllipse> Make() { return sk_sp<SkSVGEllipse>(new SkSVGEllipse()); }
void setCx(const SkSVGLength&);
void setCy(const SkSVGLength&);
void setRx(const SkSVGLength&);
void setRy(const SkSVGLength&);
protected:
void onSetAttribute(SkSVGAttribute, const SkSVGValue&) override;
void onDraw(SkCanvas*, const SkSVGLengthContext&, const SkPaint&,
SkPathFillType) const override;
SkPath onAsPath(const SkSVGRenderContext&) const override;
private:
SkSVGEllipse();
SkRect resolve(const SkSVGLengthContext&) const;
SkSVGLength fCx = SkSVGLength(0);
SkSVGLength fCy = SkSVGLength(0);
SkSVGLength fRx = SkSVGLength(0);
SkSVGLength fRy = SkSVGLength(0);
using INHERITED = SkSVGShape;
};
#endif // SkSVGEllipse_DEFINED

View File

@ -0,0 +1,23 @@
/*
* 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 SkSVGG_DEFINED
#define SkSVGG_DEFINED
#include "modules/svg/include/SkSVGContainer.h"
class SkSVGG : public SkSVGContainer {
public:
static sk_sp<SkSVGG> Make() { return sk_sp<SkSVGG>(new SkSVGG()); }
private:
SkSVGG() : INHERITED(SkSVGTag::kG) { }
using INHERITED = SkSVGContainer;
};
#endif // SkSVGG_DEFINED

View File

@ -0,0 +1,51 @@
/*
* Copyright 2017 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkSVGGradient_DEFINED
#define SkSVGGradient_DEFINED
#include "include/core/SkShader.h"
#include "modules/svg/include/SkSVGHiddenContainer.h"
#include "modules/svg/include/SkSVGTypes.h"
class SkMatrix;
class SkSVGRenderContext;
class SkSVGStop;
class SkSVGGradient : public SkSVGHiddenContainer {
public:
~SkSVGGradient() override = default;
void setHref(const SkSVGStringType&);
void setGradientTransform(const SkSVGTransformType&);
void setSpreadMethod(const SkSVGSpreadMethod&);
protected:
explicit SkSVGGradient(SkSVGTag t) : INHERITED(t) {}
void onSetAttribute(SkSVGAttribute, const SkSVGValue&) override;
bool onAsPaint(const SkSVGRenderContext&, SkPaint*) const final;
virtual sk_sp<SkShader> onMakeShader(const SkSVGRenderContext&,
const SkColor*, const SkScalar*, int count,
SkTileMode, const SkMatrix& localMatrix) const = 0;
private:
using StopPositionArray = SkSTArray<2, SkScalar, true>;
using StopColorArray = SkSTArray<2, SkColor, true>;
void collectColorStops(const SkSVGRenderContext&, StopPositionArray*, StopColorArray*) const;
SkColor resolveStopColor(const SkSVGRenderContext&, const SkSVGStop&) const;
SkSVGStringType fHref;
SkSVGTransformType fGradientTransform = SkSVGTransformType(SkMatrix::I());
SkSVGSpreadMethod fSpreadMethod = SkSVGSpreadMethod(SkSVGSpreadMethod::Type::kPad);
using INHERITED = SkSVGHiddenContainer;
};
#endif // SkSVGGradient_DEFINED

View File

@ -0,0 +1,23 @@
/*
* 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 SkSVGHiddenContainer_DEFINED
#define SkSVGHiddenContainer_DEFINED
#include "modules/svg/include/SkSVGContainer.h"
class SkSVGHiddenContainer : public SkSVGContainer {
protected:
explicit SkSVGHiddenContainer(SkSVGTag t) : INHERITED(t) {}
void onRender(const SkSVGRenderContext&) const final {}
private:
using INHERITED = SkSVGContainer;
};
#endif // SkSVGHiddenContainer_DEFINED

View File

@ -0,0 +1,19 @@
/*
* 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 SkSVGIDMapper_DEFINED
#define SkSVGIDMapper_DEFINED
#include "include/core/SkRefCnt.h"
#include "include/private/SkTHash.h"
class SkString;
class SkSVGNode;
using SkSVGIDMapper = SkTHashMap<SkString, sk_sp<SkSVGNode>>;
#endif // SkSVGIDMapper_DEFINED

View File

@ -0,0 +1,48 @@
/*
* 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 SkSVGLine_DEFINED
#define SkSVGLine_DEFINED
#include "modules/svg/include/SkSVGShape.h"
#include "modules/svg/include/SkSVGTypes.h"
struct SkPoint;
class SkSVGLine final : public SkSVGShape {
public:
~SkSVGLine() override = default;
static sk_sp<SkSVGLine> Make() { return sk_sp<SkSVGLine>(new SkSVGLine()); }
void setX1(const SkSVGLength&);
void setY1(const SkSVGLength&);
void setX2(const SkSVGLength&);
void setY2(const SkSVGLength&);
protected:
void onSetAttribute(SkSVGAttribute, const SkSVGValue&) override;
void onDraw(SkCanvas*, const SkSVGLengthContext&, const SkPaint&,
SkPathFillType) const override;
SkPath onAsPath(const SkSVGRenderContext&) const override;
private:
SkSVGLine();
// resolve and return the two endpoints
std::tuple<SkPoint, SkPoint> resolve(const SkSVGLengthContext&) const;
SkSVGLength fX1 = SkSVGLength(0);
SkSVGLength fY1 = SkSVGLength(0);
SkSVGLength fX2 = SkSVGLength(0);
SkSVGLength fY2 = SkSVGLength(0);
using INHERITED = SkSVGShape;
};
#endif // SkSVGLine_DEFINED

View File

@ -0,0 +1,43 @@
/*
* 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 SkSVGLinearGradient_DEFINED
#define SkSVGLinearGradient_DEFINED
#include "modules/svg/include/SkSVGGradient.h"
#include "modules/svg/include/SkSVGTypes.h"
class SkSVGLinearGradient final : public SkSVGGradient {
public:
~SkSVGLinearGradient() override = default;
static sk_sp<SkSVGLinearGradient> Make() {
return sk_sp<SkSVGLinearGradient>(new SkSVGLinearGradient());
}
void setX1(const SkSVGLength&);
void setY1(const SkSVGLength&);
void setX2(const SkSVGLength&);
void setY2(const SkSVGLength&);
protected:
void onSetAttribute(SkSVGAttribute, const SkSVGValue&) override;
sk_sp<SkShader> onMakeShader(const SkSVGRenderContext&,
const SkColor*, const SkScalar*, int count,
SkTileMode, const SkMatrix&) const override;
private:
SkSVGLinearGradient();
SkSVGLength fX1 = SkSVGLength(0 , SkSVGLength::Unit::kPercentage);
SkSVGLength fY1 = SkSVGLength(0 , SkSVGLength::Unit::kPercentage);
SkSVGLength fX2 = SkSVGLength(100, SkSVGLength::Unit::kPercentage);
SkSVGLength fY2 = SkSVGLength(0 , SkSVGLength::Unit::kPercentage);
using INHERITED = SkSVGGradient;
};
#endif // SkSVGLinearGradient_DEFINED

View File

@ -0,0 +1,103 @@
/*
* 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 SkSVGNode_DEFINED
#define SkSVGNode_DEFINED
#include "include/core/SkRefCnt.h"
#include "modules/svg/include/SkSVGAttribute.h"
class SkCanvas;
class SkMatrix;
class SkPaint;
class SkPath;
class SkSVGRenderContext;
class SkSVGValue;
enum class SkSVGTag {
kCircle,
kClipPath,
kDefs,
kEllipse,
kG,
kLine,
kLinearGradient,
kPath,
kPattern,
kPolygon,
kPolyline,
kRadialGradient,
kRect,
kStop,
kSvg,
kText,
kUse
};
class SkSVGNode : public SkRefCnt {
public:
~SkSVGNode() override;
SkSVGTag tag() const { return fTag; }
virtual void appendChild(sk_sp<SkSVGNode>) = 0;
void render(const SkSVGRenderContext&) const;
bool asPaint(const SkSVGRenderContext&, SkPaint*) const;
SkPath asPath(const SkSVGRenderContext&) const;
void setAttribute(SkSVGAttribute, const SkSVGValue&);
bool setAttribute(const char* attributeName, const char* attributeValue);
void setClipPath(const SkSVGClip&);
void setClipRule(const SkSVGFillRule&);
void setColor(const SkSVGColorType&);
void setFill(const SkSVGPaint&);
void setFillOpacity(const SkSVGNumberType&);
void setFillRule(const SkSVGFillRule&);
void setOpacity(const SkSVGNumberType&);
void setStroke(const SkSVGPaint&);
void setStrokeDashArray(const SkSVGDashArray&);
void setStrokeDashOffset(const SkSVGLength&);
void setStrokeOpacity(const SkSVGNumberType&);
void setStrokeLineCap(const SkSVGLineCap&);
void setStrokeLineJoin(const SkSVGLineJoin&);
void setStrokeMiterLimit(const SkSVGNumberType&);
void setStrokeWidth(const SkSVGLength&);
void setVisibility(const SkSVGVisibility&);
protected:
SkSVGNode(SkSVGTag);
// Called before onRender(), to apply local attributes to the context. Unlike onRender(),
// onPrepareToRender() bubbles up the inheritance chain: overriders should always call
// INHERITED::onPrepareToRender(), unless they intend to short-circuit rendering
// (return false).
// Implementations are expected to return true if rendering is to continue, or false if
// the node/subtree rendering is disabled.
virtual bool onPrepareToRender(SkSVGRenderContext*) const;
virtual void onRender(const SkSVGRenderContext&) const = 0;
virtual bool onAsPaint(const SkSVGRenderContext&, SkPaint*) const { return false; }
virtual SkPath onAsPath(const SkSVGRenderContext&) const = 0;
virtual void onSetAttribute(SkSVGAttribute, const SkSVGValue&);
virtual bool hasChildren() const { return false; }
private:
SkSVGTag fTag;
// FIXME: this should be sparse
SkSVGPresentationAttributes fPresentationAttributes;
using INHERITED = SkRefCnt;
};
#endif // SkSVGNode_DEFINED

View File

@ -0,0 +1,37 @@
/*
* 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 SkSVGPath_DEFINED
#define SkSVGPath_DEFINED
#include "include/core/SkPath.h"
#include "modules/svg/include/SkSVGShape.h"
class SkSVGPath final : public SkSVGShape {
public:
~SkSVGPath() override = default;
static sk_sp<SkSVGPath> Make() { return sk_sp<SkSVGPath>(new SkSVGPath()); }
void setPath(const SkPath& path) { fPath = path; }
protected:
void onSetAttribute(SkSVGAttribute, const SkSVGValue&) override;
void onDraw(SkCanvas*, const SkSVGLengthContext&, const SkPaint&,
SkPathFillType) const override;
SkPath onAsPath(const SkSVGRenderContext&) const override;
private:
SkSVGPath();
mutable SkPath fPath; // mutated in onDraw(), to apply inherited fill types.
using INHERITED = SkSVGShape;
};
#endif // SkSVGPath_DEFINED

View File

@ -0,0 +1,59 @@
/*
* Copyright 2017 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkSVGPattern_DEFINED
#define SkSVGPattern_DEFINED
#include "modules/svg/include/SkSVGHiddenContainer.h"
#include "modules/svg/include/SkSVGTypes.h"
class SkSVGRenderContext;
class SkSVGPattern final : public SkSVGHiddenContainer {
public:
~SkSVGPattern() override = default;
static sk_sp<SkSVGPattern> Make() {
return sk_sp<SkSVGPattern>(new SkSVGPattern());
}
void setX(const SkSVGLength&);
void setY(const SkSVGLength&);
void setWidth(const SkSVGLength&);
void setHeight(const SkSVGLength&);
void setHref(const SkSVGStringType&);
void setPatternTransform(const SkSVGTransformType&);
protected:
SkSVGPattern();
void onSetAttribute(SkSVGAttribute, const SkSVGValue&) override;
bool onAsPaint(const SkSVGRenderContext&, SkPaint*) const override;
private:
struct PatternAttributes {
SkTLazy<SkSVGLength> fX,
fY,
fWidth,
fHeight;
SkTLazy<SkSVGTransformType> fPatternTransform;
} fAttributes;
SkSVGStringType fHref;
const SkSVGPattern* resolveHref(const SkSVGRenderContext&, PatternAttributes*) const;
const SkSVGPattern* hrefTarget(const SkSVGRenderContext&) const;
// TODO:
// - patternUnits
// - patternContentUnits
using INHERITED = SkSVGHiddenContainer;
};
#endif // SkSVGPattern_DEFINED

View File

@ -0,0 +1,45 @@
/*
* 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 SkSVGPoly_DEFINED
#define SkSVGPoly_DEFINED
#include "include/core/SkPath.h"
#include "modules/svg/include/SkSVGShape.h"
// Handles <polygon> and <polyline> elements.
class SkSVGPoly final : public SkSVGShape {
public:
~SkSVGPoly() override = default;
static sk_sp<SkSVGPoly> MakePolygon() {
return sk_sp<SkSVGPoly>(new SkSVGPoly(SkSVGTag::kPolygon));
}
static sk_sp<SkSVGPoly> MakePolyline() {
return sk_sp<SkSVGPoly>(new SkSVGPoly(SkSVGTag::kPolyline));
}
void setPoints(const SkSVGPointsType&);
protected:
void onSetAttribute(SkSVGAttribute, const SkSVGValue&) override;
void onDraw(SkCanvas*, const SkSVGLengthContext&, const SkPaint&,
SkPathFillType) const override;
SkPath onAsPath(const SkSVGRenderContext&) const override;
private:
SkSVGPoly(SkSVGTag);
mutable SkPath fPath; // mutated in onDraw(), to apply inherited fill types.
using INHERITED = SkSVGShape;
};
#endif // SkSVGPoly_DEFINED

View File

@ -0,0 +1,46 @@
/*
* Copyright 2017 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkSVGRadialGradient_DEFINED
#define SkSVGRadialGradient_DEFINED
#include "modules/svg/include/SkSVGGradient.h"
#include "modules/svg/include/SkSVGTypes.h"
class SkSVGRadialGradient final : public SkSVGGradient {
public:
~SkSVGRadialGradient() override = default;
static sk_sp<SkSVGRadialGradient> Make() {
return sk_sp<SkSVGRadialGradient>(new SkSVGRadialGradient());
}
void setCx(const SkSVGLength&);
void setCy(const SkSVGLength&);
void setR(const SkSVGLength&);
void setFx(const SkSVGLength&);
void setFy(const SkSVGLength&);
protected:
void onSetAttribute(SkSVGAttribute, const SkSVGValue&) override;
sk_sp<SkShader> onMakeShader(const SkSVGRenderContext&,
const SkColor*, const SkScalar*, int count,
SkTileMode, const SkMatrix&) const override;
private:
SkSVGRadialGradient();
SkSVGLength fCx = SkSVGLength(50, SkSVGLength::Unit::kPercentage);
SkSVGLength fCy = SkSVGLength(50, SkSVGLength::Unit::kPercentage);
SkSVGLength fR = SkSVGLength(50, SkSVGLength::Unit::kPercentage);
SkTLazy<SkSVGLength> fFx;
SkTLazy<SkSVGLength> fFy;
using INHERITED = SkSVGGradient;
};
#endif // SkSVGRadialGradient_DEFINED

View File

@ -0,0 +1,54 @@
/*
* 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 SkSVGRect_DEFINED
#define SkSVGRect_DEFINED
#include "modules/svg/include/SkSVGShape.h"
#include "modules/svg/include/SkSVGTypes.h"
class SkRRect;
class SkSVGRect final : public SkSVGShape {
public:
~SkSVGRect() override = default;
static sk_sp<SkSVGRect> Make() { return sk_sp<SkSVGRect>(new SkSVGRect()); }
void setX(const SkSVGLength&);
void setY(const SkSVGLength&);
void setWidth(const SkSVGLength&);
void setHeight(const SkSVGLength&);
void setRx(const SkSVGLength&);
void setRy(const SkSVGLength&);
protected:
void onSetAttribute(SkSVGAttribute, const SkSVGValue&) override;
void onDraw(SkCanvas*, const SkSVGLengthContext&, const SkPaint&,
SkPathFillType) const override;
SkPath onAsPath(const SkSVGRenderContext&) const override;
private:
SkSVGRect();
SkRRect resolve(const SkSVGLengthContext&) const;
SkSVGLength fX = SkSVGLength(0);
SkSVGLength fY = SkSVGLength(0);
SkSVGLength fWidth = SkSVGLength(0);
SkSVGLength fHeight = SkSVGLength(0);
// The x radius for rounded rects.
SkSVGLength fRx = SkSVGLength(0);
// The y radius for rounded rects.
SkSVGLength fRy = SkSVGLength(0);
using INHERITED = SkSVGShape;
};
#endif // SkSVGRect_DEFINED

View File

@ -0,0 +1,144 @@
/*
* 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 SkSVGRenderContext_DEFINED
#define SkSVGRenderContext_DEFINED
#include "include/core/SkPaint.h"
#include "include/core/SkPath.h"
#include "include/core/SkRect.h"
#include "include/core/SkSize.h"
#include "include/core/SkTypes.h"
#include "modules/svg/include/SkSVGAttribute.h"
#include "modules/svg/include/SkSVGIDMapper.h"
#include "src/core/SkTLazy.h"
class SkCanvas;
class SkSVGLength;
class SkSVGLengthContext {
public:
SkSVGLengthContext(const SkSize& viewport, SkScalar dpi = 90)
: fViewport(viewport), fDPI(dpi) {}
enum class LengthType {
kHorizontal,
kVertical,
kOther,
};
const SkSize& viewPort() const { return fViewport; }
void setViewPort(const SkSize& viewport) { fViewport = viewport; }
SkScalar resolve(const SkSVGLength&, LengthType) const;
SkRect resolveRect(const SkSVGLength& x, const SkSVGLength& y,
const SkSVGLength& w, const SkSVGLength& h) const;
private:
SkSize fViewport;
SkScalar fDPI;
};
struct SkSVGPresentationContext {
SkSVGPresentationContext();
SkSVGPresentationContext(const SkSVGPresentationContext&) = default;
SkSVGPresentationContext& operator=(const SkSVGPresentationContext&) = default;
// Inherited presentation attributes, computed for the current node.
SkSVGPresentationAttributes fInherited;
// Cached paints, reflecting the current presentation attributes.
SkPaint fFillPaint;
SkPaint fStrokePaint;
};
class SkSVGRenderContext {
public:
SkSVGRenderContext(SkCanvas*, const SkSVGIDMapper&, const SkSVGLengthContext&,
const SkSVGPresentationContext&);
SkSVGRenderContext(const SkSVGRenderContext&);
SkSVGRenderContext(const SkSVGRenderContext&, SkCanvas*);
~SkSVGRenderContext();
const SkSVGLengthContext& lengthContext() const { return *fLengthContext; }
SkSVGLengthContext* writableLengthContext() { return fLengthContext.writable(); }
const SkSVGPresentationContext& presentationContext() const { return *fPresentationContext; }
SkCanvas* canvas() const { return fCanvas; }
void saveOnce();
enum ApplyFlags {
kLeaf = 1 << 0, // the target node doesn't have descendants
};
void applyPresentationAttributes(const SkSVGPresentationAttributes&, uint32_t flags);
// Scoped wrapper that temporarily clears the original node reference.
class BorrowedNode {
public:
explicit BorrowedNode(sk_sp<SkSVGNode>* node)
: fOwner(node) {
if (fOwner) {
fBorrowed = std::move(*fOwner);
*fOwner = nullptr;
}
}
~BorrowedNode() {
if (fOwner) {
*fOwner = std::move(fBorrowed);
}
}
const SkSVGNode* get() const { return fBorrowed.get(); }
const SkSVGNode* operator->() const { return fBorrowed.get(); }
const SkSVGNode& operator*() const { return *fBorrowed; }
operator bool() const { return !!fBorrowed; }
private:
// noncopyable
BorrowedNode(const BorrowedNode&) = delete;
BorrowedNode& operator=(BorrowedNode&) = delete;
sk_sp<SkSVGNode>* fOwner;
sk_sp<SkSVGNode> fBorrowed;
};
// Note: the id->node association is cleared for the lifetime of the returned value
// (effectively breaks reference cycles, assuming appropriate return value scoping).
BorrowedNode findNodeById(const SkString&) const;
const SkPaint* fillPaint() const;
const SkPaint* strokePaint() const;
// The local computed clip path (not inherited).
const SkPath* clipPath() const { return fClipPath.getMaybeNull(); }
private:
// Stack-only
void* operator new(size_t) = delete;
void* operator new(size_t, void*) = delete;
SkSVGRenderContext& operator=(const SkSVGRenderContext&) = delete;
void applyOpacity(SkScalar opacity, uint32_t flags);
void applyClip(const SkSVGClip&);
void updatePaintsWithCurrentColor(const SkSVGPresentationAttributes&);
const SkSVGIDMapper& fIDMapper;
SkTCopyOnFirstWrite<SkSVGLengthContext> fLengthContext;
SkTCopyOnFirstWrite<SkSVGPresentationContext> fPresentationContext;
SkCanvas* fCanvas;
// The save count on 'fCanvas' at construction time.
// A restoreToCount() will be issued on destruction.
int fCanvasSaveCount;
// clipPath, if present for the current context (not inherited).
SkTLazy<SkPath> fClipPath;
};
#endif // SkSVGRenderContext_DEFINED

View File

@ -0,0 +1,49 @@
/*
* 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 SkSVGSVG_DEFINED
#define SkSVGSVG_DEFINED
#include "modules/svg/include/SkSVGContainer.h"
#include "modules/svg/include/SkSVGTypes.h"
#include "src/core/SkTLazy.h"
class SkSVGLengthContext;
class SkSVGSVG : public SkSVGContainer {
public:
~SkSVGSVG() override = default;
static sk_sp<SkSVGSVG> Make() { return sk_sp<SkSVGSVG>(new SkSVGSVG()); }
void setX(const SkSVGLength&);
void setY(const SkSVGLength&);
void setWidth(const SkSVGLength&);
void setHeight(const SkSVGLength&);
void setViewBox(const SkSVGViewBoxType&);
SkSize intrinsicSize(const SkSVGLengthContext&) const;
protected:
bool onPrepareToRender(SkSVGRenderContext*) const override;
void onSetAttribute(SkSVGAttribute, const SkSVGValue&) override;
private:
SkSVGSVG();
SkSVGLength fX = SkSVGLength(0);
SkSVGLength fY = SkSVGLength(0);
SkSVGLength fWidth = SkSVGLength(100, SkSVGLength::Unit::kPercentage);
SkSVGLength fHeight = SkSVGLength(100, SkSVGLength::Unit::kPercentage);
SkTLazy<SkSVGViewBoxType> fViewBox;
using INHERITED = SkSVGContainer;
};
#endif // SkSVGSVG_DEFINED

View File

@ -0,0 +1,35 @@
/*
* 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 SkSVGShape_DEFINED
#define SkSVGShape_DEFINED
#include "include/core/SkPath.h"
#include "modules/svg/include/SkSVGTransformableNode.h"
class SkSVGLengthContext;
class SkPaint;
class SkSVGShape : public SkSVGTransformableNode {
public:
~SkSVGShape() override = default;
void appendChild(sk_sp<SkSVGNode>) override;
protected:
SkSVGShape(SkSVGTag);
void onRender(const SkSVGRenderContext&) const final;
virtual void onDraw(SkCanvas*, const SkSVGLengthContext&, const SkPaint&,
SkPathFillType) const = 0;
private:
using INHERITED = SkSVGTransformableNode;
};
#endif // SkSVGShape_DEFINED

View File

@ -0,0 +1,44 @@
/*
* 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 SkSVGStop_DEFINED
#define SkSVGStop_DEFINED
#include "modules/svg/include/SkSVGHiddenContainer.h"
#include "modules/svg/include/SkSVGTypes.h"
class SkSVGLengthContext;
class SkSVGStop : public SkSVGHiddenContainer {
public:
~SkSVGStop() override = default;
static sk_sp<SkSVGStop> Make() {
return sk_sp<SkSVGStop>(new SkSVGStop());
}
const SkSVGLength& offset() const { return fOffset; }
const SkSVGStopColor& stopColor() const { return fStopColor; }
const SkSVGNumberType& stopOpacity() const { return fStopOpacity; }
void setOffset(const SkSVGLength&);
void setStopColor(const SkSVGStopColor&);
void setStopOpacity(const SkSVGNumberType&);
protected:
void onSetAttribute(SkSVGAttribute, const SkSVGValue&) override;
private:
SkSVGStop();
SkSVGLength fOffset = SkSVGLength(0 , SkSVGLength::Unit::kPercentage);
SkSVGStopColor fStopColor = SkSVGStopColor(SK_ColorBLACK);
SkSVGNumberType fStopOpacity = SkSVGNumberType(1);
using INHERITED = SkSVGHiddenContainer;
};
#endif // SkSVGStop_DEFINED

View File

@ -0,0 +1,57 @@
/*
* Copyright 2019 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkSVGText_DEFINED
#define SkSVGText_DEFINED
#include "include/core/SkFont.h"
#include "include/utils/SkTextUtils.h"
#include "modules/svg/include/SkSVGShape.h"
#include "modules/svg/include/SkSVGTypes.h"
class SkRRect;
class SkSVGText final : public SkSVGShape {
public:
~SkSVGText() override = default;
static sk_sp<SkSVGText> Make() {
return sk_sp<SkSVGText>(new SkSVGText()); }
void setX(const SkSVGLength&);
void setY(const SkSVGLength&);
void setFontFamily(const SkSVGStringType&);
void setFontSize(const SkSVGLength&);
void setFontStyle(const SkSVGStringType&);
void setFontWeight(const SkSVGStringType&);
void setText(const SkSVGStringType&);
void setTextAnchor(const SkSVGStringType&);
protected:
void onSetAttribute(SkSVGAttribute, const SkSVGValue&) override;
void onDraw(SkCanvas*, const SkSVGLengthContext&, const SkPaint&,
SkPathFillType) const override;
SkPath onAsPath(const SkSVGRenderContext&) const override;
void loadFont();
private:
SkSVGText();
SkSVGLength fX = SkSVGLength(0);
SkSVGLength fY = SkSVGLength(0);
SkSVGStringType fText;
sk_sp<SkTypeface> fTypeface;
SkSVGLength fFontSize;
SkSVGStringType fFontFamily;
SkSVGStringType fFontStyle;
SkSVGStringType fFontWeight;
SkTextUtils::Align fTextAlign = SkTextUtils::Align::kLeft_Align;
using INHERITED = SkSVGShape;
};
#endif // SkSVGText_DEFINED

View File

@ -0,0 +1,36 @@
/*
* 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 SkSVGTransformableNode_DEFINED
#define SkSVGTransformableNode_DEFINED
#include "include/core/SkMatrix.h"
#include "modules/svg/include/SkSVGNode.h"
class SkSVGTransformableNode : public SkSVGNode {
public:
~SkSVGTransformableNode() override = default;
void setTransform(const SkSVGTransformType& t) { fTransform = t; }
protected:
SkSVGTransformableNode(SkSVGTag);
bool onPrepareToRender(SkSVGRenderContext*) const override;
void onSetAttribute(SkSVGAttribute, const SkSVGValue&) override;
void mapToParent(SkPath*) const;
private:
// FIXME: should be sparse
SkSVGTransformType fTransform;
using INHERITED = SkSVGNode;
};
#endif // SkSVGTransformableNode_DEFINED

View File

@ -0,0 +1,311 @@
/*
* 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 SkSVGTypes_DEFINED
#define SkSVGTypes_DEFINED
#include "include/core/SkColor.h"
#include "include/core/SkMatrix.h"
#include "include/core/SkPath.h"
#include "include/core/SkPoint.h"
#include "include/core/SkRect.h"
#include "include/core/SkScalar.h"
#include "include/core/SkString.h"
#include "include/core/SkTypes.h"
#include "include/private/SkTDArray.h"
using SkSVGColorType = SkColor;
using SkSVGNumberType = SkScalar;
using SkSVGStringType = SkString;
using SkSVGViewBoxType = SkRect;
using SkSVGTransformType = SkMatrix;
using SkSVGPointsType = SkTDArray<SkPoint>;
class SkSVGLength {
public:
enum class Unit {
kUnknown,
kNumber,
kPercentage,
kEMS,
kEXS,
kPX,
kCM,
kMM,
kIN,
kPT,
kPC,
};
constexpr SkSVGLength() : fValue(0), fUnit(Unit::kUnknown) {}
explicit constexpr SkSVGLength(SkScalar v, Unit u = Unit::kNumber)
: fValue(v), fUnit(u) {}
SkSVGLength(const SkSVGLength&) = default;
SkSVGLength& operator=(const SkSVGLength&) = default;
bool operator==(const SkSVGLength& other) const {
return fUnit == other.fUnit && fValue == other.fValue;
}
bool operator!=(const SkSVGLength& other) const { return !(*this == other); }
const SkScalar& value() const { return fValue; }
const Unit& unit() const { return fUnit; }
private:
SkScalar fValue;
Unit fUnit;
};
class SkSVGPaint {
public:
enum class Type {
kNone,
kCurrentColor,
kColor,
kInherit,
kIRI,
};
SkSVGPaint() : fType(Type::kInherit), fColor(SK_ColorBLACK) {}
explicit SkSVGPaint(Type t) : fType(t), fColor(SK_ColorBLACK) {}
explicit SkSVGPaint(const SkSVGColorType& c) : fType(Type::kColor), fColor(c) {}
explicit SkSVGPaint(const SkString& iri)
: fType(Type::kIRI), fColor(SK_ColorBLACK), fIRI(iri) {}
SkSVGPaint(const SkSVGPaint&) = default;
SkSVGPaint& operator=(const SkSVGPaint&) = default;
bool operator==(const SkSVGPaint& other) const {
return fType == other.fType && fColor == other.fColor && fIRI == other.fIRI;
}
bool operator!=(const SkSVGPaint& other) const { return !(*this == other); }
Type type() const { return fType; }
const SkSVGColorType& color() const { SkASSERT(fType == Type::kColor); return fColor; }
const SkString& iri() const { SkASSERT(fType == Type::kIRI); return fIRI; }
private:
Type fType;
// Logical union.
SkSVGColorType fColor;
SkString fIRI;
};
class SkSVGClip {
public:
enum class Type {
kNone,
kInherit,
kIRI,
};
SkSVGClip() : fType(Type::kNone) {}
explicit SkSVGClip(Type t) : fType(t) {}
explicit SkSVGClip(const SkString& iri) : fType(Type::kIRI), fIRI(iri) {}
SkSVGClip(const SkSVGClip&) = default;
SkSVGClip& operator=(const SkSVGClip&) = default;
bool operator==(const SkSVGClip& other) const {
return fType == other.fType && fIRI == other.fIRI;
}
bool operator!=(const SkSVGClip& other) const { return !(*this == other); }
Type type() const { return fType; }
const SkString& iri() const { SkASSERT(fType == Type::kIRI); return fIRI; }
private:
Type fType;
SkString fIRI;
};
class SkSVGLineCap {
public:
enum class Type {
kButt,
kRound,
kSquare,
kInherit,
};
constexpr SkSVGLineCap() : fType(Type::kInherit) {}
constexpr explicit SkSVGLineCap(Type t) : fType(t) {}
SkSVGLineCap(const SkSVGLineCap&) = default;
SkSVGLineCap& operator=(const SkSVGLineCap&) = default;
bool operator==(const SkSVGLineCap& other) const { return fType == other.fType; }
bool operator!=(const SkSVGLineCap& other) const { return !(*this == other); }
Type type() const { return fType; }
private:
Type fType;
};
class SkSVGLineJoin {
public:
enum class Type {
kMiter,
kRound,
kBevel,
kInherit,
};
constexpr SkSVGLineJoin() : fType(Type::kInherit) {}
constexpr explicit SkSVGLineJoin(Type t) : fType(t) {}
SkSVGLineJoin(const SkSVGLineJoin&) = default;
SkSVGLineJoin& operator=(const SkSVGLineJoin&) = default;
bool operator==(const SkSVGLineJoin& other) const { return fType == other.fType; }
bool operator!=(const SkSVGLineJoin& other) const { return !(*this == other); }
Type type() const { return fType; }
private:
Type fType;
};
class SkSVGSpreadMethod {
public:
// These values must match Skia's SkShader::TileMode enum.
enum class Type {
kPad, // kClamp_TileMode
kRepeat, // kRepeat_TileMode
kReflect, // kMirror_TileMode
};
constexpr SkSVGSpreadMethod() : fType(Type::kPad) {}
constexpr explicit SkSVGSpreadMethod(Type t) : fType(t) {}
SkSVGSpreadMethod(const SkSVGSpreadMethod&) = default;
SkSVGSpreadMethod& operator=(const SkSVGSpreadMethod&) = default;
bool operator==(const SkSVGSpreadMethod& other) const { return fType == other.fType; }
bool operator!=(const SkSVGSpreadMethod& other) const { return !(*this == other); }
Type type() const { return fType; }
private:
Type fType;
};
class SkSVGFillRule {
public:
enum class Type {
kNonZero,
kEvenOdd,
kInherit,
};
constexpr SkSVGFillRule() : fType(Type::kInherit) {}
constexpr explicit SkSVGFillRule(Type t) : fType(t) {}
SkSVGFillRule(const SkSVGFillRule&) = default;
SkSVGFillRule& operator=(const SkSVGFillRule&) = default;
bool operator==(const SkSVGFillRule& other) const { return fType == other.fType; }
bool operator!=(const SkSVGFillRule& other) const { return !(*this == other); }
Type type() const { return fType; }
SkPathFillType asFillType() const {
SkASSERT(fType != Type::kInherit); // should never be called for unresolved values.
return fType == Type::kEvenOdd ? SkPathFillType::kEvenOdd : SkPathFillType::kWinding;
}
private:
Type fType;
};
class SkSVGVisibility {
public:
enum class Type {
kVisible,
kHidden,
kCollapse,
kInherit,
};
constexpr SkSVGVisibility() : fType(Type::kVisible) {}
constexpr explicit SkSVGVisibility(Type t) : fType(t) {}
SkSVGVisibility(const SkSVGVisibility&) = default;
SkSVGVisibility& operator=(const SkSVGVisibility&) = default;
bool operator==(const SkSVGVisibility& other) const { return fType == other.fType; }
bool operator!=(const SkSVGVisibility& other) const { return !(*this == other); }
Type type() const { return fType; }
private:
Type fType;
};
class SkSVGDashArray {
public:
enum class Type {
kNone,
kDashArray,
kInherit,
};
SkSVGDashArray() : fType(Type::kNone) {}
explicit SkSVGDashArray(Type t) : fType(t) {}
explicit SkSVGDashArray(SkTDArray<SkSVGLength>&& dashArray)
: fType(Type::kDashArray)
, fDashArray(std::move(dashArray)) {}
SkSVGDashArray(const SkSVGDashArray&) = default;
SkSVGDashArray& operator=(const SkSVGDashArray&) = default;
bool operator==(const SkSVGDashArray& other) const {
return fType == other.fType && fDashArray == other.fDashArray;
}
bool operator!=(const SkSVGDashArray& other) const { return !(*this == other); }
Type type() const { return fType; }
const SkTDArray<SkSVGLength>& dashArray() const { return fDashArray; }
private:
Type fType;
SkTDArray<SkSVGLength> fDashArray;
};
class SkSVGStopColor {
public:
enum class Type {
kColor,
kCurrentColor,
kICCColor,
kInherit,
};
SkSVGStopColor() : fType(Type::kColor), fColor(SK_ColorBLACK) {}
explicit SkSVGStopColor(Type t) : fType(t), fColor(SK_ColorBLACK) {}
explicit SkSVGStopColor(const SkSVGColorType& c) : fType(Type::kColor), fColor(c) {}
SkSVGStopColor(const SkSVGStopColor&) = default;
SkSVGStopColor& operator=(const SkSVGStopColor&) = default;
bool operator==(const SkSVGStopColor& other) const {
return fType == other.fType && fColor == other.fColor;
}
bool operator!=(const SkSVGStopColor& other) const { return !(*this == other); }
Type type() const { return fType; }
const SkSVGColorType& color() const { SkASSERT(fType == Type::kColor); return fColor; }
private:
Type fType;
SkSVGColorType fColor;
};
#endif // SkSVGTypes_DEFINED

View File

@ -0,0 +1,47 @@
/*
* Copyright 2017 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkSVGUse_DEFINED
#define SkSVGUse_DEFINED
#include "modules/svg/include/SkSVGTransformableNode.h"
#include "modules/svg/include/SkSVGTypes.h"
/**
* Implements support for <use> (reference) elements.
* (https://www.w3.org/TR/SVG11/struct.html#UseElement)
*/
class SkSVGUse final : public SkSVGTransformableNode {
public:
~SkSVGUse() override = default;
static sk_sp<SkSVGUse> Make() { return sk_sp<SkSVGUse>(new SkSVGUse()); }
void appendChild(sk_sp<SkSVGNode>) override;
void setHref(const SkSVGStringType&);
void setX(const SkSVGLength&);
void setY(const SkSVGLength&);
protected:
void onSetAttribute(SkSVGAttribute, const SkSVGValue&) override;
bool onPrepareToRender(SkSVGRenderContext*) const override;
void onRender(const SkSVGRenderContext&) const override;
SkPath onAsPath(const SkSVGRenderContext&) const override;
private:
SkSVGUse();
SkSVGStringType fHref;
SkSVGLength fX = SkSVGLength(0);
SkSVGLength fY = SkSVGLength(0);
using INHERITED = SkSVGTransformableNode;
};
#endif // SkSVGUse_DEFINED

View File

@ -0,0 +1,97 @@
/*
* 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 "include/core/SkColor.h"
#include "include/core/SkMatrix.h"
#include "include/core/SkPath.h"
#include "include/core/SkTypes.h"
#include "include/private/SkNoncopyable.h"
#include "modules/svg/include/SkSVGTypes.h"
class SkSVGValue : public SkNoncopyable {
public:
enum class Type {
kClip,
kColor,
kDashArray,
kFillRule,
kLength,
kLineCap,
kLineJoin,
kNumber,
kPaint,
kPath,
kPoints,
kSpreadMethod,
kStopColor,
kString,
kTransform,
kViewBox,
kVisibility,
};
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;
using INHERITED = SkNoncopyable;
};
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;
using INHERITED = SkSVGValue;
};
using SkSVGClipValue = SkSVGWrapperValue<SkSVGClip , SkSVGValue::Type::kClip >;
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>;
using SkSVGStopColorValue = SkSVGWrapperValue<SkSVGStopColor , SkSVGValue::Type::kStopColor >;
using SkSVGVisibilityValue = SkSVGWrapperValue<SkSVGVisibility , SkSVGValue::Type::kVisibility>;
using SkSVGDashArrayValue = SkSVGWrapperValue<SkSVGDashArray , SkSVGValue::Type::kDashArray >;
#endif // SkSVGValue_DEFINED

View File

@ -5,7 +5,7 @@
* found in the LICENSE file.
*/
#include "experimental/svg/model/SkSVGAttribute.h"
#include "modules/svg/include/SkSVGAttribute.h"
SkSVGPresentationAttributes SkSVGPresentationAttributes::MakeInitial() {
SkSVGPresentationAttributes result;

View File

@ -5,9 +5,9 @@
* found in the LICENSE file.
*/
#include "experimental/svg/model/SkSVGAttributeParser.h"
#include "experimental/svg/model/SkSVGTypes.h"
#include "include/utils/SkParse.h"
#include "modules/svg/include/SkSVGAttributeParser.h"
#include "modules/svg/include/SkSVGTypes.h"
namespace {

View File

@ -5,10 +5,10 @@
* found in the LICENSE file.
*/
#include "experimental/svg/model/SkSVGCircle.h"
#include "experimental/svg/model/SkSVGRenderContext.h"
#include "experimental/svg/model/SkSVGValue.h"
#include "include/core/SkCanvas.h"
#include "modules/svg/include/SkSVGCircle.h"
#include "modules/svg/include/SkSVGRenderContext.h"
#include "modules/svg/include/SkSVGValue.h"
SkSVGCircle::SkSVGCircle() : INHERITED(SkSVGTag::kCircle) {}

View File

@ -5,6 +5,6 @@
* found in the LICENSE file.
*/
#include "experimental/svg/model/SkSVGClipPath.h"
#include "modules/svg/include/SkSVGClipPath.h"
SkSVGClipPath::SkSVGClipPath() : INHERITED(SkSVGTag::kClipPath) {}

View File

@ -5,7 +5,7 @@
* found in the LICENSE file.
*/
#include "experimental/svg/model/SkSVGContainer.h"
#include "modules/svg/include/SkSVGContainer.h"
#include "include/core/SkPath.h"
#include "include/pathops/SkPathOps.h"

View File

@ -5,32 +5,32 @@
* found in the LICENSE file.
*/
#include "experimental/svg/model/SkSVGAttributeParser.h"
#include "experimental/svg/model/SkSVGCircle.h"
#include "experimental/svg/model/SkSVGClipPath.h"
#include "experimental/svg/model/SkSVGDOM.h"
#include "experimental/svg/model/SkSVGDefs.h"
#include "experimental/svg/model/SkSVGEllipse.h"
#include "experimental/svg/model/SkSVGG.h"
#include "experimental/svg/model/SkSVGLine.h"
#include "experimental/svg/model/SkSVGLinearGradient.h"
#include "experimental/svg/model/SkSVGNode.h"
#include "experimental/svg/model/SkSVGPath.h"
#include "experimental/svg/model/SkSVGPattern.h"
#include "experimental/svg/model/SkSVGPoly.h"
#include "experimental/svg/model/SkSVGRadialGradient.h"
#include "experimental/svg/model/SkSVGRect.h"
#include "experimental/svg/model/SkSVGRenderContext.h"
#include "experimental/svg/model/SkSVGSVG.h"
#include "experimental/svg/model/SkSVGStop.h"
#include "experimental/svg/model/SkSVGText.h"
#include "experimental/svg/model/SkSVGTypes.h"
#include "experimental/svg/model/SkSVGUse.h"
#include "experimental/svg/model/SkSVGValue.h"
#include "include/core/SkCanvas.h"
#include "include/core/SkString.h"
#include "include/private/SkTo.h"
#include "include/utils/SkParsePath.h"
#include "modules/svg/include/SkSVGAttributeParser.h"
#include "modules/svg/include/SkSVGCircle.h"
#include "modules/svg/include/SkSVGClipPath.h"
#include "modules/svg/include/SkSVGDOM.h"
#include "modules/svg/include/SkSVGDefs.h"
#include "modules/svg/include/SkSVGEllipse.h"
#include "modules/svg/include/SkSVGG.h"
#include "modules/svg/include/SkSVGLine.h"
#include "modules/svg/include/SkSVGLinearGradient.h"
#include "modules/svg/include/SkSVGNode.h"
#include "modules/svg/include/SkSVGPath.h"
#include "modules/svg/include/SkSVGPattern.h"
#include "modules/svg/include/SkSVGPoly.h"
#include "modules/svg/include/SkSVGRadialGradient.h"
#include "modules/svg/include/SkSVGRect.h"
#include "modules/svg/include/SkSVGRenderContext.h"
#include "modules/svg/include/SkSVGSVG.h"
#include "modules/svg/include/SkSVGStop.h"
#include "modules/svg/include/SkSVGText.h"
#include "modules/svg/include/SkSVGTypes.h"
#include "modules/svg/include/SkSVGUse.h"
#include "modules/svg/include/SkSVGValue.h"
#include "src/core/SkTSearch.h"
#include "src/xml/SkDOM.h"

View File

@ -5,10 +5,10 @@
* found in the LICENSE file.
*/
#include "experimental/svg/model/SkSVGEllipse.h"
#include "experimental/svg/model/SkSVGRenderContext.h"
#include "experimental/svg/model/SkSVGValue.h"
#include "include/core/SkCanvas.h"
#include "modules/svg/include/SkSVGEllipse.h"
#include "modules/svg/include/SkSVGRenderContext.h"
#include "modules/svg/include/SkSVGValue.h"
SkSVGEllipse::SkSVGEllipse() : INHERITED(SkSVGTag::kEllipse) {}

View File

@ -5,10 +5,10 @@
* found in the LICENSE file.
*/
#include "experimental/svg/model/SkSVGGradient.h"
#include "experimental/svg/model/SkSVGRenderContext.h"
#include "experimental/svg/model/SkSVGStop.h"
#include "experimental/svg/model/SkSVGValue.h"
#include "modules/svg/include/SkSVGGradient.h"
#include "modules/svg/include/SkSVGRenderContext.h"
#include "modules/svg/include/SkSVGStop.h"
#include "modules/svg/include/SkSVGValue.h"
void SkSVGGradient::setHref(const SkSVGStringType& href) {
fHref = std::move(href);

View File

@ -5,10 +5,10 @@
* found in the LICENSE file.
*/
#include "experimental/svg/model/SkSVGLine.h"
#include "experimental/svg/model/SkSVGRenderContext.h"
#include "experimental/svg/model/SkSVGValue.h"
#include "include/core/SkCanvas.h"
#include "modules/svg/include/SkSVGLine.h"
#include "modules/svg/include/SkSVGRenderContext.h"
#include "modules/svg/include/SkSVGValue.h"
SkSVGLine::SkSVGLine() : INHERITED(SkSVGTag::kLine) {}

View File

@ -5,10 +5,10 @@
* found in the LICENSE file.
*/
#include "experimental/svg/model/SkSVGLinearGradient.h"
#include "experimental/svg/model/SkSVGRenderContext.h"
#include "experimental/svg/model/SkSVGValue.h"
#include "include/effects/SkGradientShader.h"
#include "modules/svg/include/SkSVGLinearGradient.h"
#include "modules/svg/include/SkSVGRenderContext.h"
#include "modules/svg/include/SkSVGValue.h"
SkSVGLinearGradient::SkSVGLinearGradient() : INHERITED(SkSVGTag::kLinearGradient) {}

View File

@ -5,12 +5,12 @@
* found in the LICENSE file.
*/
#include "experimental/svg/model/SkSVGNode.h"
#include "experimental/svg/model/SkSVGRenderContext.h"
#include "experimental/svg/model/SkSVGValue.h"
#include "include/core/SkCanvas.h"
#include "include/core/SkMatrix.h"
#include "include/pathops/SkPathOps.h"
#include "modules/svg/include/SkSVGNode.h"
#include "modules/svg/include/SkSVGRenderContext.h"
#include "modules/svg/include/SkSVGValue.h"
#include "src/core/SkTLazy.h"
SkSVGNode::SkSVGNode(SkSVGTag t) : fTag(t) { }

View File

@ -5,11 +5,11 @@
* found in the LICENSE file.
*/
#include "experimental/svg/model/SkSVGPath.h"
#include "experimental/svg/model/SkSVGRenderContext.h"
#include "experimental/svg/model/SkSVGValue.h"
#include "include/core/SkCanvas.h"
#include "include/core/SkPaint.h"
#include "modules/svg/include/SkSVGPath.h"
#include "modules/svg/include/SkSVGRenderContext.h"
#include "modules/svg/include/SkSVGValue.h"
SkSVGPath::SkSVGPath() : INHERITED(SkSVGTag::kPath) { }

View File

@ -5,12 +5,12 @@
* found in the LICENSE file.
*/
#include "experimental/svg/model/SkSVGPattern.h"
#include "modules/svg/include/SkSVGPattern.h"
#include "experimental/svg/model/SkSVGRenderContext.h"
#include "experimental/svg/model/SkSVGValue.h"
#include "include/core/SkPictureRecorder.h"
#include "include/core/SkShader.h"
#include "modules/svg/include/SkSVGRenderContext.h"
#include "modules/svg/include/SkSVGValue.h"
SkSVGPattern::SkSVGPattern() : INHERITED(SkSVGTag::kPattern) {}

View File

@ -5,10 +5,10 @@
* found in the LICENSE file.
*/
#include "experimental/svg/model/SkSVGPoly.h"
#include "experimental/svg/model/SkSVGRenderContext.h"
#include "experimental/svg/model/SkSVGValue.h"
#include "include/core/SkCanvas.h"
#include "modules/svg/include/SkSVGPoly.h"
#include "modules/svg/include/SkSVGRenderContext.h"
#include "modules/svg/include/SkSVGValue.h"
#include "src/core/SkTLazy.h"
SkSVGPoly::SkSVGPoly(SkSVGTag t) : INHERITED(t) {}

View File

@ -5,10 +5,10 @@
* found in the LICENSE file.
*/
#include "experimental/svg/model/SkSVGRadialGradient.h"
#include "experimental/svg/model/SkSVGRenderContext.h"
#include "experimental/svg/model/SkSVGValue.h"
#include "include/effects/SkGradientShader.h"
#include "modules/svg/include/SkSVGRadialGradient.h"
#include "modules/svg/include/SkSVGRenderContext.h"
#include "modules/svg/include/SkSVGValue.h"
SkSVGRadialGradient::SkSVGRadialGradient() : INHERITED(SkSVGTag::kRadialGradient) {}

View File

@ -5,11 +5,11 @@
* found in the LICENSE file.
*/
#include "experimental/svg/model/SkSVGRect.h"
#include "experimental/svg/model/SkSVGRenderContext.h"
#include "experimental/svg/model/SkSVGValue.h"
#include "include/core/SkCanvas.h"
#include "include/core/SkRect.h"
#include "modules/svg/include/SkSVGRect.h"
#include "modules/svg/include/SkSVGRenderContext.h"
#include "modules/svg/include/SkSVGValue.h"
SkSVGRect::SkSVGRect() : INHERITED(SkSVGTag::kRect) {}

View File

@ -5,15 +5,15 @@
* found in the LICENSE file.
*/
#include "experimental/svg/model/SkSVGRenderContext.h"
#include "modules/svg/include/SkSVGRenderContext.h"
#include "experimental/svg/model/SkSVGAttribute.h"
#include "experimental/svg/model/SkSVGNode.h"
#include "experimental/svg/model/SkSVGTypes.h"
#include "include/core/SkCanvas.h"
#include "include/core/SkPath.h"
#include "include/effects/SkDashPathEffect.h"
#include "include/private/SkTo.h"
#include "modules/svg/include/SkSVGAttribute.h"
#include "modules/svg/include/SkSVGNode.h"
#include "modules/svg/include/SkSVGTypes.h"
namespace {

View File

@ -5,10 +5,10 @@
* found in the LICENSE file.
*/
#include "experimental/svg/model/SkSVGRenderContext.h"
#include "experimental/svg/model/SkSVGSVG.h"
#include "experimental/svg/model/SkSVGValue.h"
#include "include/core/SkCanvas.h"
#include "modules/svg/include/SkSVGRenderContext.h"
#include "modules/svg/include/SkSVGSVG.h"
#include "modules/svg/include/SkSVGValue.h"
SkSVGSVG::SkSVGSVG() : INHERITED(SkSVGTag::kSvg) { }

View File

@ -5,8 +5,8 @@
* found in the LICENSE file.
*/
#include "experimental/svg/model/SkSVGRenderContext.h"
#include "experimental/svg/model/SkSVGShape.h"
#include "modules/svg/include/SkSVGRenderContext.h"
#include "modules/svg/include/SkSVGShape.h"
SkSVGShape::SkSVGShape(SkSVGTag t) : INHERITED(t) {}

View File

@ -5,9 +5,9 @@
* found in the LICENSE file.
*/
#include "experimental/svg/model/SkSVGRenderContext.h"
#include "experimental/svg/model/SkSVGStop.h"
#include "experimental/svg/model/SkSVGValue.h"
#include "modules/svg/include/SkSVGRenderContext.h"
#include "modules/svg/include/SkSVGStop.h"
#include "modules/svg/include/SkSVGValue.h"
SkSVGStop::SkSVGStop() : INHERITED(SkSVGTag::kStop) {}

View File

@ -5,13 +5,13 @@
* found in the LICENSE file.
*/
#include "experimental/svg/model/SkSVGText.h"
#include "modules/svg/include/SkSVGText.h"
#include "experimental/svg/model/SkSVGRenderContext.h"
#include "experimental/svg/model/SkSVGValue.h"
#include "include/core/SkCanvas.h"
#include "include/core/SkFontStyle.h"
#include "include/core/SkString.h"
#include "modules/svg/include/SkSVGRenderContext.h"
#include "modules/svg/include/SkSVGValue.h"
SkSVGText::SkSVGText() : INHERITED(SkSVGTag::kText) {}

View File

@ -5,10 +5,10 @@
* found in the LICENSE file.
*/
#include "experimental/svg/model/SkSVGRenderContext.h"
#include "experimental/svg/model/SkSVGTransformableNode.h"
#include "experimental/svg/model/SkSVGValue.h"
#include "include/core/SkCanvas.h"
#include "modules/svg/include/SkSVGRenderContext.h"
#include "modules/svg/include/SkSVGTransformableNode.h"
#include "modules/svg/include/SkSVGValue.h"
SkSVGTransformableNode::SkSVGTransformableNode(SkSVGTag tag)
: INHERITED(tag)

View File

@ -5,11 +5,11 @@
* found in the LICENSE file.
*/
#include "experimental/svg/model/SkSVGUse.h"
#include "modules/svg/include/SkSVGUse.h"
#include "experimental/svg/model/SkSVGRenderContext.h"
#include "experimental/svg/model/SkSVGValue.h"
#include "include/core/SkCanvas.h"
#include "modules/svg/include/SkSVGRenderContext.h"
#include "modules/svg/include/SkSVGValue.h"
SkSVGUse::SkSVGUse() : INHERITED(SkSVGTag::kUse) {}

67
modules/svg/svg.gni Normal file
View File

@ -0,0 +1,67 @@
# Copyright 2020 Google Inc.
#
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# Things are easiest for everyone if these source paths are absolute.
_src = get_path_info("src", "abspath")
_include = get_path_info("include", "abspath")
skia_svg_public = [
"$_include/SkSVGAttribute.h",
"$_include/SkSVGAttributeParser.h",
"$_include/SkSVGCircle.h",
"$_include/SkSVGClipPath.h",
"$_include/SkSVGContainer.h",
"$_include/SkSVGDefs.h",
"$_include/SkSVGDOM.h",
"$_include/SkSVGEllipse.h",
"$_include/SkSVGG.h",
"$_include/SkSVGGradient.h",
"$_include/SkSVGHiddenContainer.h",
"$_include/SkSVGIDMapper.h",
"$_include/SkSVGLinearGradient.h",
"$_include/SkSVGLine.h",
"$_include/SkSVGNode.h",
"$_include/SkSVGPath.h",
"$_include/SkSVGPattern.h",
"$_include/SkSVGPoly.h",
"$_include/SkSVGRadialGradient.h",
"$_include/SkSVGRect.h",
"$_include/SkSVGRenderContext.h",
"$_include/SkSVGShape.h",
"$_include/SkSVGStop.h",
"$_include/SkSVGSVG.h",
"$_include/SkSVGText.h",
"$_include/SkSVGTransformableNode.h",
"$_include/SkSVGTypes.h",
"$_include/SkSVGUse.h",
"$_include/SkSVGValue.h",
]
skia_svg_sources = [
"$_src/SkSVGAttribute.cpp",
"$_src/SkSVGAttributeParser.cpp",
"$_src/SkSVGCircle.cpp",
"$_src/SkSVGClipPath.cpp",
"$_src/SkSVGContainer.cpp",
"$_src/SkSVGDOM.cpp",
"$_src/SkSVGEllipse.cpp",
"$_src/SkSVGGradient.cpp",
"$_src/SkSVGLine.cpp",
"$_src/SkSVGLinearGradient.cpp",
"$_src/SkSVGNode.cpp",
"$_src/SkSVGPath.cpp",
"$_src/SkSVGPattern.cpp",
"$_src/SkSVGPoly.cpp",
"$_src/SkSVGRadialGradient.cpp",
"$_src/SkSVGRect.cpp",
"$_src/SkSVGRenderContext.cpp",
"$_src/SkSVGSVG.cpp",
"$_src/SkSVGShape.cpp",
"$_src/SkSVGStop.cpp",
"$_src/SkSVGText.cpp",
"$_src/SkSVGTransformableNode.cpp",
"$_src/SkSVGUse.cpp",
"$_src/SkSVGValue.cpp",
]

View File

@ -7,11 +7,11 @@
#include <iostream>
#include "experimental/svg/model/SkSVGDOM.h"
#include "include/core/SkMatrix.h"
#include "include/core/SkStream.h"
#include "include/core/SkSurface.h"
#include "include/encode/SkPngEncoder.h"
#include "modules/svg/include/SkSVGDOM.h"
#include "tools/flags/CommandLineFlags.h"
static DEFINE_string2(input , i, nullptr, "Input SVG file.");

View File

@ -566,12 +566,13 @@ DM_SRCS_ALL = struct(
"dm/*.h",
"experimental/pipe/*.cpp",
"experimental/pipe/*.h",
"experimental/svg/model/*.cpp",
"experimental/svg/model/*.h",
"gm/*.cpp",
"gm/*.h",
"gm/verifiers/*.cpp",
"gm/verifiers/*.h",
# TODO(fmalita): SVG sources should not be included here
"modules/svg/include/*.h",
"modules/svg/src/*.cpp",
"src/utils/SkMultiPictureDocument.cpp",
"src/xml/*.cpp",
"tests/*.cpp",
@ -987,17 +988,21 @@ SKOTTIE_IOS_LIB_SDK_FRAMEWORKS = [
################################################################################
def svg_lib_hdrs():
return native.glob(["experimental/svg/model/*.h"])
return native.glob([
# transitional headers, to be removed
"experimental/svg/model/*.h",
"modules/svg/include/*.h",
])
def svg_lib_srcs():
return native.glob(["experimental/svg/model/*.cpp"])
return native.glob(["modules/svg/src/*.cpp"])
################################################################################
## svg_tool
################################################################################
SVG_TOOL_SRCS = [
"experimental/svg/utils/SvgTool.cpp",
"modules/svg/utils/SvgTool.cpp",
# TODO(benjaminwagner): Add "flags" target.
"tools/flags/CommandLineFlags.cpp",
"tools/flags/CommandLineFlags.h",

View File

@ -9,10 +9,10 @@
#ifdef SK_XML
#include "experimental/svg/model/SkSVGDOM.h"
#include "include/core/SkCanvas.h"
#include "include/core/SkRect.h"
#include "include/core/SkStream.h"
#include "modules/svg/include/SkSVGDOM.h"
#include "samplecode/Sample.h"
#include "src/core/SkOSFile.h"
#include "src/utils/SkOSPath.h"

View File

@ -9,9 +9,9 @@
#ifdef SK_XML
#include "experimental/svg/model/SkSVGDOM.h"
#include "include/core/SkCanvas.h"
#include "include/core/SkStream.h"
#include "modules/svg/include/SkSVGDOM.h"
#include "samplecode/Sample.h"
#include "src/core/SkOSFile.h"
#include "src/utils/SkOSPath.h"

View File

@ -1,7 +1,6 @@
// Copyright 2019 Google LLC.
// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
#include "experimental/svg/model/SkSVGDOM.h"
#include "gm/gm.h"
#include "include/codec/SkCodec.h"
#include "include/core/SkCanvas.h"
@ -13,6 +12,7 @@
#include "include/gpu/GrContextOptions.h"
#include "include/gpu/GrDirectContext.h"
#include "include/private/SkTHash.h"
#include "modules/svg/include/SkSVGDOM.h"
#include "src/core/SkColorSpacePriv.h"
#include "src/core/SkMD5.h"
#include "src/core/SkOSFile.h"

View File

@ -9,7 +9,6 @@
#ifdef SK_XML
#include "experimental/svg/model/SkSVGDOM.h"
#include "include/core/SkBitmap.h"
#include "include/core/SkCanvas.h"
#include "include/core/SkColor.h"
@ -30,6 +29,7 @@
#include "include/private/SkTDArray.h"
#include "include/private/SkTemplates.h"
#include "include/utils/SkNoDrawCanvas.h"
#include "modules/svg/include/SkSVGDOM.h"
#include "src/core/SkAdvancedTypefaceMetrics.h"
#include "src/core/SkFontDescriptor.h"
#include "src/core/SkFontPriv.h"

View File

@ -39,7 +39,8 @@ roots = [
# Don't count our local Vulkan headers as Skia headers;
# we don't want #include <vulkan/vulkan_foo.h> rewritten to point to them.
# Nor do we care about things in node_modules, used by *Kits.
ignorelist = ['include/third_party/vulkan', 'node_modules']
# Also ignore transitional SVG headers.
ignorelist = ['include/third_party/vulkan', 'node_modules', 'experimental/svg/model']
assert '/' in [os.sep, os.altsep]
def fix_path(p):

View File

@ -34,7 +34,7 @@
#include "tools/gpu/GrContextFactory.h"
#ifdef SK_XML
#include "experimental/svg/model/SkSVGDOM.h"
#include "modules/svg/include/SkSVGDOM.h"
#include "src/xml/SkDOM.h"
#endif

View File

@ -14,7 +14,7 @@
#include <utility>
#ifdef SK_XML
#include "experimental/svg/model/SkSVGDOM.h"
#include "modules/svg/include/SkSVGDOM.h"
#include "src/xml/SkDOM.h"
#endif

Some files were not shown because too many files have changed in this diff Show More