Allow the alpha folding optimization if the single draw's paint has a shader

Let's land this and then leave for 2 weeks.

BUG=skia:3119

Review URL: https://codereview.chromium.org/817033002
This commit is contained in:
robertphillips 2014-12-21 10:52:01 -08:00 committed by Commit bot
parent fa4f6cba2f
commit ca32da7533

View File

@ -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;
}