Index: src/core/SkBBoxRecord.cpp |
diff --git a/src/core/SkBBoxRecord.cpp b/src/core/SkBBoxRecord.cpp |
index a40ea8ba0d27e531e997dfaa922488e0c19433a3..448e8f65f48adb993949e55de6fcaa0f6ddc74e1 100644 |
--- a/src/core/SkBBoxRecord.cpp |
+++ b/src/core/SkBBoxRecord.cpp |
@@ -8,6 +8,10 @@ |
#include "SkBBoxRecord.h" |
+SkBBoxRecord::~SkBBoxRecord() { |
+ fSaveStack.deleteAll(); |
+} |
+ |
void SkBBoxRecord::drawOval(const SkRect& rect, const SkPaint& paint) { |
if (this->transformBounds(rect, &paint)) { |
INHERITED::drawOval(rect, paint); |
@@ -287,6 +291,26 @@ void SkBBoxRecord::onDrawPicture(const SkPicture* picture) { |
} |
} |
+void SkBBoxRecord::willSave() { |
+ fSaveStack.push(NULL); |
+ this->INHERITED::willSave(); |
+} |
+ |
+SkCanvas::SaveLayerStrategy SkBBoxRecord::willSaveLayer(const SkRect* bounds, |
+ const SkPaint* paint, |
+ SaveFlags flags) { |
+ // Image filters can affect the effective bounds of primitives drawn inside saveLayer(). |
+ // Copy the paint so we can compute the modified bounds in transformBounds(). |
+ fSaveStack.push(paint && paint->getImageFilter() ? new SkPaint(*paint) : NULL); |
+ return this->INHERITED::willSaveLayer(bounds, paint, flags); |
+} |
+ |
+void SkBBoxRecord::willRestore() { |
+ delete fSaveStack.top(); |
+ fSaveStack.pop(); |
+ this->INHERITED::willRestore(); |
+} |
+ |
bool SkBBoxRecord::transformBounds(const SkRect& bounds, const SkPaint* paint) { |
SkRect outBounds = bounds; |
outBounds.sort(); |
@@ -305,6 +329,14 @@ bool SkBBoxRecord::transformBounds(const SkRect& bounds, const SkPaint* paint) { |
} |
} |
+ for (int i = fSaveStack.count() - 1; i >= 0; --i) { |
+ const SkPaint* paint = fSaveStack.getAt(i); |
+ if (paint && paint->canComputeFastBounds()) { |
+ SkRect temp; |
+ outBounds = paint->computeFastBounds(outBounds, &temp); |
+ } |
+ } |
+ |
if (!outBounds.isEmpty() && !this->quickReject(outBounds)) { |
this->getTotalMatrix().mapRect(&outBounds); |
this->handleBBox(outBounds); |