OLD | NEW |
| (Empty) |
1 <!DOCTYPE html> | |
2 | |
3 <html ng-app="Loader" ng-controller="Loader.Controller"> | |
4 | |
5 <head> | |
6 <title ng-bind="windowTitle"></title> | |
7 <script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></scr
ipt> | |
8 <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.20/angular.js
"></script> | |
9 <script src="constants.js"></script> | |
10 <script src="live-loader.js"></script> | |
11 <script src="utils.js"></script> | |
12 | |
13 <link rel="stylesheet" href="view.css"> | |
14 </head> | |
15 | |
16 <body> | |
17 <h2> | |
18 Instructions, roadmap, etc. are at | |
19 <a href="http://tinyurl.com/SkiaRebaselineServer"> | |
20 http://tinyurl.com/SkiaRebaselineServer | |
21 </a> | |
22 </h2> | |
23 | |
24 <em ng-show="!readyToDisplay"> | |
25 Loading results of query: | |
26 <ul> | |
27 <li>setA: "{{setASection}}" within {{setADir}}</li> | |
28 <li>setB: "{{setBSection}}" within {{setBDir}}</li> | |
29 </ul> | |
30 <br> | |
31 {{loadingMessage}} | |
32 </em> | |
33 | |
34 <div ng-show="readyToDisplay"> | |
35 | |
36 <div class="warning-div" | |
37 ng-show="urlSchemaVersionLoaded != constants.URL_VALUE__SCHEMA_VERSION_
_CURRENT"> | |
38 WARNING! The URL you loaded used schema version {{urlSchemaVersionLoaded}
}, rather than | |
39 the most recent version {{constants.URL_VALUE__SCHEMA_VERSION__CURRENT}}.
It has been | |
40 converted to the most recent version on a best-effort basis; you may wish
to double-check | |
41 which records are displayed. | |
42 </div> | |
43 | |
44 <div ng-show="header[constants.KEY__HEADER__TIME_UPDATED]"> | |
45 setA: "{{header[constants.KEY__HEADER__SET_A_DESCRIPTIONS][constants.KEY__
SET_DESCRIPTIONS__SECTION]}}" | |
46 within {{header[constants.KEY__HEADER__SET_A_DESCRIPTIONS][constants.KEY__
SET_DESCRIPTIONS__DIR]}} | |
47 <span ng-show="header[constants.KEY__HEADER__SET_A_DESCRIPTIONS][constants
.KEY__SET_DESCRIPTIONS__REPO_REVISION]">at <a href="https://skia.googlesource.co
m/skia/+/{{header[constants.KEY__HEADER__SET_A_DESCRIPTIONS][constants.KEY__SET_
DESCRIPTIONS__REPO_REVISION]}}">rev {{header[constants.KEY__HEADER__SET_A_DESCRI
PTIONS][constants.KEY__SET_DESCRIPTIONS__REPO_REVISION]}}</a></span> | |
48 <br> | |
49 setB: "{{header[constants.KEY__HEADER__SET_B_DESCRIPTIONS][constants.KEY__
SET_DESCRIPTIONS__SECTION]}}" | |
50 within {{header[constants.KEY__HEADER__SET_B_DESCRIPTIONS][constants.KEY__
SET_DESCRIPTIONS__DIR]}} | |
51 <span ng-show="header[constants.KEY__HEADER__SET_B_DESCRIPTIONS][constants
.KEY__SET_DESCRIPTIONS__REPO_REVISION]">at <a href="https://skia.googlesource.co
m/skia/+/{{header[constants.KEY__HEADER__SET_B_DESCRIPTIONS][constants.KEY__SET_
DESCRIPTIONS__REPO_REVISION]}}">rev {{header[constants.KEY__HEADER__SET_B_DESCRI
PTIONS][constants.KEY__SET_DESCRIPTIONS__REPO_REVISION]}}</a></span> | |
52 <br> | |
53 <a href="{{liveQueryUrl}}">latest raw JSON diffs between these two sets</a
><br> | |
54 These results current as of | |
55 {{localTimeString(header[constants.KEY__HEADER__TIME_UPDATED])}} | |
56 </div> | |
57 | |
58 <div class="tab-wrapper"><!-- tabs --> | |
59 <div class="tab-spacer" ng-repeat="tab in tabs"> | |
60 <div class="tab tab-{{tab == viewingTab}}" | |
61 ng-click="setViewingTab(tab)"> | |
62 {{tab}} ({{numResultsPerTab[tab]}}) | |
63 </div> | |
64 <div class="tab-spacer"> | |
65 | |
66 </div> | |
67 </div> | |
68 </div><!-- tabs --> | |
69 | |
70 <div class="tab-main"><!-- main display area of selected tab --> | |
71 | |
72 <br> | |
73 <!-- We only show the filters/settings table on the Unfiled tab. --> | |
74 <table ng-show="viewingTab == defaultTab" border="1"> | |
75 <tr> | |
76 <th colspan="4"> | |
77 Filters | |
78 </th> | |
79 <th> | |
80 Settings | |
81 </th> | |
82 </tr> | |
83 <tr valign="top"> | |
84 | |
85 <!-- filters --> | |
86 <td ng-repeat="columnName in orderedColumnNames"> | |
87 | |
88 <!-- Only display filterable columns here... --> | |
89 <div ng-if="extraColumnHeaders[columnName][constants.KEY__EXTRACOLUMNHEA
DERS__IS_FILTERABLE]"> | |
90 {{extraColumnHeaders[columnName][constants.KEY__EXTRACOLUMNHEADERS__HE
ADER_TEXT]}}<br> | |
91 | |
92 <!-- If we filter this column using free-form text match... --> | |
93 <div ng-if="extraColumnHeaders[columnName][constants.KEY__EXTRACOLUMNH
EADERS__USE_FREEFORM_FILTER]"> | |
94 <input type="text" | |
95 ng-model="columnStringMatch[columnName]" | |
96 ng-change="setUpdatesPending(true)"/> | |
97 <br> | |
98 <button ng-click="setColumnStringMatch(columnName, '')" | |
99 ng-disabled="('' == columnStringMatch[columnName])"> | |
100 clear (show all) | |
101 </button> | |
102 </div> | |
103 | |
104 <!-- If we filter this column using checkboxes... --> | |
105 <div ng-if="!extraColumnHeaders[columnName][constants.KEY__EXTRACOLUMN
HEADERS__USE_FREEFORM_FILTER]"> | |
106 <label ng-repeat="valueAndCount in extraColumnHeaders[columnName][co
nstants.KEY__EXTRACOLUMNHEADERS__VALUES_AND_COUNTS]"> | |
107 <input type="checkbox" | |
108 name="resultTypes" | |
109 value="{{valueAndCount[0]}}" | |
110 ng-checked="isValueInSet(valueAndCount[0], showingColumnVal
ues[columnName])" | |
111 ng-click="toggleValueInSet(valueAndCount[0], showingColumnV
alues[columnName]); setUpdatesPending(true)"> | |
112 {{valueAndCount[0]}} ({{valueAndCount[1]}})<br> | |
113 </label> | |
114 <button ng-click="showingColumnValues[columnName] = {}; toggleValues
InSet(allColumnValues[columnName], showingColumnValues[columnName]); updateResul
ts()" | |
115 ng-disabled="!readyToDisplay || allColumnValues[columnName].
length == setSize(showingColumnValues[columnName])"> | |
116 all | |
117 </button> | |
118 <button ng-click="showingColumnValues[columnName] = {}; updateResult
s()" | |
119 ng-disabled="!readyToDisplay || 0 == setSize(showingColumnVa
lues[columnName])"> | |
120 none | |
121 </button> | |
122 <button ng-click="toggleValuesInSet(allColumnValues[columnName], sho
wingColumnValues[columnName]); updateResults()"> | |
123 toggle | |
124 </button> | |
125 </div> | |
126 | |
127 </div> | |
128 </td> | |
129 | |
130 <!-- settings --> | |
131 <td><table> | |
132 <tr><td> | |
133 <input type="checkbox" ng-model="showThumbnailsPending" | |
134 ng-init="showThumbnailsPending = true" | |
135 ng-change="areUpdatesPending = true"/> | |
136 Show thumbnails | |
137 </td></tr> | |
138 <tr><td> | |
139 <input type="checkbox" ng-model="mergeIdenticalRowsPending" | |
140 ng-init="mergeIdenticalRowsPending = true" | |
141 ng-change="areUpdatesPending = true"/> | |
142 Merge identical rows | |
143 </td></tr> | |
144 <tr><td> | |
145 Image width | |
146 <input type="text" ng-model="imageSizePending" | |
147 ng-init="imageSizePending=100" | |
148 ng-change="areUpdatesPending = true" | |
149 maxlength="4"/> | |
150 </td></tr> | |
151 <tr><td> | |
152 Max records to display | |
153 <input type="text" ng-model="displayLimitPending" | |
154 ng-init="displayLimitPending=50" | |
155 ng-change="areUpdatesPending = true" | |
156 maxlength="4"/> | |
157 </td></tr> | |
158 <tr><td> | |
159 <button class="update-results-button" | |
160 ng-click="updateResults()" | |
161 ng-disabled="!areUpdatesPending"> | |
162 Update Results | |
163 </button> | |
164 </td></tr> | |
165 </tr></table></td> | |
166 </tr> | |
167 </table> | |
168 | |
169 <p> | |
170 | |
171 <!-- Submission UI that we only show in the Pending Approval tab. --> | |
172 <div ng-show="'Pending Approval' == viewingTab"> | |
173 <div style="display:inline-block"> | |
174 <button style="font-size:20px" | |
175 ng-click="submitApprovals(filteredImagePairs)" | |
176 ng-disabled="submitPending || (filteredImagePairs.length == 0)
"> | |
177 Get a patchfile to update these {{filteredImagePairs.length}} expect
ations | |
178 </button> | |
179 </div> | |
180 <div style="display:inline-block"> | |
181 <div style="font-size:20px" | |
182 ng-show="submitPending"> | |
183 Submitting, please wait... | |
184 </div> | |
185 </div> | |
186 <div> | |
187 Advanced settings... | |
188 <input type="checkbox" ng-model="showSubmitAdvancedSettings"> | |
189 show | |
190 <ul ng-show="showSubmitAdvancedSettings"> | |
191 <li ng-repeat="setting in [constants.KEY__EXPECTATIONS__REVIEWED, co
nstants.KEY__EXPECTATIONS__IGNOREFAILURE]"> | |
192 {{setting}} | |
193 <input type="checkbox" ng-model="submitAdvancedSettings[setting]"> | |
194 </li> | |
195 <li ng-repeat="setting in ['bug']"> | |
196 {{setting}} | |
197 <input type="text" ng-model="submitAdvancedSettings[setting]"> | |
198 </li> | |
199 </ul> | |
200 </div> | |
201 <div ng-show="diffResults"> | |
202 <p> | |
203 Here is the patch to apply to your local checkout: | |
204 <br> | |
205 <textarea rows="8" cols="50">{{diffResults}}</textarea> | |
206 <br> | |
207 <a download="patch.txt" ng-href="{{diffResultsBlobUrl}}"> | |
208 Click here to download that patch as a text file. | |
209 </a> | |
210 </div> | |
211 </div> | |
212 | |
213 <p> | |
214 | |
215 <table border="0"><tr><td> <!-- table holding results header + results table
--> | |
216 <table border="0" width="100%"> <!-- results header --> | |
217 <tr> | |
218 <td> | |
219 Found {{filteredImagePairs.length}} matches; | |
220 <span ng-show="filteredImagePairs.length > limitedImagePairs.length"
> | |
221 displaying the first {{limitedImagePairs.length}}. | |
222 </span> | |
223 <span ng-show="filteredImagePairs.length <= limitedImagePairs.length
"> | |
224 displaying them all. | |
225 </span> | |
226 <span ng-show="renderEndTime > renderStartTime"> | |
227 Rendered in {{(renderEndTime - renderStartTime).toFixed(0)}} ms. | |
228 </span> | |
229 <br> | |
230 (click on the column header radio buttons to re-sort by that column) | |
231 </td> | |
232 <td align="right"> | |
233 <div> | |
234 all tests shown: | |
235 <button ng-click="selectAllImagePairs()"> | |
236 select | |
237 </button> | |
238 <button ng-click="clearAllImagePairs()"> | |
239 clear | |
240 </button> | |
241 <button ng-click="toggleAllImagePairs()"> | |
242 toggle | |
243 </button> | |
244 </div> | |
245 <div ng-repeat="otherTab in tabs"> | |
246 <button ng-click="moveSelectedImagePairsToTab(otherTab)" | |
247 ng-disabled="selectedImagePairs.length == 0" | |
248 ng-show="otherTab != viewingTab"> | |
249 move {{selectedImagePairs.length}} selected tests to {{otherTab}
} tab | |
250 </button> | |
251 </div> | |
252 </td> | |
253 </tr> | |
254 </table> <!-- results header --> | |
255 </td></tr><tr><td> | |
256 <table border="1" ng-app="diff_viewer"> <!-- results --> | |
257 <tr> | |
258 <!-- Most column headers are displayed in a common fashion... --> | |
259 <th ng-repeat="columnName in orderedColumnNames"> | |
260 <a ng-class="'sort-' + sortedByColumnsCls(columnName)" | |
261 ng-click="sortResultsBy(constants.KEY__IMAGEPAIRS__EXTRACOLUMNS
, columnName)" | |
262 href="" | |
263 class="sortable-header"> | |
264 {{extraColumnHeaders[columnName][constants.KEY__EXTRACOLUMNHEADER
S__HEADER_TEXT]}} | |
265 </a> | |
266 </th> | |
267 <!-- ... but there are a few columns where we display things different
ly. --> | |
268 <th> | |
269 <a ng-class="'sort-' + sortedByColumnsCls(constants.KEY__EXPECTATION
S__BUGS)" | |
270 ng-click="sortResultsBy(constants.KEY__IMAGEPAIRS__EXPECTATIONS,
constants.KEY__EXPECTATIONS__BUGS)" | |
271 href="" | |
272 class="sortable-header"> | |
273 bugs | |
274 </a> | |
275 </th> | |
276 <th width="{{imageSize}}"> | |
277 <a ng-class="'sort-' + sortedByColumnsCls(constants.KEY__IMAGEPAIRS_
_IMAGE_A_URL)" | |
278 ng-click="sortResultsBy('none', constants.KEY__IMAGEPAIRS__IMAGE_
A_URL)" | |
279 href="" | |
280 title="setA: '{{header[constants.KEY__HEADER__SET_A_DESCRIPTIONS]
[constants.KEY__SET_DESCRIPTIONS__SECTION]}}' within {{header[constants.KEY__HEA
DER__SET_A_DESCRIPTIONS][constants.KEY__SET_DESCRIPTIONS__DIR]}}" | |
281 class="sortable-header"> | |
282 <span ng-show="'Pending Approval' != viewingTab"> | |
283 {{imageSets[constants.KEY__IMAGESETS__SET__IMAGE_A][constants.KE
Y__IMAGESETS__FIELD__DESCRIPTION]}} | |
284 </span> | |
285 <span ng-show="'Pending Approval' == viewingTab"> | |
286 old expectations | |
287 </span> | |
288 </a> | |
289 </th> | |
290 <th width="{{imageSize}}"> | |
291 <a ng-class="'sort-' + sortedByColumnsCls(constants.KEY__IMAGEPAIRS_
_IMAGE_B_URL)" | |
292 ng-click="sortResultsBy('none', constants.KEY__IMAGEPAIRS__IMAGE_
B_URL)" | |
293 href="" | |
294 title="setB: '{{header[constants.KEY__HEADER__SET_B_DESCRIPTIONS]
[constants.KEY__SET_DESCRIPTIONS__SECTION]}}' within {{header[constants.KEY__HEA
DER__SET_B_DESCRIPTIONS][constants.KEY__SET_DESCRIPTIONS__DIR]}}" | |
295 class="sortable-header"> | |
296 <span ng-show="'Pending Approval' != viewingTab"> | |
297 {{imageSets[constants.KEY__IMAGESETS__SET__IMAGE_B][constants.KE
Y__IMAGESETS__FIELD__DESCRIPTION]}} | |
298 </span> | |
299 <span ng-show="'Pending Approval' == viewingTab"> | |
300 new expectations | |
301 </span> | |
302 </a> | |
303 </th> | |
304 <th width="{{imageSize}}"> | |
305 <a ng-class="'sort-' + sortedByColumnsCls(constants.KEY__DIFFERENCES
__PERCENT_DIFF_PIXELS)" | |
306 ng-click="sortResultsBy(constants.KEY__IMAGEPAIRS__DIFFERENCES, c
onstants.KEY__DIFFERENCES__PERCENT_DIFF_PIXELS)" | |
307 href="" | |
308 class="sortable-header"> | |
309 differing pixels in white | |
310 </a> | |
311 </th> | |
312 <th width="{{imageSize}}"> | |
313 <a ng-class="'sort-' + sortedByColumnsCls(constants.KEY__DIFFERENCES
__PERCEPTUAL_DIFF)" | |
314 ng-click="sortResultsBy(constants.KEY__IMAGEPAIRS__DIFFERENCES, c
onstants.KEY__DIFFERENCES__PERCEPTUAL_DIFF)" | |
315 href="" | |
316 class="sortable-header"> | |
317 perceptual difference | |
318 </a> | |
319 <br> | |
320 <input type="range" ng-model="pixelDiffBgColorBrightness" | |
321 ng-init="pixelDiffBgColorBrightness=64; pixelDiffBgColor=brig
htnessStringToHexColor(pixelDiffBgColorBrightness)" | |
322 ng-change="pixelDiffBgColor=brightnessStringToHexColor(pixelD
iffBgColorBrightness)" | |
323 title="image background brightness" | |
324 min="0" max="255"/> | |
325 </th> | |
326 <th> | |
327 <!-- imagepair-selection checkbox column --> | |
328 </th> | |
329 </tr> | |
330 | |
331 <tr ng-repeat="imagePair in limitedImagePairs" valign="top" | |
332 ng-class-odd="'results-odd'" ng-class-even="'results-even'" | |
333 results-updated-callback-directive> | |
334 | |
335 <td ng-repeat="columnName in orderedColumnNames"> | |
336 {{imagePair[constants.KEY__IMAGEPAIRS__EXTRACOLUMNS][columnName]}} | |
337 <br> | |
338 <button class="show-only-button" | |
339 ng-show="viewingTab == defaultTab" | |
340 ng-disabled="1 == setSize(showingColumnValues[columnName])" | |
341 ng-click="showOnlyColumnValue(columnName, imagePair[constant
s.KEY__IMAGEPAIRS__EXTRACOLUMNS][columnName])" | |
342 title="show only results of {{extraColumnHeaders[columnName]
[constants.KEY__EXTRACOLUMNHEADERS__HEADER_TEXT]}} {{imagePair[constants.KEY__IM
AGEPAIRS__EXTRACOLUMNS][columnName]}}"> | |
343 show only | |
344 </button> | |
345 <br> | |
346 <button class="show-all-button" | |
347 ng-show="viewingTab == defaultTab" | |
348 ng-disabled="allColumnValues[columnName].length == setSize(s
howingColumnValues[columnName])" | |
349 ng-click="showAllColumnValues(columnName)" | |
350 title="show results of all {{extraColumnHeaders[columnName][
constants.KEY__EXTRACOLUMNHEADERS__HEADER_TEXT]}}s"> | |
351 show all | |
352 </button> | |
353 </td> | |
354 | |
355 <!-- bugs --> | |
356 <td> | |
357 <a ng-repeat="bug in imagePair[constants.KEY__IMAGEPAIRS__EXPECTATIO
NS][constants.KEY__EXPECTATIONS__BUGS]" | |
358 href="https://code.google.com/p/skia/issues/detail?id={{bug}}" | |
359 target="_blank"> | |
360 {{bug}} | |
361 </a> | |
362 </td> | |
363 | |
364 <!-- image A --> | |
365 <td width="{{imageSize}}" ng-if="imagePair[constants.KEY__IMAGEPAIRS__
ROWSPAN] > 0" rowspan="{{imagePair[constants.KEY__IMAGEPAIRS__ROWSPAN]}}"> | |
366 <div ng-if="imagePair[constants.KEY__IMAGEPAIRS__IMAGE_A_URL] != nul
l"> | |
367 <a href="{{imageSets[constants.KEY__IMAGESETS__SET__IMAGE_A][const
ants.KEY__IMAGESETS__FIELD__BASE_URL]}}/{{imagePair[constants.KEY__IMAGEPAIRS__I
MAGE_A_URL]}}" target="_blank">View Image</a><br/> | |
368 <img ng-if="showThumbnails" | |
369 width="{{imageSize}}" | |
370 ng-src="{{imageSets[constants.KEY__IMAGESETS__SET__IMAGE_A][c
onstants.KEY__IMAGESETS__FIELD__BASE_URL]}}/{{imagePair[constants.KEY__IMAGEPAIR
S__IMAGE_A_URL]}}" /> | |
371 </div> | |
372 <div ng-show="imagePair[constants.KEY__IMAGEPAIRS__IMAGE_A_URL] == n
ull" | |
373 style="text-align:center"> | |
374 –none– | |
375 </div> | |
376 </td> | |
377 | |
378 <!-- image B --> | |
379 <td width="{{imageSize}}" ng-if="imagePair[constants.KEY__IMAGEPAIRS__
ROWSPAN] > 0" rowspan="{{imagePair[constants.KEY__IMAGEPAIRS__ROWSPAN]}}"> | |
380 <div ng-if="imagePair[constants.KEY__IMAGEPAIRS__IMAGE_B_URL] != nul
l"> | |
381 <a href="{{imageSets[constants.KEY__IMAGESETS__SET__IMAGE_B][const
ants.KEY__IMAGESETS__FIELD__BASE_URL]}}/{{imagePair[constants.KEY__IMAGEPAIRS__I
MAGE_B_URL]}}" target="_blank">View Image</a><br/> | |
382 <img ng-if="showThumbnails" | |
383 width="{{imageSize}}" | |
384 ng-src="{{imageSets[constants.KEY__IMAGESETS__SET__IMAGE_B][c
onstants.KEY__IMAGESETS__FIELD__BASE_URL]}}/{{imagePair[constants.KEY__IMAGEPAIR
S__IMAGE_B_URL]}}" /> | |
385 </div> | |
386 <div ng-show="imagePair[constants.KEY__IMAGEPAIRS__IMAGE_B_URL] == n
ull" | |
387 style="text-align:center"> | |
388 –none– | |
389 </div> | |
390 </td> | |
391 | |
392 <!-- whitediffs: every differing pixel shown in white --> | |
393 <td width="{{imageSize}}" ng-if="imagePair[constants.KEY__IMAGEPAIRS__
ROWSPAN] > 0" rowspan="{{imagePair[constants.KEY__IMAGEPAIRS__ROWSPAN]}}"> | |
394 <div ng-if="imagePair[constants.KEY__IMAGEPAIRS__IS_DIFFERENT]" | |
395 title="{{imagePair[constants.KEY__IMAGEPAIRS__DIFFERENCES][cons
tants.KEY__DIFFERENCES__NUM_DIFF_PIXELS] | number:0}} of {{(100 * imagePair[cons
tants.KEY__IMAGEPAIRS__DIFFERENCES][constants.KEY__DIFFERENCES__NUM_DIFF_PIXELS]
/ imagePair[constants.KEY__IMAGEPAIRS__DIFFERENCES][constants.KEY__DIFFERENCES_
_PERCENT_DIFF_PIXELS]) | number:0}} pixels ({{imagePair[constants.KEY__IMAGEPAIR
S__DIFFERENCES][constants.KEY__DIFFERENCES__PERCENT_DIFF_PIXELS].toFixed(4)}}%)
differ from expectation."> | |
396 | |
397 <a href="{{imageSets[constants.KEY__IMAGESETS__SET__WHITEDIFFS][co
nstants.KEY__IMAGESETS__FIELD__BASE_URL]}}/{{imagePair[constants.KEY__IMAGEPAIRS
__DIFFERENCES][constants.KEY__DIFFERENCES__WHITE_DIFF_URL]}}" target="_blank">Vi
ew Image</a><br/> | |
398 <img ng-if="showThumbnails" | |
399 width="{{imageSize}}" | |
400 ng-src="{{imageSets[constants.KEY__IMAGESETS__SET__WHITEDIFFS
][constants.KEY__IMAGESETS__FIELD__BASE_URL]}}/{{imagePair[constants.KEY__IMAGEP
AIRS__DIFFERENCES][constants.KEY__DIFFERENCES__WHITE_DIFF_URL]}}" /> | |
401 <br/> | |
402 {{imagePair[constants.KEY__IMAGEPAIRS__DIFFERENCES][constants.KEY_
_DIFFERENCES__PERCENT_DIFF_PIXELS].toFixed(4)}}% | |
403 ({{imagePair[constants.KEY__IMAGEPAIRS__DIFFERENCES][constants.KEY
__DIFFERENCES__NUM_DIFF_PIXELS]}}) | |
404 </div> | |
405 <div ng-show="!imagePair[constants.KEY__IMAGEPAIRS__IS_DIFFERENT]" | |
406 style="text-align:center"> | |
407 –none– | |
408 </div> | |
409 </td> | |
410 | |
411 <!-- diffs: per-channel RGB deltas --> | |
412 <td width="{{imageSize}}" ng-if="imagePair[constants.KEY__IMAGEPAIRS__
ROWSPAN] > 0" rowspan="{{imagePair[constants.KEY__IMAGEPAIRS__ROWSPAN]}}"> | |
413 <div ng-if="imagePair[constants.KEY__IMAGEPAIRS__IS_DIFFERENT]" | |
414 title="Perceptual difference measure is {{imagePair[constants.K
EY__IMAGEPAIRS__DIFFERENCES][constants.KEY__DIFFERENCES__PERCEPTUAL_DIFF].toFixe
d(4)}}%. Maximum difference per channel: R={{imagePair[constants.KEY__IMAGEPAIR
S__DIFFERENCES][constants.KEY__DIFFERENCES__MAX_DIFF_PER_CHANNEL][0]}}, G={{imag
ePair[constants.KEY__IMAGEPAIRS__DIFFERENCES][constants.KEY__DIFFERENCES__MAX_DI
FF_PER_CHANNEL][1]}}, B={{imagePair[constants.KEY__IMAGEPAIRS__DIFFERENCES][cons
tants.KEY__DIFFERENCES__MAX_DIFF_PER_CHANNEL][2]}}"> | |
415 | |
416 <a href="{{imageSets[constants.KEY__IMAGESETS__SET__DIFFS][constan
ts.KEY__IMAGESETS__FIELD__BASE_URL]}}/{{imagePair[constants.KEY__IMAGEPAIRS__DIF
FERENCES][constants.KEY__DIFFERENCES__DIFF_URL]}}" target="_blank">View Image</a
><br/> | |
417 <img ng-if="showThumbnails" | |
418 ng-style="{backgroundColor: pixelDiffBgColor}" | |
419 width="{{imageSize}}" | |
420 ng-src="{{imageSets[constants.KEY__IMAGESETS__SET__DIFFS][con
stants.KEY__IMAGESETS__FIELD__BASE_URL]}}/{{imagePair[constants.KEY__IMAGEPAIRS_
_DIFFERENCES][constants.KEY__DIFFERENCES__DIFF_URL]}}" /> | |
421 <br/> | |
422 {{imagePair[constants.KEY__IMAGEPAIRS__DIFFERENCES][constants.KEY_
_DIFFERENCES__PERCEPTUAL_DIFF].toFixed(4)}}% | |
423 {{imagePair[constants.KEY__IMAGEPAIRS__DIFFERENCES][constants.KEY_
_DIFFERENCES__MAX_DIFF_PER_CHANNEL]}} | |
424 </div> | |
425 <div ng-show="!imagePair[constants.KEY__IMAGEPAIRS__IS_DIFFERENT]" | |
426 style="text-align:center"> | |
427 –none– | |
428 </div> | |
429 </td> | |
430 | |
431 <td ng-if="imagePair[constants.KEY__IMAGEPAIRS__ROWSPAN] > 0" rowspan=
"{{imagePair[constants.KEY__IMAGEPAIRS__ROWSPAN]}}"> | |
432 <br/> | |
433 <input type="checkbox" | |
434 name="rowSelect" | |
435 value="{{imagePair.index}}" | |
436 ng-checked="isValueInArray(imagePair.index, selectedImagePair
s)" | |
437 ng-click="toggleSomeImagePairs($index, imagePair[constants.KE
Y__IMAGEPAIRS__ROWSPAN])"> | |
438 </tr> | |
439 </table> <!-- imagePairs --> | |
440 </td></tr></table> <!-- table holding results header + imagePairs table --> | |
441 | |
442 </div><!-- main display area of selected tab --> | |
443 </div><!-- everything: hide until readyToDisplay --> | |
444 | |
445 </body> | |
446 </html> | |
OLD | NEW |