diff options
author | Florin Malita <fmalita@chromium.org> | 2018-07-09 16:20:47 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2018-07-10 13:28:15 +0000 |
commit | 418e658a6922923f8d1e1ce2cf00f0a0f6b18ff3 (patch) | |
tree | 3454ad2c2d0a10f2561511ab977753a7cffcc40e /modules/sksg | |
parent | 6d98257725b59e01a1a844b1b9c9e80912512b49 (diff) |
[skottie] Apply fully opaque masks as clips
We already have a clip optimization when there is only one opaque mask.
Extend to cover multiple opaque masks, using Merge scene nodes.
TBR=
Change-Id: I24b61f0c0d080b13438c6777e98a8e2fefd09fdd
Reviewed-on: https://skia-review.googlesource.com/140002
Reviewed-by: Florin Malita <fmalita@chromium.org>
Commit-Queue: Florin Malita <fmalita@chromium.org>
Diffstat (limited to 'modules/sksg')
-rw-r--r-- | modules/sksg/include/SkSGMerge.h | 16 | ||||
-rw-r--r-- | modules/sksg/src/SkSGMerge.cpp | 42 |
2 files changed, 37 insertions, 21 deletions
diff --git a/modules/sksg/include/SkSGMerge.h b/modules/sksg/include/SkSGMerge.h index 54924d6475..c4957f45a1 100644 --- a/modules/sksg/include/SkSGMerge.h +++ b/modules/sksg/include/SkSGMerge.h @@ -36,8 +36,13 @@ public: kXOR, }; - static sk_sp<Merge> Make(std::vector<sk_sp<GeometryNode>>&& geos, Mode mode) { - return sk_sp<Merge>(new Merge(std::move(geos), mode)); + struct Rec { + sk_sp<GeometryNode> fGeo; + Mode fMode; + }; + + static sk_sp<Merge> Make(std::vector<Rec>&& recs) { + return sk_sp<Merge>(new Merge(std::move(recs))); } ~Merge() override; @@ -50,11 +55,10 @@ protected: SkPath onAsPath() const override; private: - Merge(std::vector<sk_sp<GeometryNode>>&& geos, Mode); + Merge(std::vector<Rec>&& recs); - std::vector<sk_sp<GeometryNode>> fGeos; - SkPath fMerged; - Mode fMode; + const std::vector<Rec> fRecs; + SkPath fMerged; using INHERITED = GeometryNode; }; diff --git a/modules/sksg/src/SkSGMerge.cpp b/modules/sksg/src/SkSGMerge.cpp index be1ff4123a..ff50021047 100644 --- a/modules/sksg/src/SkSGMerge.cpp +++ b/modules/sksg/src/SkSGMerge.cpp @@ -12,17 +12,16 @@ namespace sksg { -Merge::Merge(std::vector<sk_sp<GeometryNode>>&& geos, Mode mode) - : fGeos(std::move(geos)) - , fMode(mode) { - for (const auto& geo : fGeos) { - this->observeInval(geo); +Merge::Merge(std::vector<Rec>&& recs) + : fRecs(std::move(recs)) { + for (const auto& rec : fRecs) { + this->observeInval(rec.fGeo); } } Merge::~Merge() { - for (const auto& geo : fGeos) { - this->unobserveInval(geo); + for (const auto& rec : fRecs) { + this->unobserveInval(rec.fGeo); } } @@ -60,21 +59,34 @@ static SkPathOp mode_to_op(Merge::Mode mode) { SkRect Merge::onRevalidate(InvalidationController* ic, const SkMatrix& ctm) { SkASSERT(this->hasInval()); - const auto op = mode_to_op(fMode); SkOpBuilder builder; fMerged.reset(); + bool in_builder = false; - for (const auto& geo : fGeos) { - geo->revalidate(ic, ctm); - if (fMode == Mode::kMerge) { - fMerged.addPath(geo->asPath()); - } else { - builder.add(geo->asPath(), geo == fGeos.front() ? kUnion_SkPathOp : op); + for (const auto& rec : fRecs) { + rec.fGeo->revalidate(ic, ctm); + + // Merge is not currently supported by SkOpBuidler. + if (rec.fMode == Mode::kMerge) { + if (in_builder) { + builder.resolve(&fMerged); + in_builder = false; + } + + fMerged.addPath(rec.fGeo->asPath()); + continue; } + + if (!in_builder) { + builder.add(fMerged, kUnion_SkPathOp); + in_builder = true; + } + + builder.add(rec.fGeo->asPath(), mode_to_op(rec.fMode)); } - if (fMode != Mode::kMerge) { + if (in_builder) { builder.resolve(&fMerged); } |