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 616 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 627 dev->beginSheet(unitsPerMeter, pixelsPerMeter, trimSize); | 627 dev->beginSheet(unitsPerMeter, pixelsPerMeter, trimSize); |
| 628 invokeGM(gm, &c, false, false); | 628 invokeGM(gm, &c, false, false); |
| 629 dev->endSheet(); | 629 dev->endSheet(); |
| 630 dev->endPortfolio(); | 630 dev->endPortfolio(); |
| 631 | 631 |
| 632 #endif | 632 #endif |
| 633 } | 633 } |
| 634 | 634 |
| 635 ErrorCombination write_reference_image(const ConfigData& gRec, const char wr itePath [], | 635 ErrorCombination write_reference_image(const ConfigData& gRec, const char wr itePath [], |
| 636 const char renderModeDescriptor [], | 636 const char renderModeDescriptor [], |
| 637 const char *shortName, SkBitmap& bitm ap, | 637 const char *shortName, const SkBitmap * bitmap, |
| 638 SkDynamicMemoryWStream* document) { | 638 SkDynamicMemoryWStream* document) { |
| 639 SkString path; | 639 SkString path; |
| 640 bool success = false; | 640 bool success = false; |
| 641 if (gRec.fBackend == kRaster_Backend || | 641 if (gRec.fBackend == kRaster_Backend || |
| 642 gRec.fBackend == kGPU_Backend || | 642 gRec.fBackend == kGPU_Backend || |
| 643 (gRec.fBackend == kPDF_Backend && CAN_IMAGE_PDF)) { | 643 (gRec.fBackend == kPDF_Backend && CAN_IMAGE_PDF)) { |
| 644 | 644 |
| 645 path = make_filename(writePath, shortName, gRec.fName, renderModeDes criptor, | 645 path = make_filename(writePath, shortName, gRec.fName, renderModeDes criptor, |
| 646 kPNG_FileExtension); | 646 kPNG_FileExtension); |
| 647 success = write_bitmap(path, bitmap); | 647 success = write_bitmap(path, *bitmap); |
| 648 } | 648 } |
| 649 if (kPDF_Backend == gRec.fBackend) { | 649 if (kPDF_Backend == gRec.fBackend) { |
| 650 path = make_filename(writePath, shortName, gRec.fName, renderModeDes criptor, | 650 path = make_filename(writePath, shortName, gRec.fName, renderModeDes criptor, |
| 651 "pdf"); | 651 "pdf"); |
| 652 success = write_document(path, *document); | 652 success = write_document(path, *document); |
| 653 } | 653 } |
| 654 if (kXPS_Backend == gRec.fBackend) { | 654 if (kXPS_Backend == gRec.fBackend) { |
| 655 path = make_filename(writePath, shortName, gRec.fName, renderModeDes criptor, | 655 path = make_filename(writePath, shortName, gRec.fName, renderModeDes criptor, |
| 656 "xps"); | 656 "xps"); |
| 657 success = write_document(path, *document); | 657 success = write_document(path, *document); |
| (...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 857 this->fJsonExpectedResults[testName] = expectations.asJsonValue(); | 857 this->fJsonExpectedResults[testName] = expectations.asJsonValue(); |
| 858 } | 858 } |
| 859 | 859 |
| 860 /** | 860 /** |
| 861 * Compare actualBitmap to expectations stored in this->fExpectationsSource. | 861 * Compare actualBitmap to expectations stored in this->fExpectationsSource. |
| 862 * | 862 * |
| 863 * @param gm which test generated the actualBitmap | 863 * @param gm which test generated the actualBitmap |
| 864 * @param gRec | 864 * @param gRec |
| 865 * @param writePath unless this is NULL, write out actual images into this | 865 * @param writePath unless this is NULL, write out actual images into this |
| 866 * directory | 866 * directory |
| 867 * @param actualBitmap bitmap generated by this run | 867 * @param actualBitmap ptr to bitmap generated by this run, or NULL if we |
| 868 * @param pdf | 868 * don't have a usable bitmap representation |
| 869 * @param document pdf or xps representation, if appropriate | |
| 869 */ | 870 */ |
| 870 ErrorCombination compare_test_results_to_stored_expectations( | 871 ErrorCombination compare_test_results_to_stored_expectations( |
| 871 GM* gm, const ConfigData& gRec, const char writePath[], | 872 GM* gm, const ConfigData& gRec, const char writePath[], |
| 872 SkBitmap& actualBitmap, SkDynamicMemoryWStream* pdf) { | 873 const SkBitmap* actualBitmap, SkDynamicMemoryWStream* document) { |
| 873 | 874 |
| 874 SkString shortNamePlusConfig = make_shortname_plus_config(gm->shortName( ), gRec.fName); | 875 SkString shortNamePlusConfig = make_shortname_plus_config(gm->shortName( ), gRec.fName); |
| 875 SkString nameWithExtension(shortNamePlusConfig); | 876 SkString nameWithExtension(shortNamePlusConfig); |
| 876 nameWithExtension.append("."); | 877 nameWithExtension.append("."); |
| 877 nameWithExtension.append(kPNG_FileExtension); | 878 nameWithExtension.append(kPNG_FileExtension); |
| 878 | 879 |
| 879 ErrorCombination errors; | 880 ErrorCombination errors; |
| 880 ExpectationsSource *expectationsSource = this->fExpectationsSource.get() ; | 881 |
| 881 if (expectationsSource && (gRec.fFlags & kRead_ConfigFlag)) { | 882 if (NULL == actualBitmap) { |
| 882 /* | 883 // Note that we intentionally skipped validating the results for |
| 883 * Get the expected results for this test, as one or more allowed | 884 // this test, because we don't know how to generate an SkBitmap |
| 884 * hash digests. The current implementation of expectationsSource | 885 // version of the output. |
| 885 * get this by computing the hash digest of a single PNG file on dis k. | 886 RecordTestResults(ErrorCombination(kIntentionallySkipped_ErrorType), |
|
epoger
2013/06/18 05:20:10
Patchset 3 gives us better behavior... when render
| |
| 886 * | 887 shortNamePlusConfig, ""); |
| 887 * TODO(epoger): This relies on the fact that | |
| 888 * force_all_opaque() was called on the bitmap before it | |
| 889 * was written to disk as a PNG in the first place. If | |
| 890 * not, the hash digest returned here may not match the | |
| 891 * hash digest of actualBitmap, which *has* been run through | |
| 892 * force_all_opaque(). | |
| 893 * See comments above complete_bitmap() for more detail. | |
| 894 */ | |
| 895 Expectations expectations = expectationsSource->get(nameWithExtensio n.c_str()); | |
| 896 errors.add(compare_to_expectations(expectations, actualBitmap, | |
| 897 gm->shortName(), gRec.fName, "", true)); | |
| 898 } else { | 888 } else { |
| 899 // If we are running without expectations, we still want to | 889 ExpectationsSource *expectationsSource = this->fExpectationsSource.g et(); |
| 900 // record the actual results. | 890 if (expectationsSource && (gRec.fFlags & kRead_ConfigFlag)) { |
|
epoger
2013/06/18 05:20:10
This section is just moved down and tab-indented.
| |
| 901 GmResultDigest actualResultDigest(actualBitmap); | 891 /* |
| 902 add_actual_results_to_json_summary(nameWithExtension.c_str(), actual ResultDigest, | 892 * Get the expected results for this test, as one or more allowe d |
| 903 ErrorCombination(kMissingExpectat ions_ErrorType), | 893 * hash digests. The current implementation of expectationsSourc e |
| 904 false); | 894 * get this by computing the hash digest of a single PNG file on disk. |
| 905 RecordTestResults(ErrorCombination(kMissingExpectations_ErrorType), | 895 * |
| 906 shortNamePlusConfig, ""); | 896 * TODO(epoger): This relies on the fact that |
| 897 * force_all_opaque() was called on the bitmap before it | |
| 898 * was written to disk as a PNG in the first place. If | |
| 899 * not, the hash digest returned here may not match the | |
| 900 * hash digest of actualBitmap, which *has* been run through | |
| 901 * force_all_opaque(). | |
| 902 * See comments above complete_bitmap() for more detail. | |
| 903 */ | |
| 904 Expectations expectations = expectationsSource->get(nameWithExte nsion.c_str()); | |
| 905 errors.add(compare_to_expectations(expectations, *actualBitmap, | |
| 906 gm->shortName(), gRec.fName, "", true)); | |
| 907 } else { | |
| 908 // If we are running without expectations, we still want to | |
| 909 // record the actual results. | |
| 910 GmResultDigest actualResultDigest(*actualBitmap); | |
| 911 add_actual_results_to_json_summary(nameWithExtension.c_str(), ac tualResultDigest, | |
| 912 ErrorCombination(kMissingExpe ctations_ErrorType), | |
| 913 false); | |
| 914 RecordTestResults(ErrorCombination(kMissingExpectations_ErrorTyp e), | |
| 915 shortNamePlusConfig, ""); | |
| 916 } | |
| 907 } | 917 } |
| 908 | 918 |
| 909 // TODO: Consider moving this into compare_to_expectations(), | 919 // TODO: Consider moving this into compare_to_expectations(), |
| 910 // similar to fMismatchPath... for now, we don't do that, because | 920 // similar to fMismatchPath... for now, we don't do that, because |
| 911 // we don't want to write out the actual bitmaps for all | 921 // we don't want to write out the actual bitmaps for all |
| 912 // renderModes of all tests! That would be a lot of files. | 922 // renderModes of all tests! That would be a lot of files. |
| 913 if (writePath && (gRec.fFlags & kWrite_ConfigFlag)) { | 923 if (writePath && (gRec.fFlags & kWrite_ConfigFlag)) { |
| 914 errors.add(write_reference_image(gRec, writePath, "", gm->shortName( ), | 924 errors.add(write_reference_image(gRec, writePath, "", gm->shortName( ), |
| 915 actualBitmap, pdf)); | 925 actualBitmap, document)); |
| 916 } | 926 } |
| 917 | 927 |
| 918 return errors; | 928 return errors; |
| 919 } | 929 } |
| 920 | 930 |
| 921 /** | 931 /** |
| 922 * Compare actualBitmap to referenceBitmap. | 932 * Compare actualBitmap to referenceBitmap. |
| 923 * | 933 * |
| 924 * @param shortName test name, e.g. "selftest1" | 934 * @param shortName test name, e.g. "selftest1" |
| 925 * @param configName configuration name, e.g. "8888" | 935 * @param configName configuration name, e.g. "8888" |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1007 // JSON look like if we get an "early error" while | 1017 // JSON look like if we get an "early error" while |
| 1008 // trying to generate the image. | 1018 // trying to generate the image. |
| 1009 return errors; | 1019 return errors; |
| 1010 } | 1020 } |
| 1011 } else if (gRec.fBackend == kPDF_Backend) { | 1021 } else if (gRec.fBackend == kPDF_Backend) { |
| 1012 generate_pdf(gm, document); | 1022 generate_pdf(gm, document); |
| 1013 #if CAN_IMAGE_PDF | 1023 #if CAN_IMAGE_PDF |
| 1014 SkAutoDataUnref data(document.copyToData()); | 1024 SkAutoDataUnref data(document.copyToData()); |
| 1015 SkMemoryStream stream(data->data(), data->size()); | 1025 SkMemoryStream stream(data->data(), data->size()); |
| 1016 SkPDFDocumentToBitmap(&stream, bitmap); | 1026 SkPDFDocumentToBitmap(&stream, bitmap); |
| 1027 #else | |
| 1028 bitmap = NULL; // we don't generate a bitmap rendering of the PDF f ile | |
| 1017 #endif | 1029 #endif |
| 1018 } else if (gRec.fBackend == kXPS_Backend) { | 1030 } else if (gRec.fBackend == kXPS_Backend) { |
| 1019 generate_xps(gm, document); | 1031 generate_xps(gm, document); |
| 1032 bitmap = NULL; // we don't generate a bitmap rendering of the XPS f ile | |
| 1020 } | 1033 } |
| 1021 return compare_test_results_to_stored_expectations( | 1034 return compare_test_results_to_stored_expectations( |
| 1022 gm, gRec, writePath, *bitmap, &document); | 1035 gm, gRec, writePath, bitmap, &document); |
| 1023 } | 1036 } |
| 1024 | 1037 |
| 1025 ErrorCombination test_deferred_drawing(GM* gm, | 1038 ErrorCombination test_deferred_drawing(GM* gm, |
| 1026 const ConfigData& gRec, | 1039 const ConfigData& gRec, |
| 1027 const SkBitmap& referenceBitmap, | 1040 const SkBitmap& referenceBitmap, |
| 1028 GrSurface* gpuTarget) { | 1041 GrSurface* gpuTarget) { |
| 1029 SkDynamicMemoryWStream document; | 1042 SkDynamicMemoryWStream document; |
| 1030 | 1043 |
| 1031 if (gRec.fBackend == kRaster_Backend || | 1044 if (gRec.fBackend == kRaster_Backend || |
| 1032 gRec.fBackend == kGPU_Backend) { | 1045 gRec.fBackend == kGPU_Backend) { |
| (...skipping 1054 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2087 if (FLAGS_forceBWtext) { | 2100 if (FLAGS_forceBWtext) { |
| 2088 canvas->setDrawFilter(SkNEW(BWTextDrawFilter))->unref(); | 2101 canvas->setDrawFilter(SkNEW(BWTextDrawFilter))->unref(); |
| 2089 } | 2102 } |
| 2090 } | 2103 } |
| 2091 | 2104 |
| 2092 #if !defined(SK_BUILD_FOR_IOS) && !defined(SK_BUILD_FOR_NACL) | 2105 #if !defined(SK_BUILD_FOR_IOS) && !defined(SK_BUILD_FOR_NACL) |
| 2093 int main(int argc, char * const argv[]) { | 2106 int main(int argc, char * const argv[]) { |
| 2094 return tool_main(argc, (char**) argv); | 2107 return tool_main(argc, (char**) argv); |
| 2095 } | 2108 } |
| 2096 #endif | 2109 #endif |
| OLD | NEW |