| 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 |