Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
|
epoger
2013/03/21 15:17:12
patchset 2: no changes, just synced the workspace
| |
| 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 * |
| 11 * If you make changes to this, re-run the self-tests at gm/tests/run.sh | 11 * If you make changes to this, re-run the self-tests at gm/tests/run.sh |
| (...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 255 // The common case: no error means nothing to record. | 255 // The common case: no error means nothing to record. |
| 256 if (kEmptyErrorBitfield == errorType) { | 256 if (kEmptyErrorBitfield == errorType) { |
| 257 return; | 257 return; |
| 258 } | 258 } |
| 259 | 259 |
| 260 // If only certain error type(s) were reported, we know we can ignore th em. | 260 // If only certain error type(s) were reported, we know we can ignore th em. |
| 261 if (errorType == (errorType & kIgnorable_ErrorBitmask)) { | 261 if (errorType == (errorType & kIgnorable_ErrorBitmask)) { |
| 262 return; | 262 return; |
| 263 } | 263 } |
| 264 | 264 |
| 265 FailRec& rec = fFailedTests.push_back(make_name( | 265 SkString completeName = name; |
| 266 name.c_str(), renderModeDescriptor)); | 266 completeName.append(renderModeDescriptor); |
| 267 FailRec& rec = fFailedTests.push_back(completeName); | |
| 267 rec.fIsPixelError = | 268 rec.fIsPixelError = |
| 268 (kEmptyErrorBitfield != (errorType & kImageMismatch_ErrorBitmask)); | 269 (kEmptyErrorBitfield != (errorType & kImageMismatch_ErrorBitmask)); |
| 269 } | 270 } |
| 270 | 271 |
| 271 // List contents of fFailedTests via SkDebug. | 272 // List contents of fFailedTests via SkDebug. |
| 272 void ListErrors() { | 273 void ListErrors() { |
| 273 for (int i = 0; i < fFailedTests.count(); ++i) { | 274 for (int i = 0; i < fFailedTests.count(); ++i) { |
| 274 if (fFailedTests[i].fIsPixelError) { | 275 if (fFailedTests[i].fIsPixelError) { |
| 275 gm_fprintf(stderr, "\t\t%s pixel_error\n", fFailedTests[i].fName .c_str()); | 276 gm_fprintf(stderr, "\t\t%s pixel_error\n", fFailedTests[i].fName .c_str()); |
| 276 } else { | 277 } else { |
| (...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 584 * _ErrorBitmask values otherwise. | 585 * _ErrorBitmask values otherwise. |
| 585 * | 586 * |
| 586 * If fMismatchPath has been set, and there are pixel diffs, then the | 587 * If fMismatchPath has been set, and there are pixel diffs, then the |
| 587 * actual bitmap will be written out to a file within fMismatchPath. | 588 * actual bitmap will be written out to a file within fMismatchPath. |
| 588 * | 589 * |
| 589 * @param expectations what expectations to compare actualBitmap against | 590 * @param expectations what expectations to compare actualBitmap against |
| 590 * @param actualBitmap the image we actually generated | 591 * @param actualBitmap the image we actually generated |
| 591 * @param baseNameString name of test without renderModeDescriptor added | 592 * @param baseNameString name of test without renderModeDescriptor added |
| 592 * @param renderModeDescriptor e.g., "-rtree", "-deferred" | 593 * @param renderModeDescriptor e.g., "-rtree", "-deferred" |
| 593 * @param addToJsonSummary whether to add these results (both actual and | 594 * @param addToJsonSummary whether to add these results (both actual and |
| 594 * expected) to the JSON summary | 595 * expected) to the JSON summary. Regardless of this setting, if |
| 595 * | 596 * we find an image mismatch in this test, we will write these |
| 596 * TODO: For now, addToJsonSummary is only set to true within | 597 * results to the JSON summary. (This is so that we will always |
| 597 * compare_test_results_to_stored_expectations(), so results of our | 598 * report errors across rendering modes, such as pipe vs tiled. |
| 598 * in-memory comparisons (Rtree vs regular, etc.) are not written to the | 599 * See https://codereview.chromium.org/12825005/ ) |
| 599 * JSON summary. We may wish to change that. | |
| 600 */ | 600 */ |
| 601 ErrorBitfield compare_to_expectations(Expectations expectations, | 601 ErrorBitfield compare_to_expectations(Expectations expectations, |
| 602 const SkBitmap& actualBitmap, | 602 const SkBitmap& actualBitmap, |
| 603 const SkString& baseNameString, | 603 const SkString& baseNameString, |
| 604 const char renderModeDescriptor[], | 604 const char renderModeDescriptor[], |
| 605 bool addToJsonSummary=false) { | 605 bool addToJsonSummary) { |
| 606 ErrorBitfield retval; | 606 ErrorBitfield retval; |
| 607 Checksum actualChecksum = SkBitmapChecksummer::Compute64(actualBitmap); | 607 Checksum actualChecksum = SkBitmapChecksummer::Compute64(actualBitmap); |
| 608 SkString completeNameString = baseNameString; | 608 SkString completeNameString = baseNameString; |
| 609 completeNameString.append(renderModeDescriptor); | 609 completeNameString.append(renderModeDescriptor); |
| 610 const char* completeName = completeNameString.c_str(); | 610 const char* completeName = completeNameString.c_str(); |
| 611 | 611 |
| 612 if (expectations.empty()) { | 612 if (expectations.empty()) { |
| 613 retval = kMissingExpectations_ErrorBitmask; | 613 retval = kMissingExpectations_ErrorBitmask; |
| 614 } else if (expectations.match(actualChecksum)) { | 614 } else if (expectations.match(actualChecksum)) { |
| 615 retval = kEmptyErrorBitfield; | 615 retval = kEmptyErrorBitfield; |
| 616 } else { | 616 } else { |
| 617 addToJsonSummary = true; | |
| 617 retval = kImageMismatch_ErrorBitmask; | 618 retval = kImageMismatch_ErrorBitmask; |
| 618 | 619 |
| 619 // Write out the "actuals" for any mismatches, if we have | 620 // Write out the "actuals" for any mismatches, if we have |
| 620 // been directed to do so. | 621 // been directed to do so. |
| 621 if (fMismatchPath) { | 622 if (fMismatchPath) { |
| 622 SkString path = | 623 SkString path = |
| 623 make_filename(fMismatchPath, renderModeDescriptor, | 624 make_filename(fMismatchPath, renderModeDescriptor, |
| 624 baseNameString.c_str(), "png"); | 625 baseNameString.c_str(), "png"); |
| 625 write_bitmap(path, actualBitmap); | 626 write_bitmap(path, actualBitmap); |
| 626 } | 627 } |
| (...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 774 * @param referenceBitmap bitmap we expected to be generated | 775 * @param referenceBitmap bitmap we expected to be generated |
| 775 */ | 776 */ |
| 776 ErrorBitfield compare_test_results_to_reference_bitmap( | 777 ErrorBitfield compare_test_results_to_reference_bitmap( |
| 777 GM* gm, const ConfigData& gRec, const char renderModeDescriptor [], | 778 GM* gm, const ConfigData& gRec, const char renderModeDescriptor [], |
| 778 SkBitmap& actualBitmap, const SkBitmap* referenceBitmap) { | 779 SkBitmap& actualBitmap, const SkBitmap* referenceBitmap) { |
| 779 | 780 |
| 780 SkASSERT(referenceBitmap); | 781 SkASSERT(referenceBitmap); |
| 781 SkString name = make_name(gm->shortName(), gRec.fName); | 782 SkString name = make_name(gm->shortName(), gRec.fName); |
| 782 Expectations expectations(*referenceBitmap); | 783 Expectations expectations(*referenceBitmap); |
| 783 return compare_to_expectations(expectations, actualBitmap, | 784 return compare_to_expectations(expectations, actualBitmap, |
| 784 name, renderModeDescriptor); | 785 name, renderModeDescriptor, false); |
| 785 } | 786 } |
| 786 | 787 |
| 787 static SkPicture* generate_new_picture(GM* gm, BbhType bbhType, uint32_t rec ordFlags, | 788 static SkPicture* generate_new_picture(GM* gm, BbhType bbhType, uint32_t rec ordFlags, |
| 788 SkScalar scale = SK_Scalar1) { | 789 SkScalar scale = SK_Scalar1) { |
| 789 // Pictures are refcounted so must be on heap | 790 // Pictures are refcounted so must be on heap |
| 790 SkPicture* pict; | 791 SkPicture* pict; |
| 791 int width = SkScalarCeilToInt(SkScalarMul(SkIntToScalar(gm->getISize().w idth()), scale)); | 792 int width = SkScalarCeilToInt(SkScalarMul(SkIntToScalar(gm->getISize().w idth()), scale)); |
| 792 int height = SkScalarCeilToInt(SkScalarMul(SkIntToScalar(gm->getISize(). height()), scale)); | 793 int height = SkScalarCeilToInt(SkScalarMul(SkIntToScalar(gm->getISize(). height()), scale)); |
| 793 | 794 |
| 794 if (kTileGrid_BbhType == bbhType) { | 795 if (kTileGrid_BbhType == bbhType) { |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 882 // expected in some cases, so don't report a test failure. | 883 // expected in some cases, so don't report a test failure. |
| 883 if (!generate_image(gm, gRec, context, rt, &bitmap, true)) { | 884 if (!generate_image(gm, gRec, context, rt, &bitmap, true)) { |
| 884 return kEmptyErrorBitfield; | 885 return kEmptyErrorBitfield; |
| 885 } | 886 } |
| 886 return compare_test_results_to_reference_bitmap( | 887 return compare_test_results_to_reference_bitmap( |
| 887 gm, gRec, "-deferred", bitmap, &referenceBitmap); | 888 gm, gRec, "-deferred", bitmap, &referenceBitmap); |
| 888 } | 889 } |
| 889 return kEmptyErrorBitfield; | 890 return kEmptyErrorBitfield; |
| 890 } | 891 } |
| 891 | 892 |
| 892 ErrorBitfield test_pipe_playback(GM* gm, | 893 ErrorBitfield test_pipe_playback(GM* gm, const ConfigData& gRec, |
| 893 const ConfigData& gRec, | 894 const SkBitmap& referenceBitmap, bool simul ateFailure) { |
| 894 const SkBitmap& referenceBitmap) { | |
| 895 ErrorBitfield errors = kEmptyErrorBitfield; | 895 ErrorBitfield errors = kEmptyErrorBitfield; |
| 896 for (size_t i = 0; i < SK_ARRAY_COUNT(gPipeWritingFlagCombos); ++i) { | 896 for (size_t i = 0; i < SK_ARRAY_COUNT(gPipeWritingFlagCombos); ++i) { |
| 897 SkBitmap bitmap; | 897 SkBitmap bitmap; |
| 898 SkISize size = gm->getISize(); | 898 SkISize size = gm->getISize(); |
| 899 setup_bitmap(gRec, size, &bitmap); | 899 setup_bitmap(gRec, size, &bitmap); |
| 900 SkCanvas canvas(bitmap); | 900 SkCanvas canvas(bitmap); |
| 901 installFilter(&canvas); | 901 installFilter(&canvas); |
| 902 PipeController pipeController(&canvas); | 902 PipeController pipeController(&canvas); |
| 903 SkGPipeWriter writer; | 903 SkGPipeWriter writer; |
| 904 SkCanvas* pipeCanvas = writer.startRecording( | 904 SkCanvas* pipeCanvas = writer.startRecording( |
| 905 &pipeController, gPipeWritingFlagCombos[i].flags); | 905 &pipeController, gPipeWritingFlagCombos[i].flags); |
| 906 invokeGM(gm, pipeCanvas, false, false); | 906 if (!simulateFailure) { |
| 907 invokeGM(gm, pipeCanvas, false, false); | |
| 908 } | |
| 907 complete_bitmap(&bitmap); | 909 complete_bitmap(&bitmap); |
| 908 writer.endRecording(); | 910 writer.endRecording(); |
| 909 SkString string("-pipe"); | 911 SkString string("-pipe"); |
| 910 string.append(gPipeWritingFlagCombos[i].name); | 912 string.append(gPipeWritingFlagCombos[i].name); |
| 911 errors |= compare_test_results_to_reference_bitmap( | 913 errors |= compare_test_results_to_reference_bitmap( |
| 912 gm, gRec, string.c_str(), bitmap, &referenceBitmap); | 914 gm, gRec, string.c_str(), bitmap, &referenceBitmap); |
| 913 if (errors != kEmptyErrorBitfield) { | 915 if (errors != kEmptyErrorBitfield) { |
| 914 break; | 916 break; |
| 915 } | 917 } |
| 916 } | 918 } |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1054 DEFINE_string(modulo, "", "[--modulo <remainder> <divisor>]: only run tests for which " | 1056 DEFINE_string(modulo, "", "[--modulo <remainder> <divisor>]: only run tests for which " |
| 1055 "testIndex %% divisor == remainder."); | 1057 "testIndex %% divisor == remainder."); |
| 1056 DEFINE_bool(pdf, true, "Exercise the pdf rendering test pass."); | 1058 DEFINE_bool(pdf, true, "Exercise the pdf rendering test pass."); |
| 1057 DEFINE_bool(pipe, true, "Exercise the SkGPipe replay test pass."); | 1059 DEFINE_bool(pipe, true, "Exercise the SkGPipe replay test pass."); |
| 1058 DEFINE_string2(readPath, r, "", "Read reference images from this dir, and report " | 1060 DEFINE_string2(readPath, r, "", "Read reference images from this dir, and report " |
| 1059 "any differences between those and the newly generated ones."); | 1061 "any differences between those and the newly generated ones."); |
| 1060 DEFINE_bool(replay, true, "Exercise the SkPicture replay test pass."); | 1062 DEFINE_bool(replay, true, "Exercise the SkPicture replay test pass."); |
| 1061 DEFINE_string2(resourcePath, i, "", "Directory that stores image resources."); | 1063 DEFINE_string2(resourcePath, i, "", "Directory that stores image resources."); |
| 1062 DEFINE_bool(rtree, true, "Exercise the R-Tree variant of SkPicture test pass."); | 1064 DEFINE_bool(rtree, true, "Exercise the R-Tree variant of SkPicture test pass."); |
| 1063 DEFINE_bool(serialize, true, "Exercise the SkPicture serialization & deserializa tion test pass."); | 1065 DEFINE_bool(serialize, true, "Exercise the SkPicture serialization & deserializa tion test pass."); |
| 1066 DEFINE_bool(simulatePipePlaybackFailure, false, "Simulate a rendering failure in pipe mode only."); | |
| 1064 DEFINE_bool(tiledPipe, false, "Exercise tiled SkGPipe replay."); | 1067 DEFINE_bool(tiledPipe, false, "Exercise tiled SkGPipe replay."); |
| 1065 DEFINE_bool(tileGrid, true, "Exercise the tile grid variant of SkPicture."); | 1068 DEFINE_bool(tileGrid, true, "Exercise the tile grid variant of SkPicture."); |
| 1066 DEFINE_string(tileGridReplayScales, "", "Space separated list of floating-point scale " | 1069 DEFINE_string(tileGridReplayScales, "", "Space separated list of floating-point scale " |
| 1067 "factors to be used for tileGrid playback testing. Default value: 1.0"); | 1070 "factors to be used for tileGrid playback testing. Default value: 1.0"); |
| 1068 DEFINE_string(writeJsonSummaryPath, "", "Write a JSON-formatted result summary t o this file."); | 1071 DEFINE_string(writeJsonSummaryPath, "", "Write a JSON-formatted result summary t o this file."); |
| 1069 DEFINE_bool2(verbose, v, false, "Print diagnostics (e.g. list each config to be tested)."); | 1072 DEFINE_bool2(verbose, v, false, "Print diagnostics (e.g. list each config to be tested)."); |
| 1070 DEFINE_string2(writePath, w, "", "Write rendered images into this directory."); | 1073 DEFINE_string2(writePath, w, "", "Write rendered images into this directory."); |
| 1071 DEFINE_string2(writePicturePath, wp, "", "Write .skp files into this directory." ); | 1074 DEFINE_string2(writePicturePath, wp, "", "Write .skp files into this directory." ); |
| 1072 | 1075 |
| 1073 static int findConfig(const char config[]) { | 1076 static int findConfig(const char config[]) { |
| (...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1365 gm, compareConfig, suffix.c_str(), bitmap, &comparisonBitmap); | 1368 gm, compareConfig, suffix.c_str(), bitmap, &comparisonBitmap); |
| 1366 } | 1369 } |
| 1367 } | 1370 } |
| 1368 | 1371 |
| 1369 // run the pipe centric GM steps | 1372 // run the pipe centric GM steps |
| 1370 if (!(gmFlags & GM::kSkipPipe_Flag)) { | 1373 if (!(gmFlags & GM::kSkipPipe_Flag)) { |
| 1371 | 1374 |
| 1372 ErrorBitfield pipeErrors = kEmptyErrorBitfield; | 1375 ErrorBitfield pipeErrors = kEmptyErrorBitfield; |
| 1373 | 1376 |
| 1374 if (FLAGS_pipe) { | 1377 if (FLAGS_pipe) { |
| 1375 pipeErrors |= gmmain.test_pipe_playback(gm, compareConfig, compariso nBitmap); | 1378 pipeErrors |= gmmain.test_pipe_playback(gm, compareConfig, compariso nBitmap, |
| 1379 FLAGS_simulatePipePlaybackFa ilure); | |
| 1376 } | 1380 } |
| 1377 | 1381 |
| 1378 if ((kEmptyErrorBitfield == pipeErrors) && | 1382 if ((kEmptyErrorBitfield == pipeErrors) && |
| 1379 FLAGS_tiledPipe && !(gmFlags & GM::kSkipTiled_Flag)) { | 1383 FLAGS_tiledPipe && !(gmFlags & GM::kSkipTiled_Flag)) { |
| 1380 pipeErrors |= gmmain.test_tiled_pipe_playback(gm, compareConfig, com parisonBitmap); | 1384 pipeErrors |= gmmain.test_tiled_pipe_playback(gm, compareConfig, com parisonBitmap); |
| 1381 } | 1385 } |
| 1382 | 1386 |
| 1383 errorsForAllModes |= pipeErrors; | 1387 errorsForAllModes |= pipeErrors; |
| 1384 } | 1388 } |
| 1385 return errorsForAllModes; | 1389 return errorsForAllModes; |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1532 moduloRemainder = -1; | 1536 moduloRemainder = -1; |
| 1533 } | 1537 } |
| 1534 if (moduloRemainder < 0 || moduloRemainder >= moduloDivisor) { | 1538 if (moduloRemainder < 0 || moduloRemainder >= moduloDivisor) { |
| 1535 moduloRemainder = -1; | 1539 moduloRemainder = -1; |
| 1536 } | 1540 } |
| 1537 | 1541 |
| 1538 // Accumulate success of all tests. | 1542 // Accumulate success of all tests. |
| 1539 int testsRun = 0; | 1543 int testsRun = 0; |
| 1540 int testsPassed = 0; | 1544 int testsPassed = 0; |
| 1541 int testsFailed = 0; | 1545 int testsFailed = 0; |
| 1546 int testsWithDrawingModeDiscrepancies = 0; | |
| 1542 int testsMissingReferenceImages = 0; | 1547 int testsMissingReferenceImages = 0; |
| 1543 | 1548 |
| 1544 int gmIndex = -1; | 1549 int gmIndex = -1; |
| 1545 SkString moduloStr; | 1550 SkString moduloStr; |
| 1546 | 1551 |
| 1547 // If we will be writing out files, prepare subdirectories. | 1552 // If we will be writing out files, prepare subdirectories. |
| 1548 if (FLAGS_writePath.count() == 1) { | 1553 if (FLAGS_writePath.count() == 1) { |
| 1549 if (!sk_mkdir(FLAGS_writePath[0])) { | 1554 if (!sk_mkdir(FLAGS_writePath[0])) { |
| 1550 return -1; | 1555 return -1; |
| 1551 } | 1556 } |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 1577 const char* shortName = gm->shortName(); | 1582 const char* shortName = gm->shortName(); |
| 1578 if (skip_name(FLAGS_match, shortName)) { | 1583 if (skip_name(FLAGS_match, shortName)) { |
| 1579 SkDELETE(gm); | 1584 SkDELETE(gm); |
| 1580 continue; | 1585 continue; |
| 1581 } | 1586 } |
| 1582 | 1587 |
| 1583 SkISize size = gm->getISize(); | 1588 SkISize size = gm->getISize(); |
| 1584 gm_fprintf(stdout, "%sdrawing... %s [%d %d]\n", moduloStr.c_str(), short Name, | 1589 gm_fprintf(stdout, "%sdrawing... %s [%d %d]\n", moduloStr.c_str(), short Name, |
| 1585 size.width(), size.height()); | 1590 size.width(), size.height()); |
| 1586 | 1591 |
| 1587 ErrorBitfield testErrors = kEmptyErrorBitfield; | 1592 ErrorBitfield compositeErrors = kEmptyErrorBitfield; |
| 1588 testErrors |= run_multiple_configs(gmmain, gm, configs, grFactory); | 1593 ErrorBitfield multipleConfigErrors = run_multiple_configs(gmmain, gm, co nfigs, grFactory); |
| 1594 compositeErrors |= multipleConfigErrors; | |
| 1589 | 1595 |
| 1590 SkBitmap comparisonBitmap; | 1596 SkBitmap comparisonBitmap; |
| 1591 const ConfigData compareConfig = | 1597 const ConfigData compareConfig = |
| 1592 { SkBitmap::kARGB_8888_Config, kRaster_Backend, kDontCare_GLContextT ype, 0, kRW_ConfigFlag, "comparison", false }; | 1598 { SkBitmap::kARGB_8888_Config, kRaster_Backend, kDontCare_GLContextT ype, 0, |
| 1593 testErrors |= gmmain.generate_image(gm, compareConfig, NULL, NULL, &comp arisonBitmap, false); | 1599 kRW_ConfigFlag, "comparison", false }; |
| 1600 ErrorBitfield generateModeBaselineErrors = gmmain.generate_image( | |
| 1601 gm, compareConfig, NULL, NULL, &comparisonBitmap, false); | |
| 1602 compositeErrors |= generateModeBaselineErrors; | |
| 1594 | 1603 |
| 1595 // TODO(epoger): only run this if gmmain.generate_image() succeeded? | 1604 // TODO(epoger): only run this if generateModeBaselineErrors is kEmptyEr rorBitfield? |
| 1596 // Otherwise, what are we comparing against? | 1605 // Otherwise, what are we comparing against? |
| 1597 testErrors |= run_multiple_modes(gmmain, gm, compareConfig, comparisonBi tmap); | 1606 ErrorBitfield multipleModeErrors = run_multiple_modes(gmmain, gm, compar eConfig, |
| 1607 comparisonBitmap); | |
| 1608 compositeErrors |= multipleModeErrors; | |
| 1598 | 1609 |
| 1599 // Update overall results. | 1610 // A non-ignorable error in run_multiple_configs(), or ANY error in |
| 1600 // We only tabulate the particular error types that we currently | 1611 // generate_image()/run_multiple_modes(), counts as a failure. |
| 1601 // care about (e.g., missing reference images). Later on, if we | |
| 1602 // want to also tabulate other error types, we can do so. | |
| 1603 testsRun++; | 1612 testsRun++; |
| 1604 if (!gmmain.fExpectationsSource.get() || | 1613 if (kEmptyErrorBitfield != multipleModeErrors) { |
| 1605 (kEmptyErrorBitfield != (kMissingExpectations_ErrorBitmask & testErr ors))) { | 1614 testsWithDrawingModeDiscrepancies++; |
| 1606 testsMissingReferenceImages++; | 1615 testsFailed++; |
| 1607 } | 1616 } else if (kEmptyErrorBitfield != generateModeBaselineErrors) { |
| 1608 if (testErrors == (testErrors & kIgnorable_ErrorBitmask)) { | 1617 testsFailed++; |
| 1618 } else if (compositeErrors == (compositeErrors & kIgnorable_ErrorBitmask )) { | |
| 1609 testsPassed++; | 1619 testsPassed++; |
| 1610 } else { | 1620 } else { |
| 1611 testsFailed++; | 1621 testsFailed++; |
| 1612 } | 1622 } |
| 1623 // Any other result categories we care to report. | |
| 1624 if (!gmmain.fExpectationsSource.get() || | |
| 1625 (kEmptyErrorBitfield != (kMissingExpectations_ErrorBitmask & composi teErrors))) { | |
| 1626 testsMissingReferenceImages++; | |
| 1627 } | |
| 1613 | 1628 |
| 1614 SkDELETE(gm); | 1629 SkDELETE(gm); |
| 1615 } | 1630 } |
| 1616 gm_fprintf(stdout, "Ran %d tests: %d passed, %d failed, %d missing reference images\n", | 1631 gm_fprintf(stdout, "Ran %d tests: %d passed, %d failed, %d with drawing mode discrepancies, " |
| 1617 testsRun, testsPassed, testsFailed, testsMissingReferenceImages); | 1632 "%d missing reference images\n", |
| 1633 testsRun, testsPassed, testsFailed, testsWithDrawingModeDiscrepan cies, | |
| 1634 testsMissingReferenceImages); | |
| 1618 gmmain.ListErrors(); | 1635 gmmain.ListErrors(); |
| 1619 | 1636 |
| 1620 if (FLAGS_writeJsonSummaryPath.count() == 1) { | 1637 if (FLAGS_writeJsonSummaryPath.count() == 1) { |
| 1621 Json::Value actualResults; | 1638 Json::Value actualResults; |
| 1622 actualResults[kJsonKey_ActualResults_Failed] = | 1639 actualResults[kJsonKey_ActualResults_Failed] = |
| 1623 gmmain.fJsonActualResults_Failed; | 1640 gmmain.fJsonActualResults_Failed; |
| 1624 actualResults[kJsonKey_ActualResults_FailureIgnored] = | 1641 actualResults[kJsonKey_ActualResults_FailureIgnored] = |
| 1625 gmmain.fJsonActualResults_FailureIgnored; | 1642 gmmain.fJsonActualResults_FailureIgnored; |
| 1626 actualResults[kJsonKey_ActualResults_NoComparison] = | 1643 actualResults[kJsonKey_ActualResults_NoComparison] = |
| 1627 gmmain.fJsonActualResults_NoComparison; | 1644 gmmain.fJsonActualResults_NoComparison; |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1661 if (FLAGS_forceBWtext) { | 1678 if (FLAGS_forceBWtext) { |
| 1662 canvas->setDrawFilter(SkNEW(BWTextDrawFilter))->unref(); | 1679 canvas->setDrawFilter(SkNEW(BWTextDrawFilter))->unref(); |
| 1663 } | 1680 } |
| 1664 } | 1681 } |
| 1665 | 1682 |
| 1666 #if !defined(SK_BUILD_FOR_IOS) && !defined(SK_BUILD_FOR_NACL) | 1683 #if !defined(SK_BUILD_FOR_IOS) && !defined(SK_BUILD_FOR_NACL) |
| 1667 int main(int argc, char * const argv[]) { | 1684 int main(int argc, char * const argv[]) { |
| 1668 return tool_main(argc, (char**) argv); | 1685 return tool_main(argc, (char**) argv); |
| 1669 } | 1686 } |
| 1670 #endif | 1687 #endif |
| OLD | NEW |