diff options
author | 2013-04-02 15:30:03 +0000 | |
---|---|---|
committer | 2013-04-02 15:30:03 +0000 | |
commit | c52570475f00d5b62b8d82ba50b4b911dc38ce43 (patch) | |
tree | 0fee2f27b0e46fb6ba10e9044556caecddcf0ea8 | |
parent | 5a7d029fd6fcdf161b58c09887c6f745c37f1855 (diff) |
Expand filter 0 to handle transparent drawBitmapRect paints
https://codereview.chromium.org/13394014/
git-svn-id: http://skia.googlecode.com/svn/trunk@8486 2bbb7eff-a529-9590-31e7-b0007b416f81
-rw-r--r-- | tools/filtermain.cpp | 28 |
1 files changed, 17 insertions, 11 deletions
diff --git a/tools/filtermain.cpp b/tools/filtermain.cpp index 216fa66ffa..cbebb49d10 100644 --- a/tools/filtermain.cpp +++ b/tools/filtermain.cpp @@ -61,18 +61,15 @@ static bool check_0(SkDebugCanvas* canvas, int curCommand) { 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 @@ static void apply_0(SkDebugCanvas* canvas, int curCommand) { // 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 @@ static void apply_7(SkDebugCanvas* canvas, int curCommand) { a1 = 0xFF; } - int newA = (a0 * a1) / 255; + int newA = SkMulDiv255Round(a0, a1); SkASSERT(newA <= 0xFF); SkPaint* dbmrPaint = dbmr->paint(); |