| Index: src/core/SkBBoxHierarchyRecord.cpp
|
| diff --git a/src/core/SkBBoxHierarchyRecord.cpp b/src/core/SkBBoxHierarchyRecord.cpp
|
| index f0382e64701672447297c25d6ce14260cf806648..d6fbd21239f9eab796651a2393ebac6229046165 100644
|
| --- a/src/core/SkBBoxHierarchyRecord.cpp
|
| +++ b/src/core/SkBBoxHierarchyRecord.cpp
|
| @@ -35,8 +35,29 @@ void SkBBoxHierarchyRecord::willSave(SaveFlags flags) {
|
| SkCanvas::SaveLayerStrategy SkBBoxHierarchyRecord::willSaveLayer(const SkRect* bounds,
|
| const SkPaint* paint,
|
| SaveFlags flags) {
|
| + // For now, assume all filters affect transparent black.
|
| + // FIXME: This could be made less conservative as an optimization.
|
| + bool paintAffectsTransparentBlack = NULL != paint &&
|
| + ((NULL != paint->getImageFilter()) ||
|
| + (NULL != paint->getColorFilter()));
|
| + SkRect drawBounds;
|
| + if (paintAffectsTransparentBlack) {
|
| + if (bounds) {
|
| + drawBounds = *bounds;
|
| + this->getTotalMatrix().mapRect(&drawBounds);
|
| + } else {
|
| + SkIRect deviceBounds;
|
| + this->getClipDeviceBounds(&deviceBounds);
|
| + drawBounds.set(deviceBounds);
|
| + }
|
| + }
|
| fStateTree->appendSaveLayer(this->writeStream().bytesWritten());
|
| - return this->INHERITED::willSaveLayer(bounds, paint, flags);
|
| + SkCanvas::SaveLayerStrategy strategy = this->INHERITED::willSaveLayer(bounds, paint, flags);
|
| + if (paintAffectsTransparentBlack) {
|
| + this->handleBBox(drawBounds);
|
| + this->addNoOp();
|
| + }
|
| + return strategy;
|
| }
|
|
|
| void SkBBoxHierarchyRecord::willRestore() {
|
|
|