| 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 646 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 657 invokeGM(gm, &c, false, false); | 657 invokeGM(gm, &c, false, false); |
| 658 dev->endSheet(); | 658 dev->endSheet(); |
| 659 dev->endPortfolio(); | 659 dev->endPortfolio(); |
| 660 | 660 |
| 661 #endif | 661 #endif |
| 662 } | 662 } |
| 663 | 663 |
| 664 ErrorCombination write_reference_image(const ConfigData& gRec, const char wr
itePath [], | 664 ErrorCombination write_reference_image(const ConfigData& gRec, const char wr
itePath [], |
| 665 const char renderModeDescriptor [], | 665 const char renderModeDescriptor [], |
| 666 const char *shortName, | 666 const char *shortName, |
| 667 const BitmapAndDigest& bitmapAndDiges
t, | 667 const BitmapAndDigest* bitmapAndDiges
t, |
| 668 SkDynamicMemoryWStream* document) { | 668 SkDynamicMemoryWStream* document) { |
| 669 SkString path; | 669 SkString path; |
| 670 bool success = false; | 670 bool success = false; |
| 671 if (gRec.fBackend == kRaster_Backend || | 671 if (gRec.fBackend == kRaster_Backend || |
| 672 gRec.fBackend == kGPU_Backend || | 672 gRec.fBackend == kGPU_Backend || |
| 673 (gRec.fBackend == kPDF_Backend && CAN_IMAGE_PDF)) { | 673 (gRec.fBackend == kPDF_Backend && CAN_IMAGE_PDF)) { |
| 674 | 674 |
| 675 path = make_bitmap_filename(writePath, shortName, gRec.fName, render
ModeDescriptor, | 675 path = make_bitmap_filename(writePath, shortName, gRec.fName, render
ModeDescriptor, |
| 676 bitmapAndDigest.fDigest); | 676 bitmapAndDigest->fDigest); |
| 677 success = write_bitmap(path, bitmapAndDigest.fBitmap); | 677 success = write_bitmap(path, bitmapAndDigest->fBitmap); |
| 678 } | 678 } |
| 679 if (kPDF_Backend == gRec.fBackend) { | 679 if (kPDF_Backend == gRec.fBackend) { |
| 680 path = make_filename(writePath, shortName, gRec.fName, renderModeDes
criptor, | 680 path = make_filename(writePath, shortName, gRec.fName, renderModeDes
criptor, |
| 681 "pdf"); | 681 "pdf"); |
| 682 success = write_document(path, *document); | 682 success = write_document(path, *document); |
| 683 } | 683 } |
| 684 if (kXPS_Backend == gRec.fBackend) { | 684 if (kXPS_Backend == gRec.fBackend) { |
| 685 path = make_filename(writePath, shortName, gRec.fName, renderModeDes
criptor, | 685 path = make_filename(writePath, shortName, gRec.fName, renderModeDes
criptor, |
| 686 "xps"); | 686 "xps"); |
| 687 success = write_document(path, *document); | 687 success = write_document(path, *document); |
| (...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 898 this->fJsonExpectedResults[testName] = expectations.asJsonValue(); | 898 this->fJsonExpectedResults[testName] = expectations.asJsonValue(); |
| 899 } | 899 } |
| 900 | 900 |
| 901 /** | 901 /** |
| 902 * Compare actualBitmap to expectations stored in this->fExpectationsSource. | 902 * Compare actualBitmap to expectations stored in this->fExpectationsSource. |
| 903 * | 903 * |
| 904 * @param gm which test generated the actualBitmap | 904 * @param gm which test generated the actualBitmap |
| 905 * @param gRec | 905 * @param gRec |
| 906 * @param writePath unless this is NULL, write out actual images into this | 906 * @param writePath unless this is NULL, write out actual images into this |
| 907 * directory | 907 * directory |
| 908 * @param actualBitmap bitmap generated by this run | 908 * @param actualBitmapAndDigest ptr to bitmap generated by this run, or NULL |
| 909 * @param pdf | 909 * if we don't have a usable bitmap representation |
| 910 * @param document pdf or xps representation, if appropriate |
| 910 */ | 911 */ |
| 911 ErrorCombination compare_test_results_to_stored_expectations( | 912 ErrorCombination compare_test_results_to_stored_expectations( |
| 912 GM* gm, const ConfigData& gRec, const char writePath[], | 913 GM* gm, const ConfigData& gRec, const char writePath[], |
| 913 SkBitmap& actualBitmap, SkDynamicMemoryWStream* pdf) { | 914 const BitmapAndDigest* actualBitmapAndDigest, SkDynamicMemoryWStream* do
cument) { |
| 914 | 915 |
| 915 BitmapAndDigest actualBitmapAndDigest(actualBitmap); | |
| 916 SkString shortNamePlusConfig = make_shortname_plus_config(gm->shortName(
), gRec.fName); | 916 SkString shortNamePlusConfig = make_shortname_plus_config(gm->shortName(
), gRec.fName); |
| 917 SkString nameWithExtension(shortNamePlusConfig); | 917 SkString nameWithExtension(shortNamePlusConfig); |
| 918 nameWithExtension.append("."); | 918 nameWithExtension.append("."); |
| 919 nameWithExtension.append(kPNG_FileExtension); | 919 nameWithExtension.append(kPNG_FileExtension); |
| 920 | 920 |
| 921 ErrorCombination errors; | 921 ErrorCombination errors; |
| 922 ExpectationsSource *expectationsSource = this->fExpectationsSource.get()
; | 922 |
| 923 if (expectationsSource && (gRec.fFlags & kRead_ConfigFlag)) { | 923 if (NULL == actualBitmapAndDigest) { |
| 924 /* | 924 // Note that we intentionally skipped validating the results for |
| 925 * Get the expected results for this test, as one or more allowed | 925 // this test, because we don't know how to generate an SkBitmap |
| 926 * hash digests. The current implementation of expectationsSource | 926 // version of the output. |
| 927 * get this by computing the hash digest of a single PNG file on dis
k. | 927 RecordTestResults(ErrorCombination(kIntentionallySkipped_ErrorType), |
| 928 * | 928 shortNamePlusConfig, ""); |
| 929 * TODO(epoger): This relies on the fact that | |
| 930 * force_all_opaque() was called on the bitmap before it | |
| 931 * was written to disk as a PNG in the first place. If | |
| 932 * not, the hash digest returned here may not match the | |
| 933 * hash digest of actualBitmap, which *has* been run through | |
| 934 * force_all_opaque(). | |
| 935 * See comments above complete_bitmap() for more detail. | |
| 936 */ | |
| 937 Expectations expectations = expectationsSource->get(nameWithExtensio
n.c_str()); | |
| 938 errors.add(compare_to_expectations(expectations, actualBitmapAndDige
st, | |
| 939 gm->shortName(), gRec.fName, "",
true)); | |
| 940 } else { | 929 } else { |
| 941 // If we are running without expectations, we still want to | 930 ExpectationsSource *expectationsSource = this->fExpectationsSource.g
et(); |
| 942 // record the actual results. | 931 if (expectationsSource && (gRec.fFlags & kRead_ConfigFlag)) { |
| 943 add_actual_results_to_json_summary(nameWithExtension.c_str(), | 932 /* |
| 944 actualBitmapAndDigest.fDigest, | 933 * Get the expected results for this test, as one or more allowe
d |
| 945 ErrorCombination(kMissingExpectat
ions_ErrorType), | 934 * hash digests. The current implementation of expectationsSourc
e |
| 946 false); | 935 * get this by computing the hash digest of a single PNG file on
disk. |
| 947 RecordTestResults(ErrorCombination(kMissingExpectations_ErrorType), | 936 * |
| 948 shortNamePlusConfig, ""); | 937 * TODO(epoger): This relies on the fact that |
| 938 * force_all_opaque() was called on the bitmap before it |
| 939 * was written to disk as a PNG in the first place. If |
| 940 * not, the hash digest returned here may not match the |
| 941 * hash digest of actualBitmap, which *has* been run through |
| 942 * force_all_opaque(). |
| 943 * See comments above complete_bitmap() for more detail. |
| 944 */ |
| 945 Expectations expectations = expectationsSource->get(nameWithExte
nsion.c_str()); |
| 946 errors.add(compare_to_expectations(expectations, *actualBitmapAn
dDigest, |
| 947 gm->shortName(), gRec.fName,
"", true)); |
| 948 } else { |
| 949 // If we are running without expectations, we still want to |
| 950 // record the actual results. |
| 951 add_actual_results_to_json_summary(nameWithExtension.c_str(), |
| 952 actualBitmapAndDigest->fDiges
t, |
| 953 ErrorCombination(kMissingExpe
ctations_ErrorType), |
| 954 false); |
| 955 RecordTestResults(ErrorCombination(kMissingExpectations_ErrorTyp
e), |
| 956 shortNamePlusConfig, ""); |
| 957 } |
| 949 } | 958 } |
| 950 | 959 |
| 951 // TODO: Consider moving this into compare_to_expectations(), | 960 // TODO: Consider moving this into compare_to_expectations(), |
| 952 // similar to fMismatchPath... for now, we don't do that, because | 961 // similar to fMismatchPath... for now, we don't do that, because |
| 953 // we don't want to write out the actual bitmaps for all | 962 // we don't want to write out the actual bitmaps for all |
| 954 // renderModes of all tests! That would be a lot of files. | 963 // renderModes of all tests! That would be a lot of files. |
| 955 if (writePath && (gRec.fFlags & kWrite_ConfigFlag)) { | 964 if (writePath && (gRec.fFlags & kWrite_ConfigFlag)) { |
| 956 errors.add(write_reference_image(gRec, writePath, "", gm->shortName(
), | 965 errors.add(write_reference_image(gRec, writePath, "", gm->shortName(
), |
| 957 actualBitmapAndDigest, pdf)); | 966 actualBitmapAndDigest, document)); |
| 958 } | 967 } |
| 959 | 968 |
| 960 return errors; | 969 return errors; |
| 961 } | 970 } |
| 962 | 971 |
| 963 /** | 972 /** |
| 964 * Compare actualBitmap to referenceBitmap. | 973 * Compare actualBitmap to referenceBitmap. |
| 965 * | 974 * |
| 966 * @param shortName test name, e.g. "selftest1" | 975 * @param shortName test name, e.g. "selftest1" |
| 967 * @param configName configuration name, e.g. "8888" | 976 * @param configName configuration name, e.g. "8888" |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1047 // JSON look like if we get an "early error" while | 1056 // JSON look like if we get an "early error" while |
| 1048 // trying to generate the image. | 1057 // trying to generate the image. |
| 1049 return errors; | 1058 return errors; |
| 1050 } | 1059 } |
| 1051 } else if (gRec.fBackend == kPDF_Backend) { | 1060 } else if (gRec.fBackend == kPDF_Backend) { |
| 1052 generate_pdf(gm, document); | 1061 generate_pdf(gm, document); |
| 1053 #if CAN_IMAGE_PDF | 1062 #if CAN_IMAGE_PDF |
| 1054 SkAutoDataUnref data(document.copyToData()); | 1063 SkAutoDataUnref data(document.copyToData()); |
| 1055 SkMemoryStream stream(data->data(), data->size()); | 1064 SkMemoryStream stream(data->data(), data->size()); |
| 1056 SkPDFDocumentToBitmap(&stream, bitmap); | 1065 SkPDFDocumentToBitmap(&stream, bitmap); |
| 1066 #else |
| 1067 bitmap = NULL; // we don't generate a bitmap rendering of the PDF f
ile |
| 1057 #endif | 1068 #endif |
| 1058 } else if (gRec.fBackend == kXPS_Backend) { | 1069 } else if (gRec.fBackend == kXPS_Backend) { |
| 1059 generate_xps(gm, document); | 1070 generate_xps(gm, document); |
| 1071 bitmap = NULL; // we don't generate a bitmap rendering of the XPS f
ile |
| 1060 } | 1072 } |
| 1061 return compare_test_results_to_stored_expectations( | 1073 |
| 1062 gm, gRec, writePath, *bitmap, &document); | 1074 if (NULL == bitmap) { |
| 1075 return compare_test_results_to_stored_expectations( |
| 1076 gm, gRec, writePath, NULL, &document); |
| 1077 } else { |
| 1078 BitmapAndDigest bitmapAndDigest(*bitmap); |
| 1079 return compare_test_results_to_stored_expectations( |
| 1080 gm, gRec, writePath, &bitmapAndDigest, &document); |
| 1081 } |
| 1063 } | 1082 } |
| 1064 | 1083 |
| 1065 ErrorCombination test_deferred_drawing(GM* gm, | 1084 ErrorCombination test_deferred_drawing(GM* gm, |
| 1066 const ConfigData& gRec, | 1085 const ConfigData& gRec, |
| 1067 const SkBitmap& referenceBitmap, | 1086 const SkBitmap& referenceBitmap, |
| 1068 GrSurface* gpuTarget) { | 1087 GrSurface* gpuTarget) { |
| 1069 SkDynamicMemoryWStream document; | 1088 SkDynamicMemoryWStream document; |
| 1070 | 1089 |
| 1071 if (gRec.fBackend == kRaster_Backend || | 1090 if (gRec.fBackend == kRaster_Backend || |
| 1072 gRec.fBackend == kGPU_Backend) { | 1091 gRec.fBackend == kGPU_Backend) { |
| (...skipping 1073 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2146 if (FLAGS_forceBWtext) { | 2165 if (FLAGS_forceBWtext) { |
| 2147 canvas->setDrawFilter(SkNEW(BWTextDrawFilter))->unref(); | 2166 canvas->setDrawFilter(SkNEW(BWTextDrawFilter))->unref(); |
| 2148 } | 2167 } |
| 2149 } | 2168 } |
| 2150 | 2169 |
| 2151 #if !defined(SK_BUILD_FOR_IOS) && !defined(SK_BUILD_FOR_NACL) | 2170 #if !defined(SK_BUILD_FOR_IOS) && !defined(SK_BUILD_FOR_NACL) |
| 2152 int main(int argc, char * const argv[]) { | 2171 int main(int argc, char * const argv[]) { |
| 2153 return tool_main(argc, (char**) argv); | 2172 return tool_main(argc, (char**) argv); |
| 2154 } | 2173 } |
| 2155 #endif | 2174 #endif |
| OLD | NEW |