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:
parent
fa4f6cba2f
commit
ca32da7533
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user