Add looping over optimizations to filter tool

https://codereview.chromium.org/13261018/



git-svn-id: http://skia.googlecode.com/svn/trunk@8465 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/tools/filtermain.cpp b/tools/filtermain.cpp
index 24887c5..00cf6f0 100644
--- a/tools/filtermain.cpp
+++ b/tools/filtermain.cpp
@@ -536,12 +536,26 @@
         debugCanvas.deleteDrawCommandAt(debugCanvas.getSize()-1);
     }
 
-    for (int i = 0; i < debugCanvas.getSize(); ++i) {
-        for (size_t opt = 0; opt < SK_ARRAY_COUNT(gOptTable); ++opt) {
-            if ((*gOptTable[opt].fCheck)(&debugCanvas, i)) {
-                (*gOptTable[opt].fApply)(&debugCanvas, i);
-                ++gOptTable[opt].fNumTimesApplied;
-                ++localCount[opt];
+    bool changed = true;
+
+    while (changed) {
+        changed = false;
+        for (int i = 0; i < debugCanvas.getSize(); ++i) {
+            for (size_t opt = 0; opt < SK_ARRAY_COUNT(gOptTable); ++opt) {
+                if ((*gOptTable[opt].fCheck)(&debugCanvas, i)) {
+                    (*gOptTable[opt].fApply)(&debugCanvas, i);
+
+                    ++gOptTable[opt].fNumTimesApplied;
+                    ++localCount[opt];
+
+                    if (debugCanvas.getSize() == i) {
+                        // the optimization removed all the remaining operations
+                        break;
+                    }
+
+                    opt = 0;          // try all the opts all over again
+                    changed = true;
+                }
             }
         }
     }