Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(513)

Unified Diff: src/record/SkRecordDraw.cpp

Issue 231933003: SkRecordDraw: don't bother clipping an empty clip down further (Closed) Base URL: https://skia.googlesource.com/skia.git@clipping
Patch Set: add test Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | tests/RecordDrawTest.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/record/SkRecordDraw.cpp
diff --git a/src/record/SkRecordDraw.cpp b/src/record/SkRecordDraw.cpp
index 4782344bed241b66337c534f96b85e97eb72f961..ddde2fede80ed1a528fe7143a9c97e87fc9b124f 100644
--- a/src/record/SkRecordDraw.cpp
+++ b/src/record/SkRecordDraw.cpp
@@ -37,13 +37,20 @@ template <> void Draw::operator()(const SkRecords::PushCull& r) {
template <> void Draw::operator()(const SkRecords::T& r) { fCanvas->call; this->updateClip(); }
CASE(Restore, restore());
CASE(SaveLayer, saveLayer(r.bounds, r.paint, r.flags));
+#undef CASE
+
+// These certainly do change the clip,
+// but we can skip them if they're intersecting with a clip that's already empty.
+#define CASE(T, call) template <> void Draw::operator()(const SkRecords::T& r) { \
+ if (!(fClipEmpty && SkRegion::kIntersect_Op == r.op)) { fCanvas->call; this->updateClip(); } \
+}
CASE(ClipPath, clipPath(r.path, r.op, r.doAA));
CASE(ClipRRect, clipRRect(r.rrect, r.op, r.doAA));
CASE(ClipRect, clipRect(r.rect, r.op, r.doAA));
CASE(ClipRegion, clipRegion(r.region, r.op));
#undef CASE
-// Commands which must run regardless of the clip.
+// Commands which must run regardless of the clip, but don't change it themselves.
#define CASE(T, call) \
template <> void Draw::operator()(const SkRecords::T& r) { fCanvas->call; }
CASE(Save, save(r.flags));
« no previous file with comments | « no previous file | tests/RecordDrawTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698