Chromium Code Reviews| Index: src/core/SkBBoxRecord.cpp |
| diff --git a/src/core/SkBBoxRecord.cpp b/src/core/SkBBoxRecord.cpp |
| index a40ea8ba0d27e531e997dfaa922488e0c19433a3..e6f5f431db02cd95c7fc4de38e9e3e2bfd7c614e 100644 |
| --- a/src/core/SkBBoxRecord.cpp |
| +++ b/src/core/SkBBoxRecord.cpp |
| @@ -8,6 +8,13 @@ |
| #include "SkBBoxRecord.h" |
| +SkBBoxRecord::~SkBBoxRecord() { |
| + while (!fSaveStack.empty()) { |
| + delete fSaveStack.top(); |
| + fSaveStack.pop(); |
| + } |
| +} |
| + |
| void SkBBoxRecord::drawOval(const SkRect& rect, const SkPaint& paint) { |
| if (this->transformBounds(rect, &paint)) { |
| INHERITED::drawOval(rect, paint); |
| @@ -287,6 +294,24 @@ 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) { |
| + fSaveStack.push(paint && paint->getImageFilter() ? new SkPaint(*paint) : NULL); |
|
mtklein
2014/07/11 15:37:14
// The only effects that can affect the bounds of
|
| + 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 +330,14 @@ bool SkBBoxRecord::transformBounds(const SkRect& bounds, const SkPaint* paint) { |
| } |
| } |
| + for (int i = fSaveStack.count() - 1; i >= 0; --i) { |
| + const SkPaint* paint = fSaveStack.index(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); |