| 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);
|
|
|