OLD | NEW |
| (Empty) |
1 /* | |
2 * Copyright 2013 Google Inc. | |
3 * | |
4 * Use of this source code is governed by a BSD-style license that can be | |
5 * found in the LICENSE file. | |
6 */ | |
7 | |
8 #ifndef SkDiffContext_DEFINED | |
9 #define SkDiffContext_DEFINED | |
10 | |
11 #include "SkImageDiffer.h" | |
12 #include "SkMutex.h" | |
13 #include "SkString.h" | |
14 #include "SkTArray.h" | |
15 #include "SkTDArray.h" | |
16 #include "SkTLList.h" | |
17 | |
18 class SkWStream; | |
19 | |
20 /** | |
21 * Collects records of diffs and outputs them as JSON. | |
22 */ | |
23 class SkDiffContext { | |
24 public: | |
25 SkDiffContext(); | |
26 ~SkDiffContext(); | |
27 | |
28 void setThreadCount(int threadCount) { fThreadCount = threadCount; } | |
29 | |
30 /** | |
31 * Sets the directory within which to store alphaMasks (images that | |
32 * are transparent for each pixel that differs between baseline and test). | |
33 * | |
34 * If the directory does not exist yet, it will be created. | |
35 */ | |
36 void setAlphaMaskDir(const SkString& directory); | |
37 | |
38 /** | |
39 * Sets the directory within which to store rgbDiffs (images showing the | |
40 * per-channel difference between baseline and test at each pixel). | |
41 * | |
42 * If the directory does not exist yet, it will be created. | |
43 */ | |
44 void setRgbDiffDir(const SkString& directory); | |
45 | |
46 /** | |
47 * Sets the directory within which to store whiteDiffs (images showing white | |
48 * for each pixel that differs between baseline and test). | |
49 * | |
50 * If the directory does not exist yet, it will be created. | |
51 */ | |
52 void setWhiteDiffDir(const SkString& directory); | |
53 | |
54 /** | |
55 * Modify the pattern used to generate commonName (= the | |
56 * basename of rgb/white diff files). | |
57 * | |
58 * - true: basename is a combination of the input file names. | |
59 * - false: basename is the common prefix of the input file names. | |
60 * | |
61 * For example, for: | |
62 * baselinePath=/tmp/dir/image-before.png | |
63 * testPath=/tmp/dir/image-after.png | |
64 * | |
65 * If setLongNames(true), commonName would be: | |
66 * image-before-png-vs-image-after-png.png | |
67 * | |
68 * If setLongNames(false), commonName would be: | |
69 * image-.png | |
70 */ | |
71 void setLongNames(const bool useLongNames); | |
72 | |
73 /** | |
74 * Sets the differs to be used in each diff. Already started diffs will not
retroactively use | |
75 * these. | |
76 * @param differs An array of differs to use. The array is copied, but not t
he differs | |
77 * themselves. | |
78 */ | |
79 void setDiffers(const SkTDArray<SkImageDiffer*>& differs); | |
80 | |
81 /** | |
82 * Compares two directories of images with the given differ | |
83 * @param baselinePath The baseline directory's path | |
84 * @param testPath The test directory's path | |
85 */ | |
86 void diffDirectories(const char baselinePath[], const char testPath[]); | |
87 | |
88 /** | |
89 * Compares two sets of images identified by glob style patterns with the gi
ven differ | |
90 * @param baselinePattern A pattern for baseline files | |
91 * @param testPattern A pattern for test files that matches each file of
the baseline file | |
92 */ | |
93 void diffPatterns(const char baselinePattern[], const char testPattern[]); | |
94 | |
95 /** | |
96 * Compares the images at the given paths | |
97 * @param baselinePath The baseline file path | |
98 * @param testPath The matching test file path | |
99 */ | |
100 void addDiff(const char* baselinePath, const char* testPath); | |
101 | |
102 /** | |
103 * Output the records of each diff in JSON. | |
104 * | |
105 * The format of the JSON document is one top level array named "records". | |
106 * Each record in the array is an object with the following values: | |
107 * "commonName" : string containing the output filename (basename) | |
108 * depending on the value of 'longNames'. | |
109 * (see 'setLongNames' for an explanation and example)
. | |
110 * "baselinePath" : string containing the path to the baseline image | |
111 * "testPath" : string containing the path to the test image | |
112 * "differencePath" : (optional) string containing the path to an alpha | |
113 * mask of the pixel difference between the baseline | |
114 * and test images | |
115 * TODO(epoger): consider renaming this "alphaMaskPath
" | |
116 * to distinguish from other difference types? | |
117 * "rgbDiffPath" : (optional) string containing the path to a bitmap | |
118 * showing per-channel differences between the | |
119 * baseline and test images at each pixel | |
120 * "whiteDiffPath" : (optional) string containing the path to a bitmap | |
121 * showing every pixel that differs between the | |
122 * baseline and test images as white | |
123 * | |
124 * They also have an array named "diffs" with each element being one diff re
cord for the two | |
125 * images indicated in the above field. | |
126 * A diff record includes: | |
127 * "differName" : string name of the diff metric used | |
128 * "result" : numerical result of the diff | |
129 * | |
130 * Here is an example: | |
131 * | |
132 * { | |
133 * "records": [ | |
134 * { | |
135 * "commonName": "queue.png", | |
136 * "baselinePath": "/a/queue.png", | |
137 * "testPath": "/b/queue.png", | |
138 * "diffs": [ | |
139 * { | |
140 * "differName": "different_pixels", | |
141 * "result": 1, | |
142 * } | |
143 * ] | |
144 * } | |
145 * ] | |
146 * } | |
147 * | |
148 * @param stream The stream to output the diff to | |
149 * @param useJSONP True to adding padding to the JSON output to make it cros
s-site requestable. | |
150 */ | |
151 void outputRecords(SkWStream& stream, bool useJSONP); | |
152 | |
153 /** | |
154 * Output the records score in csv format. | |
155 */ | |
156 void outputCsv(SkWStream& stream); | |
157 | |
158 | |
159 private: | |
160 struct DiffData { | |
161 const char* fDiffName; | |
162 SkImageDiffer::Result fResult; | |
163 }; | |
164 | |
165 struct DiffRecord { | |
166 // TODO(djsollen): Some of these fields are required, while others are o
ptional | |
167 // (e.g., fRgbDiffPath is only filled in if SkDifferentPixelsMetric | |
168 // was run). Figure out a way to note that. See https://bug.skia.org/2
712 | |
169 // ('allow skpdiff to report different sets of result fields for | |
170 // different comparison algorithms') | |
171 SkString fCommonName; | |
172 SkString fAlphaMaskPath; | |
173 SkString fRgbDiffPath; | |
174 SkString fWhiteDiffPath; | |
175 SkString fBaselinePath; | |
176 SkString fTestPath; | |
177 SkISize fSize; | |
178 int fMaxRedDiff; | |
179 int fMaxGreenDiff; | |
180 int fMaxBlueDiff; | |
181 SkTArray<DiffData> fDiffs; | |
182 }; | |
183 | |
184 // Used to protect access to fRecords and ensure only one thread is | |
185 // adding new entries at a time. | |
186 SkMutex fRecordMutex; | |
187 | |
188 // We use linked list for the records so that their pointers remain stable.
A resizable array | |
189 // might change its pointers, which would make it harder for async diffs to
record their | |
190 // results. | |
191 typedef SkTLList<DiffRecord, 1> RecordList; | |
192 RecordList fRecords; | |
193 | |
194 SkImageDiffer** fDiffers; | |
195 int fDifferCount; | |
196 int fThreadCount; | |
197 | |
198 SkString fAlphaMaskDir; | |
199 SkString fRgbDiffDir; | |
200 SkString fWhiteDiffDir; | |
201 bool longNames; | |
202 }; | |
203 | |
204 #endif | |
OLD | NEW |