Index: src/core/SkCanvas.cpp |
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp |
index 08b09e8e2b6e970b06d93c0449b9af8859573173..c2e36b319157c85ac5cb25e3b15d9f8113d51017 100644 |
--- a/src/core/SkCanvas.cpp |
+++ b/src/core/SkCanvas.cpp |
@@ -791,11 +791,18 @@ static bool bounds_affects_clip(SkCanvas::SaveFlags flags) { |
} |
bool SkCanvas::clipRectBounds(const SkRect* bounds, SaveFlags flags, |
- SkIRect* intersection) { |
+ SkIRect* intersection, const SkImageFilter* imageFilter) { |
SkIRect clipBounds; |
+ SkRegion::Op op = SkRegion::kIntersect_Op; |
if (!this->getClipDeviceBounds(&clipBounds)) { |
return false; |
} |
+ |
+ if (imageFilter) { |
+ imageFilter->filterBounds(clipBounds, *fMCRec->fMatrix, &clipBounds); |
+ // Filters may grow the bounds beyond the device bounds. |
+ op = SkRegion::kReplace_Op; |
+ } |
SkIRect ir; |
if (NULL != bounds) { |
SkRect r; |
@@ -813,11 +820,11 @@ bool SkCanvas::clipRectBounds(const SkRect* bounds, SaveFlags flags, |
ir = clipBounds; |
} |
- fClipStack.clipDevRect(ir, SkRegion::kIntersect_Op); |
+ fClipStack.clipDevRect(ir, op); |
// early exit if the clip is now empty |
if (bounds_affects_clip(flags) && |
- !fMCRec->fRasterClip->op(ir, SkRegion::kIntersect_Op)) { |
+ !fMCRec->fRasterClip->op(ir, op)) { |
return false; |
} |
@@ -841,7 +848,7 @@ int SkCanvas::internalSaveLayer(const SkRect* bounds, const SkPaint* paint, |
fDeviceCMDirty = true; |
SkIRect ir; |
- if (!this->clipRectBounds(bounds, flags, &ir)) { |
+ if (!this->clipRectBounds(bounds, flags, &ir, paint ? paint->getImageFilter() : NULL)) { |
return count; |
} |