diff options
author | 2012-12-12 17:58:15 +0000 | |
---|---|---|
committer | 2012-12-12 17:58:15 +0000 | |
commit | 8cdf0f52ff395d4053f7ed5c20861c42eba25d31 (patch) | |
tree | 4455a49c8761c38b489ab5dd2733d9066ef503de /src | |
parent | 31114c69f39befd50d2b755b7d0dd1cda2c6d2ab (diff) |
Adding quickContains API method to SkClipStack
BUG=http://code.google.com/p/chromium/issues/detail?id=164580
TEST=unit test ClipStack/quickContains
Review URL: https://codereview.appspot.com/6919044
git-svn-id: http://skia.googlecode.com/svn/trunk@6760 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src')
-rw-r--r-- | src/core/SkClipStack.cpp | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/src/core/SkClipStack.cpp b/src/core/SkClipStack.cpp index bb4ea0801f..9afef3f311 100644 --- a/src/core/SkClipStack.cpp +++ b/src/core/SkClipStack.cpp @@ -497,6 +497,31 @@ bool SkClipStack::intersectRectWithClip(SkRect* rect) const { } } +bool SkClipStack::quickContains(const SkRect& rect) const { + + Iter iter(*this, Iter::kTop_IterStart); + const Element* element = iter.prev(); + while (element != NULL) { + if (SkRegion::kIntersect_Op != element->getOp() && SkRegion::kReplace_Op != element->getOp()) + return false; + if (element->isInverseFilled()) { + // Part of 'rect' could be trimmed off by the inverse-filled clip element + if (SkRect::Intersects(element->getBounds(), rect)) { + return false; + } + } else { + if (!element->contains(rect)) { + return false; + } + } + if (SkRegion::kReplace_Op == element->getOp()) { + break; + } + element = iter.prev(); + } + return true; +} + void SkClipStack::clipDevRect(const SkRect& rect, SkRegion::Op op, bool doAA) { // Use reverse iterator instead of back because Rect path may need previous |