| Index: src/core/SkRasterClip.cpp
|
| diff --git a/src/core/SkRasterClip.cpp b/src/core/SkRasterClip.cpp
|
| index d1615a3445f6348fef5e3cf7cdd3d3a916fa8aa0..dab91d8f4ce31434af80839208961509e5746761 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);
|
|
|