Fix filter optimizations to take the paint's alpha into account
authorrobertphillips@google.com <robertphillips@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>
Wed, 13 Feb 2013 13:27:44 +0000 (13:27 +0000)
committerrobertphillips@google.com <robertphillips@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>
Wed, 13 Feb 2013 13:27:44 +0000 (13:27 +0000)
https://codereview.appspot.com/7312083/

git-svn-id: http://skia.googlecode.com/svn/trunk@7711 2bbb7eff-a529-9590-31e7-b0007b416f81

tools/filtermain.cpp

index cca96e4..b7bbe69 100644 (file)
@@ -58,12 +58,19 @@ static bool check_0(const SkTDArray<SkDrawCommand*>& commands, int curCommand) {
     const SkPaint* saveLayerPaint = saveLayer->paint();
     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
+    SkColor layerColor = saveLayerPaint->getColor() | 0xFF000000; // force opaque
+
     return NULL == saveLayerPaint ||
            NULL == dbmrPaint ||
-           (is_simple(*saveLayerPaint) &&
-            (SkColorGetR(saveLayerPaint->getColor()) == SkColorGetR(dbmrPaint->getColor())) &&
-            (SkColorGetG(saveLayerPaint->getColor()) == SkColorGetG(dbmrPaint->getColor())) &&
-            (SkColorGetB(saveLayerPaint->getColor()) == SkColorGetB(dbmrPaint->getColor())));
+           (is_simple(*saveLayerPaint) && dbmrPaint->getColor() == layerColor);
 }
 
 // Fold the saveLayer's alpha into the drawBitmapRect and remove the saveLayer
@@ -116,12 +123,19 @@ static bool check_1(const SkTDArray<SkDrawCommand*>& commands, int curCommand) {
     const SkPaint* saveLayerPaint = saveLayer->paint();
     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
+    SkColor layerColor = saveLayerPaint->getColor() | 0xFF000000; // force opaque
+
     return NULL == saveLayerPaint ||
            NULL == dbmrPaint ||
-           (is_simple(*saveLayerPaint) &&
-            (SkColorGetR(saveLayerPaint->getColor()) == SkColorGetR(dbmrPaint->getColor())) &&
-            (SkColorGetG(saveLayerPaint->getColor()) == SkColorGetG(dbmrPaint->getColor())) &&
-            (SkColorGetB(saveLayerPaint->getColor()) == SkColorGetB(dbmrPaint->getColor())));
+           (is_simple(*saveLayerPaint) && dbmrPaint->getColor() == layerColor);
 }
 
 // Fold the saveLayer's alpha into the drawBitmapRect and remove the saveLayer