Index: experimental/skpdiff/SkDiffContext.h |
diff --git a/experimental/skpdiff/SkDiffContext.h b/experimental/skpdiff/SkDiffContext.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..545b51512380a02b1fa62dba2f86cc66d4f8d836 |
--- /dev/null |
+++ b/experimental/skpdiff/SkDiffContext.h |
@@ -0,0 +1,115 @@ |
+/* |
+ * Copyright 2013 Google Inc. |
+ * |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. |
+ */ |
+ |
+#ifndef SkDiffContext_DEFINED |
+#define SkDiffContext_DEFINED |
+ |
+#include "SkString.h" |
+#include "SkTArray.h" |
+#include "SkTDArray.h" |
+ |
+class SkWStream; |
+class SkImageDiffer; |
+ |
+/** |
+ * Collects records of diffs and outputs them as JSON. |
+ */ |
+class SkDiffContext { |
+public: |
+ SkDiffContext(); |
+ ~SkDiffContext(); |
+ |
+ /** |
+ * Sets the differs to be used in each diff. Already started diffs will not retroactively use |
+ * these. |
+ * @param differs An array of differs to use. The array is copied, but not the differs |
+ * themselves. |
+ */ |
+ void setDiffers(const SkTDArray<SkImageDiffer*>& differs); |
+ |
+ /** |
+ * Compares two directories of images with the given differ |
+ * @param baselinePath The baseline directory's path |
+ * @param testPath The test directory's path |
+ */ |
+ void diffDirectories(const char baselinePath[], const char testPath[]); |
+ |
+ /** |
+ * Compares two sets of images identified by glob style patterns with the given differ |
+ * @param baselinePattern A pattern for baseline files |
+ * @param testPattern A pattern for test files that matches each file of the baseline file |
+ */ |
+ void diffPatterns(const char baselinePattern[], const char testPattern[]); |
+ |
+ /** |
+ * Compares the images at the given paths |
+ * @param baselinePath The baseline file path |
+ * @param testPath The matching test file path |
+ */ |
+ void addDiff(const char* baselinePath, const char* testPath); |
+ |
+ /** |
+ * Output the records of each diff in JSON. |
+ * |
+ * The format of the JSON document is one top level array named "records". |
+ * Each record in the array is an object with both a "baselinePath" and "testPath" string field. |
+ * They also have an array named "diffs" with each element being one diff record for the two |
+ * images indicated in the above field. |
+ * A diff record includes: |
+ * "differName" : string name of the diff metric used |
+ * "result" : numerical result of the diff |
+ * "pointsOfInterest" : an array of coordinates (stored as a 2-array of ints) of interesting |
+ * points |
+ * |
+ * Here is an example: |
+ * |
+ * { |
+ * "records": [ |
+ * { |
+ * "baselinePath": "queue.png", |
+ * "testPath": "queue.png", |
+ * "diffs": [ |
+ * { |
+ * "differName": "different_pixels", |
+ * "result": 1, |
+ * "pointsOfInterest": [ |
+ * [285,279], |
+ * ] |
+ * } |
+ * ] |
+ * } |
+ * ] |
+ * } |
+ * |
+ * @param stream The stream to output the diff to |
+ */ |
+ void outputRecords(SkWStream& stream); |
+ |
+private: |
+ struct DiffData { |
+ const char* fDiffName; |
+ double fResult; |
+ SkTDArray<SkIPoint> fPointsOfInterest; |
+ }; |
+ |
+ struct DiffRecord { |
+ SkString fBaselinePath; |
+ SkString fTestPath; |
+ SkTArray<DiffData> fDiffs; |
+ DiffRecord* fNext; |
+ }; |
+ |
+ // We use linked list for the records so that their pointers remain stable. A resizable array |
+ // might change its pointers, which would make it harder for async diffs to record their |
+ // results. |
+ DiffRecord * fRecords; |
+ |
+ SkImageDiffer** fDiffers; |
+ int fDifferCount; |
+}; |
+ |
+#endif |