Chromium Code Reviews| Index: tools/filtermain.cpp |
| =================================================================== |
| --- tools/filtermain.cpp (revision 8471) |
| +++ tools/filtermain.cpp (working copy) |
| @@ -61,18 +61,15 @@ |
| SkPaint* dbmrPaint = dbmr->paint(); |
| // For this optimization we only fold the saveLayer and drawBitmapRect |
| - // together if the saveLayer's draw is simple (i.e., no fancy effects) and |
| - // and the only difference in the colors is that the saveLayer's can have |
| - // an alpha while the drawBitmapRect's is opaque. |
| - // TODO: it should be possible to fold them together even if they both |
| - // have different non-255 alphas but this is low priority since we have |
| - // never seen that case |
| - // If either operation lacks a paint then the collapse is trivial |
| + // together if the saveLayer's draw is simple (i.e., no fancy effects) |
| + // and the only difference in the colors is their alpha value |
| SkColor layerColor = saveLayerPaint->getColor() | 0xFF000000; // force opaque |
| + SkColor dbmrColor = dbmrPaint->getColor() | 0xFF000000; // force opaque |
| + // If either operation lacks a paint then the collapse is trivial |
| return NULL == saveLayerPaint || |
| NULL == dbmrPaint || |
| - (is_simple(*saveLayerPaint) && dbmrPaint->getColor() == layerColor); |
| + (is_simple(*saveLayerPaint) && dbmrColor == layerColor); |
| } |
| // Fold the saveLayer's alpha into the drawBitmapRect and remove the saveLayer |
| @@ -90,8 +87,17 @@ |
| // if the DBMR doesn't have a paint just use the saveLayer's |
| dbmr->setPaint(*saveLayerPaint); |
| } else if (NULL != saveLayerPaint) { |
| - SkColor newColor = SkColorSetA(dbmrPaint->getColor(), |
| - SkColorGetA(saveLayerPaint->getColor())); |
| + // Both paints are present so their alphas need to be combined |
| + SkColor color = saveLayerPaint->getColor(); |
| + int a0 = SkColorGetA(color); |
| + |
| + color = dbmrPaint->getColor(); |
| + int a1 = SkColorGetA(color); |
| + |
| + int newA = (a0 * a1) / 255; |
|
bsalomon
2013/04/02 14:53:27
It seems like there's probably some alpha mul macr
bsalomon
2013/04/02 14:55:53
SkMulDiv255Round?
robertphillips
2013/04/02 15:30:22
Done.
|
| + SkASSERT(newA <= 0xFF); |
| + |
| + SkColor newColor = SkColorSetA(color, newA); |
| dbmrPaint->setColor(newColor); |
| } |
| } |