Chromium Code Reviews| Index: src/core/SkRecordDraw.cpp |
| diff --git a/src/core/SkRecordDraw.cpp b/src/core/SkRecordDraw.cpp |
| index ac1e429f1227a575e27cb0342171842ac46a41b7..d3e26f287f6561ad1df15de622d56ea11f448cc8 100644 |
| --- a/src/core/SkRecordDraw.cpp |
| +++ b/src/core/SkRecordDraw.cpp |
| @@ -229,8 +229,39 @@ private: |
| } |
| static bool PaintMayAffectTransparentBlack(const SkPaint* paint) { |
| - // FIXME: this is very conservative |
| - return paint && (paint->getImageFilter() || paint->getColorFilter()); |
| + if (paint) { |
| + // FIXME: this is very conservative |
| + if (paint->getImageFilter() || paint->getColorFilter()) { |
| + return true; |
| + } |
| + |
| + // Unusual Xfermodes require us to process a saved layer |
| + // even with operations outisde the clip. |
| + // For example, DstIn is used by masking layers. |
| + // https://code.google.com/p/skia/issues/detail?id=1291 |
| + // https://crbug.com/401593 |
| + SkXfermode* xfermode = paint->getXfermode(); |
| + SkXfermode::Mode mode; |
| + // SrcOver is ok, and is also the common case with a NULL xfermode. |
| + // So we should make that the fast path and bypass the mode extraction |
| + // and test. |
| + if (xfermode && xfermode->asMode(&mode)) { |
| + switch (mode) { |
| + case SkXfermode::kClear_Mode: |
|
mtklein
2014/09/12 20:57:16
Might note something like,
// For each of these t
dneto
2014/09/15 15:48:48
Done.
|
| + case SkXfermode::kSrc_Mode: |
| + case SkXfermode::kSrcIn_Mode: |
| + case SkXfermode::kDstIn_Mode: |
| + case SkXfermode::kSrcOut_Mode: |
| + case SkXfermode::kDstATop_Mode: |
| + case SkXfermode::kModulate_Mode: |
| + return true; |
| + break; |
| + default: |
| + break; |
| + } |
| + } |
| + } |
| + return false; |
| } |
| Bounds popSaveBlock() { |