From cd05b196099492da8f4badd3d47a906395fc0b79 Mon Sep 17 00:00:00 2001 From: Florin Malita Date: Wed, 25 Apr 2018 21:43:03 -0400 Subject: [skottie] Add support for inverse mask paths TBR= Change-Id: I442033b2e82777c90ee497d8a5b2310af1d2e631 Reviewed-on: https://skia-review.googlesource.com/123840 Reviewed-by: Florin Malita Commit-Queue: Florin Malita --- experimental/skottie/Skottie.cpp | 11 ++++------- experimental/sksg/SkSGNode.h | 10 +++++++++- experimental/sksg/geometry/SkSGPath.cpp | 8 +++++++- experimental/sksg/geometry/SkSGPath.h | 1 + 4 files changed, 21 insertions(+), 9 deletions(-) (limited to 'experimental') diff --git a/experimental/skottie/Skottie.cpp b/experimental/skottie/Skottie.cpp index 7486502f2e..194efe70c4 100644 --- a/experimental/skottie/Skottie.cpp +++ b/experimental/skottie/Skottie.cpp @@ -949,19 +949,16 @@ sk_sp AttachMask(const Json::Value& jmask, if (!m.isObject()) continue; - const auto inverted = ParseDefault(m["inv"], false); - // TODO - if (inverted) { - LogFail(m, "Unsupported inverse mask"); - continue; - } - auto mask_path = AttachPath(m["pt"], ctx); if (!mask_path) { LogFail(m, "Could not parse mask path"); continue; } + mask_path->setFillType(ParseDefault(m["inv"], false) + ? SkPath::kInverseWinding_FillType + : SkPath::kWinding_FillType); + SkString mode; if (!Parse(m["mode"], &mode) || mode.size() != 1 || diff --git a/experimental/sksg/SkSGNode.h b/experimental/sksg/SkSGNode.h index 6396e4d33e..17619de485 100644 --- a/experimental/sksg/SkSGNode.h +++ b/experimental/sksg/SkSGNode.h @@ -92,7 +92,15 @@ private: if (attr_container == v) return; \ attr_container = v; \ this->invalidate(); \ - } + } + +#define SG_MAPPED_ATTRIBUTE(attr_name, attr_type, attr_container) \ + attr_type get##attr_name() const { return attr_container.get##attr_name(); } \ + void set##attr_name(const attr_type& v) { \ + if (attr_container.get##attr_name() == v) return; \ + attr_container.set##attr_name(v); \ + this->invalidate(); \ + } } // namespace sksg diff --git a/experimental/sksg/geometry/SkSGPath.cpp b/experimental/sksg/geometry/SkSGPath.cpp index 8d5a25373a..230442d409 100644 --- a/experimental/sksg/geometry/SkSGPath.cpp +++ b/experimental/sksg/geometry/SkSGPath.cpp @@ -9,6 +9,7 @@ #include "SkCanvas.h" #include "SkPaint.h" +#include "SkRectPriv.h" namespace sksg { @@ -25,7 +26,12 @@ void Path::onDraw(SkCanvas* canvas, const SkPaint& paint) const { SkRect Path::onRevalidate(InvalidationController*, const SkMatrix&) { SkASSERT(this->hasInval()); - return fPath.computeTightBounds(); + const auto ft = fPath.getFillType(); + return (ft == SkPath::kWinding_FillType || ft == SkPath::kEvenOdd_FillType) + // "Containing" fills have finite bounds. + ? fPath.computeTightBounds() + // Inverse fills are "infinite". + : SkRectPriv::MakeLargeS32(); } SkPath Path::onAsPath() const { diff --git a/experimental/sksg/geometry/SkSGPath.h b/experimental/sksg/geometry/SkSGPath.h index a398e2f0a4..1a8718868d 100644 --- a/experimental/sksg/geometry/SkSGPath.h +++ b/experimental/sksg/geometry/SkSGPath.h @@ -26,6 +26,7 @@ public: static sk_sp Make(const SkPath& r) { return sk_sp(new Path(r)); } SG_ATTRIBUTE(Path, SkPath, fPath) + SG_MAPPED_ATTRIBUTE(FillType, SkPath::FillType, fPath) protected: void onClip(SkCanvas*, bool antiAlias) const override; -- cgit v1.2.3