| 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 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 56 #define DEFAULT_CACHE_VALUE -1 | 56 #define DEFAULT_CACHE_VALUE -1 |
| 57 static int gGpuCacheSizeBytes; | 57 static int gGpuCacheSizeBytes; |
| 58 static int gGpuCacheSizeCount; | 58 static int gGpuCacheSizeCount; |
| 59 #else | 59 #else |
| 60 class GrContextFactory; | 60 class GrContextFactory; |
| 61 class GrContext; | 61 class GrContext; |
| 62 class GrSurface; | 62 class GrSurface; |
| 63 typedef int GLContextType; | 63 typedef int GLContextType; |
| 64 #endif | 64 #endif |
| 65 | 65 |
| 66 #define DEBUGFAIL_SEE_STDERR SkDEBUGFAIL("see stderr for message") |
| 67 |
| 66 extern bool gSkSuppressFontCachePurgeSpew; | 68 extern bool gSkSuppressFontCachePurgeSpew; |
| 67 | 69 |
| 68 #ifdef SK_SUPPORT_PDF | 70 #ifdef SK_SUPPORT_PDF |
| 69 #include "SkPDFDevice.h" | 71 #include "SkPDFDevice.h" |
| 70 #include "SkPDFDocument.h" | 72 #include "SkPDFDocument.h" |
| 71 #endif | 73 #endif |
| 72 | 74 |
| 73 // Until we resolve http://code.google.com/p/skia/issues/detail?id=455 , | 75 // Until we resolve http://code.google.com/p/skia/issues/detail?id=455 , |
| 74 // stop writing out XPS-format image baselines in gm. | 76 // stop writing out XPS-format image baselines in gm. |
| 75 #undef SK_SUPPORT_XPS | 77 #undef SK_SUPPORT_XPS |
| (...skipping 685 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 761 add_actual_results_to_json_summary(completeName, actualBitmapHash, e
rrors, | 763 add_actual_results_to_json_summary(completeName, actualBitmapHash, e
rrors, |
| 762 expectations.ignoreFailure()); | 764 expectations.ignoreFailure()); |
| 763 add_expected_results_to_json_summary(completeName, expectations); | 765 add_expected_results_to_json_summary(completeName, expectations); |
| 764 } | 766 } |
| 765 | 767 |
| 766 return errors; | 768 return errors; |
| 767 } | 769 } |
| 768 | 770 |
| 769 /** | 771 /** |
| 770 * Add this result to the appropriate JSON collection of actual results, | 772 * Add this result to the appropriate JSON collection of actual results, |
| 771 * depending on status. | 773 * depending on errors encountered. |
| 772 */ | 774 */ |
| 773 void add_actual_results_to_json_summary(const char testName[], | 775 void add_actual_results_to_json_summary(const char testName[], |
| 774 const SkHashDigest& actualBitmapHash
, | 776 const SkHashDigest& actualResult, |
| 775 ErrorCombination result, | 777 ErrorCombination errors, |
| 776 bool ignoreFailure) { | 778 bool ignoreFailure) { |
| 777 Json::Value actualResults; | 779 Json::Value jsonActualResults = ActualResultAsJsonValue(actualResult); |
| 778 actualResults[kJsonKey_ActualResults_AnyStatus_Checksum] = | 780 if (errors.isEmpty()) { |
| 779 asJsonValue(actualBitmapHash); | 781 this->fJsonActualResults_Succeeded[testName] = jsonActualResults; |
| 780 if (result.isEmpty()) { | |
| 781 this->fJsonActualResults_Succeeded[testName] = actualResults; | |
| 782 } else { | 782 } else { |
| 783 if (ignoreFailure) { | 783 if (ignoreFailure) { |
| 784 // TODO: Once we have added the ability to compare | 784 // TODO: Once we have added the ability to compare |
| 785 // actual results against expectations in a JSON file | 785 // actual results against expectations in a JSON file |
| 786 // (where we can set ignore-failure to either true or | 786 // (where we can set ignore-failure to either true or |
| 787 // false), add test cases that exercise ignored | 787 // false), add test cases that exercise ignored |
| 788 // failures (both for kMissingExpectations_ErrorType | 788 // failures (both for kMissingExpectations_ErrorType |
| 789 // and kExpectationsMismatch_ErrorType). | 789 // and kExpectationsMismatch_ErrorType). |
| 790 this->fJsonActualResults_FailureIgnored[testName] = | 790 this->fJsonActualResults_FailureIgnored[testName] = |
| 791 actualResults; | 791 jsonActualResults; |
| 792 } else { | 792 } else { |
| 793 if (result.includes(kMissingExpectations_ErrorType)) { | 793 if (errors.includes(kMissingExpectations_ErrorType)) { |
| 794 // TODO: What about the case where there IS an | 794 // TODO: What about the case where there IS an |
| 795 // expected image hash digest, but that gm test | 795 // expected image hash digest, but that gm test |
| 796 // doesn't actually run? For now, those cases | 796 // doesn't actually run? For now, those cases |
| 797 // will always be ignored, because gm only looks | 797 // will always be ignored, because gm only looks |
| 798 // at expectations that correspond to gm tests | 798 // at expectations that correspond to gm tests |
| 799 // that were actually run. | 799 // that were actually run. |
| 800 // | 800 // |
| 801 // Once we have the ability to express | 801 // Once we have the ability to express |
| 802 // expectations as a JSON file, we should fix this | 802 // expectations as a JSON file, we should fix this |
| 803 // (and add a test case for which an expectation | 803 // (and add a test case for which an expectation |
| 804 // is given but the test is never run). | 804 // is given but the test is never run). |
| 805 this->fJsonActualResults_NoComparison[testName] = | 805 this->fJsonActualResults_NoComparison[testName] = |
| 806 actualResults; | 806 jsonActualResults; |
| 807 } | 807 } |
| 808 if (result.includes(kExpectationsMismatch_ErrorType) || | 808 if (errors.includes(kExpectationsMismatch_ErrorType) || |
| 809 result.includes(kRenderModeMismatch_ErrorType)) { | 809 errors.includes(kRenderModeMismatch_ErrorType)) { |
| 810 this->fJsonActualResults_Failed[testName] = actualResults; | 810 this->fJsonActualResults_Failed[testName] = jsonActualResult
s; |
| 811 } | 811 } |
| 812 } | 812 } |
| 813 } | 813 } |
| 814 } | 814 } |
| 815 | 815 |
| 816 /** | 816 /** |
| 817 * Add this test to the JSON collection of expected results. | 817 * Add this test to the JSON collection of expected results. |
| 818 */ | 818 */ |
| 819 void add_expected_results_to_json_summary(const char testName[], | 819 void add_expected_results_to_json_summary(const char testName[], |
| 820 Expectations expectations) { | 820 Expectations expectations) { |
| 821 // For now, we assume that this collection starts out empty and we | 821 this->fJsonExpectedResults[testName] = expectations.asJsonValue(); |
| 822 // just fill it in as we go; once gm accepts a JSON file as input, | |
| 823 // we'll have to change that. | |
| 824 Json::Value expectedResults; | |
| 825 expectedResults[kJsonKey_ExpectedResults_Checksums] = | |
| 826 expectations.allowedChecksumsAsJson(); | |
| 827 expectedResults[kJsonKey_ExpectedResults_IgnoreFailure] = | |
| 828 expectations.ignoreFailure(); | |
| 829 this->fJsonExpectedResults[testName] = expectedResults; | |
| 830 } | 822 } |
| 831 | 823 |
| 832 /** | 824 /** |
| 833 * Compare actualBitmap to expectations stored in this->fExpectationsSource. | 825 * Compare actualBitmap to expectations stored in this->fExpectationsSource. |
| 834 * | 826 * |
| 835 * @param gm which test generated the actualBitmap | 827 * @param gm which test generated the actualBitmap |
| 836 * @param gRec | 828 * @param gRec |
| 837 * @param writePath unless this is NULL, write out actual images into this | 829 * @param writePath unless this is NULL, write out actual images into this |
| 838 * directory | 830 * directory |
| 839 * @param actualBitmap bitmap generated by this run | 831 * @param actualBitmap bitmap generated by this run |
| (...skipping 1112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1952 // ('GM is unexpectedly skipping tests on Android') | 1944 // ('GM is unexpectedly skipping tests on Android') |
| 1953 #ifndef SK_BUILD_FOR_ANDROID | 1945 #ifndef SK_BUILD_FOR_ANDROID |
| 1954 if (expectedNumberOfTests != gmmain.fTestsRun) { | 1946 if (expectedNumberOfTests != gmmain.fTestsRun) { |
| 1955 gm_fprintf(stderr, "expected %d tests, but ran or skipped %d tests\n", | 1947 gm_fprintf(stderr, "expected %d tests, but ran or skipped %d tests\n", |
| 1956 expectedNumberOfTests, gmmain.fTestsRun); | 1948 expectedNumberOfTests, gmmain.fTestsRun); |
| 1957 reportError = true; | 1949 reportError = true; |
| 1958 } | 1950 } |
| 1959 #endif | 1951 #endif |
| 1960 | 1952 |
| 1961 if (FLAGS_writeJsonSummaryPath.count() == 1) { | 1953 if (FLAGS_writeJsonSummaryPath.count() == 1) { |
| 1962 Json::Value actualResults; | 1954 Json::Value root = CreateJsonTree( |
| 1963 actualResults[kJsonKey_ActualResults_Failed] = | 1955 gmmain.fJsonExpectedResults, |
| 1964 gmmain.fJsonActualResults_Failed; | 1956 gmmain.fJsonActualResults_Failed, gmmain.fJsonActualResults_FailureI
gnored, |
| 1965 actualResults[kJsonKey_ActualResults_FailureIgnored] = | 1957 gmmain.fJsonActualResults_NoComparison, gmmain.fJsonActualResults_Su
cceeded); |
| 1966 gmmain.fJsonActualResults_FailureIgnored; | |
| 1967 actualResults[kJsonKey_ActualResults_NoComparison] = | |
| 1968 gmmain.fJsonActualResults_NoComparison; | |
| 1969 actualResults[kJsonKey_ActualResults_Succeeded] = | |
| 1970 gmmain.fJsonActualResults_Succeeded; | |
| 1971 Json::Value root; | |
| 1972 root[kJsonKey_ActualResults] = actualResults; | |
| 1973 root[kJsonKey_ExpectedResults] = gmmain.fJsonExpectedResults; | |
| 1974 std::string jsonStdString = root.toStyledString(); | 1958 std::string jsonStdString = root.toStyledString(); |
| 1975 SkFILEWStream stream(FLAGS_writeJsonSummaryPath[0]); | 1959 SkFILEWStream stream(FLAGS_writeJsonSummaryPath[0]); |
| 1976 stream.write(jsonStdString.c_str(), jsonStdString.length()); | 1960 stream.write(jsonStdString.c_str(), jsonStdString.length()); |
| 1977 } | 1961 } |
| 1978 | 1962 |
| 1979 #if SK_SUPPORT_GPU | 1963 #if SK_SUPPORT_GPU |
| 1980 | 1964 |
| 1981 #if GR_CACHE_STATS | 1965 #if GR_CACHE_STATS |
| 1982 for (int i = 0; i < configs.count(); i++) { | 1966 for (int i = 0; i < configs.count(); i++) { |
| 1983 ConfigData config = gRec[configs[i]]; | 1967 ConfigData config = gRec[configs[i]]; |
| (...skipping 18 matching lines...) Expand all Loading... |
| 2002 if (FLAGS_forceBWtext) { | 1986 if (FLAGS_forceBWtext) { |
| 2003 canvas->setDrawFilter(SkNEW(BWTextDrawFilter))->unref(); | 1987 canvas->setDrawFilter(SkNEW(BWTextDrawFilter))->unref(); |
| 2004 } | 1988 } |
| 2005 } | 1989 } |
| 2006 | 1990 |
| 2007 #if !defined(SK_BUILD_FOR_IOS) && !defined(SK_BUILD_FOR_NACL) | 1991 #if !defined(SK_BUILD_FOR_IOS) && !defined(SK_BUILD_FOR_NACL) |
| 2008 int main(int argc, char * const argv[]) { | 1992 int main(int argc, char * const argv[]) { |
| 2009 return tool_main(argc, (char**) argv); | 1993 return tool_main(argc, (char**) argv); |
| 2010 } | 1994 } |
| 2011 #endif | 1995 #endif |
| OLD | NEW |