Index: src/core/SkRecordDraw.cpp |
diff --git a/src/core/SkRecordDraw.cpp b/src/core/SkRecordDraw.cpp |
index a14b0316955dd0b1c93448c1bcd2410c5f74bae8..5dd2ba3296df619de59823d7b73669de6f76a6d8 100644 |
--- a/src/core/SkRecordDraw.cpp |
+++ b/src/core/SkRecordDraw.cpp |
@@ -204,19 +204,29 @@ private: |
this->pushControl(); |
} |
+ static bool PaintMayAffectTransparentBlack(const SkPaint* paint) { |
+ // FIXME: this is very conservative |
+ return paint && (paint->getImageFilter() || paint->getColorFilter()); |
+ } |
+ |
SkIRect popSaveBlock() { |
// We're done the Save block. Apply the block's bounds to all control ops inside it. |
SaveBounds sb; |
fSaveStack.pop(&sb); |
+ |
+ // If the paint affects transparent black, we can't trust any of our calculated bounds. |
+ const SkIRect& bounds = |
+ PaintMayAffectTransparentBlack(sb.paint) ? fCurrentClipBounds : sb.bounds; |
+ |
while (sb.controlOps --> 0) { |
- this->popControl(sb.bounds); |
+ this->popControl(bounds); |
} |
// This whole Save block may be part another Save block. |
- this->updateSaveBounds(sb.bounds); |
+ this->updateSaveBounds(bounds); |
// If called from a real Restore (not a phony one for balance), it'll need the bounds. |
- return sb.bounds; |
+ return bounds; |
} |
void pushControl() { |