| 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 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 185 | 185 |
| 186 const static ErrorCombination kDefaultIgnorableErrorTypes = ErrorCombination() | 186 const static ErrorCombination kDefaultIgnorableErrorTypes = ErrorCombination() |
| 187 .plus(kMissingExpectations_ErrorType) | 187 .plus(kMissingExpectations_ErrorType) |
| 188 .plus(kIntentionallySkipped_ErrorType); | 188 .plus(kIntentionallySkipped_ErrorType); |
| 189 | 189 |
| 190 class GMMain { | 190 class GMMain { |
| 191 public: | 191 public: |
| 192 GMMain() : fUseFileHierarchy(false), fIgnorableErrorTypes(kDefaultIgnorableE
rrorTypes), | 192 GMMain() : fUseFileHierarchy(false), fIgnorableErrorTypes(kDefaultIgnorableE
rrorTypes), |
| 193 fMismatchPath(NULL), fTestsRun(0), fRenderModesEncountered(1) {} | 193 fMismatchPath(NULL), fTestsRun(0), fRenderModesEncountered(1) {} |
| 194 | 194 |
| 195 SkString make_name(const char shortName[], const char configName[]) { | 195 /** |
| 196 * Assemble shortNamePlusConfig from (surprise!) shortName and configName. |
| 197 * |
| 198 * The method for doing so depends on whether we are using hierarchical nami
ng. |
| 199 * For example, shortName "selftest1" and configName "8888" could be assembl
ed into |
| 200 * either "selftest1_8888" or "8888/selftest1". |
| 201 */ |
| 202 SkString make_shortname_plus_config(const char *shortName, const char *confi
gName) { |
| 196 SkString name; | 203 SkString name; |
| 197 if (0 == strlen(configName)) { | 204 if (0 == strlen(configName)) { |
| 198 name.append(shortName); | 205 name.append(shortName); |
| 199 } else if (fUseFileHierarchy) { | 206 } else if (fUseFileHierarchy) { |
| 200 name.appendf("%s%c%s", configName, SkPATH_SEPARATOR, shortName); | 207 name.appendf("%s%c%s", configName, SkPATH_SEPARATOR, shortName); |
| 201 } else { | 208 } else { |
| 202 name.appendf("%s_%s", shortName, configName); | 209 name.appendf("%s_%s", shortName, configName); |
| 203 } | 210 } |
| 204 return name; | 211 return name; |
| 205 } | 212 } |
| 206 | 213 |
| 214 /** |
| 215 * Assemble filename, suitable for writing out the results of a particular t
est. |
| 216 */ |
| 217 SkString make_filename(const char *path, |
| 218 const char *shortName, |
| 219 const char *configName, |
| 220 const char *renderModeDescriptor, |
| 221 const char *suffix) { |
| 222 SkString filename = make_shortname_plus_config(shortName, configName); |
| 223 filename.append(renderModeDescriptor); |
| 224 filename.appendUnichar('.'); |
| 225 filename.append(suffix); |
| 226 return SkPathJoin(path, filename.c_str()); |
| 227 } |
| 228 |
| 207 /* since PNG insists on unpremultiplying our alpha, we take no | 229 /* since PNG insists on unpremultiplying our alpha, we take no |
| 208 precision chances and force all pixels to be 100% opaque, | 230 precision chances and force all pixels to be 100% opaque, |
| 209 otherwise on compare we may not get a perfect match. | 231 otherwise on compare we may not get a perfect match. |
| 210 */ | 232 */ |
| 211 static void force_all_opaque(const SkBitmap& bitmap) { | 233 static void force_all_opaque(const SkBitmap& bitmap) { |
| 212 SkBitmap::Config config = bitmap.config(); | 234 SkBitmap::Config config = bitmap.config(); |
| 213 switch (config) { | 235 switch (config) { |
| 214 case SkBitmap::kARGB_8888_Config: | 236 case SkBitmap::kARGB_8888_Config: |
| 215 force_all_opaque_8888(bitmap); | 237 force_all_opaque_8888(bitmap); |
| 216 break; | 238 break; |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 262 } | 284 } |
| 263 } | 285 } |
| 264 } | 286 } |
| 265 | 287 |
| 266 /** | 288 /** |
| 267 * Records the results of this test in fTestsRun and fFailedTests. | 289 * Records the results of this test in fTestsRun and fFailedTests. |
| 268 * | 290 * |
| 269 * We even record successes, and errors that we regard as | 291 * We even record successes, and errors that we regard as |
| 270 * "ignorable"; we can filter them out later. | 292 * "ignorable"; we can filter them out later. |
| 271 */ | 293 */ |
| 272 void RecordTestResults(const ErrorCombination& errorCombination, const SkStr
ing& name, | 294 void RecordTestResults(const ErrorCombination& errorCombination, |
| 295 const SkString& shortNamePlusConfig, |
| 273 const char renderModeDescriptor []) { | 296 const char renderModeDescriptor []) { |
| 274 // Things to do regardless of errorCombination. | 297 // Things to do regardless of errorCombination. |
| 275 fTestsRun++; | 298 fTestsRun++; |
| 276 int renderModeCount = 0; | 299 int renderModeCount = 0; |
| 277 this->fRenderModesEncountered.find(renderModeDescriptor, &renderModeCoun
t); | 300 this->fRenderModesEncountered.find(renderModeDescriptor, &renderModeCoun
t); |
| 278 renderModeCount++; | 301 renderModeCount++; |
| 279 this->fRenderModesEncountered.set(renderModeDescriptor, renderModeCount)
; | 302 this->fRenderModesEncountered.set(renderModeDescriptor, renderModeCount)
; |
| 280 | 303 |
| 281 if (errorCombination.isEmpty()) { | 304 if (errorCombination.isEmpty()) { |
| 282 return; | 305 return; |
| 283 } | 306 } |
| 284 | 307 |
| 285 // Things to do only if there is some error condition. | 308 // Things to do only if there is some error condition. |
| 286 SkString fullName = name; | 309 SkString fullName = shortNamePlusConfig; |
| 287 fullName.append(renderModeDescriptor); | 310 fullName.append(renderModeDescriptor); |
| 288 for (int typeInt = 0; typeInt <= kLast_ErrorType; typeInt++) { | 311 for (int typeInt = 0; typeInt <= kLast_ErrorType; typeInt++) { |
| 289 ErrorType type = static_cast<ErrorType>(typeInt); | 312 ErrorType type = static_cast<ErrorType>(typeInt); |
| 290 if (errorCombination.includes(type)) { | 313 if (errorCombination.includes(type)) { |
| 291 fFailedTests[type].push_back(fullName); | 314 fFailedTests[type].push_back(fullName); |
| 292 } | 315 } |
| 293 } | 316 } |
| 294 } | 317 } |
| 295 | 318 |
| 296 /** | 319 /** |
| (...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 596 dev->beginPortfolio(&xps); | 619 dev->beginPortfolio(&xps); |
| 597 dev->beginSheet(unitsPerMeter, pixelsPerMeter, trimSize); | 620 dev->beginSheet(unitsPerMeter, pixelsPerMeter, trimSize); |
| 598 invokeGM(gm, &c, false, false); | 621 invokeGM(gm, &c, false, false); |
| 599 dev->endSheet(); | 622 dev->endSheet(); |
| 600 dev->endPortfolio(); | 623 dev->endPortfolio(); |
| 601 | 624 |
| 602 #endif | 625 #endif |
| 603 } | 626 } |
| 604 | 627 |
| 605 ErrorCombination write_reference_image(const ConfigData& gRec, const char wr
itePath [], | 628 ErrorCombination write_reference_image(const ConfigData& gRec, const char wr
itePath [], |
| 606 const char renderModeDescriptor [], c
onst SkString& name, | 629 const char renderModeDescriptor [], |
| 607 SkBitmap& bitmap, SkDynamicMemoryWStr
eam* document) { | 630 const char *shortName, SkBitmap& bitm
ap, |
| 631 SkDynamicMemoryWStream* document) { |
| 608 SkString path; | 632 SkString path; |
| 609 bool success = false; | 633 bool success = false; |
| 610 if (gRec.fBackend == kRaster_Backend || | 634 if (gRec.fBackend == kRaster_Backend || |
| 611 gRec.fBackend == kGPU_Backend || | 635 gRec.fBackend == kGPU_Backend || |
| 612 (gRec.fBackend == kPDF_Backend && CAN_IMAGE_PDF)) { | 636 (gRec.fBackend == kPDF_Backend && CAN_IMAGE_PDF)) { |
| 613 | 637 |
| 614 path = make_filename(writePath, renderModeDescriptor, name.c_str(), | 638 path = make_filename(writePath, shortName, gRec.fName, renderModeDes
criptor, |
| 615 kPNG_FileExtension); | 639 kPNG_FileExtension); |
| 616 success = write_bitmap(path, bitmap); | 640 success = write_bitmap(path, bitmap); |
| 617 } | 641 } |
| 618 if (kPDF_Backend == gRec.fBackend) { | 642 if (kPDF_Backend == gRec.fBackend) { |
| 619 path = make_filename(writePath, renderModeDescriptor, name.c_str(), | 643 path = make_filename(writePath, shortName, gRec.fName, renderModeDes
criptor, |
| 620 "pdf"); | 644 "pdf"); |
| 621 success = write_document(path, *document); | 645 success = write_document(path, *document); |
| 622 } | 646 } |
| 623 if (kXPS_Backend == gRec.fBackend) { | 647 if (kXPS_Backend == gRec.fBackend) { |
| 624 path = make_filename(writePath, renderModeDescriptor, name.c_str(), | 648 path = make_filename(writePath, shortName, gRec.fName, renderModeDes
criptor, |
| 625 "xps"); | 649 "xps"); |
| 626 success = write_document(path, *document); | 650 success = write_document(path, *document); |
| 627 } | 651 } |
| 628 if (success) { | 652 if (success) { |
| 629 return kEmpty_ErrorCombination; | 653 return kEmpty_ErrorCombination; |
| 630 } else { | 654 } else { |
| 631 gm_fprintf(stderr, "FAILED to write %s\n", path.c_str()); | 655 gm_fprintf(stderr, "FAILED to write %s\n", path.c_str()); |
| 632 ErrorCombination errors(kWritingReferenceImage_ErrorType); | 656 ErrorCombination errors(kWritingReferenceImage_ErrorType); |
| 633 // TODO(epoger): Don't call RecordTestResults() here... | 657 // TODO(epoger): Don't call RecordTestResults() here... |
| 634 // Instead, we should make sure to call RecordTestResults | 658 // Instead, we should make sure to call RecordTestResults |
| 635 // exactly ONCE per test. (Otherwise, gmmain.fTestsRun | 659 // exactly ONCE per test. (Otherwise, gmmain.fTestsRun |
| 636 // will be incremented twice for this test: once in | 660 // will be incremented twice for this test: once in |
| 637 // compare_test_results_to_stored_expectations() before | 661 // compare_test_results_to_stored_expectations() before |
| 638 // that method calls this one, and again here.) | 662 // that method calls this one, and again here.) |
| 639 // | 663 // |
| 640 // When we make that change, we should probably add a | 664 // When we make that change, we should probably add a |
| 641 // WritingReferenceImage test to the gm self-tests.) | 665 // WritingReferenceImage test to the gm self-tests.) |
| 642 RecordTestResults(errors, name, renderModeDescriptor); | 666 RecordTestResults(errors, make_shortname_plus_config(shortName, gRec
.fName), |
| 667 renderModeDescriptor); |
| 643 return errors; | 668 return errors; |
| 644 } | 669 } |
| 645 } | 670 } |
| 646 | 671 |
| 647 /** | 672 /** |
| 648 * Log more detail about the mistmatch between expectedBitmap and | 673 * Log more detail about the mistmatch between expectedBitmap and |
| 649 * actualBitmap. | 674 * actualBitmap. |
| 650 */ | 675 */ |
| 651 void report_bitmap_diffs(const SkBitmap& expectedBitmap, const SkBitmap& act
ualBitmap, | 676 void report_bitmap_diffs(const SkBitmap& expectedBitmap, const SkBitmap& act
ualBitmap, |
| 652 const char *testName) { | 677 const char *testName) { |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 702 | 727 |
| 703 /** | 728 /** |
| 704 * Compares actual hash digest to expectations, returning the set of errors | 729 * Compares actual hash digest to expectations, returning the set of errors |
| 705 * (if any) that we saw along the way. | 730 * (if any) that we saw along the way. |
| 706 * | 731 * |
| 707 * If fMismatchPath has been set, and there are pixel diffs, then the | 732 * If fMismatchPath has been set, and there are pixel diffs, then the |
| 708 * actual bitmap will be written out to a file within fMismatchPath. | 733 * actual bitmap will be written out to a file within fMismatchPath. |
| 709 * | 734 * |
| 710 * @param expectations what expectations to compare actualBitmap against | 735 * @param expectations what expectations to compare actualBitmap against |
| 711 * @param actualBitmap the image we actually generated | 736 * @param actualBitmap the image we actually generated |
| 712 * @param baseNameString name of test without renderModeDescriptor added | 737 * @param shortName name of test, e.g. "selftest1" |
| 738 * @param configName name of config, e.g. "8888" |
| 713 * @param renderModeDescriptor e.g., "-rtree", "-deferred" | 739 * @param renderModeDescriptor e.g., "-rtree", "-deferred" |
| 714 * @param addToJsonSummary whether to add these results (both actual and | 740 * @param addToJsonSummary whether to add these results (both actual and |
| 715 * expected) to the JSON summary. Regardless of this setting, if | 741 * expected) to the JSON summary. Regardless of this setting, if |
| 716 * we find an image mismatch in this test, we will write these | 742 * we find an image mismatch in this test, we will write these |
| 717 * results to the JSON summary. (This is so that we will always | 743 * results to the JSON summary. (This is so that we will always |
| 718 * report errors across rendering modes, such as pipe vs tiled. | 744 * report errors across rendering modes, such as pipe vs tiled. |
| 719 * See https://codereview.chromium.org/13650002/ ) | 745 * See https://codereview.chromium.org/13650002/ ) |
| 720 */ | 746 */ |
| 721 ErrorCombination compare_to_expectations(Expectations expectations, | 747 ErrorCombination compare_to_expectations(Expectations expectations, |
| 722 const SkBitmap& actualBitmap, | 748 const SkBitmap& actualBitmap, |
| 723 const SkString& baseNameString, | 749 const char *shortName, const char *
configName, |
| 724 const char renderModeDescriptor[], | 750 const char *renderModeDescriptor, |
| 725 bool addToJsonSummary) { | 751 bool addToJsonSummary) { |
| 726 ErrorCombination errors; | 752 ErrorCombination errors; |
| 727 SkHashDigest actualBitmapHash; | 753 SkHashDigest actualBitmapHash; |
| 728 // TODO(epoger): Better handling for error returned by ComputeDigest()? | 754 // TODO(epoger): Better handling for error returned by ComputeDigest()? |
| 729 // For now, we just report a digest of 0 in error cases, like before. | 755 // For now, we just report a digest of 0 in error cases, like before. |
| 730 if (!SkBitmapHasher::ComputeDigest(actualBitmap, &actualBitmapHash)) { | 756 if (!SkBitmapHasher::ComputeDigest(actualBitmap, &actualBitmapHash)) { |
| 731 actualBitmapHash = 0; | 757 actualBitmapHash = 0; |
| 732 } | 758 } |
| 733 SkString completeNameString = baseNameString; | 759 SkString shortNamePlusConfig = make_shortname_plus_config(shortName, con
figName); |
| 760 SkString completeNameString(shortNamePlusConfig); |
| 734 completeNameString.append(renderModeDescriptor); | 761 completeNameString.append(renderModeDescriptor); |
| 735 completeNameString.append("."); | 762 completeNameString.append("."); |
| 736 completeNameString.append(kPNG_FileExtension); | 763 completeNameString.append(kPNG_FileExtension); |
| 737 const char* completeName = completeNameString.c_str(); | 764 const char* completeName = completeNameString.c_str(); |
| 738 | 765 |
| 739 if (expectations.empty()) { | 766 if (expectations.empty()) { |
| 740 errors.add(kMissingExpectations_ErrorType); | 767 errors.add(kMissingExpectations_ErrorType); |
| 741 } else if (!expectations.match(actualBitmapHash)) { | 768 } else if (!expectations.match(actualBitmapHash)) { |
| 742 addToJsonSummary = true; | 769 addToJsonSummary = true; |
| 743 // The error mode we record depends on whether this was running | 770 // The error mode we record depends on whether this was running |
| 744 // in a non-standard renderMode. | 771 // in a non-standard renderMode. |
| 745 if ('\0' == *renderModeDescriptor) { | 772 if ('\0' == *renderModeDescriptor) { |
| 746 errors.add(kExpectationsMismatch_ErrorType); | 773 errors.add(kExpectationsMismatch_ErrorType); |
| 747 } else { | 774 } else { |
| 748 errors.add(kRenderModeMismatch_ErrorType); | 775 errors.add(kRenderModeMismatch_ErrorType); |
| 749 } | 776 } |
| 750 | 777 |
| 751 // Write out the "actuals" for any mismatches, if we have | 778 // Write out the "actuals" for any mismatches, if we have |
| 752 // been directed to do so. | 779 // been directed to do so. |
| 753 if (fMismatchPath) { | 780 if (fMismatchPath) { |
| 754 SkString path = | 781 SkString path = |
| 755 make_filename(fMismatchPath, renderModeDescriptor, | 782 make_filename(fMismatchPath, shortName, configName, renderMo
deDescriptor, |
| 756 baseNameString.c_str(), kPNG_FileExtension); | 783 kPNG_FileExtension); |
| 757 write_bitmap(path, actualBitmap); | 784 write_bitmap(path, actualBitmap); |
| 758 } | 785 } |
| 759 | 786 |
| 760 // If we have access to a single expected bitmap, log more | 787 // If we have access to a single expected bitmap, log more |
| 761 // detail about the mismatch. | 788 // detail about the mismatch. |
| 762 const SkBitmap *expectedBitmapPtr = expectations.asBitmap(); | 789 const SkBitmap *expectedBitmapPtr = expectations.asBitmap(); |
| 763 if (NULL != expectedBitmapPtr) { | 790 if (NULL != expectedBitmapPtr) { |
| 764 report_bitmap_diffs(*expectedBitmapPtr, actualBitmap, completeNa
me); | 791 report_bitmap_diffs(*expectedBitmapPtr, actualBitmap, completeNa
me); |
| 765 } | 792 } |
| 766 } | 793 } |
| 767 RecordTestResults(errors, baseNameString, renderModeDescriptor); | 794 RecordTestResults(errors, shortNamePlusConfig, renderModeDescriptor); |
| 768 | 795 |
| 769 if (addToJsonSummary) { | 796 if (addToJsonSummary) { |
| 770 add_actual_results_to_json_summary(completeName, actualBitmapHash, e
rrors, | 797 add_actual_results_to_json_summary(completeName, actualBitmapHash, e
rrors, |
| 771 expectations.ignoreFailure()); | 798 expectations.ignoreFailure()); |
| 772 add_expected_results_to_json_summary(completeName, expectations); | 799 add_expected_results_to_json_summary(completeName, expectations); |
| 773 } | 800 } |
| 774 | 801 |
| 775 return errors; | 802 return errors; |
| 776 } | 803 } |
| 777 | 804 |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 835 * @param gRec | 862 * @param gRec |
| 836 * @param writePath unless this is NULL, write out actual images into this | 863 * @param writePath unless this is NULL, write out actual images into this |
| 837 * directory | 864 * directory |
| 838 * @param actualBitmap bitmap generated by this run | 865 * @param actualBitmap bitmap generated by this run |
| 839 * @param pdf | 866 * @param pdf |
| 840 */ | 867 */ |
| 841 ErrorCombination compare_test_results_to_stored_expectations( | 868 ErrorCombination compare_test_results_to_stored_expectations( |
| 842 GM* gm, const ConfigData& gRec, const char writePath[], | 869 GM* gm, const ConfigData& gRec, const char writePath[], |
| 843 SkBitmap& actualBitmap, SkDynamicMemoryWStream* pdf) { | 870 SkBitmap& actualBitmap, SkDynamicMemoryWStream* pdf) { |
| 844 | 871 |
| 845 SkString name = make_name(gm->shortName(), gRec.fName); | 872 SkString shortNamePlusConfig = make_shortname_plus_config(gm->shortName(
), gRec.fName); |
| 873 SkString nameWithExtension(shortNamePlusConfig); |
| 874 nameWithExtension.append("."); |
| 875 nameWithExtension.append(kPNG_FileExtension); |
| 876 |
| 846 ErrorCombination errors; | 877 ErrorCombination errors; |
| 847 | |
| 848 ExpectationsSource *expectationsSource = this->fExpectationsSource.get()
; | 878 ExpectationsSource *expectationsSource = this->fExpectationsSource.get()
; |
| 849 if (expectationsSource && (gRec.fFlags & kRead_ConfigFlag)) { | 879 if (expectationsSource && (gRec.fFlags & kRead_ConfigFlag)) { |
| 850 /* | 880 /* |
| 851 * Get the expected results for this test, as one or more allowed | 881 * Get the expected results for this test, as one or more allowed |
| 852 * hash digests. The current implementation of expectationsSource | 882 * hash digests. The current implementation of expectationsSource |
| 853 * get this by computing the hash digest of a single PNG file on dis
k. | 883 * get this by computing the hash digest of a single PNG file on dis
k. |
| 854 * | 884 * |
| 855 * TODO(epoger): This relies on the fact that | 885 * TODO(epoger): This relies on the fact that |
| 856 * force_all_opaque() was called on the bitmap before it | 886 * force_all_opaque() was called on the bitmap before it |
| 857 * was written to disk as a PNG in the first place. If | 887 * was written to disk as a PNG in the first place. If |
| 858 * not, the hash digest returned here may not match the | 888 * not, the hash digest returned here may not match the |
| 859 * hash digest of actualBitmap, which *has* been run through | 889 * hash digest of actualBitmap, which *has* been run through |
| 860 * force_all_opaque(). | 890 * force_all_opaque(). |
| 861 * See comments above complete_bitmap() for more detail. | 891 * See comments above complete_bitmap() for more detail. |
| 862 */ | 892 */ |
| 863 SkString nameWithExtension(name); | |
| 864 nameWithExtension.append("."); | |
| 865 nameWithExtension.append(kPNG_FileExtension); | |
| 866 Expectations expectations = expectationsSource->get(nameWithExtensio
n.c_str()); | 893 Expectations expectations = expectationsSource->get(nameWithExtensio
n.c_str()); |
| 867 errors.add(compare_to_expectations(expectations, actualBitmap, | 894 errors.add(compare_to_expectations(expectations, actualBitmap, |
| 868 name, "", true)); | 895 gm->shortName(), gRec.fName, "",
true)); |
| 869 } else { | 896 } else { |
| 870 // If we are running without expectations, we still want to | 897 // If we are running without expectations, we still want to |
| 871 // record the actual results. | 898 // record the actual results. |
| 872 SkHashDigest actualBitmapHash; | 899 SkHashDigest actualBitmapHash; |
| 873 // TODO(epoger): Better handling for error returned by ComputeDigest
()? | 900 // TODO(epoger): Better handling for error returned by ComputeDigest
()? |
| 874 // For now, we just report a digest of 0 in error cases, like before
. | 901 // For now, we just report a digest of 0 in error cases, like before
. |
| 875 if (!SkBitmapHasher::ComputeDigest(actualBitmap, &actualBitmapHash))
{ | 902 if (!SkBitmapHasher::ComputeDigest(actualBitmap, &actualBitmapHash))
{ |
| 876 actualBitmapHash = 0; | 903 actualBitmapHash = 0; |
| 877 } | 904 } |
| 878 SkString nameWithExtension(name); | |
| 879 nameWithExtension.append("."); | |
| 880 nameWithExtension.append(kPNG_FileExtension); | |
| 881 add_actual_results_to_json_summary(nameWithExtension.c_str(), actual
BitmapHash, | 905 add_actual_results_to_json_summary(nameWithExtension.c_str(), actual
BitmapHash, |
| 882 ErrorCombination(kMissingExpectat
ions_ErrorType), | 906 ErrorCombination(kMissingExpectat
ions_ErrorType), |
| 883 false); | 907 false); |
| 884 RecordTestResults(ErrorCombination(kMissingExpectations_ErrorType),
name, ""); | 908 RecordTestResults(ErrorCombination(kMissingExpectations_ErrorType), |
| 909 shortNamePlusConfig, ""); |
| 885 } | 910 } |
| 886 | 911 |
| 887 // TODO: Consider moving this into compare_to_expectations(), | 912 // TODO: Consider moving this into compare_to_expectations(), |
| 888 // similar to fMismatchPath... for now, we don't do that, because | 913 // similar to fMismatchPath... for now, we don't do that, because |
| 889 // we don't want to write out the actual bitmaps for all | 914 // we don't want to write out the actual bitmaps for all |
| 890 // renderModes of all tests! That would be a lot of files. | 915 // renderModes of all tests! That would be a lot of files. |
| 891 if (writePath && (gRec.fFlags & kWrite_ConfigFlag)) { | 916 if (writePath && (gRec.fFlags & kWrite_ConfigFlag)) { |
| 892 errors.add(write_reference_image(gRec, writePath, "", | 917 errors.add(write_reference_image(gRec, writePath, "", gm->shortName(
), |
| 893 name, actualBitmap, pdf)); | 918 actualBitmap, pdf)); |
| 894 } | 919 } |
| 895 | 920 |
| 896 return errors; | 921 return errors; |
| 897 } | 922 } |
| 898 | 923 |
| 899 /** | 924 /** |
| 900 * Compare actualBitmap to referenceBitmap. | 925 * Compare actualBitmap to referenceBitmap. |
| 901 * | 926 * |
| 902 * @param baseNameString name of test without renderModeDescriptor added | 927 * @param shortName test name, e.g. "selftest1" |
| 928 * @param configName configuration name, e.g. "8888" |
| 903 * @param renderModeDescriptor | 929 * @param renderModeDescriptor |
| 904 * @param actualBitmap actual bitmap generated by this run | 930 * @param actualBitmap actual bitmap generated by this run |
| 905 * @param referenceBitmap bitmap we expected to be generated | 931 * @param referenceBitmap bitmap we expected to be generated |
| 906 */ | 932 */ |
| 907 ErrorCombination compare_test_results_to_reference_bitmap( | 933 ErrorCombination compare_test_results_to_reference_bitmap( |
| 908 const SkString& baseNameString, const char renderModeDescriptor[], | 934 const char *shortName, const char *configName, const char *renderModeDes
criptor, |
| 909 SkBitmap& actualBitmap, const SkBitmap* referenceBitmap) { | 935 SkBitmap& actualBitmap, const SkBitmap* referenceBitmap) { |
| 910 | 936 |
| 911 SkASSERT(referenceBitmap); | 937 SkASSERT(referenceBitmap); |
| 912 Expectations expectations(*referenceBitmap); | 938 Expectations expectations(*referenceBitmap); |
| 913 return compare_to_expectations(expectations, actualBitmap, | 939 return compare_to_expectations(expectations, actualBitmap, shortName, |
| 914 baseNameString, renderModeDescriptor, fal
se); | 940 configName, renderModeDescriptor, false); |
| 915 } | 941 } |
| 916 | 942 |
| 917 static SkPicture* generate_new_picture(GM* gm, BbhType bbhType, uint32_t rec
ordFlags, | 943 static SkPicture* generate_new_picture(GM* gm, BbhType bbhType, uint32_t rec
ordFlags, |
| 918 SkScalar scale = SK_Scalar1) { | 944 SkScalar scale = SK_Scalar1) { |
| 919 // Pictures are refcounted so must be on heap | 945 // Pictures are refcounted so must be on heap |
| 920 SkPicture* pict; | 946 SkPicture* pict; |
| 921 int width = SkScalarCeilToInt(SkScalarMul(SkIntToScalar(gm->getISize().w
idth()), scale)); | 947 int width = SkScalarCeilToInt(SkScalarMul(SkIntToScalar(gm->getISize().w
idth()), scale)); |
| 922 int height = SkScalarCeilToInt(SkScalarMul(SkIntToScalar(gm->getISize().
height()), scale)); | 948 int height = SkScalarCeilToInt(SkScalarMul(SkIntToScalar(gm->getISize().
height()), scale)); |
| 923 | 949 |
| 924 if (kTileGrid_BbhType == bbhType) { | 950 if (kTileGrid_BbhType == bbhType) { |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1021 // https://codereview.chromium.org/12992003/ is unblocked. | 1047 // https://codereview.chromium.org/12992003/ is unblocked. |
| 1022 // | 1048 // |
| 1023 // Filed as https://code.google.com/p/skia/issues/detail?id=1180 | 1049 // Filed as https://code.google.com/p/skia/issues/detail?id=1180 |
| 1024 // ('image-surface gm test is failing in "deferred" mode, | 1050 // ('image-surface gm test is failing in "deferred" mode, |
| 1025 // and gm is not reporting the failure') | 1051 // and gm is not reporting the failure') |
| 1026 if (errors.isEmpty()) { | 1052 if (errors.isEmpty()) { |
| 1027 // TODO(epoger): Report this as a new ErrorType, | 1053 // TODO(epoger): Report this as a new ErrorType, |
| 1028 // something like kImageGeneration_ErrorType? | 1054 // something like kImageGeneration_ErrorType? |
| 1029 return kEmpty_ErrorCombination; | 1055 return kEmpty_ErrorCombination; |
| 1030 } | 1056 } |
| 1031 const SkString name = make_name(gm->shortName(), gRec.fName); | |
| 1032 return compare_test_results_to_reference_bitmap( | 1057 return compare_test_results_to_reference_bitmap( |
| 1033 name, renderModeDescriptor, bitmap, &referenceBitmap); | 1058 gm->shortName(), gRec.fName, renderModeDescriptor, bitmap, &refe
renceBitmap); |
| 1034 } | 1059 } |
| 1035 return kEmpty_ErrorCombination; | 1060 return kEmpty_ErrorCombination; |
| 1036 } | 1061 } |
| 1037 | 1062 |
| 1038 ErrorCombination test_pipe_playback(GM* gm, const ConfigData& gRec, | 1063 ErrorCombination test_pipe_playback(GM* gm, const ConfigData& gRec, |
| 1039 const SkBitmap& referenceBitmap, bool si
mulateFailure) { | 1064 const SkBitmap& referenceBitmap, bool si
mulateFailure) { |
| 1040 const SkString name = make_name(gm->shortName(), gRec.fName); | 1065 const SkString shortNamePlusConfig = make_shortname_plus_config(gm->shor
tName(), |
| 1066 gRec.fNa
me); |
| 1041 ErrorCombination errors; | 1067 ErrorCombination errors; |
| 1042 for (size_t i = 0; i < SK_ARRAY_COUNT(gPipeWritingFlagCombos); ++i) { | 1068 for (size_t i = 0; i < SK_ARRAY_COUNT(gPipeWritingFlagCombos); ++i) { |
| 1043 SkString renderModeDescriptor("-pipe"); | 1069 SkString renderModeDescriptor("-pipe"); |
| 1044 renderModeDescriptor.append(gPipeWritingFlagCombos[i].name); | 1070 renderModeDescriptor.append(gPipeWritingFlagCombos[i].name); |
| 1045 | 1071 |
| 1046 if (gm->getFlags() & GM::kSkipPipe_Flag) { | 1072 if (gm->getFlags() & GM::kSkipPipe_Flag) { |
| 1047 RecordTestResults(kIntentionallySkipped_ErrorType, name, | 1073 RecordTestResults(kIntentionallySkipped_ErrorType, shortNamePlus
Config, |
| 1048 renderModeDescriptor.c_str()); | 1074 renderModeDescriptor.c_str()); |
| 1049 errors.add(kIntentionallySkipped_ErrorType); | 1075 errors.add(kIntentionallySkipped_ErrorType); |
| 1050 } else { | 1076 } else { |
| 1051 SkBitmap bitmap; | 1077 SkBitmap bitmap; |
| 1052 SkISize size = gm->getISize(); | 1078 SkISize size = gm->getISize(); |
| 1053 setup_bitmap(gRec, size, &bitmap); | 1079 setup_bitmap(gRec, size, &bitmap); |
| 1054 SkCanvas canvas(bitmap); | 1080 SkCanvas canvas(bitmap); |
| 1055 installFilter(&canvas); | 1081 installFilter(&canvas); |
| 1056 // Pass a decoding function so the factory GM (which has an SkBi
tmap | 1082 // Pass a decoding function so the factory GM (which has an SkBi
tmap |
| 1057 // with encoded data) will not fail playback. | 1083 // with encoded data) will not fail playback. |
| 1058 PipeController pipeController(&canvas, &SkImageDecoder::DecodeMe
mory); | 1084 PipeController pipeController(&canvas, &SkImageDecoder::DecodeMe
mory); |
| 1059 SkGPipeWriter writer; | 1085 SkGPipeWriter writer; |
| 1060 SkCanvas* pipeCanvas = writer.startRecording(&pipeController, | 1086 SkCanvas* pipeCanvas = writer.startRecording(&pipeController, |
| 1061 gPipeWritingFlagCom
bos[i].flags, | 1087 gPipeWritingFlagCom
bos[i].flags, |
| 1062 size.width(), size.
height()); | 1088 size.width(), size.
height()); |
| 1063 if (!simulateFailure) { | 1089 if (!simulateFailure) { |
| 1064 invokeGM(gm, pipeCanvas, false, false); | 1090 invokeGM(gm, pipeCanvas, false, false); |
| 1065 } | 1091 } |
| 1066 complete_bitmap(&bitmap); | 1092 complete_bitmap(&bitmap); |
| 1067 writer.endRecording(); | 1093 writer.endRecording(); |
| 1068 errors.add(compare_test_results_to_reference_bitmap( | 1094 errors.add(compare_test_results_to_reference_bitmap( |
| 1069 name, renderModeDescriptor.c_str(), bitmap, &referenceBitmap
)); | 1095 gm->shortName(), gRec.fName, renderModeDescriptor.c_str(), b
itmap, |
| 1096 &referenceBitmap)); |
| 1070 if (!errors.isEmpty()) { | 1097 if (!errors.isEmpty()) { |
| 1071 break; | 1098 break; |
| 1072 } | 1099 } |
| 1073 } | 1100 } |
| 1074 } | 1101 } |
| 1075 return errors; | 1102 return errors; |
| 1076 } | 1103 } |
| 1077 | 1104 |
| 1078 ErrorCombination test_tiled_pipe_playback(GM* gm, const ConfigData& gRec, | 1105 ErrorCombination test_tiled_pipe_playback(GM* gm, const ConfigData& gRec, |
| 1079 const SkBitmap& referenceBitmap) { | 1106 const SkBitmap& referenceBitmap) { |
| 1080 const SkString name = make_name(gm->shortName(), gRec.fName); | 1107 const SkString shortNamePlusConfig = make_shortname_plus_config(gm->shor
tName(), |
| 1108 gRec.fNa
me); |
| 1081 ErrorCombination errors; | 1109 ErrorCombination errors; |
| 1082 for (size_t i = 0; i < SK_ARRAY_COUNT(gPipeWritingFlagCombos); ++i) { | 1110 for (size_t i = 0; i < SK_ARRAY_COUNT(gPipeWritingFlagCombos); ++i) { |
| 1083 SkString renderModeDescriptor("-tiled pipe"); | 1111 SkString renderModeDescriptor("-tiled pipe"); |
| 1084 renderModeDescriptor.append(gPipeWritingFlagCombos[i].name); | 1112 renderModeDescriptor.append(gPipeWritingFlagCombos[i].name); |
| 1085 | 1113 |
| 1086 if ((gm->getFlags() & GM::kSkipPipe_Flag) || | 1114 if ((gm->getFlags() & GM::kSkipPipe_Flag) || |
| 1087 (gm->getFlags() & GM::kSkipTiled_Flag)) { | 1115 (gm->getFlags() & GM::kSkipTiled_Flag)) { |
| 1088 RecordTestResults(kIntentionallySkipped_ErrorType, name, | 1116 RecordTestResults(kIntentionallySkipped_ErrorType, shortNamePlus
Config, |
| 1089 renderModeDescriptor.c_str()); | 1117 renderModeDescriptor.c_str()); |
| 1090 errors.add(kIntentionallySkipped_ErrorType); | 1118 errors.add(kIntentionallySkipped_ErrorType); |
| 1091 } else { | 1119 } else { |
| 1092 SkBitmap bitmap; | 1120 SkBitmap bitmap; |
| 1093 SkISize size = gm->getISize(); | 1121 SkISize size = gm->getISize(); |
| 1094 setup_bitmap(gRec, size, &bitmap); | 1122 setup_bitmap(gRec, size, &bitmap); |
| 1095 SkCanvas canvas(bitmap); | 1123 SkCanvas canvas(bitmap); |
| 1096 installFilter(&canvas); | 1124 installFilter(&canvas); |
| 1097 TiledPipeController pipeController(bitmap, &SkImageDecoder::Deco
deMemory); | 1125 TiledPipeController pipeController(bitmap, &SkImageDecoder::Deco
deMemory); |
| 1098 SkGPipeWriter writer; | 1126 SkGPipeWriter writer; |
| 1099 SkCanvas* pipeCanvas = writer.startRecording(&pipeController, | 1127 SkCanvas* pipeCanvas = writer.startRecording(&pipeController, |
| 1100 gPipeWritingFlagCom
bos[i].flags, | 1128 gPipeWritingFlagCom
bos[i].flags, |
| 1101 size.width(), size.
height()); | 1129 size.width(), size.
height()); |
| 1102 invokeGM(gm, pipeCanvas, false, false); | 1130 invokeGM(gm, pipeCanvas, false, false); |
| 1103 complete_bitmap(&bitmap); | 1131 complete_bitmap(&bitmap); |
| 1104 writer.endRecording(); | 1132 writer.endRecording(); |
| 1105 errors.add(compare_test_results_to_reference_bitmap(name, | 1133 errors.add(compare_test_results_to_reference_bitmap(gm->shortNam
e(), gRec.fName, |
| 1106 renderModeDe
scriptor.c_str(), | 1134 renderModeDe
scriptor.c_str(), |
| 1107 bitmap, &ref
erenceBitmap)); | 1135 bitmap, &ref
erenceBitmap)); |
| 1108 if (!errors.isEmpty()) { | 1136 if (!errors.isEmpty()) { |
| 1109 break; | 1137 break; |
| 1110 } | 1138 } |
| 1111 } | 1139 } |
| 1112 } | 1140 } |
| 1113 return errors; | 1141 return errors; |
| 1114 } | 1142 } |
| 1115 | 1143 |
| (...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1415 ErrorCombination run_multiple_configs(GMMain &gmmain, GM *gm, const SkTDArray<si
ze_t> &configs, | 1443 ErrorCombination run_multiple_configs(GMMain &gmmain, GM *gm, const SkTDArray<si
ze_t> &configs, |
| 1416 GrContextFactory *grFactory); | 1444 GrContextFactory *grFactory); |
| 1417 ErrorCombination run_multiple_configs(GMMain &gmmain, GM *gm, const SkTDArray<si
ze_t> &configs, | 1445 ErrorCombination run_multiple_configs(GMMain &gmmain, GM *gm, const SkTDArray<si
ze_t> &configs, |
| 1418 GrContextFactory *grFactory) { | 1446 GrContextFactory *grFactory) { |
| 1419 const char renderModeDescriptor[] = ""; | 1447 const char renderModeDescriptor[] = ""; |
| 1420 ErrorCombination errorsForAllConfigs; | 1448 ErrorCombination errorsForAllConfigs; |
| 1421 uint32_t gmFlags = gm->getFlags(); | 1449 uint32_t gmFlags = gm->getFlags(); |
| 1422 | 1450 |
| 1423 for (int i = 0; i < configs.count(); i++) { | 1451 for (int i = 0; i < configs.count(); i++) { |
| 1424 ConfigData config = gRec[configs[i]]; | 1452 ConfigData config = gRec[configs[i]]; |
| 1425 const SkString name = gmmain.make_name(gm->shortName(), config.fName); | 1453 const SkString shortNamePlusConfig = gmmain.make_shortname_plus_config(g
m->shortName(), |
| 1454 c
onfig.fName); |
| 1426 | 1455 |
| 1427 // Skip any tests that we don't even need to try. | 1456 // Skip any tests that we don't even need to try. |
| 1428 // If any of these were skipped on a per-GM basis, record them as | 1457 // If any of these were skipped on a per-GM basis, record them as |
| 1429 // kIntentionallySkipped. | 1458 // kIntentionallySkipped. |
| 1430 if (kPDF_Backend == config.fBackend) { | 1459 if (kPDF_Backend == config.fBackend) { |
| 1431 if (!FLAGS_pdf) { | 1460 if (!FLAGS_pdf) { |
| 1432 continue; | 1461 continue; |
| 1433 } | 1462 } |
| 1434 if (gmFlags & GM::kSkipPDF_Flag) { | 1463 if (gmFlags & GM::kSkipPDF_Flag) { |
| 1435 gmmain.RecordTestResults(kIntentionallySkipped_ErrorType, name, | 1464 gmmain.RecordTestResults(kIntentionallySkipped_ErrorType, shortN
amePlusConfig, |
| 1436 renderModeDescriptor); | 1465 renderModeDescriptor); |
| 1437 errorsForAllConfigs.add(kIntentionallySkipped_ErrorType); | 1466 errorsForAllConfigs.add(kIntentionallySkipped_ErrorType); |
| 1438 continue; | 1467 continue; |
| 1439 } | 1468 } |
| 1440 } | 1469 } |
| 1441 if ((gmFlags & GM::kSkip565_Flag) && | 1470 if ((gmFlags & GM::kSkip565_Flag) && |
| 1442 (kRaster_Backend == config.fBackend) && | 1471 (kRaster_Backend == config.fBackend) && |
| 1443 (SkBitmap::kRGB_565_Config == config.fConfig)) { | 1472 (SkBitmap::kRGB_565_Config == config.fConfig)) { |
| 1444 gmmain.RecordTestResults(kIntentionallySkipped_ErrorType, name, | 1473 gmmain.RecordTestResults(kIntentionallySkipped_ErrorType, shortNameP
lusConfig, |
| 1445 renderModeDescriptor); | 1474 renderModeDescriptor); |
| 1446 errorsForAllConfigs.add(kIntentionallySkipped_ErrorType); | 1475 errorsForAllConfigs.add(kIntentionallySkipped_ErrorType); |
| 1447 continue; | 1476 continue; |
| 1448 } | 1477 } |
| 1449 if ((gmFlags & GM::kSkipGPU_Flag) && | 1478 if ((gmFlags & GM::kSkipGPU_Flag) && |
| 1450 kGPU_Backend == config.fBackend) { | 1479 kGPU_Backend == config.fBackend) { |
| 1451 gmmain.RecordTestResults(kIntentionallySkipped_ErrorType, name, | 1480 gmmain.RecordTestResults(kIntentionallySkipped_ErrorType, shortNameP
lusConfig, |
| 1452 renderModeDescriptor); | 1481 renderModeDescriptor); |
| 1453 errorsForAllConfigs.add(kIntentionallySkipped_ErrorType); | 1482 errorsForAllConfigs.add(kIntentionallySkipped_ErrorType); |
| 1454 continue; | 1483 continue; |
| 1455 } | 1484 } |
| 1456 | 1485 |
| 1457 // Now we know that we want to run this test and record its | 1486 // Now we know that we want to run this test and record its |
| 1458 // success or failure. | 1487 // success or failure. |
| 1459 ErrorCombination errorsForThisConfig; | 1488 ErrorCombination errorsForThisConfig; |
| 1460 GrSurface* gpuTarget = NULL; | 1489 GrSurface* gpuTarget = NULL; |
| 1461 #if SK_SUPPORT_GPU | 1490 #if SK_SUPPORT_GPU |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1528 * Returns all errors encountered while doing so. | 1557 * Returns all errors encountered while doing so. |
| 1529 */ | 1558 */ |
| 1530 ErrorCombination run_multiple_modes(GMMain &gmmain, GM *gm, const ConfigData &co
mpareConfig, | 1559 ErrorCombination run_multiple_modes(GMMain &gmmain, GM *gm, const ConfigData &co
mpareConfig, |
| 1531 const SkBitmap &comparisonBitmap, | 1560 const SkBitmap &comparisonBitmap, |
| 1532 const SkTDArray<SkScalar> &tileGridReplaySca
les); | 1561 const SkTDArray<SkScalar> &tileGridReplaySca
les); |
| 1533 ErrorCombination run_multiple_modes(GMMain &gmmain, GM *gm, const ConfigData &co
mpareConfig, | 1562 ErrorCombination run_multiple_modes(GMMain &gmmain, GM *gm, const ConfigData &co
mpareConfig, |
| 1534 const SkBitmap &comparisonBitmap, | 1563 const SkBitmap &comparisonBitmap, |
| 1535 const SkTDArray<SkScalar> &tileGridReplaySca
les) { | 1564 const SkTDArray<SkScalar> &tileGridReplaySca
les) { |
| 1536 ErrorCombination errorsForAllModes; | 1565 ErrorCombination errorsForAllModes; |
| 1537 uint32_t gmFlags = gm->getFlags(); | 1566 uint32_t gmFlags = gm->getFlags(); |
| 1538 const SkString name = gmmain.make_name(gm->shortName(), compareConfig.fName)
; | 1567 const SkString shortNamePlusConfig = gmmain.make_shortname_plus_config(gm->s
hortName(), |
| 1568 compa
reConfig.fName); |
| 1539 | 1569 |
| 1540 SkPicture* pict = gmmain.generate_new_picture(gm, kNone_BbhType, 0); | 1570 SkPicture* pict = gmmain.generate_new_picture(gm, kNone_BbhType, 0); |
| 1541 SkAutoUnref aur(pict); | 1571 SkAutoUnref aur(pict); |
| 1542 if (FLAGS_replay) { | 1572 if (FLAGS_replay) { |
| 1543 const char renderModeDescriptor[] = "-replay"; | 1573 const char renderModeDescriptor[] = "-replay"; |
| 1544 if (gmFlags & GM::kSkipPicture_Flag) { | 1574 if (gmFlags & GM::kSkipPicture_Flag) { |
| 1545 gmmain.RecordTestResults(kIntentionallySkipped_ErrorType, name, rend
erModeDescriptor); | 1575 gmmain.RecordTestResults(kIntentionallySkipped_ErrorType, shortNameP
lusConfig, |
| 1576 renderModeDescriptor); |
| 1546 errorsForAllModes.add(kIntentionallySkipped_ErrorType); | 1577 errorsForAllModes.add(kIntentionallySkipped_ErrorType); |
| 1547 } else { | 1578 } else { |
| 1548 SkBitmap bitmap; | 1579 SkBitmap bitmap; |
| 1549 gmmain.generate_image_from_picture(gm, compareConfig, pict, &bitmap)
; | 1580 gmmain.generate_image_from_picture(gm, compareConfig, pict, &bitmap)
; |
| 1550 errorsForAllModes.add(gmmain.compare_test_results_to_reference_bitma
p( | 1581 errorsForAllModes.add(gmmain.compare_test_results_to_reference_bitma
p( |
| 1551 name, renderModeDescriptor, bitmap, &comparisonBitmap)); | 1582 gm->shortName(), compareConfig.fName, renderModeDescriptor, bitm
ap, |
| 1583 &comparisonBitmap)); |
| 1552 } | 1584 } |
| 1553 } | 1585 } |
| 1554 | 1586 |
| 1555 if (FLAGS_serialize) { | 1587 if (FLAGS_serialize) { |
| 1556 const char renderModeDescriptor[] = "-serialize"; | 1588 const char renderModeDescriptor[] = "-serialize"; |
| 1557 if (gmFlags & GM::kSkipPicture_Flag) { | 1589 if (gmFlags & GM::kSkipPicture_Flag) { |
| 1558 gmmain.RecordTestResults(kIntentionallySkipped_ErrorType, name, rend
erModeDescriptor); | 1590 gmmain.RecordTestResults(kIntentionallySkipped_ErrorType, shortNameP
lusConfig, |
| 1591 renderModeDescriptor); |
| 1559 errorsForAllModes.add(kIntentionallySkipped_ErrorType); | 1592 errorsForAllModes.add(kIntentionallySkipped_ErrorType); |
| 1560 } else { | 1593 } else { |
| 1561 SkPicture* repict = gmmain.stream_to_new_picture(*pict); | 1594 SkPicture* repict = gmmain.stream_to_new_picture(*pict); |
| 1562 SkAutoUnref aurr(repict); | 1595 SkAutoUnref aurr(repict); |
| 1563 SkBitmap bitmap; | 1596 SkBitmap bitmap; |
| 1564 gmmain.generate_image_from_picture(gm, compareConfig, repict, &bitma
p); | 1597 gmmain.generate_image_from_picture(gm, compareConfig, repict, &bitma
p); |
| 1565 errorsForAllModes.add(gmmain.compare_test_results_to_reference_bitma
p( | 1598 errorsForAllModes.add(gmmain.compare_test_results_to_reference_bitma
p( |
| 1566 name, renderModeDescriptor, bitmap, &comparisonBitmap)); | 1599 gm->shortName(), compareConfig.fName, renderModeDescriptor, bitm
ap, |
| 1600 &comparisonBitmap)); |
| 1567 } | 1601 } |
| 1568 } | 1602 } |
| 1569 | 1603 |
| 1570 if ((1 == FLAGS_writePicturePath.count()) && | 1604 if ((1 == FLAGS_writePicturePath.count()) && |
| 1571 !(gmFlags & GM::kSkipPicture_Flag)) { | 1605 !(gmFlags & GM::kSkipPicture_Flag)) { |
| 1572 const char* pictureSuffix = "skp"; | 1606 const char* pictureSuffix = "skp"; |
| 1573 SkString path = make_filename(FLAGS_writePicturePath[0], "", | 1607 // TODO(epoger): Make sure this still works even though the |
| 1574 gm->shortName(), pictureSuffix); | 1608 // filename now contains the config name (it used to contain |
| 1609 // just the shortName). I think this is actually an |
| 1610 // *improvement*, because now runs with different configs will |
| 1611 // write out their SkPictures to separate files rather than |
| 1612 // overwriting each other. But we should make sure it doesn't |
| 1613 // break anybody. |
| 1614 SkString path = gmmain.make_filename(FLAGS_writePicturePath[0], gm->shor
tName(), |
| 1615 compareConfig.fName, "", pictureSuf
fix); |
| 1575 SkFILEWStream stream(path.c_str()); | 1616 SkFILEWStream stream(path.c_str()); |
| 1576 pict->serialize(&stream); | 1617 pict->serialize(&stream); |
| 1577 } | 1618 } |
| 1578 | 1619 |
| 1579 if (FLAGS_rtree) { | 1620 if (FLAGS_rtree) { |
| 1580 const char renderModeDescriptor[] = "-rtree"; | 1621 const char renderModeDescriptor[] = "-rtree"; |
| 1581 if (gmFlags & GM::kSkipPicture_Flag) { | 1622 if (gmFlags & GM::kSkipPicture_Flag) { |
| 1582 gmmain.RecordTestResults(kIntentionallySkipped_ErrorType, name, rend
erModeDescriptor); | 1623 gmmain.RecordTestResults(kIntentionallySkipped_ErrorType, shortNameP
lusConfig, |
| 1624 renderModeDescriptor); |
| 1583 errorsForAllModes.add(kIntentionallySkipped_ErrorType); | 1625 errorsForAllModes.add(kIntentionallySkipped_ErrorType); |
| 1584 } else { | 1626 } else { |
| 1585 SkPicture* pict = gmmain.generate_new_picture( | 1627 SkPicture* pict = gmmain.generate_new_picture( |
| 1586 gm, kRTree_BbhType, SkPicture::kUsePathBoundsForClip_RecordingFl
ag); | 1628 gm, kRTree_BbhType, SkPicture::kUsePathBoundsForClip_RecordingFl
ag); |
| 1587 SkAutoUnref aur(pict); | 1629 SkAutoUnref aur(pict); |
| 1588 SkBitmap bitmap; | 1630 SkBitmap bitmap; |
| 1589 gmmain.generate_image_from_picture(gm, compareConfig, pict, &bitmap)
; | 1631 gmmain.generate_image_from_picture(gm, compareConfig, pict, &bitmap)
; |
| 1590 errorsForAllModes.add(gmmain.compare_test_results_to_reference_bitma
p( | 1632 errorsForAllModes.add(gmmain.compare_test_results_to_reference_bitma
p( |
| 1591 name, renderModeDescriptor, bitmap, &comparisonBitmap)); | 1633 gm->shortName(), compareConfig.fName, renderModeDescriptor, bitm
ap, |
| 1634 &comparisonBitmap)); |
| 1592 } | 1635 } |
| 1593 } | 1636 } |
| 1594 | 1637 |
| 1595 if (FLAGS_tileGrid) { | 1638 if (FLAGS_tileGrid) { |
| 1596 for(int scaleIndex = 0; scaleIndex < tileGridReplayScales.count(); ++sca
leIndex) { | 1639 for(int scaleIndex = 0; scaleIndex < tileGridReplayScales.count(); ++sca
leIndex) { |
| 1597 SkScalar replayScale = tileGridReplayScales[scaleIndex]; | 1640 SkScalar replayScale = tileGridReplayScales[scaleIndex]; |
| 1598 SkString renderModeDescriptor("-tilegrid"); | 1641 SkString renderModeDescriptor("-tilegrid"); |
| 1599 if (SK_Scalar1 != replayScale) { | 1642 if (SK_Scalar1 != replayScale) { |
| 1600 renderModeDescriptor += "-scale-"; | 1643 renderModeDescriptor += "-scale-"; |
| 1601 renderModeDescriptor.appendScalar(replayScale); | 1644 renderModeDescriptor.appendScalar(replayScale); |
| 1602 } | 1645 } |
| 1603 | 1646 |
| 1604 if ((gmFlags & GM::kSkipPicture_Flag) || | 1647 if ((gmFlags & GM::kSkipPicture_Flag) || |
| 1605 ((gmFlags & GM::kSkipScaledReplay_Flag) && replayScale != 1)) { | 1648 ((gmFlags & GM::kSkipScaledReplay_Flag) && replayScale != 1)) { |
| 1606 gmmain.RecordTestResults(kIntentionallySkipped_ErrorType, name, | 1649 gmmain.RecordTestResults(kIntentionallySkipped_ErrorType, shortN
amePlusConfig, |
| 1607 renderModeDescriptor.c_str()); | 1650 renderModeDescriptor.c_str()); |
| 1608 errorsForAllModes.add(kIntentionallySkipped_ErrorType); | 1651 errorsForAllModes.add(kIntentionallySkipped_ErrorType); |
| 1609 } else { | 1652 } else { |
| 1610 // We record with the reciprocal scale to obtain a replay | 1653 // We record with the reciprocal scale to obtain a replay |
| 1611 // result that can be validated against comparisonBitmap. | 1654 // result that can be validated against comparisonBitmap. |
| 1612 SkScalar recordScale = SkScalarInvert(replayScale); | 1655 SkScalar recordScale = SkScalarInvert(replayScale); |
| 1613 SkPicture* pict = gmmain.generate_new_picture( | 1656 SkPicture* pict = gmmain.generate_new_picture( |
| 1614 gm, kTileGrid_BbhType, SkPicture::kUsePathBoundsForClip_Reco
rdingFlag, | 1657 gm, kTileGrid_BbhType, SkPicture::kUsePathBoundsForClip_Reco
rdingFlag, |
| 1615 recordScale); | 1658 recordScale); |
| 1616 SkAutoUnref aur(pict); | 1659 SkAutoUnref aur(pict); |
| 1617 SkBitmap bitmap; | 1660 SkBitmap bitmap; |
| 1618 // We cannot yet pass 'true' to generate_image_from_picture to | 1661 // We cannot yet pass 'true' to generate_image_from_picture to |
| 1619 // perform actual tiled rendering (see Issue 1198 - | 1662 // perform actual tiled rendering (see Issue 1198 - |
| 1620 // https://code.google.com/p/skia/issues/detail?id=1198) | 1663 // https://code.google.com/p/skia/issues/detail?id=1198) |
| 1621 gmmain.generate_image_from_picture(gm, compareConfig, pict, &bit
map, | 1664 gmmain.generate_image_from_picture(gm, compareConfig, pict, &bit
map, |
| 1622 replayScale /*, true */); | 1665 replayScale /*, true */); |
| 1623 errorsForAllModes.add(gmmain.compare_test_results_to_reference_b
itmap( | 1666 errorsForAllModes.add(gmmain.compare_test_results_to_reference_b
itmap( |
| 1624 name, renderModeDescriptor.c_str(), bitmap, &comparisonBitma
p)); | 1667 gm->shortName(), compareConfig.fName, renderModeDescriptor.c
_str(), bitmap, |
| 1668 &comparisonBitmap)); |
| 1625 } | 1669 } |
| 1626 } | 1670 } |
| 1627 } | 1671 } |
| 1628 | 1672 |
| 1629 // run the pipe centric GM steps | 1673 // run the pipe centric GM steps |
| 1630 if (FLAGS_pipe) { | 1674 if (FLAGS_pipe) { |
| 1631 errorsForAllModes.add(gmmain.test_pipe_playback(gm, compareConfig, compa
risonBitmap, | 1675 errorsForAllModes.add(gmmain.test_pipe_playback(gm, compareConfig, compa
risonBitmap, |
| 1632 FLAGS_simulatePipePlayba
ckFailure)); | 1676 FLAGS_simulatePipePlayba
ckFailure)); |
| 1633 if (FLAGS_tiledPipe) { | 1677 if (FLAGS_tiledPipe) { |
| 1634 errorsForAllModes.add(gmmain.test_tiled_pipe_playback(gm, compareCon
fig, | 1678 errorsForAllModes.add(gmmain.test_tiled_pipe_playback(gm, compareCon
fig, |
| (...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2045 if (FLAGS_forceBWtext) { | 2089 if (FLAGS_forceBWtext) { |
| 2046 canvas->setDrawFilter(SkNEW(BWTextDrawFilter))->unref(); | 2090 canvas->setDrawFilter(SkNEW(BWTextDrawFilter))->unref(); |
| 2047 } | 2091 } |
| 2048 } | 2092 } |
| 2049 | 2093 |
| 2050 #if !defined(SK_BUILD_FOR_IOS) && !defined(SK_BUILD_FOR_NACL) | 2094 #if !defined(SK_BUILD_FOR_IOS) && !defined(SK_BUILD_FOR_NACL) |
| 2051 int main(int argc, char * const argv[]) { | 2095 int main(int argc, char * const argv[]) { |
| 2052 return tool_main(argc, (char**) argv); | 2096 return tool_main(argc, (char**) argv); |
| 2053 } | 2097 } |
| 2054 #endif | 2098 #endif |
| OLD | NEW |