Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 /* | 8 /* |
| 9 * Code for the "gm" (Golden Master) rendering comparison tool. | 9 * Code for the "gm" (Golden Master) rendering comparison tool. |
| 10 * | 10 * |
| (...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 216 static void force_all_opaque(const SkBitmap& bitmap) { | 216 static void force_all_opaque(const SkBitmap& bitmap) { |
| 217 SkBitmap::Config config = bitmap.config(); | 217 SkBitmap::Config config = bitmap.config(); |
| 218 switch (config) { | 218 switch (config) { |
| 219 case SkBitmap::kARGB_8888_Config: | 219 case SkBitmap::kARGB_8888_Config: |
| 220 force_all_opaque_8888(bitmap); | 220 force_all_opaque_8888(bitmap); |
| 221 break; | 221 break; |
| 222 case SkBitmap::kRGB_565_Config: | 222 case SkBitmap::kRGB_565_Config: |
| 223 // nothing to do here; 565 bitmaps are inherently opaque | 223 // nothing to do here; 565 bitmaps are inherently opaque |
| 224 break; | 224 break; |
| 225 default: | 225 default: |
| 226 fprintf(stderr, "unsupported bitmap config %d\n", config); | 226 gm_fprintf(stderr, "unsupported bitmap config %d\n", config); |
| 227 SkDEBUGFAIL("unsupported bitmap config"); | 227 DEBUGFAIL_SEE_STDERR; |
| 228 } | 228 } |
| 229 } | 229 } |
| 230 | 230 |
| 231 static void force_all_opaque_8888(const SkBitmap& bitmap) { | 231 static void force_all_opaque_8888(const SkBitmap& bitmap) { |
| 232 SkAutoLockPixels lock(bitmap); | 232 SkAutoLockPixels lock(bitmap); |
| 233 for (int y = 0; y < bitmap.height(); y++) { | 233 for (int y = 0; y < bitmap.height(); y++) { |
| 234 for (int x = 0; x < bitmap.width(); x++) { | 234 for (int x = 0; x < bitmap.width(); x++) { |
| 235 *bitmap.getAddr32(x, y) |= (SK_A32_MASK << SK_A32_SHIFT); | 235 *bitmap.getAddr32(x, y) |= (SK_A32_MASK << SK_A32_SHIFT); |
| 236 } | 236 } |
| 237 } | 237 } |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 264 FailRec& rec = fFailedTests.push_back(make_name( | 264 FailRec& rec = fFailedTests.push_back(make_name( |
| 265 name.c_str(), renderModeDescriptor)); | 265 name.c_str(), renderModeDescriptor)); |
| 266 rec.fIsPixelError = | 266 rec.fIsPixelError = |
| 267 (kEmptyErrorBitfield != (errorType & kImageMismatch_ErrorBitmask)); | 267 (kEmptyErrorBitfield != (errorType & kImageMismatch_ErrorBitmask)); |
| 268 } | 268 } |
| 269 | 269 |
| 270 // List contents of fFailedTests via SkDebug. | 270 // List contents of fFailedTests via SkDebug. |
| 271 void ListErrors() { | 271 void ListErrors() { |
| 272 for (int i = 0; i < fFailedTests.count(); ++i) { | 272 for (int i = 0; i < fFailedTests.count(); ++i) { |
| 273 if (fFailedTests[i].fIsPixelError) { | 273 if (fFailedTests[i].fIsPixelError) { |
| 274 SkDebugf("\t\t%s pixel_error\n", fFailedTests[i].fName.c_str()); | 274 gm_fprintf(stderr, "\t\t%s pixel_error\n", fFailedTests[i].fName .c_str()); |
|
borenet
2013/03/13 11:58:41
Thanks for directing these to stderr.
| |
| 275 } else { | 275 } else { |
| 276 SkDebugf("\t\t%s\n", fFailedTests[i].fName.c_str()); | 276 gm_fprintf(stderr, "\t\t%s\n", fFailedTests[i].fName.c_str()); |
| 277 } | 277 } |
| 278 } | 278 } |
| 279 } | 279 } |
| 280 | 280 |
| 281 static bool write_document(const SkString& path, | 281 static bool write_document(const SkString& path, |
| 282 const SkDynamicMemoryWStream& document) { | 282 const SkDynamicMemoryWStream& document) { |
| 283 SkFILEWStream stream(path.c_str()); | 283 SkFILEWStream stream(path.c_str()); |
| 284 SkAutoDataUnref data(document.copyToData()); | 284 SkAutoDataUnref data(document.copyToData()); |
| 285 return stream.writeData(data.get()); | 285 return stream.writeData(data.get()); |
| 286 } | 286 } |
| (...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 511 success = write_document(path, *document); | 511 success = write_document(path, *document); |
| 512 } | 512 } |
| 513 if (kXPS_Backend == gRec.fBackend) { | 513 if (kXPS_Backend == gRec.fBackend) { |
| 514 path = make_filename(writePath, renderModeDescriptor, name.c_str(), | 514 path = make_filename(writePath, renderModeDescriptor, name.c_str(), |
| 515 "xps"); | 515 "xps"); |
| 516 success = write_document(path, *document); | 516 success = write_document(path, *document); |
| 517 } | 517 } |
| 518 if (success) { | 518 if (success) { |
| 519 return kEmptyErrorBitfield; | 519 return kEmptyErrorBitfield; |
| 520 } else { | 520 } else { |
| 521 fprintf(stderr, "FAILED to write %s\n", path.c_str()); | 521 gm_fprintf(stderr, "FAILED to write %s\n", path.c_str()); |
| 522 RecordError(kWritingReferenceImage_ErrorBitmask, name, | 522 RecordError(kWritingReferenceImage_ErrorBitmask, name, |
| 523 renderModeDescriptor); | 523 renderModeDescriptor); |
| 524 return kWritingReferenceImage_ErrorBitmask; | 524 return kWritingReferenceImage_ErrorBitmask; |
| 525 } | 525 } |
| 526 } | 526 } |
| 527 | 527 |
| 528 /** | 528 /** |
| 529 * Log more detail about the mistmatch between expectedBitmap and | 529 * Log more detail about the mistmatch between expectedBitmap and |
| 530 * actualBitmap. | 530 * actualBitmap. |
| 531 */ | 531 */ |
| 532 void report_bitmap_diffs(const SkBitmap& expectedBitmap, const SkBitmap& act ualBitmap, | 532 void report_bitmap_diffs(const SkBitmap& expectedBitmap, const SkBitmap& act ualBitmap, |
| 533 const char *testName) { | 533 const char *testName) { |
| 534 const int expectedWidth = expectedBitmap.width(); | 534 const int expectedWidth = expectedBitmap.width(); |
| 535 const int expectedHeight = expectedBitmap.height(); | 535 const int expectedHeight = expectedBitmap.height(); |
| 536 const int width = actualBitmap.width(); | 536 const int width = actualBitmap.width(); |
| 537 const int height = actualBitmap.height(); | 537 const int height = actualBitmap.height(); |
| 538 if ((expectedWidth != width) || (expectedHeight != height)) { | 538 if ((expectedWidth != width) || (expectedHeight != height)) { |
| 539 SkDebugf("---- %s: dimension mismatch -- expected [%d %d], actual [% d %d]\n", | 539 gm_fprintf(stderr, "---- %s: dimension mismatch --" |
| 540 testName, expectedWidth, expectedHeight, width, height); | 540 " expected [%d %d], actual [%d %d]\n", |
| 541 testName, expectedWidth, expectedHeight, width, height); | |
| 541 return; | 542 return; |
| 542 } | 543 } |
| 543 | 544 |
| 544 if ((SkBitmap::kARGB_8888_Config != expectedBitmap.config()) || | 545 if ((SkBitmap::kARGB_8888_Config != expectedBitmap.config()) || |
| 545 (SkBitmap::kARGB_8888_Config != actualBitmap.config())) { | 546 (SkBitmap::kARGB_8888_Config != actualBitmap.config())) { |
| 546 SkDebugf("---- %s: not computing max per-channel pixel mismatch beca use non-8888\n", | 547 gm_fprintf(stderr, "---- %s: not computing max per-channel" |
| 547 testName); | 548 " pixel mismatch because non-8888\n", testName); |
| 548 return; | 549 return; |
| 549 } | 550 } |
| 550 | 551 |
| 551 SkAutoLockPixels alp0(expectedBitmap); | 552 SkAutoLockPixels alp0(expectedBitmap); |
| 552 SkAutoLockPixels alp1(actualBitmap); | 553 SkAutoLockPixels alp1(actualBitmap); |
| 553 int errR = 0; | 554 int errR = 0; |
| 554 int errG = 0; | 555 int errG = 0; |
| 555 int errB = 0; | 556 int errB = 0; |
| 556 int errA = 0; | 557 int errA = 0; |
| 557 int differingPixels = 0; | 558 int differingPixels = 0; |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 568 (int)SkGetPackedR32(actualPixel ))); | 569 (int)SkGetPackedR32(actualPixel ))); |
| 569 errG = SkMax32(errG, SkAbs32((int)SkGetPackedG32(expectedPix el) - | 570 errG = SkMax32(errG, SkAbs32((int)SkGetPackedG32(expectedPix el) - |
| 570 (int)SkGetPackedG32(actualPixel ))); | 571 (int)SkGetPackedG32(actualPixel ))); |
| 571 errB = SkMax32(errB, SkAbs32((int)SkGetPackedB32(expectedPix el) - | 572 errB = SkMax32(errB, SkAbs32((int)SkGetPackedB32(expectedPix el) - |
| 572 (int)SkGetPackedB32(actualPixel ))); | 573 (int)SkGetPackedB32(actualPixel ))); |
| 573 errA = SkMax32(errA, SkAbs32((int)SkGetPackedA32(expectedPix el) - | 574 errA = SkMax32(errA, SkAbs32((int)SkGetPackedA32(expectedPix el) - |
| 574 (int)SkGetPackedA32(actualPixel ))); | 575 (int)SkGetPackedA32(actualPixel ))); |
| 575 } | 576 } |
| 576 } | 577 } |
| 577 } | 578 } |
| 578 SkDebugf("---- %s: %d (of %d) differing pixels, max per-channel mismatch " | 579 gm_fprintf(stderr, "---- %s: %d (of %d) differing pixels," |
| 579 " R=%d G=%d B=%d A=%d\n", | 580 " max per-channel mismatch R=%d G=%d B=%d A=%d\n", |
| 580 testName, differingPixels, width*height, errR, errG, errB, errA ); | 581 testName, differingPixels, width*height, errR, errG, errB, er rA); |
| 581 } | 582 } |
| 582 | 583 |
| 583 /** | 584 /** |
| 584 * Compares actual checksum to expectations. Returns | 585 * Compares actual checksum to expectations. Returns |
| 585 * kEmptyErrorBitfield if they match, or some combination of | 586 * kEmptyErrorBitfield if they match, or some combination of |
| 586 * _ErrorBitmask values otherwise. | 587 * _ErrorBitmask values otherwise. |
| 587 * | 588 * |
| 588 * If fMismatchPath has been set, and there are pixel diffs, then the | 589 * If fMismatchPath has been set, and there are pixel diffs, then the |
| 589 * actual bitmap will be written out to a file within fMismatchPath. | 590 * actual bitmap will be written out to a file within fMismatchPath. |
| 590 * | 591 * |
| (...skipping 414 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1005 #ifdef SK_SUPPORT_XPS | 1006 #ifdef SK_SUPPORT_XPS |
| 1006 /* At present we have no way of comparing XPS files (either natively or by c onverting to PNG). */ | 1007 /* At present we have no way of comparing XPS files (either natively or by c onverting to PNG). */ |
| 1007 { SkBitmap::kARGB_8888_Config, kXPS_Backend, kDontCare_GLContextType, 0, kWrite_ConfigFlag, "xps" }, | 1008 { SkBitmap::kARGB_8888_Config, kXPS_Backend, kDontCare_GLContextType, 0, kWrite_ConfigFlag, "xps" }, |
| 1008 #endif // SK_SUPPORT_XPS | 1009 #endif // SK_SUPPORT_XPS |
| 1009 #ifdef SK_SUPPORT_PDF | 1010 #ifdef SK_SUPPORT_PDF |
| 1010 { SkBitmap::kARGB_8888_Config, kPDF_Backend, kDontCare_GLContextType, 0, kPDFConfigFlags, "pdf" }, | 1011 { SkBitmap::kARGB_8888_Config, kPDF_Backend, kDontCare_GLContextType, 0, kPDFConfigFlags, "pdf" }, |
| 1011 #endif // SK_SUPPORT_PDF | 1012 #endif // SK_SUPPORT_PDF |
| 1012 }; | 1013 }; |
| 1013 | 1014 |
| 1014 static void usage(const char * argv0) { | 1015 static void usage(const char * argv0) { |
| 1015 SkDebugf("%s\n", argv0); | 1016 fprintf(stderr, "%s\n", argv0); |
| 1016 SkDebugf(" [--config "); | 1017 fprintf(stderr, " [--config "); |
| 1017 for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); ++i) { | 1018 for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); ++i) { |
| 1018 if (i > 0) { | 1019 if (i > 0) { |
| 1019 SkDebugf("|"); | 1020 fprintf(stderr, "|"); |
| 1020 } | 1021 } |
| 1021 SkDebugf(gRec[i].fName); | 1022 fprintf(stderr, "%s", gRec[i].fName); |
| 1022 } | 1023 } |
| 1023 SkDebugf("]:\n run these configurations\n"); | 1024 fprintf(stderr, "]:\n run these configurations\n"); |
| 1024 SkDebugf( | 1025 fprintf(stderr, |
| 1025 // Alphabetized ignoring "no" prefix ("readPath", "noreplay", "resourcePath"). | 1026 // Alphabetized ignoring "no" prefix ("readPath", "noreplay", "resourcePath"). |
| 1026 // It would probably be better if we allowed both yes-and-no settings for each | 1027 // It would probably be better if we allowed both yes-and-no settings for each |
| 1027 // one, e.g.: | 1028 // one, e.g.: |
| 1028 // [--replay|--noreplay]: whether to exercise SkPicture replay; default is yes | 1029 // [--replay|--noreplay]: whether to exercise SkPicture replay; default is yes |
| 1029 " [--nodeferred]: skip the deferred rendering test pass\n" | 1030 " [--nodeferred]: skip the deferred rendering test pass\n" |
| 1030 " [--disable-missing-warning]: don't print a message to stderr if\n" | 1031 " [--disable-missing-warning]: don't print a message to stderr if\n" |
| 1031 " unable to read a reference image for any tests (NOT default behavior)\n " | 1032 " unable to read a reference image for any tests (NOT default behavior)\n " |
| 1032 " [--enable-missing-warning]: print message to stderr (but don't fail) if\n" | 1033 " [--enable-missing-warning]: print message to stderr (but don't fail) if\n" |
| 1033 " unable to read a reference image for any tests (default behavior)\n" | 1034 " unable to read a reference image for any tests (default behavior)\n" |
| 1034 " [--exclude-config]: disable this config (may be used multiple times)\n" | 1035 " [--exclude-config]: disable this config (may be used multiple times)\n" |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1190 char* const* stop = argv + argc; | 1191 char* const* stop = argv + argc; |
| 1191 for (++argv; argv < stop; ++argv) { | 1192 for (++argv; argv < stop; ++argv) { |
| 1192 if (strcmp(*argv, "--config") == 0) { | 1193 if (strcmp(*argv, "--config") == 0) { |
| 1193 argv++; | 1194 argv++; |
| 1194 if (argv < stop) { | 1195 if (argv < stop) { |
| 1195 int index = findConfig(*argv); | 1196 int index = findConfig(*argv); |
| 1196 if (index >= 0) { | 1197 if (index >= 0) { |
| 1197 appendUnique<size_t>(&configs, index); | 1198 appendUnique<size_t>(&configs, index); |
| 1198 userConfig = true; | 1199 userConfig = true; |
| 1199 } else { | 1200 } else { |
| 1200 SkString str; | 1201 gm_fprintf(stderr, "unrecognized config %s\n", *argv); |
| 1201 str.printf("unrecognized config %s\n", *argv); | |
| 1202 SkDebugf(str.c_str()); | |
| 1203 usage(commandName); | 1202 usage(commandName); |
| 1204 return -1; | 1203 return -1; |
| 1205 } | 1204 } |
| 1206 } else { | 1205 } else { |
| 1207 SkDebugf("missing arg for --config\n"); | 1206 gm_fprintf(stderr, "missing arg for --config\n"); |
| 1208 usage(commandName); | 1207 usage(commandName); |
| 1209 return -1; | 1208 return -1; |
| 1210 } | 1209 } |
| 1211 } else if (strcmp(*argv, "--exclude-config") == 0) { | 1210 } else if (strcmp(*argv, "--exclude-config") == 0) { |
| 1212 argv++; | 1211 argv++; |
| 1213 if (argv < stop) { | 1212 if (argv < stop) { |
| 1214 int index = findConfig(*argv); | 1213 int index = findConfig(*argv); |
| 1215 if (index >= 0) { | 1214 if (index >= 0) { |
| 1216 *excludeConfigs.append() = index; | 1215 *excludeConfigs.append() = index; |
| 1217 } else { | 1216 } else { |
| 1218 SkString str; | 1217 gm_fprintf(stderr, "unrecognized exclude-config %s\n", *argv ); |
| 1219 str.printf("unrecognized exclude-config %s\n", *argv); | |
| 1220 SkDebugf(str.c_str()); | |
| 1221 usage(commandName); | 1218 usage(commandName); |
| 1222 return -1; | 1219 return -1; |
| 1223 } | 1220 } |
| 1224 } else { | 1221 } else { |
| 1225 SkDebugf("missing arg for --exclude-config\n"); | 1222 gm_fprintf(stderr, "missing arg for --exclude-config\n"); |
| 1226 usage(commandName); | 1223 usage(commandName); |
| 1227 return -1; | 1224 return -1; |
| 1228 } | 1225 } |
| 1229 } else if (strcmp(*argv, "--nodeferred") == 0) { | 1226 } else if (strcmp(*argv, "--nodeferred") == 0) { |
| 1230 doDeferred = false; | 1227 doDeferred = false; |
| 1231 } else if (strcmp(*argv, "--disable-missing-warning") == 0) { | 1228 } else if (strcmp(*argv, "--disable-missing-warning") == 0) { |
| 1232 notifyMissingReadReference = false; | 1229 notifyMissingReadReference = false; |
| 1233 } else if (strcmp(*argv, "--mismatchPath") == 0) { | 1230 } else if (strcmp(*argv, "--mismatchPath") == 0) { |
| 1234 argv++; | 1231 argv++; |
| 1235 if (argv < stop && **argv) { | 1232 if (argv < stop && **argv) { |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 1260 } else if (strcmp(*argv, "--enable-missing-warning") == 0) { | 1257 } else if (strcmp(*argv, "--enable-missing-warning") == 0) { |
| 1261 notifyMissingReadReference = true; | 1258 notifyMissingReadReference = true; |
| 1262 } else if (strcmp(*argv, "--forceBWtext") == 0) { | 1259 } else if (strcmp(*argv, "--forceBWtext") == 0) { |
| 1263 gForceBWtext = true; | 1260 gForceBWtext = true; |
| 1264 #if SK_SUPPORT_GPU | 1261 #if SK_SUPPORT_GPU |
| 1265 } else if (strcmp(*argv, "--gpuCacheSize") == 0) { | 1262 } else if (strcmp(*argv, "--gpuCacheSize") == 0) { |
| 1266 if (stop - argv > 2) { | 1263 if (stop - argv > 2) { |
| 1267 gpuCacheSize.fBytes = atoi(*++argv); | 1264 gpuCacheSize.fBytes = atoi(*++argv); |
| 1268 gpuCacheSize.fCount = atoi(*++argv); | 1265 gpuCacheSize.fCount = atoi(*++argv); |
| 1269 } else { | 1266 } else { |
| 1270 SkDebugf("missing arg for --gpuCacheSize\n"); | 1267 gm_fprintf(stderr, "missing arg for --gpuCacheSize\n"); |
| 1271 usage(commandName); | 1268 usage(commandName); |
| 1272 return -1; | 1269 return -1; |
| 1273 } | 1270 } |
| 1274 #endif | 1271 #endif |
| 1275 } else if (strcmp(*argv, "--help") == 0 || strcmp(*argv, "-h") == 0) { | 1272 } else if (strcmp(*argv, "--help") == 0 || strcmp(*argv, "-h") == 0) { |
| 1276 usage(commandName); | 1273 usage(commandName); |
| 1277 return -1; | 1274 return -1; |
| 1278 } else if (strcmp(*argv, "--hierarchy") == 0) { | 1275 } else if (strcmp(*argv, "--hierarchy") == 0) { |
| 1279 gmmain.fUseFileHierarchy = true; | 1276 gmmain.fUseFileHierarchy = true; |
| 1280 } else if (strcmp(*argv, "--nohierarchy") == 0) { | 1277 } else if (strcmp(*argv, "--nohierarchy") == 0) { |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 1291 continue; | 1288 continue; |
| 1292 } | 1289 } |
| 1293 moduloRemainder = atoi(*argv); | 1290 moduloRemainder = atoi(*argv); |
| 1294 | 1291 |
| 1295 ++argv; | 1292 ++argv; |
| 1296 if (argv >= stop) { | 1293 if (argv >= stop) { |
| 1297 continue; | 1294 continue; |
| 1298 } | 1295 } |
| 1299 moduloDivisor = atoi(*argv); | 1296 moduloDivisor = atoi(*argv); |
| 1300 if (moduloRemainder < 0 || moduloDivisor <= 0 || moduloRemainder >= moduloDivisor) { | 1297 if (moduloRemainder < 0 || moduloDivisor <= 0 || moduloRemainder >= moduloDivisor) { |
| 1301 SkDebugf("invalid modulo values."); | 1298 gm_fprintf(stderr, "invalid modulo values."); |
| 1302 return -1; | 1299 return -1; |
| 1303 } | 1300 } |
| 1304 } else if (strcmp(*argv, "--nopdf") == 0) { | 1301 } else if (strcmp(*argv, "--nopdf") == 0) { |
| 1305 doPDF = false; | 1302 doPDF = false; |
| 1306 } else if (strcmp(*argv, "--nopipe") == 0) { | 1303 } else if (strcmp(*argv, "--nopipe") == 0) { |
| 1307 doPipe = false; | 1304 doPipe = false; |
| 1308 } else if ((0 == strcmp(*argv, "--readPath")) || | 1305 } else if ((0 == strcmp(*argv, "--readPath")) || |
| 1309 (0 == strcmp(*argv, "-r"))) { | 1306 (0 == strcmp(*argv, "-r"))) { |
| 1310 argv++; | 1307 argv++; |
| 1311 if (argv < stop && **argv) { | 1308 if (argv < stop && **argv) { |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1365 int index = configs.find(excludeConfigs[i]); | 1362 int index = configs.find(excludeConfigs[i]); |
| 1366 if (index >= 0) { | 1363 if (index >= 0) { |
| 1367 configs.remove(index); | 1364 configs.remove(index); |
| 1368 // now assert that there was only one copy in configs[] | 1365 // now assert that there was only one copy in configs[] |
| 1369 SkASSERT(configs.find(excludeConfigs[i]) < 0); | 1366 SkASSERT(configs.find(excludeConfigs[i]) < 0); |
| 1370 } | 1367 } |
| 1371 } | 1368 } |
| 1372 | 1369 |
| 1373 if (doVerbose) { | 1370 if (doVerbose) { |
| 1374 SkString str; | 1371 SkString str; |
| 1375 str.printf("gm: %d configs:", configs.count()); | 1372 str.printf("%d configs:", configs.count()); |
| 1376 for (int i = 0; i < configs.count(); ++i) { | 1373 for (int i = 0; i < configs.count(); ++i) { |
| 1377 str.appendf(" %s", gRec[configs[i]].fName); | 1374 str.appendf(" %s", gRec[configs[i]].fName); |
| 1378 } | 1375 } |
| 1379 SkDebugf("%s\n", str.c_str()); | 1376 gm_fprintf(stderr, "%s\n", str.c_str()); |
| 1380 } | 1377 } |
| 1381 | 1378 |
| 1382 GM::SetResourcePath(resourcePath); | 1379 GM::SetResourcePath(resourcePath); |
| 1383 | 1380 |
| 1384 if (readPath) { | 1381 if (readPath) { |
| 1385 if (!sk_exists(readPath)) { | 1382 if (!sk_exists(readPath)) { |
| 1386 fprintf(stderr, "readPath %s does not exist!\n", readPath); | 1383 gm_fprintf(stderr, "readPath %s does not exist!\n", readPath); |
| 1387 return -1; | 1384 return -1; |
| 1388 } | 1385 } |
| 1389 if (sk_isdir(readPath)) { | 1386 if (sk_isdir(readPath)) { |
| 1390 fprintf(stderr, "reading from %s\n", readPath); | 1387 gm_fprintf(stdout, "reading from %s\n", readPath); |
| 1391 gmmain.fExpectationsSource.reset(SkNEW_ARGS( | 1388 gmmain.fExpectationsSource.reset(SkNEW_ARGS( |
| 1392 IndividualImageExpectationsSource, | 1389 IndividualImageExpectationsSource, |
| 1393 (readPath, notifyMissingReadReference))); | 1390 (readPath, notifyMissingReadReference))); |
| 1394 } else { | 1391 } else { |
| 1395 fprintf(stderr, "reading expectations from JSON summary file %s\n", | 1392 gm_fprintf(stdout, "reading expectations from JSON summary file %s\n ", readPath); |
| 1396 readPath); | |
| 1397 gmmain.fExpectationsSource.reset(SkNEW_ARGS( | 1393 gmmain.fExpectationsSource.reset(SkNEW_ARGS( |
| 1398 JsonExpectationsSource, (readPath))); | 1394 JsonExpectationsSource, (readPath))); |
| 1399 } | 1395 } |
| 1400 } | 1396 } |
| 1401 if (writePath) { | 1397 if (writePath) { |
| 1402 fprintf(stderr, "writing to %s\n", writePath); | 1398 gm_fprintf(stdout, "writing to %s\n", writePath); |
| 1403 } | 1399 } |
| 1404 if (writePicturePath) { | 1400 if (writePicturePath) { |
| 1405 fprintf(stderr, "writing pictures to %s\n", writePicturePath); | 1401 gm_fprintf(stdout, "writing pictures to %s\n", writePicturePath); |
| 1406 } | 1402 } |
| 1407 if (resourcePath) { | 1403 if (resourcePath) { |
| 1408 fprintf(stderr, "reading resources from %s\n", resourcePath); | 1404 gm_fprintf(stdout, "reading resources from %s\n", resourcePath); |
| 1409 } | 1405 } |
| 1410 | 1406 |
| 1411 if (moduloDivisor <= 0) { | 1407 if (moduloDivisor <= 0) { |
| 1412 moduloRemainder = -1; | 1408 moduloRemainder = -1; |
| 1413 } | 1409 } |
| 1414 if (moduloRemainder < 0 || moduloRemainder >= moduloDivisor) { | 1410 if (moduloRemainder < 0 || moduloRemainder >= moduloDivisor) { |
| 1415 moduloRemainder = -1; | 1411 moduloRemainder = -1; |
| 1416 } | 1412 } |
| 1417 | 1413 |
| 1418 // Accumulate success of all tests. | 1414 // Accumulate success of all tests. |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1458 moduloStr.printf("[%d.%d] ", gmIndex, moduloDivisor); | 1454 moduloStr.printf("[%d.%d] ", gmIndex, moduloDivisor); |
| 1459 } | 1455 } |
| 1460 | 1456 |
| 1461 const char* shortName = gm->shortName(); | 1457 const char* shortName = gm->shortName(); |
| 1462 if (skip_name(fMatches, shortName)) { | 1458 if (skip_name(fMatches, shortName)) { |
| 1463 SkDELETE(gm); | 1459 SkDELETE(gm); |
| 1464 continue; | 1460 continue; |
| 1465 } | 1461 } |
| 1466 | 1462 |
| 1467 SkISize size = gm->getISize(); | 1463 SkISize size = gm->getISize(); |
| 1468 SkDebugf("%sdrawing... %s [%d %d]\n", moduloStr.c_str(), shortName, | 1464 gm_fprintf(stdout, "%sdrawing... %s [%d %d]\n", moduloStr.c_str(), short Name, |
| 1469 size.width(), size.height()); | 1465 size.width(), size.height()); |
| 1470 | 1466 |
| 1471 ErrorBitfield testErrors = kEmptyErrorBitfield; | 1467 ErrorBitfield testErrors = kEmptyErrorBitfield; |
| 1472 uint32_t gmFlags = gm->getFlags(); | 1468 uint32_t gmFlags = gm->getFlags(); |
| 1473 | 1469 |
| 1474 for (int i = 0; i < configs.count(); i++) { | 1470 for (int i = 0; i < configs.count(); i++) { |
| 1475 ConfigData config = gRec[configs[i]]; | 1471 ConfigData config = gRec[configs[i]]; |
| 1476 | 1472 |
| 1477 // Skip any tests that we don't even need to try. | 1473 // Skip any tests that we don't even need to try. |
| 1478 if ((kPDF_Backend == config.fBackend) && | 1474 if ((kPDF_Backend == config.fBackend) && |
| 1479 (!doPDF || (gmFlags & GM::kSkipPDF_Flag))) | 1475 (!doPDF || (gmFlags & GM::kSkipPDF_Flag))) |
| (...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1675 testsMissingReferenceImages++; | 1671 testsMissingReferenceImages++; |
| 1676 } | 1672 } |
| 1677 if (testErrors == (testErrors & kIgnorable_ErrorBitmask)) { | 1673 if (testErrors == (testErrors & kIgnorable_ErrorBitmask)) { |
| 1678 testsPassed++; | 1674 testsPassed++; |
| 1679 } else { | 1675 } else { |
| 1680 testsFailed++; | 1676 testsFailed++; |
| 1681 } | 1677 } |
| 1682 | 1678 |
| 1683 SkDELETE(gm); | 1679 SkDELETE(gm); |
| 1684 } | 1680 } |
| 1685 SkDebugf("Ran %d tests: %d passed, %d failed, %d missing reference images\n" , | 1681 gm_fprintf(stdout, "Ran %d tests: %d passed, %d failed, %d missing reference images\n", |
| 1686 testsRun, testsPassed, testsFailed, testsMissingReferenceImages); | 1682 testsRun, testsPassed, testsFailed, testsMissingReferenceImages); |
| 1687 gmmain.ListErrors(); | 1683 gmmain.ListErrors(); |
| 1688 | 1684 |
| 1689 if (NULL != writeJsonSummaryPath) { | 1685 if (NULL != writeJsonSummaryPath) { |
| 1690 Json::Value actualResults; | 1686 Json::Value actualResults; |
| 1691 actualResults[kJsonKey_ActualResults_Failed] = | 1687 actualResults[kJsonKey_ActualResults_Failed] = |
| 1692 gmmain.fJsonActualResults_Failed; | 1688 gmmain.fJsonActualResults_Failed; |
| 1693 actualResults[kJsonKey_ActualResults_FailureIgnored] = | 1689 actualResults[kJsonKey_ActualResults_FailureIgnored] = |
| 1694 gmmain.fJsonActualResults_FailureIgnored; | 1690 gmmain.fJsonActualResults_FailureIgnored; |
| 1695 actualResults[kJsonKey_ActualResults_NoComparison] = | 1691 actualResults[kJsonKey_ActualResults_NoComparison] = |
| 1696 gmmain.fJsonActualResults_NoComparison; | 1692 gmmain.fJsonActualResults_NoComparison; |
| 1697 actualResults[kJsonKey_ActualResults_Succeeded] = | 1693 actualResults[kJsonKey_ActualResults_Succeeded] = |
| 1698 gmmain.fJsonActualResults_Succeeded; | 1694 gmmain.fJsonActualResults_Succeeded; |
| 1699 Json::Value root; | 1695 Json::Value root; |
| 1700 root[kJsonKey_ActualResults] = actualResults; | 1696 root[kJsonKey_ActualResults] = actualResults; |
| 1701 root[kJsonKey_ExpectedResults] = gmmain.fJsonExpectedResults; | 1697 root[kJsonKey_ExpectedResults] = gmmain.fJsonExpectedResults; |
| 1702 std::string jsonStdString = root.toStyledString(); | 1698 std::string jsonStdString = root.toStyledString(); |
| 1703 SkFILEWStream stream(writeJsonSummaryPath); | 1699 SkFILEWStream stream(writeJsonSummaryPath); |
| 1704 stream.write(jsonStdString.c_str(), jsonStdString.length()); | 1700 stream.write(jsonStdString.c_str(), jsonStdString.length()); |
| 1705 } | 1701 } |
| 1706 | 1702 |
| 1707 #if SK_SUPPORT_GPU | 1703 #if SK_SUPPORT_GPU |
| 1708 | 1704 |
| 1709 #if GR_CACHE_STATS | 1705 #if GR_CACHE_STATS |
| 1710 for (int i = 0; i < configs.count(); i++) { | 1706 for (int i = 0; i < configs.count(); i++) { |
| 1711 ConfigData config = gRec[configs[i]]; | 1707 ConfigData config = gRec[configs[i]]; |
| 1712 | 1708 |
| 1713 if (kGPU_Backend == config.fBackend) { | 1709 if (kGPU_Backend == config.fBackend) { |
| 1714 GrContext* gr = grFactory->get(config.fGLContextType); | 1710 GrContext* gr = grFactory->get(config.fGLContextType); |
| 1715 | 1711 |
| 1716 SkDebugf("config: %s %x\n", config.fName, gr); | 1712 gm_fprintf(stdout, "config: %s %x\n", config.fName, gr); |
| 1717 gr->printCacheStats(); | 1713 gr->printCacheStats(); |
| 1718 } | 1714 } |
| 1719 } | 1715 } |
| 1720 #endif | 1716 #endif |
| 1721 | 1717 |
| 1722 delete grFactory; | 1718 delete grFactory; |
| 1723 #endif | 1719 #endif |
| 1724 SkGraphics::Term(); | 1720 SkGraphics::Term(); |
| 1725 | 1721 |
| 1726 return (0 == testsFailed) ? 0 : -1; | 1722 return (0 == testsFailed) ? 0 : -1; |
| 1727 } | 1723 } |
| 1728 | 1724 |
| 1729 #if !defined(SK_BUILD_FOR_IOS) && !defined(SK_BUILD_FOR_NACL) | 1725 #if !defined(SK_BUILD_FOR_IOS) && !defined(SK_BUILD_FOR_NACL) |
| 1730 int main(int argc, char * const argv[]) { | 1726 int main(int argc, char * const argv[]) { |
| 1731 return tool_main(argc, (char**) argv); | 1727 return tool_main(argc, (char**) argv); |
| 1732 } | 1728 } |
| 1733 #endif | 1729 #endif |
| OLD | NEW |