blob: 1662adf89cb9e1fb01657abdf3790f3c1a3a970c [file] [log] [blame]
epoger0b712762014-08-05 10:07:22 -07001<!DOCTYPE html>
2
3<html ng-app="Loader" ng-controller="Loader.Controller">
4
5<head>
6 <title ng-bind="windowTitle"></title>
humper27ff2272014-08-06 12:39:59 -07007 <script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
stephanad9bf7db2014-08-08 07:21:00 -07008 <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.20/angular.js"></script>
epoger0b712762014-08-05 10:07:22 -07009 <script src="constants.js"></script>
10 <script src="live-loader.js"></script>
humper27ff2272014-08-06 12:39:59 -070011 <script src="utils.js"></script>
12
epoger0b712762014-08-05 10:07:22 -070013 <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>
epogere73cd5a2014-08-07 12:13:12 -070027 <li>setA: "{{setASection}}" within {{setADir}}</li>
28 <li>setB: "{{setBSection}}" within {{setBDir}}</li>
epoger0b712762014-08-05 10:07:22 -070029 </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
epoger0b712762014-08-05 10:07:22 -070044 <div ng-show="header[constants.KEY__HEADER__TIME_UPDATED]">
epoger5c4b1372014-08-14 07:12:46 -070045 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.com/skia/+/{{header[constants.KEY__HEADER__SET_A_DESCRIPTIONS][constants.KEY__SET_DESCRIPTIONS__REPO_REVISION]}}">rev {{header[constants.KEY__HEADER__SET_A_DESCRIPTIONS][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.com/skia/+/{{header[constants.KEY__HEADER__SET_B_DESCRIPTIONS][constants.KEY__SET_DESCRIPTIONS__REPO_REVISION]}}">rev {{header[constants.KEY__HEADER__SET_B_DESCRIPTIONS][constants.KEY__SET_DESCRIPTIONS__REPO_REVISION]}}</a></span>
52 <br>
epoger30e26cd2014-08-13 19:29:49 -070053 <a href="{{liveQueryUrl}}">latest raw JSON diffs between these two sets</a><br>
epoger0b712762014-08-05 10:07:22 -070054 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 &nbsp;{{tab}} ({{numResultsPerTab[tab]}})&nbsp;
63 </div>
64 <div class="tab-spacer">
65 &nbsp;
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__EXTRACOLUMNHEADERS__IS_FILTERABLE]">
90 {{extraColumnHeaders[columnName][constants.KEY__EXTRACOLUMNHEADERS__HEADER_TEXT]}}<br>
91
92 <!-- If we filter this column using free-form text match... -->
93 <div ng-if="extraColumnHeaders[columnName][constants.KEY__EXTRACOLUMNHEADERS__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__EXTRACOLUMNHEADERS__USE_FREEFORM_FILTER]">
106 <label ng-repeat="valueAndCount in extraColumnHeaders[columnName][constants.KEY__EXTRACOLUMNHEADERS__VALUES_AND_COUNTS]">
107 <input type="checkbox"
108 name="resultTypes"
109 value="{{valueAndCount[0]}}"
110 ng-checked="isValueInSet(valueAndCount[0], showingColumnValues[columnName])"
111 ng-click="toggleValueInSet(valueAndCount[0], showingColumnValues[columnName]); setUpdatesPending(true)">
112 {{valueAndCount[0]}} ({{valueAndCount[1]}})<br>
113 </label>
114 <button ng-click="showingColumnValues[columnName] = {}; toggleValuesInSet(allColumnValues[columnName], showingColumnValues[columnName]); updateResults()"
115 ng-disabled="!readyToDisplay || allColumnValues[columnName].length == setSize(showingColumnValues[columnName])">
116 all
117 </button>
118 <button ng-click="showingColumnValues[columnName] = {}; updateResults()"
119 ng-disabled="!readyToDisplay || 0 == setSize(showingColumnValues[columnName])">
120 none
121 </button>
122 <button ng-click="toggleValuesInSet(allColumnValues[columnName], showingColumnValues[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)"
epoger2c4352b2014-08-20 08:00:28 -0700176 ng-disabled="submitPending || (filteredImagePairs.length == 0)">
177 Get a patchfile to update these {{filteredImagePairs.length}} expectations
epoger0b712762014-08-05 10:07:22 -0700178 </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, constants.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>
epoger2c4352b2014-08-20 08:00:28 -0700201 <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>
epoger3144d372014-08-20 10:55:27 -0700206 <br>
207 <a download="patch.txt" ng-href="{{diffResultsBlobUrl}}">
208 Click here to download that patch as a text file.
209 </a>
epoger2c4352b2014-08-20 08:00:28 -0700210 </div>
epoger0b712762014-08-05 10:07:22 -0700211 </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">
stephanad9bf7db2014-08-08 07:21:00 -0700260 <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__EXTRACOLUMNHEADERS__HEADER_TEXT]}}
265 </a>
epoger0b712762014-08-05 10:07:22 -0700266 </th>
267 <!-- ... but there are a few columns where we display things differently. -->
268 <th>
stephanad9bf7db2014-08-08 07:21:00 -0700269 <a ng-class="'sort-' + sortedByColumnsCls(constants.KEY__EXPECTATIONS__BUGS)"
270 ng-click="sortResultsBy(constants.KEY__IMAGEPAIRS__EXPECTATIONS, constants.KEY__EXPECTATIONS__BUGS)"
271 href=""
272 class="sortable-header">
273 bugs
274 </a>
epoger0b712762014-08-05 10:07:22 -0700275 </th>
276 <th width="{{imageSize}}">
stephanad9bf7db2014-08-08 07:21:00 -0700277 <a ng-class="'sort-' + sortedByColumnsCls(constants.KEY__IMAGEPAIRS__IMAGE_A_URL)"
278 ng-click="sortResultsBy('none', constants.KEY__IMAGEPAIRS__IMAGE_A_URL)"
279 href=""
epoger5c4b1372014-08-14 07:12:46 -0700280 title="setA: '{{header[constants.KEY__HEADER__SET_A_DESCRIPTIONS][constants.KEY__SET_DESCRIPTIONS__SECTION]}}' within {{header[constants.KEY__HEADER__SET_A_DESCRIPTIONS][constants.KEY__SET_DESCRIPTIONS__DIR]}}"
stephanad9bf7db2014-08-08 07:21:00 -0700281 class="sortable-header">
epoger8ab362e2014-08-19 12:17:06 -0700282 <span ng-show="'Pending Approval' != viewingTab">
283 {{imageSets[constants.KEY__IMAGESETS__SET__IMAGE_A][constants.KEY__IMAGESETS__FIELD__DESCRIPTION]}}
284 </span>
285 <span ng-show="'Pending Approval' == viewingTab">
286 old expectations
287 </span>
stephanad9bf7db2014-08-08 07:21:00 -0700288 </a>
epoger0b712762014-08-05 10:07:22 -0700289 </th>
290 <th width="{{imageSize}}">
stephanad9bf7db2014-08-08 07:21:00 -0700291 <a ng-class="'sort-' + sortedByColumnsCls(constants.KEY__IMAGEPAIRS__IMAGE_B_URL)"
292 ng-click="sortResultsBy('none', constants.KEY__IMAGEPAIRS__IMAGE_B_URL)"
293 href=""
epoger5c4b1372014-08-14 07:12:46 -0700294 title="setB: '{{header[constants.KEY__HEADER__SET_B_DESCRIPTIONS][constants.KEY__SET_DESCRIPTIONS__SECTION]}}' within {{header[constants.KEY__HEADER__SET_B_DESCRIPTIONS][constants.KEY__SET_DESCRIPTIONS__DIR]}}"
stephanad9bf7db2014-08-08 07:21:00 -0700295 class="sortable-header">
epoger8ab362e2014-08-19 12:17:06 -0700296 <span ng-show="'Pending Approval' != viewingTab">
297 {{imageSets[constants.KEY__IMAGESETS__SET__IMAGE_B][constants.KEY__IMAGESETS__FIELD__DESCRIPTION]}}
298 </span>
299 <span ng-show="'Pending Approval' == viewingTab">
300 new expectations
301 </span>
stephanad9bf7db2014-08-08 07:21:00 -0700302 </a>
epoger0b712762014-08-05 10:07:22 -0700303 </th>
304 <th width="{{imageSize}}">
stephanad9bf7db2014-08-08 07:21:00 -0700305 <a ng-class="'sort-' + sortedByColumnsCls(constants.KEY__DIFFERENCES__PERCENT_DIFF_PIXELS)"
306 ng-click="sortResultsBy(constants.KEY__IMAGEPAIRS__DIFFERENCES, constants.KEY__DIFFERENCES__PERCENT_DIFF_PIXELS)"
307 href=""
308 class="sortable-header">
309 differing pixels in white
310 </a>
epoger0b712762014-08-05 10:07:22 -0700311 </th>
312 <th width="{{imageSize}}">
stephanad9bf7db2014-08-08 07:21:00 -0700313 <a ng-class="'sort-' + sortedByColumnsCls(constants.KEY__DIFFERENCES__PERCEPTUAL_DIFF)"
314 ng-click="sortResultsBy(constants.KEY__IMAGEPAIRS__DIFFERENCES, constants.KEY__DIFFERENCES__PERCEPTUAL_DIFF)"
315 href=""
316 class="sortable-header">
317 perceptual difference
318 </a>
epoger0b712762014-08-05 10:07:22 -0700319 <br>
320 <input type="range" ng-model="pixelDiffBgColorBrightness"
321 ng-init="pixelDiffBgColorBrightness=64; pixelDiffBgColor=brightnessStringToHexColor(pixelDiffBgColorBrightness)"
322 ng-change="pixelDiffBgColor=brightnessStringToHexColor(pixelDiffBgColorBrightness)"
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[constants.KEY__IMAGEPAIRS__EXTRACOLUMNS][columnName])"
342 title="show only results of {{extraColumnHeaders[columnName][constants.KEY__EXTRACOLUMNHEADERS__HEADER_TEXT]}} {{imagePair[constants.KEY__IMAGEPAIRS__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(showingColumnValues[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__EXPECTATIONS][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] != null">
367 <a href="{{imageSets[constants.KEY__IMAGESETS__SET__IMAGE_A][constants.KEY__IMAGESETS__FIELD__BASE_URL]}}/{{imagePair[constants.KEY__IMAGEPAIRS__IMAGE_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][constants.KEY__IMAGESETS__FIELD__BASE_URL]}}/{{imagePair[constants.KEY__IMAGEPAIRS__IMAGE_A_URL]}}" />
371 </div>
372 <div ng-show="imagePair[constants.KEY__IMAGEPAIRS__IMAGE_A_URL] == null"
373 style="text-align:center">
374 &ndash;none&ndash;
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] != null">
381 <a href="{{imageSets[constants.KEY__IMAGESETS__SET__IMAGE_B][constants.KEY__IMAGESETS__FIELD__BASE_URL]}}/{{imagePair[constants.KEY__IMAGEPAIRS__IMAGE_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][constants.KEY__IMAGESETS__FIELD__BASE_URL]}}/{{imagePair[constants.KEY__IMAGEPAIRS__IMAGE_B_URL]}}" />
385 </div>
386 <div ng-show="imagePair[constants.KEY__IMAGEPAIRS__IMAGE_B_URL] == null"
387 style="text-align:center">
388 &ndash;none&ndash;
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][constants.KEY__DIFFERENCES__NUM_DIFF_PIXELS] | number:0}} of {{(100 * imagePair[constants.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__IMAGEPAIRS__DIFFERENCES][constants.KEY__DIFFERENCES__PERCENT_DIFF_PIXELS].toFixed(4)}}%) differ from expectation.">
396
stephanaa1aa5c22014-08-15 06:53:23 -0700397 <a href="{{imageSets[constants.KEY__IMAGESETS__SET__WHITEDIFFS][constants.KEY__IMAGESETS__FIELD__BASE_URL]}}/{{imagePair[constants.KEY__IMAGEPAIRS__DIFFERENCES][constants.KEY__DIFFERENCES__WHITE_DIFF_URL]}}" target="_blank">View Image</a><br/>
epoger0b712762014-08-05 10:07:22 -0700398 <img ng-if="showThumbnails"
399 width="{{imageSize}}"
stephanaa1aa5c22014-08-15 06:53:23 -0700400 ng-src="{{imageSets[constants.KEY__IMAGESETS__SET__WHITEDIFFS][constants.KEY__IMAGESETS__FIELD__BASE_URL]}}/{{imagePair[constants.KEY__IMAGEPAIRS__DIFFERENCES][constants.KEY__DIFFERENCES__WHITE_DIFF_URL]}}" />
epoger0b712762014-08-05 10:07:22 -0700401 <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 &ndash;none&ndash;
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.KEY__IMAGEPAIRS__DIFFERENCES][constants.KEY__DIFFERENCES__PERCEPTUAL_DIFF].toFixed(4)}}%. Maximum difference per channel: R={{imagePair[constants.KEY__IMAGEPAIRS__DIFFERENCES][constants.KEY__DIFFERENCES__MAX_DIFF_PER_CHANNEL][0]}}, G={{imagePair[constants.KEY__IMAGEPAIRS__DIFFERENCES][constants.KEY__DIFFERENCES__MAX_DIFF_PER_CHANNEL][1]}}, B={{imagePair[constants.KEY__IMAGEPAIRS__DIFFERENCES][constants.KEY__DIFFERENCES__MAX_DIFF_PER_CHANNEL][2]}}">
415
stephanaa1aa5c22014-08-15 06:53:23 -0700416 <a href="{{imageSets[constants.KEY__IMAGESETS__SET__DIFFS][constants.KEY__IMAGESETS__FIELD__BASE_URL]}}/{{imagePair[constants.KEY__IMAGEPAIRS__DIFFERENCES][constants.KEY__DIFFERENCES__DIFF_URL]}}" target="_blank">View Image</a><br/>
epoger0b712762014-08-05 10:07:22 -0700417 <img ng-if="showThumbnails"
418 ng-style="{backgroundColor: pixelDiffBgColor}"
419 width="{{imageSize}}"
stephanaa1aa5c22014-08-15 06:53:23 -0700420 ng-src="{{imageSets[constants.KEY__IMAGESETS__SET__DIFFS][constants.KEY__IMAGESETS__FIELD__BASE_URL]}}/{{imagePair[constants.KEY__IMAGEPAIRS__DIFFERENCES][constants.KEY__DIFFERENCES__DIFF_URL]}}" />
epoger0b712762014-08-05 10:07:22 -0700421 <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 &ndash;none&ndash;
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, selectedImagePairs)"
437 ng-click="toggleSomeImagePairs($index, imagePair[constants.KEY__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>