From ff2de7cb94847f7e6ad3f5c0047eb6b4815eee2e Mon Sep 17 00:00:00 2001 From: "commit-bot@chromium.org" Date: Thu, 10 Apr 2014 02:26:33 +0000 Subject: SkRecordDraw: don't bother clipping an empty clip down further BUG=skia:2378 R=fmalita@chromium.org, mtklein@google.com, fmalita@google.com Author: mtklein@chromium.org Review URL: https://codereview.chromium.org/231933003 git-svn-id: http://skia.googlecode.com/svn/trunk@14126 2bbb7eff-a529-9590-31e7-b0007b416f81 --- src/record/SkRecordDraw.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/record/SkRecordDraw.cpp b/src/record/SkRecordDraw.cpp index 4782344bed..ddde2fede8 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)); -- cgit v1.2.3