Simplify empty-clip check.

No measurable playback speed difference, but simpler code.

This makes sense: I'm seeing SkRecordDraw at ~0.25% of playback cost.  We can
pretty much do whatever we want in there for free if it helps avoid real work.

BUG=skia:2378
R=fmalita@chromium.org, mtklein@google.com, reed@google.com

Author: mtklein@chromium.org

Review URL: https://codereview.chromium.org/260143002

git-svn-id: http://skia.googlecode.com/svn/trunk@14419 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
commit-bot@chromium.org 2014-04-28 19:49:00 +00:00
parent 06d4cda5f0
commit 0974a618fe

View File

@ -11,16 +11,10 @@
namespace { namespace {
// All clip commands, Restore, and SaveLayer may change the clip.
template <typename T> struct ChangesClip { static const bool value = SkRecords::IsClip<T>::value; };
template <> struct ChangesClip<SkRecords::Restore> { static const bool value = true; };
template <> struct ChangesClip<SkRecords::SaveLayer> { static const bool value = true; };
// This is an SkRecord visitor that will draw that SkRecord to an SkCanvas. // This is an SkRecord visitor that will draw that SkRecord to an SkCanvas.
class Draw : SkNoncopyable { class Draw : SkNoncopyable {
public: public:
explicit Draw(SkCanvas* canvas) : fCanvas(canvas), fIndex(0), fClipEmpty(false) {} explicit Draw(SkCanvas* canvas) : fCanvas(canvas), fIndex(0) {}
unsigned index() const { return fIndex; } unsigned index() const { return fIndex; }
void next() { ++fIndex; } void next() { ++fIndex; }
@ -28,7 +22,6 @@ public:
template <typename T> void operator()(const T& r) { template <typename T> void operator()(const T& r) {
if (!this->skip(r)) { if (!this->skip(r)) {
this->draw(r); this->draw(r);
this->updateClip<T>();
} }
} }
@ -41,7 +34,7 @@ private:
// If we're drawing into an empty clip, we can skip it. Otherwise, run the command. // If we're drawing into an empty clip, we can skip it. Otherwise, run the command.
template <typename T> template <typename T>
SK_WHEN(SkRecords::IsDraw<T>, bool) skip(const T&) { return fClipEmpty; } SK_WHEN(SkRecords::IsDraw<T>, bool) skip(const T&) { return fCanvas->isClipEmpty(); }
template <typename T> template <typename T>
SK_WHEN(!SkRecords::IsDraw<T>, bool) skip(const T&) { return false; } SK_WHEN(!SkRecords::IsDraw<T>, bool) skip(const T&) { return false; }
@ -59,15 +52,8 @@ private:
return this->skip(*r.base) || fCanvas->quickRejectY(r.minY, r.maxY); return this->skip(*r.base) || fCanvas->quickRejectY(r.minY, r.maxY);
} }
// If we might have changed the clip, update it, else do nothing.
template <typename T>
SK_WHEN(ChangesClip<T>, void) updateClip() { fClipEmpty = fCanvas->isClipEmpty(); }
template <typename T>
SK_WHEN(!ChangesClip<T>, void) updateClip() {}
SkCanvas* fCanvas; SkCanvas* fCanvas;
unsigned fIndex; unsigned fIndex;
bool fClipEmpty;
}; };
// NoOps draw nothing. // NoOps draw nothing.