Index: tools/filtermain.cpp |
=================================================================== |
--- tools/filtermain.cpp (revision 8478) |
+++ 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 = SkMulDiv255Round(a0, a1); |
+ SkASSERT(newA <= 0xFF); |
+ |
+ SkColor newColor = SkColorSetA(color, newA); |
dbmrPaint->setColor(newColor); |
} |
} |
@@ -457,7 +463,7 @@ |
a1 = 0xFF; |
} |
- int newA = (a0 * a1) / 255; |
+ int newA = SkMulDiv255Round(a0, a1); |
SkASSERT(newA <= 0xFF); |
SkPaint* dbmrPaint = dbmr->paint(); |