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 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
167 uint32_t flags; | 167 uint32_t flags; |
168 }; | 168 }; |
169 | 169 |
170 static PipeFlagComboData gPipeWritingFlagCombos[] = { | 170 static PipeFlagComboData gPipeWritingFlagCombos[] = { |
171 { "", 0 }, | 171 { "", 0 }, |
172 { " cross-process", SkGPipeWriter::kCrossProcess_Flag }, | 172 { " cross-process", SkGPipeWriter::kCrossProcess_Flag }, |
173 { " cross-process, shared address", SkGPipeWriter::kCrossProcess_Flag | 173 { " cross-process, shared address", SkGPipeWriter::kCrossProcess_Flag |
174 | SkGPipeWriter::kSharedAddressSpace_Flag } | 174 | SkGPipeWriter::kSharedAddressSpace_Flag } |
175 }; | 175 }; |
176 | 176 |
177 static bool encode_to_dct_stream(SkWStream* stream, const SkBitmap& bitmap, cons t SkIRect& rect); | 177 static bool encode_to_dct_stream(SkWStream* stream, const SkBitmap& bitmap, cons t SkIRect& rect); |
epoger
2013/04/24 16:18:26
Looks like this got picked up from https://code.go
bsalomon
2013/04/24 18:07:33
Sorry 'bout that... I moved the CL from my home ma
| |
178 | 178 |
179 const static ErrorCombination kDefaultIgnorableErrorTypes = ErrorCombination() | 179 const static ErrorCombination kDefaultIgnorableErrorTypes = ErrorCombination() |
180 .plus(kMissingExpectations_ErrorType) | 180 .plus(kMissingExpectations_ErrorType) |
181 .plus(kIntentionallySkipped_ErrorType); | 181 .plus(kIntentionallySkipped_ErrorType); |
182 | 182 |
183 class GMMain { | 183 class GMMain { |
184 public: | 184 public: |
185 GMMain() : fUseFileHierarchy(false), fIgnorableErrorTypes(kDefaultIgnorableE rrorTypes), | 185 GMMain() : fUseFileHierarchy(false), fIgnorableErrorTypes(kDefaultIgnorableE rrorTypes), |
186 fMismatchPath(NULL), fTestsRun(0), fRenderModesEncountered(1) {} | 186 fMismatchPath(NULL), fTestsRun(0), fRenderModesEncountered(1) {} |
187 | 187 |
(...skipping 976 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1164 #endif // SK_SUPPORT_GPU | 1164 #endif // SK_SUPPORT_GPU |
1165 #ifdef SK_SUPPORT_XPS | 1165 #ifdef SK_SUPPORT_XPS |
1166 /* At present we have no way of comparing XPS files (either natively or by c onverting to PNG). */ | 1166 /* At present we have no way of comparing XPS files (either natively or by c onverting to PNG). */ |
1167 { SkBitmap::kARGB_8888_Config, kXPS_Backend, kDontCare_GLContextType, 0, kWrite_ConfigFlag, "xps", true }, | 1167 { SkBitmap::kARGB_8888_Config, kXPS_Backend, kDontCare_GLContextType, 0, kWrite_ConfigFlag, "xps", true }, |
1168 #endif // SK_SUPPORT_XPS | 1168 #endif // SK_SUPPORT_XPS |
1169 #ifdef SK_SUPPORT_PDF | 1169 #ifdef SK_SUPPORT_PDF |
1170 { SkBitmap::kARGB_8888_Config, kPDF_Backend, kDontCare_GLContextType, 0, kPDFConfigFlags, "pdf", true }, | 1170 { SkBitmap::kARGB_8888_Config, kPDF_Backend, kDontCare_GLContextType, 0, kPDFConfigFlags, "pdf", true }, |
1171 #endif // SK_SUPPORT_PDF | 1171 #endif // SK_SUPPORT_PDF |
1172 }; | 1172 }; |
1173 | 1173 |
1174 static const char kDefaultsConfigStr[] = "defaults"; | |
1175 static const char kExcludeConfigChar = '~'; | |
1176 | |
1174 static SkString configUsage() { | 1177 static SkString configUsage() { |
1175 SkString result; | 1178 SkString result; |
1176 result.appendf("Space delimited list of which configs to run. Possible optio ns: ["); | 1179 result.appendf("Space delimited list of which configs to run. Possible optio ns: ["); |
1177 for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); ++i) { | 1180 for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); ++i) { |
1181 SkASSERT(gRec[i].fName != kDefaultsConfigStr); | |
1178 if (i > 0) { | 1182 if (i > 0) { |
1179 result.append("|"); | 1183 result.append("|"); |
1180 } | 1184 } |
1181 result.appendf("%s", gRec[i].fName); | 1185 result.appendf("%s", gRec[i].fName); |
1182 } | 1186 } |
1183 result.append("]\n"); | 1187 result.append("]\n"); |
1184 result.appendf("The default value is: \""); | 1188 result.appendf("The default value is: \""); |
1189 SkString firstDefault; | |
1190 SkString allButFirstDefaults; | |
1191 SkString nonDefault; | |
1185 for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); ++i) { | 1192 for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); ++i) { |
1186 if (gRec[i].fRunByDefault) { | 1193 if (gRec[i].fRunByDefault) { |
1187 if (i > 0) { | 1194 if (i > 0) { |
1188 result.append(" "); | 1195 result.append(" "); |
1189 } | 1196 } |
1190 result.appendf("%s", gRec[i].fName); | 1197 result.append(gRec[i].fName); |
1198 if (firstDefault.isEmpty()) { | |
1199 firstDefault = gRec[i].fName; | |
1200 } else { | |
1201 if (!allButFirstDefaults.isEmpty()) { | |
1202 allButFirstDefaults.append(" "); | |
1203 } | |
1204 allButFirstDefaults.append(gRec[i].fName); | |
1205 } | |
1206 } else { | |
1207 nonDefault = gRec[i].fName; | |
1191 } | 1208 } |
1192 } | 1209 } |
1193 result.appendf("\""); | 1210 result.append("\"\n"); |
1194 | 1211 result.appendf("\"%s\" evaluates to the default set of configs.\n", kDefault sConfigStr); |
1212 result.appendf("Prepending \"%c\" on a config name excludes it from the set of configs to run.\n" | |
1213 "Exclusions always override inclusions regardless of order.\n ", | |
1214 kExcludeConfigChar); | |
1215 result.appendf("E.g. \"--config %s %c%s %s\" will run these configs:\n\t%s % s", | |
1216 kDefaultsConfigStr, | |
1217 kExcludeConfigChar, | |
1218 firstDefault.c_str(), | |
1219 nonDefault.c_str(), | |
1220 allButFirstDefaults.c_str(), | |
1221 nonDefault.c_str()); | |
1195 return result; | 1222 return result; |
1196 } | 1223 } |
1197 | 1224 |
1198 // Macro magic to convert a numeric preprocessor token into a string. | 1225 // Macro magic to convert a numeric preprocessor token into a string. |
1199 // Adapted from http://stackoverflow.com/questions/240353/convert-a-preprocessor -token-to-a-string | 1226 // Adapted from http://stackoverflow.com/questions/240353/convert-a-preprocessor -token-to-a-string |
1200 // This should probably be moved into one of our common headers... | 1227 // This should probably be moved into one of our common headers... |
1201 #define TOSTRING_INTERNAL(x) #x | 1228 #define TOSTRING_INTERNAL(x) #x |
1202 #define TOSTRING(x) TOSTRING_INTERNAL(x) | 1229 #define TOSTRING(x) TOSTRING_INTERNAL(x) |
1203 | 1230 |
1204 // Alphabetized ignoring "no" prefix ("readPath", "noreplay", "resourcePath"). | 1231 // Alphabetized ignoring "no" prefix ("readPath", "noreplay", "resourcePath"). |
(...skipping 442 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1647 usage.printf("Run the golden master tests.\n"); | 1674 usage.printf("Run the golden master tests.\n"); |
1648 SkCommandLineFlags::SetUsage(usage.c_str()); | 1675 SkCommandLineFlags::SetUsage(usage.c_str()); |
1649 SkCommandLineFlags::Parse(argc, argv); | 1676 SkCommandLineFlags::Parse(argc, argv); |
1650 | 1677 |
1651 gmmain.fUseFileHierarchy = FLAGS_hierarchy; | 1678 gmmain.fUseFileHierarchy = FLAGS_hierarchy; |
1652 if (FLAGS_mismatchPath.count() == 1) { | 1679 if (FLAGS_mismatchPath.count() == 1) { |
1653 gmmain.fMismatchPath = FLAGS_mismatchPath[0]; | 1680 gmmain.fMismatchPath = FLAGS_mismatchPath[0]; |
1654 } | 1681 } |
1655 | 1682 |
1656 for (int i = 0; i < FLAGS_config.count(); i++) { | 1683 for (int i = 0; i < FLAGS_config.count(); i++) { |
1657 int index = findConfig(FLAGS_config[i]); | 1684 const char* config = FLAGS_config[i]; |
1685 userConfig = true; | |
1686 bool exclude = false; | |
1687 if (*config == kExcludeConfigChar) { | |
1688 exclude = true; | |
1689 config += 1; | |
1690 } | |
1691 int index = findConfig(config); | |
1658 if (index >= 0) { | 1692 if (index >= 0) { |
1659 appendUnique<size_t>(&configs, index); | 1693 if (exclude) { |
1660 userConfig = true; | 1694 *excludeConfigs.append() = index; |
1695 } else { | |
1696 appendUnique<size_t>(&configs, index); | |
1697 } | |
1698 } else if (0 == strcmp(kDefaultsConfigStr, config)) { | |
1699 for (size_t c = 0; c < SK_ARRAY_COUNT(gRec); ++c) { | |
1700 if (gRec[c].fRunByDefault) { | |
1701 if (exclude) { | |
1702 gm_fprintf(stderr, "%c%s is not allowed.\n", | |
1703 kExcludeConfigChar, kDefaultsConfigStr); | |
1704 return -1; | |
1705 } else { | |
1706 appendUnique<size_t>(&configs, c); | |
1707 } | |
1708 } | |
1709 } | |
1661 } else { | 1710 } else { |
1662 gm_fprintf(stderr, "unrecognized config %s\n", FLAGS_config[i]); | 1711 gm_fprintf(stderr, "unrecognized config %s\n", config); |
1663 return -1; | 1712 return -1; |
1664 } | 1713 } |
1665 } | 1714 } |
1666 | 1715 |
1667 for (int i = 0; i < FLAGS_excludeConfig.count(); i++) { | 1716 for (int i = 0; i < FLAGS_excludeConfig.count(); i++) { |
1668 int index = findConfig(FLAGS_excludeConfig[i]); | 1717 int index = findConfig(FLAGS_excludeConfig[i]); |
1669 if (index >= 0) { | 1718 if (index >= 0) { |
1670 *excludeConfigs.append() = index; | 1719 *excludeConfigs.append() = index; |
1671 } else { | 1720 } else { |
1672 gm_fprintf(stderr, "unrecognized excludeConfig %s\n", FLAGS_excludeC onfig[i]); | 1721 gm_fprintf(stderr, "unrecognized excludeConfig %s\n", FLAGS_excludeC onfig[i]); |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1766 " Config will be skipped.\n", gRec[index].fSampleCnt, gRec[index].fName); | 1815 " Config will be skipped.\n", gRec[index].fSampleCnt, gRec[index].fName); |
1767 configs.remove(i); | 1816 configs.remove(i); |
1768 --i; | 1817 --i; |
1769 } | 1818 } |
1770 } | 1819 } |
1771 } | 1820 } |
1772 #else | 1821 #else |
1773 GrContextFactory* grFactory = NULL; | 1822 GrContextFactory* grFactory = NULL; |
1774 #endif | 1823 #endif |
1775 | 1824 |
1825 if (configs.isEmpty()) { | |
1826 gm_fprintf(stderr, "No configs to run."); | |
1827 return -1; | |
1828 } | |
1829 | |
1830 // now show the user the set of configs that will be run. | |
1831 SkString configStr("These configs will be run: "); | |
1832 // show the user the config that will run. | |
1833 for (int i = 0; i < configs.count(); ++i) { | |
1834 configStr.appendf("%s%s", gRec[configs[i]].fName, (i == configs.count() - 1) ? "\n" : " "); | |
1835 } | |
1836 gm_fprintf(stdout, "%s", configStr.c_str()); | |
1837 | |
1776 if (FLAGS_resourcePath.count() == 1) { | 1838 if (FLAGS_resourcePath.count() == 1) { |
1777 GM::SetResourcePath(FLAGS_resourcePath[0]); | 1839 GM::SetResourcePath(FLAGS_resourcePath[0]); |
1778 } | 1840 } |
1779 | 1841 |
1780 if (FLAGS_readPath.count() == 1) { | 1842 if (FLAGS_readPath.count() == 1) { |
1781 const char* readPath = FLAGS_readPath[0]; | 1843 const char* readPath = FLAGS_readPath[0]; |
1782 if (!sk_exists(readPath)) { | 1844 if (!sk_exists(readPath)) { |
1783 gm_fprintf(stderr, "readPath %s does not exist!\n", readPath); | 1845 gm_fprintf(stderr, "readPath %s does not exist!\n", readPath); |
1784 return -1; | 1846 return -1; |
1785 } | 1847 } |
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1949 if (FLAGS_forceBWtext) { | 2011 if (FLAGS_forceBWtext) { |
1950 canvas->setDrawFilter(SkNEW(BWTextDrawFilter))->unref(); | 2012 canvas->setDrawFilter(SkNEW(BWTextDrawFilter))->unref(); |
1951 } | 2013 } |
1952 } | 2014 } |
1953 | 2015 |
1954 #if !defined(SK_BUILD_FOR_IOS) && !defined(SK_BUILD_FOR_NACL) | 2016 #if !defined(SK_BUILD_FOR_IOS) && !defined(SK_BUILD_FOR_NACL) |
1955 int main(int argc, char * const argv[]) { | 2017 int main(int argc, char * const argv[]) { |
1956 return tool_main(argc, (char**) argv); | 2018 return tool_main(argc, (char**) argv); |
1957 } | 2019 } |
1958 #endif | 2020 #endif |
OLD | NEW |