| Index: src/core/SkCanvas.cpp | 
| diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp | 
| index 55b3b7ba7a7987ec878e82692eb94fc94cf98506..a31ded05864a9b436532e6320f09e8efc413cd7d 100644 | 
| --- a/src/core/SkCanvas.cpp | 
| +++ b/src/core/SkCanvas.cpp | 
| @@ -833,7 +833,6 @@ static bool bounds_affects_clip(SkCanvas::SaveFlags flags) { | 
| bool SkCanvas::clipRectBounds(const SkRect* bounds, SaveFlags flags, | 
| SkIRect* intersection, const SkImageFilter* imageFilter) { | 
| SkIRect clipBounds; | 
| -    SkRegion::Op op = SkRegion::kIntersect_Op; | 
| if (!this->getClipDeviceBounds(&clipBounds)) { | 
| return false; | 
| } | 
| @@ -842,8 +841,6 @@ bool SkCanvas::clipRectBounds(const SkRect* bounds, SaveFlags flags, | 
|  | 
| if (imageFilter) { | 
| imageFilter->filterBounds(clipBounds, ctm, &clipBounds); | 
| -        // Filters may grow the bounds beyond the device bounds. | 
| -        op = SkRegion::kReplace_Op; | 
| } | 
| SkIRect ir; | 
| if (bounds) { | 
| @@ -862,14 +859,13 @@ bool SkCanvas::clipRectBounds(const SkRect* bounds, SaveFlags flags, | 
| } else {    // no user bounds, so just use the clip | 
| ir = clipBounds; | 
| } | 
| +    SkASSERT(!ir.isEmpty()); | 
|  | 
| if (bounds_affects_clip(flags)) { | 
| +        // Simplify the current clips since they will be applied properly during restore() | 
| fCachedLocalClipBoundsDirty = true; | 
| -        fClipStack->clipDevRect(ir, op); | 
| -        // early exit if the clip is now empty | 
| -        if (!fMCRec->fRasterClip.op(ir, op)) { | 
| -            return false; | 
| -        } | 
| +        fClipStack->clipDevRect(ir, SkRegion::kReplace_Op); | 
| +        fMCRec->fRasterClip.setRect(ir); | 
| } | 
|  | 
| if (intersection) { | 
|  |