Add --csv parameter to skpdiff to dump all scores in a csv file. We can run it with...
authoredisonn@google.com <edisonn@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>
Mon, 22 Jul 2013 15:24:26 +0000 (15:24 +0000)
committeredisonn@google.com <edisonn@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>
Mon, 22 Jul 2013 15:24:26 +0000 (15:24 +0000)
R=djsollen@google.com, zachr@google.com

Review URL: https://codereview.chromium.org/19826002

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

experimental/skpdiff/SkDiffContext.cpp
experimental/skpdiff/SkDiffContext.h
experimental/skpdiff/main.cpp

index b5991273b50e1749fd46d733b1abac192de3a445..519870397e70177ad95ce34f83b42dc4d089a548 100644 (file)
@@ -9,6 +9,7 @@
 #include "SkImageDecoder.h"
 #include "SkOSFile.h"
 #include "SkStream.h"
+#include "SkTDict.h"
 
 #include "SkDiffContext.h"
 #include "SkImageDiffer.h"
@@ -230,3 +231,62 @@ void SkDiffContext::outputRecords(SkWStream& stream, bool useJSONP) {
         stream.writeText("}\n");
     }
 }
+
+void SkDiffContext::outputCsv(SkWStream& stream) {
+    SkTDict<int> columns(2);
+    int cntColumns = 0;
+
+    stream.writeText("key");
+
+    DiffRecord* currentRecord = fRecords;
+
+    // Write CSV header and create a dictionary of all columns.
+    while (NULL != currentRecord) {
+        for (int diffIndex = 0; diffIndex < currentRecord->fDiffs.count(); diffIndex++) {
+            DiffData& data = currentRecord->fDiffs[diffIndex];
+            if (!columns.find(data.fDiffName)) {
+                columns.set(data.fDiffName, cntColumns);
+                stream.writeText(", ");
+                stream.writeText(data.fDiffName);
+                cntColumns++;
+            }
+        }
+        currentRecord = currentRecord->fNext;
+    }
+    stream.writeText("\n");
+
+    double values[100];
+    SkASSERT(cntColumns < 100);  // Make the array larger, if we ever have so many diff types.
+
+    currentRecord = fRecords;
+    while (NULL != currentRecord) {
+        for (int i = 0; i < cntColumns; i++) {
+            values[i] = -1;
+        }
+
+        for (int diffIndex = 0; diffIndex < currentRecord->fDiffs.count(); diffIndex++) {
+            DiffData& data = currentRecord->fDiffs[diffIndex];
+            int index = -1;
+            SkAssertResult(columns.find(data.fDiffName, &index));
+            SkASSERT(index >= 0 && index < cntColumns);
+            values[index] = data.fResult;
+        }
+
+        const char* filename = currentRecord->fBaselinePath.c_str() +
+                strlen(currentRecord->fBaselinePath.c_str()) - 1;
+        while (filename > currentRecord->fBaselinePath.c_str() && *(filename - 1) != '/') {
+            filename--;
+        }
+
+        stream.writeText(filename);
+
+        for (int i = 0; i < cntColumns; i++) {
+            SkString str;
+            str.printf(", %f", values[i]);
+            stream.writeText(str.c_str());
+        }
+        stream.writeText("\n");
+
+        currentRecord = currentRecord->fNext;
+    }
+}
index 141da09a4d935f6165c79f88a48b5a5d84ab1f58..93354e8dec0d1ce752aeb72094a6fbaf03bd6ebb 100644 (file)
@@ -90,6 +90,12 @@ public:
      */
     void outputRecords(SkWStream& stream, bool useJSONP);
 
+    /**
+     * Output the records score in csv format.
+     */
+    void outputCsv(SkWStream& stream);
+
+
 private:
     struct DiffData {
         const char* fDiffName;
index d258c147c62015e1f41968e41eb449dc71f6cce2..7ed0e4d90d2aa961934650fbe45ecef8e032ade0 100644 (file)
@@ -32,6 +32,7 @@ DEFINE_string2(folders, f, "", "Compare two folders with identical subfile names
 DEFINE_string2(patterns, p, "", "Use two patterns to compare images: <baseline> <test>");
 DEFINE_string2(output, o, "skpdiff_output.json", "Writes the output of these diffs to output: <output>");
 DEFINE_bool(jsonp, true, "Output JSON with padding");
+DEFINE_string(csv, "", "Writes the output of these diffs to a csv file");
 
 #if SK_SUPPORT_OPENCL
 /// A callback for any OpenCL errors
@@ -169,6 +170,13 @@ int main(int argc, char** argv) {
         }
     }
 
+    if (!FLAGS_csv.isEmpty()) {
+        if (1 != FLAGS_csv.count()) {
+            SkDebugf("csv flag expects one argument: <csv file>\n");
+            return 1;
+        }
+    }
+
     SkDiffContext ctx;
     ctx.setDiffers(chosenDiffers);
 
@@ -188,5 +196,10 @@ int main(int argc, char** argv) {
         ctx.outputRecords(outputStream, FLAGS_jsonp);
     }
 
+    if (!FLAGS_csv.isEmpty()) {
+        SkFILEWStream outputStream(FLAGS_csv[0]);
+        ctx.outputCsv(outputStream);
+    }
+
     return 0;
 }