diff options
author | reed <reed@google.com> | 2014-09-05 17:37:38 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-09-05 17:37:38 -0700 |
commit | d64c9487135094c83f658319f53ea2005ecc08b2 (patch) | |
tree | 4e717f4ff95cf6b1a97f3991dc114830dcd2920b /src/core/SkRasterClip.cpp | |
parent | 2a9ca782ba5db5a7ebdc315655d9a30dcd6d9845 (diff) |
move rasterclip_ helper into rasterclip
R=robertphillips@google.com, reed@chromium.org
Author: reed@google.com
Review URL: https://codereview.chromium.org/546113002
Diffstat (limited to 'src/core/SkRasterClip.cpp')
-rw-r--r-- | src/core/SkRasterClip.cpp | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/src/core/SkRasterClip.cpp b/src/core/SkRasterClip.cpp index d1615a3445..dab91d8f4c 100644 --- a/src/core/SkRasterClip.cpp +++ b/src/core/SkRasterClip.cpp @@ -86,6 +86,39 @@ bool SkRasterClip::setPath(const SkPath& path, const SkRegion& clip, bool doAA) return this->updateCacheAndReturnNonEmpty(); } +bool SkRasterClip::op(const SkPath& path, const SkISize& size, SkRegion::Op op, bool doAA) { + // base is used to limit the size (and therefore memory allocation) of the + // region that results from scan converting devPath. + SkRegion base; + + if (SkRegion::kIntersect_Op == op) { + // since we are intersect, we can do better (tighter) with currRgn's + // bounds, than just using the device. However, if currRgn is complex, + // our region blitter may hork, so we do that case in two steps. + if (this->isRect()) { + // FIXME: we should also be able to do this when this->isBW(), + // but relaxing the test above triggers GM asserts in + // SkRgnBuilder::blitH(). We need to investigate what's going on. + return this->setPath(path, this->bwRgn(), doAA); + } else { + base.setRect(this->getBounds()); + SkRasterClip clip; + clip.setPath(path, base, doAA); + return this->op(clip, op); + } + } else { + base.setRect(0, 0, size.width(), size.height()); + + if (SkRegion::kReplace_Op == op) { + return this->setPath(path, base, doAA); + } else { + SkRasterClip clip; + clip.setPath(path, base, doAA); + return this->op(clip, op); + } + } +} + bool SkRasterClip::setPath(const SkPath& path, const SkIRect& clip, bool doAA) { SkRegion tmp; tmp.setRect(clip); |