add --listfailingbase option

BUG=skia:

Review URL: https://codereview.chromium.org/833223002
diff --git a/tools/skdiff_main.cpp b/tools/skdiff_main.cpp
index df07844..fdd83a6 100644
--- a/tools/skdiff_main.cpp
+++ b/tools/skdiff_main.cpp
@@ -17,7 +17,6 @@
 #include "SkTDArray.h"
 #include "SkTemplates.h"
 #include "SkTSearch.h"
-#include "SkTypes.h"
 
 __SK_FORCE_IMAGE_DECODER_LINKING;
 
@@ -38,6 +37,30 @@
 typedef SkTDArray<SkString*> StringArray;
 typedef StringArray FileArray;
 
+static void add_unique_basename(StringArray* array, const SkString& filename) {
+    // trim off dirs
+    const char* src = filename.c_str();
+    const char* trimmed = strrchr(src, SkPATH_SEPARATOR);
+    if (trimmed) {
+        trimmed += 1;   // skip the separator
+    } else {
+        trimmed = src;
+    }
+    const char* end = strrchr(trimmed, '.');
+    if (!end) {
+        end = trimmed + strlen(trimmed);
+    }
+    SkString result(trimmed, end - trimmed);
+
+    // only add unique entries
+    for (int i = 0; i < array->count(); ++i) {
+        if (*array->getAt(i) == result) {
+            return;
+        }
+    }
+    *array->append() = new SkString(result);
+}
+
 struct DiffSummary {
     DiffSummary ()
         : fNumMatches(0)
@@ -64,6 +87,8 @@
     FileArray fResultsOfType[DiffRecord::kResultCount];
     FileArray fStatusOfType[DiffResource::kStatusCount][DiffResource::kStatusCount];
 
+    StringArray fFailedBaseNames[DiffRecord::kResultCount];
+
     void printContents(const FileArray& fileArray,
                        const char* baseStatus, const char* comparisonStatus,
                        bool listFilenames) {
@@ -142,6 +167,19 @@
         }
     }
 
+    void printfFailingBaseNames(const char separator[]) {
+        for (int resultInt = 0; resultInt < DiffRecord::kResultCount; ++resultInt) {
+            const StringArray& array = fFailedBaseNames[resultInt];
+            if (array.count()) {
+                printf("%s [%d]%s", DiffRecord::ResultNames[resultInt], array.count(), separator);
+                for (int j = 0; j < array.count(); ++j) {
+                    printf("%s%s", array[j]->c_str(), separator);
+                }
+                printf("\n");
+            }
+        }
+    }
+
     void add (DiffRecord* drp) {
         uint32_t mismatchValue;
 
@@ -188,6 +226,15 @@
             SkDEBUGFAIL("adding DiffRecord with unhandled fResult value");
             break;
         }
+
+        switch (drp->fResult) {
+            case DiffRecord::kEqualBits_Result:
+            case DiffRecord::kEqualPixels_Result:
+                break;
+            default:
+                add_unique_basename(&fFailedBaseNames[drp->fResult], drp->fBase.fFilename);
+                break;
+        }
     }
 };
 
@@ -581,6 +628,7 @@
     bool printDirNames = true;
     bool recurseIntoSubdirs = true;
     bool verbose = false;
+    bool listFailingBase = false;
 
     RecordArray differences;
     DiffSummary summary;
@@ -705,6 +753,10 @@
                     return kGenericError;
             }
         }
+        if (!strcmp(argv[i], "--listFailingBase")) {
+            listFailingBase = true;
+            continue;
+        }
 
         SkDebugf("Unrecognized argument <%s>\n", argv[i]);
         usage(argv[0]);
@@ -758,6 +810,10 @@
                        verbose, &summary);
     summary.print(listFilenames, failOnResultType, failOnStatusType);
 
+    if (listFailingBase) {
+        summary.printfFailingBaseNames("\n");
+    }
+
     if (differences.count()) {
         qsort(differences.begin(), differences.count(),
               sizeof(DiffRecord*), sortProc);