diff options
author | reed <reed@google.com> | 2014-08-07 09:20:12 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-08-07 09:20:12 -0700 |
commit | 592cb8d552556b1e922887d506d00b64bc5d0547 (patch) | |
tree | 339dec7609c69661b75dae70c8d4c928fc324c20 /src/core/SkAAClip.cpp | |
parent | bb204f4917aff10fcb65d29a2d96e53a9611c559 (diff) |
add isRect() check to AAClip, to detect if a soft-clip is really just an irect
BUG=skia:
R=bsalomon@google.com, humper@google.com
Author: reed@google.com
Review URL: https://codereview.chromium.org/445233006
Diffstat (limited to 'src/core/SkAAClip.cpp')
-rw-r--r-- | src/core/SkAAClip.cpp | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/src/core/SkAAClip.cpp b/src/core/SkAAClip.cpp index 14152f8317..54a6dcd795 100644 --- a/src/core/SkAAClip.cpp +++ b/src/core/SkAAClip.cpp @@ -684,6 +684,35 @@ bool SkAAClip::setRect(const SkIRect& bounds) { #endif } +bool SkAAClip::isRect() const { + if (this->isEmpty()) { + return false; + } + + const RunHead* head = fRunHead; + if (head->fRowCount != 1) { + return false; + } + const YOffset* yoff = head->yoffsets(); + if (yoff->fY != fBounds.fBottom - 1) { + return false; + } + SkASSERT(0 == yoff->fOffset); + + const uint8_t* row = head->data(); + int width = fBounds.width(); + do { + if (row[1] != 0xFF) { + return false; + } + int n = row[0]; + SkASSERT(n <= width); + width -= n; + row += 2; + } while (width > 0); + return true; +} + bool SkAAClip::setRect(const SkRect& r, bool doAA) { if (r.isEmpty()) { return this->setEmpty(); |