Index: src/core/SkRecordOpts.cpp |
diff --git a/src/core/SkRecordOpts.cpp b/src/core/SkRecordOpts.cpp |
index 7c24a08c881da97f3898805344c6fd0f2c207706..4a51beea001df2d138dcc218fff401892859ae0c 100644 |
--- a/src/core/SkRecordOpts.cpp |
+++ b/src/core/SkRecordOpts.cpp |
@@ -112,7 +112,7 @@ struct SaveLayerDrawRestoreNooper { |
const uint32_t layerColor = layerPaint->getColor(); |
const uint32_t drawColor = drawPaint->getColor(); |
if (!IsOnlyAlpha(layerColor) || !IsOpaque(drawColor) || |
- HasAnyEffect(*layerPaint) || HasAnyEffect(*drawPaint)) { |
+ HasAnyEffect(*layerPaint) || CantFoldAlpha(*drawPaint)) { |
// Too fancy for us. Actually, as long as layerColor is just an alpha |
// we can blend it into drawColor's alpha; drawColor doesn't strictly have to be opaque. |
return false; |
@@ -139,6 +139,17 @@ struct SaveLayerDrawRestoreNooper { |
paint.getImageFilter(); |
} |
+ // The alpha folding can proceed if the single draw's paint has a shader, |
+ // path effect, mask filter and/or rasterizer. |
+ // TODO: most likely the looper and only some xfer modes are the hard |
+ // constraints |
+ static bool CantFoldAlpha(const SkPaint& paint) { |
+ return paint.getXfermode() || |
+ paint.getColorFilter() || |
+ paint.getLooper() || |
+ paint.getImageFilter(); |
+ } |
+ |
static bool IsOpaque(SkColor color) { |
return SkColorGetA(color) == SK_AlphaOPAQUE; |
} |