1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc. 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */ 7971d0c8049c6bfc7a58f0b41f8f59f9ec9ca077bbsalomon@google.com 857f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com/* 957f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com * Code for the "gm" (Golden Master) rendering comparison tool. 1057f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com * 1157f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com * If you make changes to this, re-run the self-tests at gm/tests/run.sh 1257f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com * to make sure they still pass... you may need to change the expected 1357f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com * results of the self-test. 1457f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com */ 1557f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com 16b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com#include "gm.h" 176f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com#include "gm_error.h" 1837269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com#include "gm_expectations.h" 197bc13a62609149f0b535c2f3ff7210eb834d8b36epoger@google.com#include "system_preferences.h" 2030e6e2af14e84216b1c113fd7500d0822bc81daamtklein#include "CrashHandler.h" 21bcbc1788b478b1e54079318ad073e8490aa66faetfarina#include "Resources.h" 22bcbc1788b478b1e54079318ad073e8490aa66faetfarina#include "SamplePipeControllers.h" 235f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com#include "SkBitmap.h" 24b9b9a18ab459c2616ac4a52c9f8cc0637d284229reed@android.com#include "SkColorPriv.h" 25d9ba9a05d6f5766fdb1378b6ed84c0659009a8dascroggo@google.com#include "SkCommandLineFlags.h" 268a85d0c4938173476d037d7af0ee3b9436a1234ereed@google.com#include "SkData.h" 274370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com#include "SkDeferredCanvas.h" 28971d0c8049c6bfc7a58f0b41f8f59f9ec9ca077bbsalomon@google.com#include "SkDevice.h" 295e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org#include "SkDocument.h" 30de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com#include "SkDrawFilter.h" 31c41295d1223136da4f9e4c65b7145360684ede4bcommit-bot@chromium.org#include "SkForceLinking.h" 325af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com#include "SkGPipe.h" 338015dd83ae37147bb630d4751030868051ad0caereed@android.com#include "SkGraphics.h" 348015dd83ae37147bb630d4751030868051ad0caereed@android.com#include "SkImageDecoder.h" 358015dd83ae37147bb630d4751030868051ad0caereed@android.com#include "SkImageEncoder.h" 36e3bb3bce3e9c1f3bc8ee779b1b3383c18e560bcecommit-bot@chromium.org#include "SkJSONCPP.h" 37e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com#include "SkOSFile.h" 380dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org#include "SkPDFRasterizer.h" 399875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com#include "SkPicture.h" 40770963f23f4fc313db0fa3bac18b1b8aafb55f17robertphillips@google.com#include "SkPictureRecorder.h" 41977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com#include "SkRefCnt.h" 425e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org#include "SkScalar.h" 4372c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.com#include "SkStream.h" 44f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com#include "SkString.h" 4511db6fa9b9fc30b1f504d9f53e0f6ae7149cc5c5reed@google.com#include "SkSurface.h" 462a48c3adb7cf4fc754f99a41352210b4a99edf04bsalomon@google.com#include "SkTArray.h" 47310478e72c63e639373465216271b81f1e4a9136epoger@google.com#include "SkTDict.h" 480770044da6d61dcbc8d9673fed8dd92460faa314reed@google.com 49515dcd36032997ce335daa0163c6d67e851bcad1commit-bot@chromium.org#ifdef SK_DEBUG 50515dcd36032997ce335daa0163c6d67e851bcad1commit-bot@chromium.orgstatic const bool kDebugOnly = true; 518065ec50f1937c1562810bfe2b216abfb98362b3commit-bot@chromium.org#define GR_DUMP_FONT_CACHE 0 52515dcd36032997ce335daa0163c6d67e851bcad1commit-bot@chromium.org#else 53515dcd36032997ce335daa0163c6d67e851bcad1commit-bot@chromium.orgstatic const bool kDebugOnly = false; 54515dcd36032997ce335daa0163c6d67e851bcad1commit-bot@chromium.org#endif 55515dcd36032997ce335daa0163c6d67e851bcad1commit-bot@chromium.org 56ed5eb4ef2aa1d6c705bc3ed466f9caba2a230a2bepoger@google.com__SK_FORCE_IMAGE_DECODER_LINKING; 57ed5eb4ef2aa1d6c705bc3ed466f9caba2a230a2bepoger@google.com 58cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#if SK_SUPPORT_GPU 59cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#include "GrContextFactory.h" 60cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#include "SkGpuDevice.h" 61cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.comtypedef GrContextFactory::GLContextType GLContextType; 626f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com#define DEFAULT_CACHE_VALUE -1 636f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.comstatic int gGpuCacheSizeBytes; 646f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.comstatic int gGpuCacheSizeCount; 65cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#else 6680724dfeb320d1152128cd33636c9024952432d3epoger@google.comclass GrContextFactory; 67cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.comclass GrContext; 68123ac1d4eab757052407064623643fdc59f85363bsalomon@google.comclass GrSurface; 69cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.comtypedef int GLContextType; 70cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#endif 71cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com 7276c913db20de7ae1baa49ae66e943bf7f40781ccepoger@google.com#define DEBUGFAIL_SEE_STDERR SkDEBUGFAIL("see stderr for message") 7376c913db20de7ae1baa49ae66e943bf7f40781ccepoger@google.com 745e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.orgDECLARE_bool(useDocumentInsteadOfDevice); 758923c6cfd580ac9accb11b909fa2a033d69553aareed@google.com 760770044da6d61dcbc8d9673fed8dd92460faa314reed@google.com#ifdef SK_SUPPORT_PDF 779875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com #include "SkPDFDevice.h" 789875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com #include "SkPDFDocument.h" 790770044da6d61dcbc8d9673fed8dd92460faa314reed@google.com#endif 8000dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com 81e3cc2eb88fef9b2123c6ea2ed813ce53b6385926epoger@google.com// Until we resolve http://code.google.com/p/skia/issues/detail?id=455 , 82e3cc2eb88fef9b2123c6ea2ed813ce53b6385926epoger@google.com// stop writing out XPS-format image baselines in gm. 83e3cc2eb88fef9b2123c6ea2ed813ce53b6385926epoger@google.com#undef SK_SUPPORT_XPS 84b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com#ifdef SK_SUPPORT_XPS 85b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com #include "SkXPSDevice.h" 86b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com#endif 87b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com 8846cce91f4859b9c229938d4d649870c0a43b1806reed@google.com#ifdef SK_BUILD_FOR_MAC 8946cce91f4859b9c229938d4d649870c0a43b1806reed@google.com #include "SkCGUtils.h" 9046cce91f4859b9c229938d4d649870c0a43b1806reed@google.com#endif 9146cce91f4859b9c229938d4d649870c0a43b1806reed@google.com 9200dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.comusing namespace skiagm; 9300dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com 9400dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.comclass Iter { 9500dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.compublic: 9600dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com Iter() { 973914958a49ee089ddeb04acc16373aae8bc2eaf7bsalomon@google.com this->reset(); 983914958a49ee089ddeb04acc16373aae8bc2eaf7bsalomon@google.com } 993914958a49ee089ddeb04acc16373aae8bc2eaf7bsalomon@google.com 1003914958a49ee089ddeb04acc16373aae8bc2eaf7bsalomon@google.com void reset() { 101dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com fReg = GMRegistry::Head(); 10200dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com } 103d4dfd10bb6f9bf3ac6e1ebc9bc3ae22c6d06321freed@google.com 104dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com GM* next() { 10500dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com if (fReg) { 106dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com GMRegistry::Factory fact = fReg->factory(); 10700dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com fReg = fReg->next(); 108dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com return fact(0); 10900dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com } 11000dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com return NULL; 11100dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com } 112d4dfd10bb6f9bf3ac6e1ebc9bc3ae22c6d06321freed@google.com 11300dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com static int Count() { 114dd0ac281e920b01a63789893cc3e7422789658ddreed@android.com const GMRegistry* reg = GMRegistry::Head(); 11500dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com int count = 0; 11600dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com while (reg) { 11700dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com count += 1; 11800dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com reg = reg->next(); 11900dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com } 12000dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com return count; 12100dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com } 122d4dfd10bb6f9bf3ac6e1ebc9bc3ae22c6d06321freed@google.com 12300dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.comprivate: 12400dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com const GMRegistry* fReg; 12500dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com}; 12600dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com 127ce057fec926f8ec1d60ed4722d1e51a0086e7976epoger@google.com// TODO(epoger): Right now, various places in this code assume that all the 128ce057fec926f8ec1d60ed4722d1e51a0086e7976epoger@google.com// image files read/written by GM use this file extension. 129ce057fec926f8ec1d60ed4722d1e51a0086e7976epoger@google.com// Search for references to this constant to find these assumptions. 130ce057fec926f8ec1d60ed4722d1e51a0086e7976epoger@google.comconst static char kPNG_FileExtension[] = "png"; 131ce057fec926f8ec1d60ed4722d1e51a0086e7976epoger@google.com 132686abdfab0e4c45de1fd30774896c46e43a299acvandebo@chromium.orgenum Backend { 1333cb834bd27a16cc60ff30adae96659558c2dc91fjunov@chromium.org kRaster_Backend, 1343cb834bd27a16cc60ff30adae96659558c2dc91fjunov@chromium.org kGPU_Backend, 1353cb834bd27a16cc60ff30adae96659558c2dc91fjunov@chromium.org kPDF_Backend, 1363cb834bd27a16cc60ff30adae96659558c2dc91fjunov@chromium.org kXPS_Backend, 1373cb834bd27a16cc60ff30adae96659558c2dc91fjunov@chromium.org}; 1383cb834bd27a16cc60ff30adae96659558c2dc91fjunov@chromium.org 1393cb834bd27a16cc60ff30adae96659558c2dc91fjunov@chromium.orgenum BbhType { 1403cb834bd27a16cc60ff30adae96659558c2dc91fjunov@chromium.org kNone_BbhType, 1413cb834bd27a16cc60ff30adae96659558c2dc91fjunov@chromium.org kRTree_BbhType, 1423cb834bd27a16cc60ff30adae96659558c2dc91fjunov@chromium.org kTileGrid_BbhType, 143d393b17cf3427bd6f6255f8670067d9aa529e409commit-bot@chromium.org kQuadTree_BbhType 144686abdfab0e4c45de1fd30774896c46e43a299acvandebo@chromium.org}; 145686abdfab0e4c45de1fd30774896c46e43a299acvandebo@chromium.org 1467361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.comenum ConfigFlags { 1477361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com kNone_ConfigFlag = 0x0, 1487361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com /* Write GM images if a write path is provided. */ 1497361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com kWrite_ConfigFlag = 0x1, 150f28dd8ab109663a6fe67fd4ee3d66248e0dac686epoger@google.com /* Read reference GM images if a read path is provided. */ 1517361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com kRead_ConfigFlag = 0x2, 1527361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com kRW_ConfigFlag = (kWrite_ConfigFlag | kRead_ConfigFlag), 1537361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com}; 1547361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com 1559875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.comstruct ConfigData { 156ddd014e65264e3f18b2d4305dd2fbc81549f5180reed SkColorType fColorType; 1577361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com Backend fBackend; 158cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com GLContextType fGLContextType; // GPU backend only 1597361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com int fSampleCnt; // GPU backend only 1607361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com ConfigFlags fFlags; 1617361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com const char* fName; 1624c75f241cb75f202cfa51569ba8dc4749a28a9f7bsalomon@google.com bool fRunByDefault; 1639875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com}; 1649875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com 1650dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.orgstruct PDFRasterizerData { 1660dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org bool (*fRasterizerFunction)(SkStream*, SkBitmap*); 1670dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org const char* fName; 1680dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org bool fRunByDefault; 1690dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org}; 1700dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org 17110afbefa5b60b0f7e8d2b02f4c996de88aa26830mike@reedtribe.orgclass BWTextDrawFilter : public SkDrawFilter { 17210afbefa5b60b0f7e8d2b02f4c996de88aa26830mike@reedtribe.orgpublic: 173971aca75572ed6e0c5e1cc959173dc58ca7b6b8dreed@google.com virtual bool filter(SkPaint*, Type) SK_OVERRIDE; 17410afbefa5b60b0f7e8d2b02f4c996de88aa26830mike@reedtribe.org}; 175971aca75572ed6e0c5e1cc959173dc58ca7b6b8dreed@google.combool BWTextDrawFilter::filter(SkPaint* p, Type t) { 17610afbefa5b60b0f7e8d2b02f4c996de88aa26830mike@reedtribe.org if (kText_Type == t) { 17710afbefa5b60b0f7e8d2b02f4c996de88aa26830mike@reedtribe.org p->setAntiAlias(false); 17810afbefa5b60b0f7e8d2b02f4c996de88aa26830mike@reedtribe.org } 179971aca75572ed6e0c5e1cc959173dc58ca7b6b8dreed@google.com return true; 18010afbefa5b60b0f7e8d2b02f4c996de88aa26830mike@reedtribe.org} 18110afbefa5b60b0f7e8d2b02f4c996de88aa26830mike@reedtribe.org 182de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.comstruct PipeFlagComboData { 183de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com const char* name; 184de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com uint32_t flags; 185de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com}; 186de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com 187de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.comstatic PipeFlagComboData gPipeWritingFlagCombos[] = { 188de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com { "", 0 }, 189de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com { " cross-process", SkGPipeWriter::kCrossProcess_Flag }, 190de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com { " cross-process, shared address", SkGPipeWriter::kCrossProcess_Flag 191de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com | SkGPipeWriter::kSharedAddressSpace_Flag } 192de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com}; 193de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com 194608ea6508ae2e9ea05ea863ba50fc27d44d2eae9commit-bot@chromium.orgstatic SkData* encode_to_dct_data(size_t* pixelRefOffset, const SkBitmap& bitmap); 19573a7ea3ae0d37ee28f90d6b38c49fda052638253edisonn@google.comDECLARE_int32(pdfRasterDpi); 196d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com 1975079d2c2a0dc0deacecccc6ef9d1c45c6c7982e4epoger@google.comconst static ErrorCombination kDefaultIgnorableErrorTypes = ErrorCombination() 1985079d2c2a0dc0deacecccc6ef9d1c45c6c7982e4epoger@google.com .plus(kMissingExpectations_ErrorType) 1995079d2c2a0dc0deacecccc6ef9d1c45c6c7982e4epoger@google.com .plus(kIntentionallySkipped_ErrorType); 2005079d2c2a0dc0deacecccc6ef9d1c45c6c7982e4epoger@google.com 201de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.comclass GMMain { 202de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.compublic: 2036f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com GMMain() : fUseFileHierarchy(false), fWriteChecksumBasedFilenames(false), 2046f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com fIgnorableErrorTypes(kDefaultIgnorableErrorTypes), 2055f99545de67ee729b4b17f1aae56f8c9dcf460f9epoger@google.com fMismatchPath(NULL), fMissingExpectationsPath(NULL), fTestsRun(0), 2065f99545de67ee729b4b17f1aae56f8c9dcf460f9epoger@google.com fRenderModesEncountered(1) {} 207e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com 208659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com /** 209659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com * Assemble shortNamePlusConfig from (surprise!) shortName and configName. 210659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com * 211659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com * The method for doing so depends on whether we are using hierarchical naming. 212659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com * For example, shortName "selftest1" and configName "8888" could be assembled into 213659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com * either "selftest1_8888" or "8888/selftest1". 214659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com */ 215659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com SkString make_shortname_plus_config(const char *shortName, const char *configName) { 216e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com SkString name; 21757f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com if (0 == strlen(configName)) { 21857f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com name.append(shortName); 21957f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com } else if (fUseFileHierarchy) { 220e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com name.appendf("%s%c%s", configName, SkPATH_SEPARATOR, shortName); 221e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com } else { 222e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com name.appendf("%s_%s", shortName, configName); 223e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com } 224de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com return name; 22510afbefa5b60b0f7e8d2b02f4c996de88aa26830mike@reedtribe.org } 22610afbefa5b60b0f7e8d2b02f4c996de88aa26830mike@reedtribe.org 227659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com /** 228659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com * Assemble filename, suitable for writing out the results of a particular test. 229659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com */ 230659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com SkString make_filename(const char *path, 231659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com const char *shortName, 232659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com const char *configName, 233659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com const char *renderModeDescriptor, 234659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com const char *suffix) { 235659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com SkString filename = make_shortname_plus_config(shortName, configName); 236659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com filename.append(renderModeDescriptor); 237659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com filename.appendUnichar('.'); 238659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com filename.append(suffix); 239ccd7afb6fb2df9774e57fb4d7f62f9504cabf03escroggo@google.com return SkOSPath::SkPathJoin(path, filename.c_str()); 240659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com } 241659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com 2426f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com /** 2436f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com * Assemble filename suitable for writing out an SkBitmap. 2446f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com */ 2456f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com SkString make_bitmap_filename(const char *path, 2466f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com const char *shortName, 2476f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com const char *configName, 2486f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com const char *renderModeDescriptor, 2496f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com const GmResultDigest &bitmapDigest) { 2506f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com if (fWriteChecksumBasedFilenames) { 2516f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com SkString filename; 2526f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com filename.append(bitmapDigest.getHashType()); 2536f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com filename.appendUnichar('_'); 2546f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com filename.append(shortName); 2556f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com filename.appendUnichar('_'); 2566f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com filename.append(bitmapDigest.getDigestValue()); 2576f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com filename.appendUnichar('.'); 2586f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com filename.append(kPNG_FileExtension); 2596f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com return SkOSPath::SkPathJoin(path, filename.c_str()); 2606f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com } else { 2616f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com return make_filename(path, shortName, configName, renderModeDescriptor, 2626f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com kPNG_FileExtension); 2636f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com } 2646f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com } 2656f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com 266de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com /* since PNG insists on unpremultiplying our alpha, we take no 267de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com precision chances and force all pixels to be 100% opaque, 268de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com otherwise on compare we may not get a perfect match. 269de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com */ 270de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com static void force_all_opaque(const SkBitmap& bitmap) { 271dac522589e9395b4654a1a708f1bd971f37f95a5commit-bot@chromium.org SkColorType colorType = bitmap.colorType(); 272dac522589e9395b4654a1a708f1bd971f37f95a5commit-bot@chromium.org switch (colorType) { 27328fcae2ec77eb16a79e155f8d788b20457f1c951commit-bot@chromium.org case kN32_SkColorType: 2745f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com force_all_opaque_8888(bitmap); 2755f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com break; 276dac522589e9395b4654a1a708f1bd971f37f95a5commit-bot@chromium.org case kRGB_565_SkColorType: 2775f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com // nothing to do here; 565 bitmaps are inherently opaque 2785f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com break; 2795f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com default: 2802b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org SkDebugf("unsupported bitmap colorType %d\n", colorType); 2815efdd0cb9cdf4c2017dc6ad70b2503bf04234d9bepoger@google.com DEBUGFAIL_SEE_STDERR; 2825f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com } 2835f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com } 2845f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com 2855f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com static void force_all_opaque_8888(const SkBitmap& bitmap) { 286de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com SkAutoLockPixels lock(bitmap); 287de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com for (int y = 0; y < bitmap.height(); y++) { 288de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com for (int x = 0; x < bitmap.width(); x++) { 289de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com *bitmap.getAddr32(x, y) |= (SK_A32_MASK << SK_A32_SHIFT); 290de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com } 291de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com } 29279d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org } 29310afbefa5b60b0f7e8d2b02f4c996de88aa26830mike@reedtribe.org 2940dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org static ErrorCombination write_bitmap(const SkString& path, const SkBitmap& bitmap) { 2955f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com // TODO(epoger): Now that we have removed force_all_opaque() 2965f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com // from this method, we should be able to get rid of the 2975f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com // transformation to 8888 format also. 298de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com SkBitmap copy; 29928fcae2ec77eb16a79e155f8d788b20457f1c951commit-bot@chromium.org bitmap.copyTo(©, kN32_SkColorType); 3000dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org if (!SkImageEncoder::EncodeFile(path.c_str(), copy, 3010dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org SkImageEncoder::kPNG_Type, 3020dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org 100)) { 3032b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org SkDebugf("FAILED to write bitmap: %s\n", path.c_str()); 3040dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org return ErrorCombination(kWritingReferenceImage_ErrorType); 3050dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org } 3060dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org return kEmpty_ErrorCombination; 307de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com } 3089875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com 3096f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com /** 310310478e72c63e639373465216271b81f1e4a9136epoger@google.com * Add all render modes encountered thus far to the "modes" array. 3116f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com */ 312310478e72c63e639373465216271b81f1e4a9136epoger@google.com void GetRenderModesEncountered(SkTArray<SkString> &modes) { 313310478e72c63e639373465216271b81f1e4a9136epoger@google.com SkTDict<int>::Iter iter(this->fRenderModesEncountered); 314310478e72c63e639373465216271b81f1e4a9136epoger@google.com const char* mode; 315310478e72c63e639373465216271b81f1e4a9136epoger@google.com while ((mode = iter.next(NULL)) != NULL) { 316310478e72c63e639373465216271b81f1e4a9136epoger@google.com SkString modeAsString = SkString(mode); 317310478e72c63e639373465216271b81f1e4a9136epoger@google.com // TODO(epoger): It seems a bit silly that all of these modes were 318310478e72c63e639373465216271b81f1e4a9136epoger@google.com // recorded with a leading "-" which we have to remove here 319310478e72c63e639373465216271b81f1e4a9136epoger@google.com // (except for mode "", which means plain old original mode). 320310478e72c63e639373465216271b81f1e4a9136epoger@google.com // But that's how renderModeDescriptor has been passed into 321310478e72c63e639373465216271b81f1e4a9136epoger@google.com // compare_test_results_to_reference_bitmap() historically, 322310478e72c63e639373465216271b81f1e4a9136epoger@google.com // and changing that now may affect other parts of our code. 323310478e72c63e639373465216271b81f1e4a9136epoger@google.com if (modeAsString.startsWith("-")) { 324310478e72c63e639373465216271b81f1e4a9136epoger@google.com modeAsString.remove(0, 1); 325310478e72c63e639373465216271b81f1e4a9136epoger@google.com } 32685195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org modes.push_back(modeAsString); 327310478e72c63e639373465216271b81f1e4a9136epoger@google.com } 328310478e72c63e639373465216271b81f1e4a9136epoger@google.com } 329310478e72c63e639373465216271b81f1e4a9136epoger@google.com 330310478e72c63e639373465216271b81f1e4a9136epoger@google.com /** 3313a882dda0787e6957cfb37f6b5a68bcd31ce5cf7epoger@google.com * Returns true if failures on this test should be ignored. 3323a882dda0787e6957cfb37f6b5a68bcd31ce5cf7epoger@google.com */ 3333e62ebf93b43139202ce803245411467c7ed13ffcommit-bot@chromium.org bool ShouldIgnoreTest(const char *name) const { 3343e62ebf93b43139202ce803245411467c7ed13ffcommit-bot@chromium.org for (int i = 0; i < fIgnorableTestNames.count(); i++) { 3353e62ebf93b43139202ce803245411467c7ed13ffcommit-bot@chromium.org if (fIgnorableTestNames[i].equals(name)) { 3363a882dda0787e6957cfb37f6b5a68bcd31ce5cf7epoger@google.com return true; 3373a882dda0787e6957cfb37f6b5a68bcd31ce5cf7epoger@google.com } 3383a882dda0787e6957cfb37f6b5a68bcd31ce5cf7epoger@google.com } 3393a882dda0787e6957cfb37f6b5a68bcd31ce5cf7epoger@google.com return false; 3403a882dda0787e6957cfb37f6b5a68bcd31ce5cf7epoger@google.com } 3413a882dda0787e6957cfb37f6b5a68bcd31ce5cf7epoger@google.com 3423a882dda0787e6957cfb37f6b5a68bcd31ce5cf7epoger@google.com /** 34385195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org * Calls RecordTestResults to record that we skipped a test. 34485195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org * 34585195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org * Depending on the backend, this may mean that we skipped a single rendermode, or all 34685195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org * rendermodes; see http://skbug.com/1994 and https://codereview.chromium.org/129203002/ 34785195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org */ 34885195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org void RecordSkippedTest(const SkString& shortNamePlusConfig, 34985195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org const char renderModeDescriptor [], Backend backend) { 35085195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org if (kRaster_Backend == backend) { 35185195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org // Skipping a test on kRaster_Backend means that we will skip ALL renderModes 35285195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org // (as opposed to other backends, on which we only run the default renderMode). 35385195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org // 35485195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org // We cannot call RecordTestResults yet, because we won't know the full set of 35585195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org // renderModes until we have run all tests. 35685195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org fTestsSkippedOnAllRenderModes.push_back(shortNamePlusConfig); 35785195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org } else { 35885195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org this->RecordTestResults(kIntentionallySkipped_ErrorType, shortNamePlusConfig, 35985195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org renderModeDescriptor); 36085195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org } 36185195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org } 36285195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org 36385195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org /** 364310478e72c63e639373465216271b81f1e4a9136epoger@google.com * Records the results of this test in fTestsRun and fFailedTests. 365310478e72c63e639373465216271b81f1e4a9136epoger@google.com * 366310478e72c63e639373465216271b81f1e4a9136epoger@google.com * We even record successes, and errors that we regard as 367310478e72c63e639373465216271b81f1e4a9136epoger@google.com * "ignorable"; we can filter them out later. 368310478e72c63e639373465216271b81f1e4a9136epoger@google.com */ 369659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com void RecordTestResults(const ErrorCombination& errorCombination, 370659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com const SkString& shortNamePlusConfig, 371310478e72c63e639373465216271b81f1e4a9136epoger@google.com const char renderModeDescriptor []) { 372310478e72c63e639373465216271b81f1e4a9136epoger@google.com // Things to do regardless of errorCombination. 373310478e72c63e639373465216271b81f1e4a9136epoger@google.com fTestsRun++; 374310478e72c63e639373465216271b81f1e4a9136epoger@google.com int renderModeCount = 0; 375310478e72c63e639373465216271b81f1e4a9136epoger@google.com this->fRenderModesEncountered.find(renderModeDescriptor, &renderModeCount); 376310478e72c63e639373465216271b81f1e4a9136epoger@google.com renderModeCount++; 377310478e72c63e639373465216271b81f1e4a9136epoger@google.com this->fRenderModesEncountered.set(renderModeDescriptor, renderModeCount); 378310478e72c63e639373465216271b81f1e4a9136epoger@google.com 3796f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com if (errorCombination.isEmpty()) { 38015655b241bfe1d77032e88115f119684722c10e0epoger@google.com return; 381eb06636133b6b5971964e5bce5ce5ca71d9ea960epoger@google.com } 382eb06636133b6b5971964e5bce5ce5ca71d9ea960epoger@google.com 383310478e72c63e639373465216271b81f1e4a9136epoger@google.com // Things to do only if there is some error condition. 384659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com SkString fullName = shortNamePlusConfig; 385caac3db48f74676889006b5520b766b572b5e9b2epoger@google.com fullName.append(renderModeDescriptor); 386310478e72c63e639373465216271b81f1e4a9136epoger@google.com for (int typeInt = 0; typeInt <= kLast_ErrorType; typeInt++) { 387310478e72c63e639373465216271b81f1e4a9136epoger@google.com ErrorType type = static_cast<ErrorType>(typeInt); 388310478e72c63e639373465216271b81f1e4a9136epoger@google.com if (errorCombination.includes(type)) { 389310478e72c63e639373465216271b81f1e4a9136epoger@google.com fFailedTests[type].push_back(fullName); 390310478e72c63e639373465216271b81f1e4a9136epoger@google.com } 39157f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com } 392310478e72c63e639373465216271b81f1e4a9136epoger@google.com } 39315655b241bfe1d77032e88115f119684722c10e0epoger@google.com 394310478e72c63e639373465216271b81f1e4a9136epoger@google.com /** 395310478e72c63e639373465216271b81f1e4a9136epoger@google.com * Return the number of significant (non-ignorable) errors we have 396310478e72c63e639373465216271b81f1e4a9136epoger@google.com * encountered so far. 397310478e72c63e639373465216271b81f1e4a9136epoger@google.com */ 398310478e72c63e639373465216271b81f1e4a9136epoger@google.com int NumSignificantErrors() { 399310478e72c63e639373465216271b81f1e4a9136epoger@google.com int significantErrors = 0; 400310478e72c63e639373465216271b81f1e4a9136epoger@google.com for (int typeInt = 0; typeInt <= kLast_ErrorType; typeInt++) { 401310478e72c63e639373465216271b81f1e4a9136epoger@google.com ErrorType type = static_cast<ErrorType>(typeInt); 4025079d2c2a0dc0deacecccc6ef9d1c45c6c7982e4epoger@google.com if (!fIgnorableErrorTypes.includes(type)) { 403310478e72c63e639373465216271b81f1e4a9136epoger@google.com significantErrors += fFailedTests[type].count(); 404310478e72c63e639373465216271b81f1e4a9136epoger@google.com } 405310478e72c63e639373465216271b81f1e4a9136epoger@google.com } 406310478e72c63e639373465216271b81f1e4a9136epoger@google.com return significantErrors; 40757f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com } 40857f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com 409310478e72c63e639373465216271b81f1e4a9136epoger@google.com /** 41051dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com * Display the summary of results with this ErrorType. 41151dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com * 41251dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com * @param type which ErrorType 41351dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com * @param verbose whether to be all verbose about it 41451dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com */ 41551dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com void DisplayResultTypeSummary(ErrorType type, bool verbose) { 4165079d2c2a0dc0deacecccc6ef9d1c45c6c7982e4epoger@google.com bool isIgnorableType = fIgnorableErrorTypes.includes(type); 41751dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com 41851dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com SkString line; 41951dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com if (isIgnorableType) { 42051dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com line.append("[ ] "); 42151dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com } else { 42251dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com line.append("[*] "); 42351dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com } 42451dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com 42551dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com SkTArray<SkString> *failedTestsOfThisType = &fFailedTests[type]; 42651dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com int count = failedTestsOfThisType->count(); 42751dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com line.appendf("%d %s", count, getErrorTypeName(type)); 42851dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com if (!isIgnorableType || verbose) { 42951dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com line.append(":"); 43051dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com for (int i = 0; i < count; ++i) { 43151dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com line.append(" "); 43251dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com line.append((*failedTestsOfThisType)[i]); 43351dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com } 43451dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com } 4352b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org SkDebugf("%s\n", line.c_str()); 43651dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com } 43751dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com 43851dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com /** 439310478e72c63e639373465216271b81f1e4a9136epoger@google.com * List contents of fFailedTests to stdout. 44051dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com * 44151dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com * @param verbose whether to be all verbose about it 442310478e72c63e639373465216271b81f1e4a9136epoger@google.com */ 44351dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com void ListErrors(bool verbose) { 444310478e72c63e639373465216271b81f1e4a9136epoger@google.com // First, print a single summary line. 445310478e72c63e639373465216271b81f1e4a9136epoger@google.com SkString summary; 446310478e72c63e639373465216271b81f1e4a9136epoger@google.com summary.appendf("Ran %d tests:", fTestsRun); 447310478e72c63e639373465216271b81f1e4a9136epoger@google.com for (int typeInt = 0; typeInt <= kLast_ErrorType; typeInt++) { 448310478e72c63e639373465216271b81f1e4a9136epoger@google.com ErrorType type = static_cast<ErrorType>(typeInt); 449310478e72c63e639373465216271b81f1e4a9136epoger@google.com summary.appendf(" %s=%d", getErrorTypeName(type), fFailedTests[type].count()); 450310478e72c63e639373465216271b81f1e4a9136epoger@google.com } 4512b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org SkDebugf("%s\n", summary.c_str()); 452310478e72c63e639373465216271b81f1e4a9136epoger@google.com 453310478e72c63e639373465216271b81f1e4a9136epoger@google.com // Now, for each failure type, list the tests that failed that way. 454310478e72c63e639373465216271b81f1e4a9136epoger@google.com for (int typeInt = 0; typeInt <= kLast_ErrorType; typeInt++) { 45551dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com this->DisplayResultTypeSummary(static_cast<ErrorType>(typeInt), verbose); 45657f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com } 4572b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org SkDebugf("(results marked with [*] will cause nonzero return value)\n"); 45857f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com } 45957f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com 4600dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org static ErrorCombination write_document(const SkString& path, SkStreamAsset* asset) { 461de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com SkFILEWStream stream(path.c_str()); 4620dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org if (!stream.writeStream(asset, asset->getLength())) { 4632b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org SkDebugf("FAILED to write document: %s\n", path.c_str()); 4640dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org return ErrorCombination(kWritingReferenceImage_ErrorType); 4650dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org } 4660dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org return kEmpty_ErrorCombination; 467de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com } 4689875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com 4695f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com /** 4705f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com * Prepare an SkBitmap to render a GM into. 4715f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com * 4725f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com * After you've rendered the GM into the SkBitmap, you must call 4735f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com * complete_bitmap()! 4745f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com * 4755f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com * @todo thudson 22 April 2011 - could refactor this to take in 4765f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com * a factory to generate the context, always call readPixels() 4775f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com * (logically a noop for rasters, if wasted time), and thus collapse the 4785f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com * GPU special case and also let this be used for SkPicture testing. 4795f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com */ 480de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com static void setup_bitmap(const ConfigData& gRec, SkISize& size, 481de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com SkBitmap* bitmap) { 482ddd014e65264e3f18b2d4305dd2fbc81549f5180reed bitmap->allocPixels(SkImageInfo::Make(size.width(), size.height(), 483ddd014e65264e3f18b2d4305dd2fbc81549f5180reed gRec.fColorType, kPremul_SkAlphaType)); 484dbfac8a72393eaf01670aeb3244de0e18d8faf98junov@google.com bitmap->eraseColor(SK_ColorTRANSPARENT); 48579d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org } 4869875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com 4875f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com /** 4885f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com * Any finalization steps we need to perform on the SkBitmap after 4895f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com * we have rendered the GM into it. 4905f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com * 4915f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com * It's too bad that we are throwing away alpha channel data 4925f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com * we could otherwise be examining, but this had always been happening 4935f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com * before... it was buried within the compare() method at 4945f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com * https://code.google.com/p/skia/source/browse/trunk/gm/gmmain.cpp?r=7289#305 . 4955f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com * 4965f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com * Apparently we need this, at least for bitmaps that are either: 4975f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com * (a) destined to be written out as PNG files, or 4985f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com * (b) compared against bitmaps read in from PNG files 4995f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com * for the reasons described just above the force_all_opaque() method. 5005f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com * 5015f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com * Neglecting to do this led to the difficult-to-diagnose 5025f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com * http://code.google.com/p/skia/issues/detail?id=1079 ('gm generating 5035f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com * spurious pixel_error messages as of r7258') 5045f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com * 5055f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com * TODO(epoger): Come up with a better solution that allows us to 5065f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com * compare full pixel data, including alpha channel, while still being 5075f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com * robust in the face of transformations to/from PNG files. 5085f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com * Options include: 5095f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com * 5105f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com * 1. Continue to call force_all_opaque(), but ONLY for bitmaps that 5115f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com * will be written to, or compared against, PNG files. 5125f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com * PRO: Preserve/compare alpha channel info for the non-PNG cases 5135f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com * (comparing different renderModes in-memory) 514908f5836626d792c5e33ad93f44c6a418a0cc8f5epoger@google.com * CON: The bitmaps (and hash digests) for these non-PNG cases would be 5155f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com * different than those for the PNG-compared cases, and in the 5165f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com * case of a failed renderMode comparison, how would we write the 5175f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com * image to disk for examination? 5185f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com * 519908f5836626d792c5e33ad93f44c6a418a0cc8f5epoger@google.com * 2. Always compute image hash digests from PNG format (either 5205f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com * directly from the the bytes of a PNG file, or capturing the 5215f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com * bytes we would have written to disk if we were writing the 5225f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com * bitmap out as a PNG). 5235f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com * PRO: I think this would allow us to never force opaque, and to 5245f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com * the extent that alpha channel data can be preserved in a PNG 5255f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com * file, we could observe it. 526908f5836626d792c5e33ad93f44c6a418a0cc8f5epoger@google.com * CON: If we read a bitmap from disk, we need to take its hash digest 5275f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com * from the source PNG (we can't compute it from the bitmap we 5285f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com * read out of the PNG, because we will have already premultiplied 5295f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com * the alpha). 5305f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com * CON: Seems wasteful to convert a bitmap to PNG format just to take 531908f5836626d792c5e33ad93f44c6a418a0cc8f5epoger@google.com * its hash digest. (Although we're wasting lots of effort already 5325f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com * calling force_all_opaque().) 5335f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com * 5345f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com * 3. Make the alpha premultiply/unpremultiply routines 100% consistent, 5355f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com * so we can transform images back and forth without fear of off-by-one 5365f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com * errors. 5375f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com * CON: Math is hard. 5385f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com * 5395f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com * 4. Perform a "close enough" comparison of bitmaps (+/- 1 bit in each 5405f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com * channel), rather than demanding absolute equality. 541908f5836626d792c5e33ad93f44c6a418a0cc8f5epoger@google.com * CON: Can't do this with hash digests. 5425f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com */ 5435f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com static void complete_bitmap(SkBitmap* bitmap) { 5445f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com force_all_opaque(*bitmap); 5455f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com } 5465f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com 54709fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com static void installFilter(SkCanvas* canvas); 5489875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com 549aef73617d1bcede80145a13639668f958a3863d8reed@google.com static void invokeGM(GM* gm, SkCanvas* canvas, bool isPDF, bool isDeferred) { 550de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com SkAutoCanvasRestore acr(canvas, true); 5519875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com 552de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com if (!isPDF) { 553de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com canvas->concat(gm->getInitialTransform()); 554de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com } 555de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com installFilter(canvas); 556aef73617d1bcede80145a13639668f958a3863d8reed@google.com gm->setCanvasIsDeferred(isDeferred); 557de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com gm->draw(canvas); 558de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com canvas->setDrawFilter(NULL); 559de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com } 560b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com 5616f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com static ErrorCombination generate_image(GM* gm, const ConfigData& gRec, 562123ac1d4eab757052407064623643fdc59f85363bsalomon@google.com GrSurface* gpuTarget, 5636f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com SkBitmap* bitmap, 5646f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com bool deferred) { 565de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com SkISize size (gm->getISize()); 566de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com setup_bitmap(gRec, size, bitmap); 567466f5f3e44e703ca58b43ac1c4ac3bfa0e1ff024commit-bot@chromium.org const SkImageInfo info = bitmap->info(); 568de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com 56911db6fa9b9fc30b1f504d9f53e0f6ae7149cc5c5reed@google.com SkAutoTUnref<SkSurface> surface; 570de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com SkAutoTUnref<SkCanvas> canvas; 571b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com 572de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com if (gRec.fBackend == kRaster_Backend) { 57311db6fa9b9fc30b1f504d9f53e0f6ae7149cc5c5reed@google.com surface.reset(SkSurface::NewRasterDirect(info, 57411db6fa9b9fc30b1f504d9f53e0f6ae7149cc5c5reed@google.com bitmap->getPixels(), 57511db6fa9b9fc30b1f504d9f53e0f6ae7149cc5c5reed@google.com bitmap->rowBytes())); 576de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com if (deferred) { 57711db6fa9b9fc30b1f504d9f53e0f6ae7149cc5c5reed@google.com canvas.reset(SkDeferredCanvas::Create(surface)); 578de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com } else { 57911db6fa9b9fc30b1f504d9f53e0f6ae7149cc5c5reed@google.com canvas.reset(SkRef(surface->getCanvas())); 580de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com } 581aef73617d1bcede80145a13639668f958a3863d8reed@google.com invokeGM(gm, canvas, false, deferred); 582de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com canvas->flush(); 583de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com } 584de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com#if SK_SUPPORT_GPU 585de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com else { // GPU 58611db6fa9b9fc30b1f504d9f53e0f6ae7149cc5c5reed@google.com surface.reset(SkSurface::NewRenderTargetDirect(gpuTarget->asRenderTarget())); 587de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com if (deferred) { 58811db6fa9b9fc30b1f504d9f53e0f6ae7149cc5c5reed@google.com canvas.reset(SkDeferredCanvas::Create(surface)); 589de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com } else { 59011db6fa9b9fc30b1f504d9f53e0f6ae7149cc5c5reed@google.com canvas.reset(SkRef(surface->getCanvas())); 591de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com } 592aef73617d1bcede80145a13639668f958a3863d8reed@google.com invokeGM(gm, canvas, false, deferred); 593de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com // the device is as large as the current rendertarget, so 594de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com // we explicitly only readback the amount we expect (in 595de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com // size) overwrite our previous allocation 596a3264e53ee3f3c5d6a2c813df7e44b5b96d207f2commit-bot@chromium.org bitmap->setInfo(SkImageInfo::MakeN32Premul(size.fWidth, size.fHeight)); 597de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com canvas->readPixels(bitmap, 0, 0); 598de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com } 599de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com#endif 6005f6a00775511b5675607c2bfdbb096c0a815025depoger@google.com complete_bitmap(bitmap); 6016f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com return kEmpty_ErrorCombination; 60246cce91f4859b9c229938d4d649870c0a43b1806reed@google.com } 603de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com 604de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com static void generate_image_from_picture(GM* gm, const ConfigData& gRec, 605c938c48bf426c322e2cb45b4bfaf8a2ee5a2a3c5junov@chromium.org SkPicture* pict, SkBitmap* bitmap, 6065a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com SkScalar scale = SK_Scalar1, 6075a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com bool tile = false) { 608de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com SkISize size = gm->getISize(); 609de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com setup_bitmap(gRec, size, bitmap); 6105a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com 6115a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com if (tile) { 6125a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com // Generate the result image by rendering to tiles and accumulating 6135a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com // the results in 'bitmap' 6145a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com 615041e2dbc0614e3341e1349fd0e962744a45b6194skia.committer@gmail.com // This 16x16 tiling matches the settings applied to 'pict' in 6165a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com // 'generate_new_picture' 6175a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com SkISize tileSize = SkISize::Make(16, 16); 6185a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com 6195a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com SkBitmap tileBM; 6205a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com setup_bitmap(gRec, tileSize, &tileBM); 6215a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com SkCanvas tileCanvas(tileBM); 6225a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com installFilter(&tileCanvas); 6235a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com 6245a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com SkCanvas bmpCanvas(*bitmap); 6255a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com SkPaint bmpPaint; 6265a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com bmpPaint.setXfermodeMode(SkXfermode::kSrc_Mode); 6275a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com 6285a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com for (int yTile = 0; yTile < (size.height()+15)/16; ++yTile) { 6295a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com for (int xTile = 0; xTile < (size.width()+15)/16; ++xTile) { 6305a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com int saveCount = tileCanvas.save(); 6315a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com SkMatrix mat(tileCanvas.getTotalMatrix()); 632041e2dbc0614e3341e1349fd0e962744a45b6194skia.committer@gmail.com mat.postTranslate(SkIntToScalar(-xTile*tileSize.width()), 6335a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com SkIntToScalar(-yTile*tileSize.height())); 6345a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com tileCanvas.setMatrix(mat); 6355a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com pict->draw(&tileCanvas); 6365a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com tileCanvas.flush(); 6375a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com tileCanvas.restoreToCount(saveCount); 638041e2dbc0614e3341e1349fd0e962744a45b6194skia.committer@gmail.com bmpCanvas.drawBitmap(tileBM, 639041e2dbc0614e3341e1349fd0e962744a45b6194skia.committer@gmail.com SkIntToScalar(xTile * tileSize.width()), 6405a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com SkIntToScalar(yTile * tileSize.height()), 6415a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com &bmpPaint); 6425a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com } 6435a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com } 6445a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com } else { 6455a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com SkCanvas canvas(*bitmap); 6465a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com installFilter(&canvas); 6475a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com canvas.scale(scale, scale); 6489b14f26d0f3a974f3dd626c8354e1db1cfcd322frobertphillips canvas.drawPicture(pict); 6495a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com complete_bitmap(bitmap); 6505a7d029fd6fcdf161b58c09887c6f745c37f1855robertphillips@google.com } 651b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com } 652de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com 6535e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org static bool generate_pdf(GM* gm, SkDynamicMemoryWStream& pdf) { 654de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com#ifdef SK_SUPPORT_PDF 655de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com SkMatrix initialTransform = gm->getInitialTransform(); 6565e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org if (FLAGS_useDocumentInsteadOfDevice) { 6575e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org SkISize pageISize = gm->getISize(); 65873a7ea3ae0d37ee28f90d6b38c49fda052638253edisonn@google.com SkAutoTUnref<SkDocument> pdfDoc( 65973a7ea3ae0d37ee28f90d6b38c49fda052638253edisonn@google.com SkDocument::CreatePDF(&pdf, NULL, 66073a7ea3ae0d37ee28f90d6b38c49fda052638253edisonn@google.com encode_to_dct_data, 66173a7ea3ae0d37ee28f90d6b38c49fda052638253edisonn@google.com SkIntToScalar(FLAGS_pdfRasterDpi))); 662de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com 6635e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org if (!pdfDoc.get()) { 6645e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org return false; 6655e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org } 666de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com 6675e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org SkCanvas* canvas = NULL; 6685e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org canvas = pdfDoc->beginPage(SkIntToScalar(pageISize.width()), 6695e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org SkIntToScalar(pageISize.height())); 6705e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org canvas->concat(initialTransform); 6715e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org 6725e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org invokeGM(gm, canvas, true, false); 6735e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org 6745e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org return pdfDoc->close(); 6755e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org } else { 6765e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org SkISize pageSize = gm->getISize(); 6775e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org SkPDFDevice* dev = NULL; 6785e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org if (initialTransform.isIdentity()) { 6795e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org dev = new SkPDFDevice(pageSize, pageSize, initialTransform); 6805e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org } else { 6815e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org SkRect content = SkRect::MakeWH(SkIntToScalar(pageSize.width()), 6825e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org SkIntToScalar(pageSize.height())); 6835e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org initialTransform.mapRect(&content); 6845e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org content.intersect(0, 0, SkIntToScalar(pageSize.width()), 6855e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org SkIntToScalar(pageSize.height())); 6865e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org SkISize contentSize = 6875e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org SkISize::Make(SkScalarRoundToInt(content.width()), 6885e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org SkScalarRoundToInt(content.height())); 6895e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org dev = new SkPDFDevice(pageSize, contentSize, initialTransform); 6905e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org } 6915e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org dev->setDCTEncoder(encode_to_dct_data); 69273a7ea3ae0d37ee28f90d6b38c49fda052638253edisonn@google.com dev->setRasterDpi(SkIntToScalar(FLAGS_pdfRasterDpi)); 6935e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org SkAutoUnref aur(dev); 6945e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org SkCanvas c(dev); 6955e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org invokeGM(gm, &c, true, false); 6965e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org SkPDFDocument doc; 6975e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org doc.appendPage(dev); 6985e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org doc.emitPDF(&pdf); 6995e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org } 7005e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org#endif // SK_SUPPORT_PDF 7015e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org return true; // Do not report failure if pdf is not supported. 7029875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com } 703de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com 704de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com static void generate_xps(GM* gm, SkDynamicMemoryWStream& xps) { 705de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com#ifdef SK_SUPPORT_XPS 706de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com SkISize size = gm->getISize(); 707de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com 708de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com SkSize trimSize = SkSize::Make(SkIntToScalar(size.width()), 709de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com SkIntToScalar(size.height())); 710de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com static const SkScalar inchesPerMeter = SkScalarDiv(10000, 254); 711de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com static const SkScalar upm = 72 * inchesPerMeter; 712de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com SkVector unitsPerMeter = SkPoint::Make(upm, upm); 713de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com static const SkScalar ppm = 200 * inchesPerMeter; 714de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com SkVector pixelsPerMeter = SkPoint::Make(ppm, ppm); 715de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com 716de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com SkXPSDevice* dev = new SkXPSDevice(); 717de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com SkAutoUnref aur(dev); 718de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com 719de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com SkCanvas c(dev); 720de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com dev->beginPortfolio(&xps); 721de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com dev->beginSheet(unitsPerMeter, pixelsPerMeter, trimSize); 722aef73617d1bcede80145a13639668f958a3863d8reed@google.com invokeGM(gm, &c, false, false); 723de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com dev->endSheet(); 724de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com dev->endPortfolio(); 725de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com 726de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com#endif 7279875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com } 7289875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com 72937269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com /** 73084a1802b072d76657261eada3018955283ab29d2epoger@google.com * Log more detail about the mistmatch between expectedBitmap and 73184a1802b072d76657261eada3018955283ab29d2epoger@google.com * actualBitmap. 73284a1802b072d76657261eada3018955283ab29d2epoger@google.com */ 73384a1802b072d76657261eada3018955283ab29d2epoger@google.com void report_bitmap_diffs(const SkBitmap& expectedBitmap, const SkBitmap& actualBitmap, 73484a1802b072d76657261eada3018955283ab29d2epoger@google.com const char *testName) { 73584a1802b072d76657261eada3018955283ab29d2epoger@google.com const int expectedWidth = expectedBitmap.width(); 73684a1802b072d76657261eada3018955283ab29d2epoger@google.com const int expectedHeight = expectedBitmap.height(); 73784a1802b072d76657261eada3018955283ab29d2epoger@google.com const int width = actualBitmap.width(); 73884a1802b072d76657261eada3018955283ab29d2epoger@google.com const int height = actualBitmap.height(); 73984a1802b072d76657261eada3018955283ab29d2epoger@google.com if ((expectedWidth != width) || (expectedHeight != height)) { 7402b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org SkDebugf("---- %s: dimension mismatch -- expected [%d %d], actual [%d %d]\n", 7412b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org testName, expectedWidth, expectedHeight, width, height); 74284a1802b072d76657261eada3018955283ab29d2epoger@google.com return; 74384a1802b072d76657261eada3018955283ab29d2epoger@google.com } 74484a1802b072d76657261eada3018955283ab29d2epoger@google.com 74528fcae2ec77eb16a79e155f8d788b20457f1c951commit-bot@chromium.org if ((kN32_SkColorType != expectedBitmap.colorType()) || 74628fcae2ec77eb16a79e155f8d788b20457f1c951commit-bot@chromium.org (kN32_SkColorType != actualBitmap.colorType())) { 7472b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org SkDebugf("---- %s: not computing max per-channel pixel mismatch because non-8888\n", 7482b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org testName); 74984a1802b072d76657261eada3018955283ab29d2epoger@google.com return; 75084a1802b072d76657261eada3018955283ab29d2epoger@google.com } 75184a1802b072d76657261eada3018955283ab29d2epoger@google.com 75284a1802b072d76657261eada3018955283ab29d2epoger@google.com SkAutoLockPixels alp0(expectedBitmap); 75384a1802b072d76657261eada3018955283ab29d2epoger@google.com SkAutoLockPixels alp1(actualBitmap); 75484a1802b072d76657261eada3018955283ab29d2epoger@google.com int errR = 0; 75584a1802b072d76657261eada3018955283ab29d2epoger@google.com int errG = 0; 75684a1802b072d76657261eada3018955283ab29d2epoger@google.com int errB = 0; 75784a1802b072d76657261eada3018955283ab29d2epoger@google.com int errA = 0; 75884a1802b072d76657261eada3018955283ab29d2epoger@google.com int differingPixels = 0; 75984a1802b072d76657261eada3018955283ab29d2epoger@google.com 76084a1802b072d76657261eada3018955283ab29d2epoger@google.com for (int y = 0; y < height; ++y) { 76184a1802b072d76657261eada3018955283ab29d2epoger@google.com const SkPMColor* expectedPixelPtr = expectedBitmap.getAddr32(0, y); 76284a1802b072d76657261eada3018955283ab29d2epoger@google.com const SkPMColor* actualPixelPtr = actualBitmap.getAddr32(0, y); 76384a1802b072d76657261eada3018955283ab29d2epoger@google.com for (int x = 0; x < width; ++x) { 76484a1802b072d76657261eada3018955283ab29d2epoger@google.com SkPMColor expectedPixel = *expectedPixelPtr++; 76584a1802b072d76657261eada3018955283ab29d2epoger@google.com SkPMColor actualPixel = *actualPixelPtr++; 76684a1802b072d76657261eada3018955283ab29d2epoger@google.com if (expectedPixel != actualPixel) { 76784a1802b072d76657261eada3018955283ab29d2epoger@google.com differingPixels++; 76884a1802b072d76657261eada3018955283ab29d2epoger@google.com errR = SkMax32(errR, SkAbs32((int)SkGetPackedR32(expectedPixel) - 76984a1802b072d76657261eada3018955283ab29d2epoger@google.com (int)SkGetPackedR32(actualPixel))); 77084a1802b072d76657261eada3018955283ab29d2epoger@google.com errG = SkMax32(errG, SkAbs32((int)SkGetPackedG32(expectedPixel) - 77184a1802b072d76657261eada3018955283ab29d2epoger@google.com (int)SkGetPackedG32(actualPixel))); 77284a1802b072d76657261eada3018955283ab29d2epoger@google.com errB = SkMax32(errB, SkAbs32((int)SkGetPackedB32(expectedPixel) - 77384a1802b072d76657261eada3018955283ab29d2epoger@google.com (int)SkGetPackedB32(actualPixel))); 77484a1802b072d76657261eada3018955283ab29d2epoger@google.com errA = SkMax32(errA, SkAbs32((int)SkGetPackedA32(expectedPixel) - 77584a1802b072d76657261eada3018955283ab29d2epoger@google.com (int)SkGetPackedA32(actualPixel))); 77684a1802b072d76657261eada3018955283ab29d2epoger@google.com } 77784a1802b072d76657261eada3018955283ab29d2epoger@google.com } 77884a1802b072d76657261eada3018955283ab29d2epoger@google.com } 7792b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org SkDebugf("---- %s: %d (of %d) differing pixels, " 7802b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org "max per-channel mismatch R=%d G=%d B=%d A=%d\n", 7812b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org testName, differingPixels, width*height, errR, errG, errB, errA); 78284a1802b072d76657261eada3018955283ab29d2epoger@google.com } 78384a1802b072d76657261eada3018955283ab29d2epoger@google.com 78484a1802b072d76657261eada3018955283ab29d2epoger@google.com /** 785908f5836626d792c5e33ad93f44c6a418a0cc8f5epoger@google.com * Compares actual hash digest to expectations, returning the set of errors 7866f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com * (if any) that we saw along the way. 78737269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com * 78837269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com * If fMismatchPath has been set, and there are pixel diffs, then the 78937269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com * actual bitmap will be written out to a file within fMismatchPath. 7905f99545de67ee729b4b17f1aae56f8c9dcf460f9epoger@google.com * And similarly for fMissingExpectationsPath... 79137269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com * 79237269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com * @param expectations what expectations to compare actualBitmap against 7936f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com * @param actualBitmapAndDigest the SkBitmap we actually generated, and its GmResultDigest 794659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com * @param shortName name of test, e.g. "selftest1" 795659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com * @param configName name of config, e.g. "8888" 79637269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com * @param renderModeDescriptor e.g., "-rtree", "-deferred" 79737269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com * @param addToJsonSummary whether to add these results (both actual and 798caac3db48f74676889006b5520b766b572b5e9b2epoger@google.com * expected) to the JSON summary. Regardless of this setting, if 799caac3db48f74676889006b5520b766b572b5e9b2epoger@google.com * we find an image mismatch in this test, we will write these 800caac3db48f74676889006b5520b766b572b5e9b2epoger@google.com * results to the JSON summary. (This is so that we will always 801caac3db48f74676889006b5520b766b572b5e9b2epoger@google.com * report errors across rendering modes, such as pipe vs tiled. 802caac3db48f74676889006b5520b766b572b5e9b2epoger@google.com * See https://codereview.chromium.org/13650002/ ) 80337269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com */ 8046f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com ErrorCombination compare_to_expectations(Expectations expectations, 8056f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com const BitmapAndDigest& actualBitmapAndDigest, 806659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com const char *shortName, const char *configName, 807659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com const char *renderModeDescriptor, 808caac3db48f74676889006b5520b766b572b5e9b2epoger@google.com bool addToJsonSummary) { 8096f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com ErrorCombination errors; 810659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com SkString shortNamePlusConfig = make_shortname_plus_config(shortName, configName); 811659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com SkString completeNameString(shortNamePlusConfig); 81237269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com completeNameString.append(renderModeDescriptor); 813ce057fec926f8ec1d60ed4722d1e51a0086e7976epoger@google.com completeNameString.append("."); 814ce057fec926f8ec1d60ed4722d1e51a0086e7976epoger@google.com completeNameString.append(kPNG_FileExtension); 81537269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com const char* completeName = completeNameString.c_str(); 81637269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com 81737269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com if (expectations.empty()) { 8186f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com errors.add(kMissingExpectations_ErrorType); 8195f99545de67ee729b4b17f1aae56f8c9dcf460f9epoger@google.com 8205f99545de67ee729b4b17f1aae56f8c9dcf460f9epoger@google.com // Write out the "actuals" for any tests without expectations, if we have 8215f99545de67ee729b4b17f1aae56f8c9dcf460f9epoger@google.com // been directed to do so. 8225f99545de67ee729b4b17f1aae56f8c9dcf460f9epoger@google.com if (fMissingExpectationsPath) { 8235f99545de67ee729b4b17f1aae56f8c9dcf460f9epoger@google.com SkString path = make_bitmap_filename(fMissingExpectationsPath, shortName, 8245f99545de67ee729b4b17f1aae56f8c9dcf460f9epoger@google.com configName, renderModeDescriptor, 8255f99545de67ee729b4b17f1aae56f8c9dcf460f9epoger@google.com actualBitmapAndDigest.fDigest); 8265f99545de67ee729b4b17f1aae56f8c9dcf460f9epoger@google.com write_bitmap(path, actualBitmapAndDigest.fBitmap); 8275f99545de67ee729b4b17f1aae56f8c9dcf460f9epoger@google.com } 8285f99545de67ee729b4b17f1aae56f8c9dcf460f9epoger@google.com 8296f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com } else if (!expectations.match(actualBitmapAndDigest.fDigest)) { 830caac3db48f74676889006b5520b766b572b5e9b2epoger@google.com addToJsonSummary = true; 831caac3db48f74676889006b5520b766b572b5e9b2epoger@google.com // The error mode we record depends on whether this was running 832caac3db48f74676889006b5520b766b572b5e9b2epoger@google.com // in a non-standard renderMode. 833caac3db48f74676889006b5520b766b572b5e9b2epoger@google.com if ('\0' == *renderModeDescriptor) { 834caac3db48f74676889006b5520b766b572b5e9b2epoger@google.com errors.add(kExpectationsMismatch_ErrorType); 835caac3db48f74676889006b5520b766b572b5e9b2epoger@google.com } else { 836caac3db48f74676889006b5520b766b572b5e9b2epoger@google.com errors.add(kRenderModeMismatch_ErrorType); 837caac3db48f74676889006b5520b766b572b5e9b2epoger@google.com } 83884a1802b072d76657261eada3018955283ab29d2epoger@google.com 83984a1802b072d76657261eada3018955283ab29d2epoger@google.com // Write out the "actuals" for any mismatches, if we have 84084a1802b072d76657261eada3018955283ab29d2epoger@google.com // been directed to do so. 84137269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com if (fMismatchPath) { 8426f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com SkString path = make_bitmap_filename(fMismatchPath, shortName, configName, 8436f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com renderModeDescriptor, 8446f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com actualBitmapAndDigest.fDigest); 8456f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com write_bitmap(path, actualBitmapAndDigest.fBitmap); 846de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com } 84784a1802b072d76657261eada3018955283ab29d2epoger@google.com 84884a1802b072d76657261eada3018955283ab29d2epoger@google.com // If we have access to a single expected bitmap, log more 84984a1802b072d76657261eada3018955283ab29d2epoger@google.com // detail about the mismatch. 85084a1802b072d76657261eada3018955283ab29d2epoger@google.com const SkBitmap *expectedBitmapPtr = expectations.asBitmap(); 85184a1802b072d76657261eada3018955283ab29d2epoger@google.com if (NULL != expectedBitmapPtr) { 8526f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com report_bitmap_diffs(*expectedBitmapPtr, actualBitmapAndDigest.fBitmap, 8536f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com completeName); 85484a1802b072d76657261eada3018955283ab29d2epoger@google.com } 855ee8a8e3931c1d3f39755ee8beaf0c7cb1ba91888epoger@google.com } 85637269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com 85737269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com if (addToJsonSummary) { 8586f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com add_actual_results_to_json_summary(completeName, actualBitmapAndDigest.fDigest, errors, 85937269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com expectations.ignoreFailure()); 86037269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com add_expected_results_to_json_summary(completeName, expectations); 86137269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com } 86237269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com 8636f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com return errors; 86437269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com } 865ee8a8e3931c1d3f39755ee8beaf0c7cb1ba91888epoger@google.com 86637269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com /** 8671ddfbc201a5445d2da17d2a087a1ec88cc980ffbepoger@google.com * Add this result to the appropriate JSON collection of actual results (but just ONE), 86876c913db20de7ae1baa49ae66e943bf7f40781ccepoger@google.com * depending on errors encountered. 86937269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com */ 87037269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com void add_actual_results_to_json_summary(const char testName[], 871d4993ff3605102036f83d5834d9a022d780e5488epoger@google.com const GmResultDigest &actualResultDigest, 87276c913db20de7ae1baa49ae66e943bf7f40781ccepoger@google.com ErrorCombination errors, 87337269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com bool ignoreFailure) { 874d4993ff3605102036f83d5834d9a022d780e5488epoger@google.com Json::Value jsonActualResults = actualResultDigest.asJsonTypeValuePair(); 8751ddfbc201a5445d2da17d2a087a1ec88cc980ffbepoger@google.com Json::Value *resultCollection = NULL; 8761ddfbc201a5445d2da17d2a087a1ec88cc980ffbepoger@google.com 87776c913db20de7ae1baa49ae66e943bf7f40781ccepoger@google.com if (errors.isEmpty()) { 8781ddfbc201a5445d2da17d2a087a1ec88cc980ffbepoger@google.com resultCollection = &this->fJsonActualResults_Succeeded; 8791ddfbc201a5445d2da17d2a087a1ec88cc980ffbepoger@google.com } else if (errors.includes(kRenderModeMismatch_ErrorType)) { 8801ddfbc201a5445d2da17d2a087a1ec88cc980ffbepoger@google.com resultCollection = &this->fJsonActualResults_Failed; 8811ddfbc201a5445d2da17d2a087a1ec88cc980ffbepoger@google.com } else if (errors.includes(kExpectationsMismatch_ErrorType)) { 88237269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com if (ignoreFailure) { 8831ddfbc201a5445d2da17d2a087a1ec88cc980ffbepoger@google.com resultCollection = &this->fJsonActualResults_FailureIgnored; 884ee8a8e3931c1d3f39755ee8beaf0c7cb1ba91888epoger@google.com } else { 8851ddfbc201a5445d2da17d2a087a1ec88cc980ffbepoger@google.com resultCollection = &this->fJsonActualResults_Failed; 886ee8a8e3931c1d3f39755ee8beaf0c7cb1ba91888epoger@google.com } 8871ddfbc201a5445d2da17d2a087a1ec88cc980ffbepoger@google.com } else if (errors.includes(kMissingExpectations_ErrorType)) { 8881ddfbc201a5445d2da17d2a087a1ec88cc980ffbepoger@google.com // TODO: What about the case where there IS an expected 8891ddfbc201a5445d2da17d2a087a1ec88cc980ffbepoger@google.com // image hash digest, but that gm test doesn't actually 8901ddfbc201a5445d2da17d2a087a1ec88cc980ffbepoger@google.com // run? For now, those cases will always be ignored, 8911ddfbc201a5445d2da17d2a087a1ec88cc980ffbepoger@google.com // because gm only looks at expectations that correspond 8921ddfbc201a5445d2da17d2a087a1ec88cc980ffbepoger@google.com // to gm tests that were actually run. 8931ddfbc201a5445d2da17d2a087a1ec88cc980ffbepoger@google.com // 8941ddfbc201a5445d2da17d2a087a1ec88cc980ffbepoger@google.com // Once we have the ability to express expectations as a 8951ddfbc201a5445d2da17d2a087a1ec88cc980ffbepoger@google.com // JSON file, we should fix this (and add a test case for 8961ddfbc201a5445d2da17d2a087a1ec88cc980ffbepoger@google.com // which an expectation is given but the test is never 8971ddfbc201a5445d2da17d2a087a1ec88cc980ffbepoger@google.com // run). 8981ddfbc201a5445d2da17d2a087a1ec88cc980ffbepoger@google.com resultCollection = &this->fJsonActualResults_NoComparison; 8991ddfbc201a5445d2da17d2a087a1ec88cc980ffbepoger@google.com } 9001ddfbc201a5445d2da17d2a087a1ec88cc980ffbepoger@google.com 9011ddfbc201a5445d2da17d2a087a1ec88cc980ffbepoger@google.com // If none of the above cases match, we don't add it to ANY tally of actual results. 9021ddfbc201a5445d2da17d2a087a1ec88cc980ffbepoger@google.com if (resultCollection) { 9031ddfbc201a5445d2da17d2a087a1ec88cc980ffbepoger@google.com (*resultCollection)[testName] = jsonActualResults; 904de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com } 90537269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com } 906ee8a8e3931c1d3f39755ee8beaf0c7cb1ba91888epoger@google.com 90737269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com /** 90837269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com * Add this test to the JSON collection of expected results. 90937269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com */ 91037269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com void add_expected_results_to_json_summary(const char testName[], 91137269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com Expectations expectations) { 91276c913db20de7ae1baa49ae66e943bf7f40781ccepoger@google.com this->fJsonExpectedResults[testName] = expectations.asJsonValue(); 9139ef89ce8b7eb270b37941553099654129f2e0a04epoger@google.com } 914a243b22422c82def12282f2ea713121716e30621epoger@google.com 91537269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com /** 91637269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com * Compare actualBitmap to expectations stored in this->fExpectationsSource. 91737269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com * 91837269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com * @param gm which test generated the actualBitmap 91937269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com * @param gRec 9208fc3766c58ec879389c3c83c96a73e50ff59eb78vandebo@chromium.org * @param configName The config name to look for in the expectation file. 921e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com * @param actualBitmapAndDigest ptr to bitmap generated by this run, or NULL 922e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com * if we don't have a usable bitmap representation 92337269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com */ 9246f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com ErrorCombination compare_test_results_to_stored_expectations( 9258fc3766c58ec879389c3c83c96a73e50ff59eb78vandebo@chromium.org GM* gm, const ConfigData& gRec, const char* configName, 9260dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org const BitmapAndDigest* actualBitmapAndDigest) { 927659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com ErrorCombination errors; 928e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com 929e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com if (NULL == actualBitmapAndDigest) { 930e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com // Note that we intentionally skipped validating the results for 931e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com // this test, because we don't know how to generate an SkBitmap 932e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com // version of the output. 9330dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org errors.add(ErrorCombination(kIntentionallySkipped_ErrorType)); 934c824c83ec1402e68e827e8920278a86793a12c0cepoger@google.com } else if (!(gRec.fFlags & kWrite_ConfigFlag)) { 935c824c83ec1402e68e827e8920278a86793a12c0cepoger@google.com // We don't record the results for this test or compare them 936c824c83ec1402e68e827e8920278a86793a12c0cepoger@google.com // against any expectations, because the output image isn't 937c824c83ec1402e68e827e8920278a86793a12c0cepoger@google.com // meaningful. 938c824c83ec1402e68e827e8920278a86793a12c0cepoger@google.com // See https://code.google.com/p/skia/issues/detail?id=1410 ('some 939c824c83ec1402e68e827e8920278a86793a12c0cepoger@google.com // GM result images not available for download from Google Storage') 9400dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org errors.add(ErrorCombination(kIntentionallySkipped_ErrorType)); 941e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com } else { 942e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com ExpectationsSource *expectationsSource = this->fExpectationsSource.get(); 94338aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org SkString nameWithExtension = make_shortname_plus_config(gm->getName(), configName); 9440dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org nameWithExtension.append("."); 9450dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org nameWithExtension.append(kPNG_FileExtension); 9460dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org 947e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com if (expectationsSource && (gRec.fFlags & kRead_ConfigFlag)) { 948e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com /* 949e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com * Get the expected results for this test, as one or more allowed 950e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com * hash digests. The current implementation of expectationsSource 951e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com * get this by computing the hash digest of a single PNG file on disk. 952e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com * 953e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com * TODO(epoger): This relies on the fact that 954e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com * force_all_opaque() was called on the bitmap before it 955e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com * was written to disk as a PNG in the first place. If 956e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com * not, the hash digest returned here may not match the 957e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com * hash digest of actualBitmap, which *has* been run through 958e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com * force_all_opaque(). 959e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com * See comments above complete_bitmap() for more detail. 960e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com */ 961e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com Expectations expectations = expectationsSource->get(nameWithExtension.c_str()); 96238aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org if (this->ShouldIgnoreTest(gm->getName())) { 963defc487aa9e6bef16f76846f286f8a1343524d45epoger@google.com expectations.setIgnoreFailure(true); 964defc487aa9e6bef16f76846f286f8a1343524d45epoger@google.com } 965e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com errors.add(compare_to_expectations(expectations, *actualBitmapAndDigest, 96638aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org gm->getName(), configName, "", true)); 967e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com } else { 968e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com // If we are running without expectations, we still want to 969e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com // record the actual results. 970e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com add_actual_results_to_json_summary(nameWithExtension.c_str(), 971e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com actualBitmapAndDigest->fDigest, 972e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com ErrorCombination(kMissingExpectations_ErrorType), 973e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com false); 9740dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org errors.add(ErrorCombination(kMissingExpectations_ErrorType)); 975e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com } 976de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com } 9776f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com return errors; 9789284ccd8bc4e3dfed83485d9fa94ebd69c4b9741epoger@google.com } 9799875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com 98037269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com /** 98137269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com * Compare actualBitmap to referenceBitmap. 98237269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com * 983659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com * @param shortName test name, e.g. "selftest1" 984659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com * @param configName configuration name, e.g. "8888" 98537269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com * @param renderModeDescriptor 98637269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com * @param actualBitmap actual bitmap generated by this run 98737269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com * @param referenceBitmap bitmap we expected to be generated 98837269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com */ 9896f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com ErrorCombination compare_test_results_to_reference_bitmap( 990659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com const char *shortName, const char *configName, const char *renderModeDescriptor, 99137269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com SkBitmap& actualBitmap, const SkBitmap* referenceBitmap) { 99237269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com 99337269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com SkASSERT(referenceBitmap); 99484a1802b072d76657261eada3018955283ab29d2epoger@google.com Expectations expectations(*referenceBitmap); 9956f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com BitmapAndDigest actualBitmapAndDigest(actualBitmap); 9960dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org 9970dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org // TODO: Eliminate RecordTestResults from here. 9980dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org // Results recording code for the test_drawing path has been refactored so that 9990dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org // RecordTestResults is only called once, at the topmost level. However, the 10000dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org // other paths have not yet been refactored, and RecordTestResults has been added 10010dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org // here to maintain proper behavior for calls not coming from the test_drawing path. 10020dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org ErrorCombination errors; 10030dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org errors.add(compare_to_expectations(expectations, actualBitmapAndDigest, shortName, 10040dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org configName, renderModeDescriptor, false)); 10050dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org SkString shortNamePlusConfig = make_shortname_plus_config(shortName, configName); 10060dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org RecordTestResults(errors, shortNamePlusConfig, renderModeDescriptor); 10070dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org 10080dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org return errors; 100937269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com } 101037269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com 101120bd04e365ca8f5cdb37068fedd696e783d1a775junov@chromium.org static SkPicture* generate_new_picture(GM* gm, BbhType bbhType, uint32_t recordFlags, 101220bd04e365ca8f5cdb37068fedd696e783d1a775junov@chromium.org SkScalar scale = SK_Scalar1) { 1013706ff2f4f6f0a46bc50401c0fdd70eb2eaafe2f0junov@chromium.org int width = SkScalarCeilToInt(SkScalarMul(SkIntToScalar(gm->getISize().width()), scale)); 1014706ff2f4f6f0a46bc50401c0fdd70eb2eaafe2f0junov@chromium.org int height = SkScalarCeilToInt(SkScalarMul(SkIntToScalar(gm->getISize().height()), scale)); 1015d8b279926e5d57b2377dac52c3358266733f5820skia.committer@gmail.com 10165fb2ce38b3dcb8e60e9e112df23c9d42456d7069commit-bot@chromium.org SkAutoTDelete<SkBBHFactory> factory; 10173cb834bd27a16cc60ff30adae96659558c2dc91fjunov@chromium.org if (kTileGrid_BbhType == bbhType) { 10185fb2ce38b3dcb8e60e9e112df23c9d42456d7069commit-bot@chromium.org SkTileGridFactory::TileGridInfo info; 101929b19e53cfac5af4f9bd5d361436d1097f349a34junov@chromium.org info.fMargin.setEmpty(); 102029b19e53cfac5af4f9bd5d361436d1097f349a34junov@chromium.org info.fOffset.setZero(); 102129b19e53cfac5af4f9bd5d361436d1097f349a34junov@chromium.org info.fTileInterval.set(16, 16); 10225fb2ce38b3dcb8e60e9e112df23c9d42456d7069commit-bot@chromium.org factory.reset(SkNEW_ARGS(SkTileGridFactory, (info))); 1023d393b17cf3427bd6f6255f8670067d9aa529e409commit-bot@chromium.org } else if (kQuadTree_BbhType == bbhType) { 10245fb2ce38b3dcb8e60e9e112df23c9d42456d7069commit-bot@chromium.org factory.reset(SkNEW(SkQuadTreeFactory)); 1025d393b17cf3427bd6f6255f8670067d9aa529e409commit-bot@chromium.org } else if (kRTree_BbhType == bbhType) { 10265fb2ce38b3dcb8e60e9e112df23c9d42456d7069commit-bot@chromium.org factory.reset(SkNEW(SkRTreeFactory)); 102720bd04e365ca8f5cdb37068fedd696e783d1a775junov@chromium.org } 10285fb2ce38b3dcb8e60e9e112df23c9d42456d7069commit-bot@chromium.org SkPictureRecorder recorder; 10295fb2ce38b3dcb8e60e9e112df23c9d42456d7069commit-bot@chromium.org SkCanvas* cv = recorder.beginRecording(width, height, factory.get(), recordFlags); 1030c938c48bf426c322e2cb45b4bfaf8a2ee5a2a3c5junov@chromium.org cv->scale(scale, scale); 1031aef73617d1bcede80145a13639668f958a3863d8reed@google.com invokeGM(gm, cv, false, false); 103284b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com return recorder.endRecording(); 1033de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com } 10349875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com 1035de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com static SkPicture* stream_to_new_picture(const SkPicture& src) { 1036de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com SkDynamicMemoryWStream storage; 1037672588b684d484dce6ae251e9e163e4a46924322reed@google.com src.serialize(&storage, NULL); 1038c29f3d8c6dec938fd0599db30cae590fcaa2108bbungeman@google.com SkAutoTUnref<SkStreamAsset> pictReadback(storage.detachAsStream()); 1039805df1aa1ddba876e6d18f9d2207d04c09415f9dcommit-bot@chromium.org SkPicture* retval = SkPicture::CreateFromStream(pictReadback, 1040805df1aa1ddba876e6d18f9d2207d04c09415f9dcommit-bot@chromium.org &SkImageDecoder::DecodeMemory); 1041de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com return retval; 1042de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com } 10439875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com 1044de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com // Test: draw into a bitmap or pdf. 104515655b241bfe1d77032e88115f119684722c10e0epoger@google.com // Depending on flags, possibly compare to an expected image. 10460dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org // If writePath is not NULL, also write images (or documents) to the specified path. 10470dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org ErrorCombination test_drawing(GM* gm, const ConfigData& gRec, 10480dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org const SkTDArray<const PDFRasterizerData*> &pdfRasterizers, 10496f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com const char writePath [], 1050123ac1d4eab757052407064623643fdc59f85363bsalomon@google.com GrSurface* gpuTarget, 10516f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com SkBitmap* bitmap) { 10520dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org ErrorCombination errors; 1053de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com SkDynamicMemoryWStream document; 10540dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org SkString path; 1055de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com 1056de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com if (gRec.fBackend == kRaster_Backend || 1057de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com gRec.fBackend == kGPU_Backend) { 1058de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com // Early exit if we can't generate the image. 10590dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org errors.add(generate_image(gm, gRec, gpuTarget, bitmap, false)); 10606f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com if (!errors.isEmpty()) { 106137269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com // TODO: Add a test to exercise what the stdout and 106237269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com // JSON look like if we get an "early error" while 106337269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com // trying to generate the image. 1064de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com return errors; 1065de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com } 10660dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org BitmapAndDigest bitmapAndDigest(*bitmap); 10670dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org errors.add(compare_test_results_to_stored_expectations( 10688fc3766c58ec879389c3c83c96a73e50ff59eb78vandebo@chromium.org gm, gRec, gRec.fName, &bitmapAndDigest)); 10690dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org 10700dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org if (writePath && (gRec.fFlags & kWrite_ConfigFlag)) { 107138aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org path = make_bitmap_filename(writePath, gm->getName(), gRec.fName, 10720dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org "", bitmapAndDigest.fDigest); 10730dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org errors.add(write_bitmap(path, bitmapAndDigest.fBitmap)); 10740dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org } 1075de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com } else if (gRec.fBackend == kPDF_Backend) { 10765e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org if (!generate_pdf(gm, document)) { 10775e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org errors.add(kGeneratePdfFailed_ErrorType); 10785e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org } else { 10795e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org SkAutoTUnref<SkStreamAsset> documentStream(document.detachAsStream()); 10805e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org if (writePath && (gRec.fFlags & kWrite_ConfigFlag)) { 108138aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org path = make_filename(writePath, gm->getName(), gRec.fName, "", "pdf"); 10825e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org errors.add(write_document(path, documentStream)); 10835e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org } 10848fc3766c58ec879389c3c83c96a73e50ff59eb78vandebo@chromium.org 10855e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org if (!(gm->getFlags() & GM::kSkipPDFRasterization_Flag)) { 10865e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org for (int i = 0; i < pdfRasterizers.count(); i++) { 10875e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org SkBitmap pdfBitmap; 1088969967ed68762ab047645a26eab0565eb760709dvandebo@chromium.org documentStream->rewind(); 10895e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org bool success = (*pdfRasterizers[i]->fRasterizerFunction)( 10905e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org documentStream.get(), &pdfBitmap); 10915e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org if (!success) { 10922b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org SkDebugf("FAILED to render PDF for %s using renderer %s\n", 10932b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org gm->getName(), 10942b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org pdfRasterizers[i]->fName); 10955e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org continue; 10965e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org } 10975e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org 10985e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org SkString configName(gRec.fName); 10995e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org configName.append("-"); 11005e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org configName.append(pdfRasterizers[i]->fName); 11015e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org 11025e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org BitmapAndDigest bitmapAndDigest(pdfBitmap); 11035e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org errors.add(compare_test_results_to_stored_expectations( 11045e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org gm, gRec, configName.c_str(), &bitmapAndDigest)); 11055e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org 11065e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org if (writePath && (gRec.fFlags & kWrite_ConfigFlag)) { 110738aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org path = make_bitmap_filename(writePath, gm->getName(), 11085e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org configName.c_str(), 11095e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org "", bitmapAndDigest.fDigest); 11105e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org errors.add(write_bitmap(path, bitmapAndDigest.fBitmap)); 11115e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org } 11120dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org } 11135e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org } else { 11145e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org errors.add(kIntentionallySkipped_ErrorType); 11150dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org } 11160dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org } 1117de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com } else if (gRec.fBackend == kXPS_Backend) { 1118de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com generate_xps(gm, document); 11190dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org SkAutoTUnref<SkStreamAsset> documentStream(document.detachAsStream()); 11200dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org 11210dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org errors.add(compare_test_results_to_stored_expectations( 11228fc3766c58ec879389c3c83c96a73e50ff59eb78vandebo@chromium.org gm, gRec, gRec.fName, NULL)); 1123e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com 11240dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org if (writePath && (gRec.fFlags & kWrite_ConfigFlag)) { 112538aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org path = make_filename(writePath, gm->getName(), gRec.fName, "", "xps"); 11260dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org errors.add(write_document(path, documentStream)); 11270dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org } 1128e33e137623d56a9d61f00ef74c6ad2e998613062epoger@google.com } else { 11290dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org SkASSERT(false); 1130de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com } 11310dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org return errors; 11329875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com } 11339875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com 11346f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com ErrorCombination test_deferred_drawing(GM* gm, 11356f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com const ConfigData& gRec, 11366f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com const SkBitmap& referenceBitmap, 1137123ac1d4eab757052407064623643fdc59f85363bsalomon@google.com GrSurface* gpuTarget) { 1138de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com if (gRec.fBackend == kRaster_Backend || 1139de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com gRec.fBackend == kGPU_Backend) { 1140c8263e704135436f71a585801966294d6deadeebepoger@google.com const char renderModeDescriptor[] = "-deferred"; 1141de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com SkBitmap bitmap; 1142de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com // Early exit if we can't generate the image, but this is 1143de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com // expected in some cases, so don't report a test failure. 1144123ac1d4eab757052407064623643fdc59f85363bsalomon@google.com ErrorCombination errors = generate_image(gm, gRec, gpuTarget, &bitmap, true); 11456f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com // TODO(epoger): This logic is the opposite of what is 11466f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com // described above... if we succeeded in generating the 11476f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com // -deferred image, we exit early! We should fix this 11486f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com // ASAP, because it is hiding -deferred errors... but for 11496f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com // now, I'm leaving the logic as it is so that the 11506f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com // refactoring change 11516f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com // https://codereview.chromium.org/12992003/ is unblocked. 11526f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com // 11536f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com // Filed as https://code.google.com/p/skia/issues/detail?id=1180 11546f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com // ('image-surface gm test is failing in "deferred" mode, 11556f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com // and gm is not reporting the failure') 11566f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com if (errors.isEmpty()) { 1157310478e72c63e639373465216271b81f1e4a9136epoger@google.com // TODO(epoger): Report this as a new ErrorType, 1158310478e72c63e639373465216271b81f1e4a9136epoger@google.com // something like kImageGeneration_ErrorType? 11596f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com return kEmpty_ErrorCombination; 1160de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com } 116137269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com return compare_test_results_to_reference_bitmap( 116238aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org gm->getName(), gRec.fName, renderModeDescriptor, bitmap, &referenceBitmap); 11634370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com } 11646f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com return kEmpty_ErrorCombination; 11654370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com } 11664370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 1167caac3db48f74676889006b5520b766b572b5e9b2epoger@google.com ErrorCombination test_pipe_playback(GM* gm, const ConfigData& gRec, 1168caac3db48f74676889006b5520b766b572b5e9b2epoger@google.com const SkBitmap& referenceBitmap, bool simulateFailure) { 116938aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org const SkString shortNamePlusConfig = make_shortname_plus_config(gm->getName(), 1170659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com gRec.fName); 11716f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com ErrorCombination errors; 1172de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com for (size_t i = 0; i < SK_ARRAY_COUNT(gPipeWritingFlagCombos); ++i) { 1173c8263e704135436f71a585801966294d6deadeebepoger@google.com SkString renderModeDescriptor("-pipe"); 1174c8263e704135436f71a585801966294d6deadeebepoger@google.com renderModeDescriptor.append(gPipeWritingFlagCombos[i].name); 1175c8263e704135436f71a585801966294d6deadeebepoger@google.com 1176805df1aa1ddba876e6d18f9d2207d04c09415f9dcommit-bot@chromium.org if (gm->getFlags() & GM::kSkipPipe_Flag 1177805df1aa1ddba876e6d18f9d2207d04c09415f9dcommit-bot@chromium.org || (gPipeWritingFlagCombos[i].flags == SkGPipeWriter::kCrossProcess_Flag 1178805df1aa1ddba876e6d18f9d2207d04c09415f9dcommit-bot@chromium.org && gm->getFlags() & GM::kSkipPipeCrossProcess_Flag)) { 1179659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com RecordTestResults(kIntentionallySkipped_ErrorType, shortNamePlusConfig, 1180c8263e704135436f71a585801966294d6deadeebepoger@google.com renderModeDescriptor.c_str()); 1181c8263e704135436f71a585801966294d6deadeebepoger@google.com errors.add(kIntentionallySkipped_ErrorType); 1182c8263e704135436f71a585801966294d6deadeebepoger@google.com } else { 1183c8263e704135436f71a585801966294d6deadeebepoger@google.com SkBitmap bitmap; 1184c8263e704135436f71a585801966294d6deadeebepoger@google.com SkISize size = gm->getISize(); 1185c8263e704135436f71a585801966294d6deadeebepoger@google.com setup_bitmap(gRec, size, &bitmap); 1186c8263e704135436f71a585801966294d6deadeebepoger@google.com SkCanvas canvas(bitmap); 1187c8263e704135436f71a585801966294d6deadeebepoger@google.com installFilter(&canvas); 118874b7ffda687c66d46ac3cfa4f2baedd4c62e3fbescroggo@google.com // Pass a decoding function so the factory GM (which has an SkBitmap 118974b7ffda687c66d46ac3cfa4f2baedd4c62e3fbescroggo@google.com // with encoded data) will not fail playback. 119074b7ffda687c66d46ac3cfa4f2baedd4c62e3fbescroggo@google.com PipeController pipeController(&canvas, &SkImageDecoder::DecodeMemory); 1191c8263e704135436f71a585801966294d6deadeebepoger@google.com SkGPipeWriter writer; 1192c8263e704135436f71a585801966294d6deadeebepoger@google.com SkCanvas* pipeCanvas = writer.startRecording(&pipeController, 1193aef2d3b14eab4f86e7d0efef952e64b3546630acscroggo@google.com gPipeWritingFlagCombos[i].flags, 1194aef2d3b14eab4f86e7d0efef952e64b3546630acscroggo@google.com size.width(), size.height()); 1195c8263e704135436f71a585801966294d6deadeebepoger@google.com if (!simulateFailure) { 1196c8263e704135436f71a585801966294d6deadeebepoger@google.com invokeGM(gm, pipeCanvas, false, false); 1197c8263e704135436f71a585801966294d6deadeebepoger@google.com } 1198c8263e704135436f71a585801966294d6deadeebepoger@google.com complete_bitmap(&bitmap); 1199c8263e704135436f71a585801966294d6deadeebepoger@google.com writer.endRecording(); 1200c8263e704135436f71a585801966294d6deadeebepoger@google.com errors.add(compare_test_results_to_reference_bitmap( 120138aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org gm->getName(), gRec.fName, renderModeDescriptor.c_str(), bitmap, 1202659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com &referenceBitmap)); 1203c8263e704135436f71a585801966294d6deadeebepoger@google.com if (!errors.isEmpty()) { 1204c8263e704135436f71a585801966294d6deadeebepoger@google.com break; 1205c8263e704135436f71a585801966294d6deadeebepoger@google.com } 1206de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com } 1207565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com } 1208de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com return errors; 1209565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com } 12105af9b2032b552516c9223d9fb22185b022b13c62scroggo@google.com 12116f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com ErrorCombination test_tiled_pipe_playback(GM* gm, const ConfigData& gRec, 12126f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com const SkBitmap& referenceBitmap) { 121338aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org const SkString shortNamePlusConfig = make_shortname_plus_config(gm->getName(), 1214659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com gRec.fName); 12156f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com ErrorCombination errors; 1216de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com for (size_t i = 0; i < SK_ARRAY_COUNT(gPipeWritingFlagCombos); ++i) { 1217c8263e704135436f71a585801966294d6deadeebepoger@google.com SkString renderModeDescriptor("-tiled pipe"); 1218c8263e704135436f71a585801966294d6deadeebepoger@google.com renderModeDescriptor.append(gPipeWritingFlagCombos[i].name); 1219c8263e704135436f71a585801966294d6deadeebepoger@google.com 1220c8263e704135436f71a585801966294d6deadeebepoger@google.com if ((gm->getFlags() & GM::kSkipPipe_Flag) || 1221c8263e704135436f71a585801966294d6deadeebepoger@google.com (gm->getFlags() & GM::kSkipTiled_Flag)) { 1222659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com RecordTestResults(kIntentionallySkipped_ErrorType, shortNamePlusConfig, 1223c8263e704135436f71a585801966294d6deadeebepoger@google.com renderModeDescriptor.c_str()); 1224c8263e704135436f71a585801966294d6deadeebepoger@google.com errors.add(kIntentionallySkipped_ErrorType); 1225c8263e704135436f71a585801966294d6deadeebepoger@google.com } else { 1226c8263e704135436f71a585801966294d6deadeebepoger@google.com SkBitmap bitmap; 1227c8263e704135436f71a585801966294d6deadeebepoger@google.com SkISize size = gm->getISize(); 1228c8263e704135436f71a585801966294d6deadeebepoger@google.com setup_bitmap(gRec, size, &bitmap); 1229c8263e704135436f71a585801966294d6deadeebepoger@google.com SkCanvas canvas(bitmap); 1230c8263e704135436f71a585801966294d6deadeebepoger@google.com installFilter(&canvas); 123174b7ffda687c66d46ac3cfa4f2baedd4c62e3fbescroggo@google.com TiledPipeController pipeController(bitmap, &SkImageDecoder::DecodeMemory); 1232c8263e704135436f71a585801966294d6deadeebepoger@google.com SkGPipeWriter writer; 1233c8263e704135436f71a585801966294d6deadeebepoger@google.com SkCanvas* pipeCanvas = writer.startRecording(&pipeController, 1234aef2d3b14eab4f86e7d0efef952e64b3546630acscroggo@google.com gPipeWritingFlagCombos[i].flags, 1235aef2d3b14eab4f86e7d0efef952e64b3546630acscroggo@google.com size.width(), size.height()); 1236c8263e704135436f71a585801966294d6deadeebepoger@google.com invokeGM(gm, pipeCanvas, false, false); 1237c8263e704135436f71a585801966294d6deadeebepoger@google.com complete_bitmap(&bitmap); 1238c8263e704135436f71a585801966294d6deadeebepoger@google.com writer.endRecording(); 123938aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org errors.add(compare_test_results_to_reference_bitmap(gm->getName(), gRec.fName, 1240c8263e704135436f71a585801966294d6deadeebepoger@google.com renderModeDescriptor.c_str(), 1241c8263e704135436f71a585801966294d6deadeebepoger@google.com bitmap, &referenceBitmap)); 1242c8263e704135436f71a585801966294d6deadeebepoger@google.com if (!errors.isEmpty()) { 1243c8263e704135436f71a585801966294d6deadeebepoger@google.com break; 1244c8263e704135436f71a585801966294d6deadeebepoger@google.com } 1245de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com } 1246565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com } 1247de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com return errors; 1248565254bc9343d0befdfbbb97a3dc6d44c6e18658scroggo@google.com } 1249e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com 1250e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com // 1251e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com // member variables. 1252e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com // They are public for now, to allow easier setting by tool_main(). 1253e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com // 1254e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com 12556f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com bool fUseFileHierarchy, fWriteChecksumBasedFilenames; 12565079d2c2a0dc0deacecccc6ef9d1c45c6c7982e4epoger@google.com ErrorCombination fIgnorableErrorTypes; 12573e62ebf93b43139202ce803245411467c7ed13ffcommit-bot@chromium.org SkTArray<SkString> fIgnorableTestNames; 1258e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com 125995146ebc43175ae0c1cd3a116509d92aa1a445abjunov@chromium.org const char* fMismatchPath; 12605f99545de67ee729b4b17f1aae56f8c9dcf460f9epoger@google.com const char* fMissingExpectationsPath; 126195146ebc43175ae0c1cd3a116509d92aa1a445abjunov@chromium.org 1262310478e72c63e639373465216271b81f1e4a9136epoger@google.com // collection of tests that have failed with each ErrorType 1263310478e72c63e639373465216271b81f1e4a9136epoger@google.com SkTArray<SkString> fFailedTests[kLast_ErrorType+1]; 126485195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org SkTArray<SkString> fTestsSkippedOnAllRenderModes; 1265310478e72c63e639373465216271b81f1e4a9136epoger@google.com int fTestsRun; 1266310478e72c63e639373465216271b81f1e4a9136epoger@google.com SkTDict<int> fRenderModesEncountered; 126757f7abc8659f17e58fc2d1410117033ad524f9d3epoger@google.com 1268908f5836626d792c5e33ad93f44c6a418a0cc8f5epoger@google.com // Where to read expectations (expected image hash digests, etc.) from. 126937269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com // If unset, we don't do comparisons. 127037269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com SkAutoTUnref<ExpectationsSource> fExpectationsSource; 127137269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com 127237269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com // JSON summaries that we generate as we go (just for output). 1273ee8a8e3931c1d3f39755ee8beaf0c7cb1ba91888epoger@google.com Json::Value fJsonExpectedResults; 1274ee8a8e3931c1d3f39755ee8beaf0c7cb1ba91888epoger@google.com Json::Value fJsonActualResults_Failed; 1275ee8a8e3931c1d3f39755ee8beaf0c7cb1ba91888epoger@google.com Json::Value fJsonActualResults_FailureIgnored; 12769c56a8dea6587242671fb36db3940277db6018dbepoger@google.com Json::Value fJsonActualResults_NoComparison; 1277ee8a8e3931c1d3f39755ee8beaf0c7cb1ba91888epoger@google.com Json::Value fJsonActualResults_Succeeded; 1278de96163a80167636d95837f9ee6a2e98baf9d350epoger@google.com}; // end of GMMain class definition 127972c9672ce274a3b6cb40800d66374edf25b157a3scroggo@google.com 1280cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#if SK_SUPPORT_GPU 1281cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.comstatic const GLContextType kDontCare_GLContextType = GrContextFactory::kNative_GLContextType; 1282cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#else 1283cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.comstatic const GLContextType kDontCare_GLContextType = 0; 1284cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#endif 12857361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com 12869875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.comstatic const ConfigData gRec[] = { 1287ddd014e65264e3f18b2d4305dd2fbc81549f5180reed { kN32_SkColorType, kRaster_Backend, kDontCare_GLContextType, 0, kRW_ConfigFlag, "8888", true }, 1288ddd014e65264e3f18b2d4305dd2fbc81549f5180reed { kRGB_565_SkColorType, kRaster_Backend, kDontCare_GLContextType, 0, kRW_ConfigFlag, "565", true }, 12894c75f241cb75f202cfa51569ba8dc4749a28a9f7bsalomon@google.com#if SK_SUPPORT_GPU 1290ddd014e65264e3f18b2d4305dd2fbc81549f5180reed { kN32_SkColorType, kGPU_Backend, GrContextFactory::kNative_GLContextType, 0, kRW_ConfigFlag, "gpu", true }, 1291ddd014e65264e3f18b2d4305dd2fbc81549f5180reed { kN32_SkColorType, kGPU_Backend, GrContextFactory::kNative_GLContextType, 16, kRW_ConfigFlag, "msaa16", false}, 1292ddd014e65264e3f18b2d4305dd2fbc81549f5180reed { kN32_SkColorType, kGPU_Backend, GrContextFactory::kNative_GLContextType, 4, kRW_ConfigFlag, "msaa4", false}, 1293ddd014e65264e3f18b2d4305dd2fbc81549f5180reed { kN32_SkColorType, kGPU_Backend, GrContextFactory::kNVPR_GLContextType, 4, kRW_ConfigFlag, "nvprmsaa4", true }, 1294ddd014e65264e3f18b2d4305dd2fbc81549f5180reed { kN32_SkColorType, kGPU_Backend, GrContextFactory::kNVPR_GLContextType, 16, kRW_ConfigFlag, "nvprmsaa16", false}, 1295c824c83ec1402e68e827e8920278a86793a12c0cepoger@google.com /* The gpudebug context does not generate meaningful images, so don't record 1296c824c83ec1402e68e827e8920278a86793a12c0cepoger@google.com * the images it generates! We only run it to look for asserts. */ 1297ddd014e65264e3f18b2d4305dd2fbc81549f5180reed { kN32_SkColorType, kGPU_Backend, GrContextFactory::kDebug_GLContextType, 0, kNone_ConfigFlag, "gpudebug", kDebugOnly}, 1298d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com /* The gpunull context does the least amount of work possible and doesn't 1299d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com generate meaninful images, so don't record them!. It can be run to 1300d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com isolate the CPU-side processing expense from the GPU-side. 1301d6543e5edae5d2fe9f364a563f41c1654b14e5f4robertphillips@google.com */ 1302ddd014e65264e3f18b2d4305dd2fbc81549f5180reed { kN32_SkColorType, kGPU_Backend, GrContextFactory::kNull_GLContextType, 0, kNone_ConfigFlag, "gpunull", kDebugOnly}, 1303cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#if SK_ANGLE 1304ddd014e65264e3f18b2d4305dd2fbc81549f5180reed { kN32_SkColorType, kGPU_Backend, GrContextFactory::kANGLE_GLContextType, 0, kRW_ConfigFlag, "angle", true }, 1305ddd014e65264e3f18b2d4305dd2fbc81549f5180reed { kN32_SkColorType, kGPU_Backend, GrContextFactory::kANGLE_GLContextType, 16, kRW_ConfigFlag, "anglemsaa16", true }, 1306cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#endif // SK_ANGLE 1307cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#ifdef SK_MESA 1308ddd014e65264e3f18b2d4305dd2fbc81549f5180reed { kN32_SkColorType, kGPU_Backend, GrContextFactory::kMESA_GLContextType, 0, kRW_ConfigFlag, "mesa", true }, 1309cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#endif // SK_MESA 13104c75f241cb75f202cfa51569ba8dc4749a28a9f7bsalomon@google.com#endif // SK_SUPPORT_GPU 1311b29c883fb46ac6099440d82ac57b86d25386daedbungeman@google.com#ifdef SK_SUPPORT_XPS 13127361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com /* At present we have no way of comparing XPS files (either natively or by converting to PNG). */ 1313ddd014e65264e3f18b2d4305dd2fbc81549f5180reed { kN32_SkColorType, kXPS_Backend, kDontCare_GLContextType, 0, kWrite_ConfigFlag, "xps", true }, 1314a73e860923885ae05ae794b40e7e3fe0b1bd8478robertphillips@google.com#endif // SK_SUPPORT_XPS 13157361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com#ifdef SK_SUPPORT_PDF 1316ddd014e65264e3f18b2d4305dd2fbc81549f5180reed { kN32_SkColorType, kPDF_Backend, kDontCare_GLContextType, 0, kRW_ConfigFlag, "pdf", true }, 1317cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#endif // SK_SUPPORT_PDF 131800dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com}; 131900dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com 13205d20caea15b574c9027ea4e695a03c4402e1d832bungeman@google.comstatic bool SkNoRasterizePDF(SkStream*, SkBitmap*) { return false; } 13215d20caea15b574c9027ea4e695a03c4402e1d832bungeman@google.com 13220dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.orgstatic const PDFRasterizerData kPDFRasterizers[] = { 13230dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org#ifdef SK_BUILD_FOR_MAC 13240dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org { &SkPDFDocumentToBitmap, "mac", true }, 13250dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org#endif 13260dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org#ifdef SK_BUILD_POPPLER 13270dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org { &SkPopplerRasterizePDF, "poppler", true }, 13280dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org#endif 1329ffd178c84d85a12016d844d1b9b3fe2172e32a74commit-bot@chromium.org#ifdef SK_BUILD_NATIVE_PDF_RENDERER 1330ffd178c84d85a12016d844d1b9b3fe2172e32a74commit-bot@chromium.org { &SkNativeRasterizePDF, "native", true }, 1331ffd178c84d85a12016d844d1b9b3fe2172e32a74commit-bot@chromium.org#endif // SK_BUILD_NATIVE_PDF_RENDERER 13325d20caea15b574c9027ea4e695a03c4402e1d832bungeman@google.com // The following exists so that this array is never zero length. 13335d20caea15b574c9027ea4e695a03c4402e1d832bungeman@google.com { &SkNoRasterizePDF, "none", false}, 13340dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org}; 13350dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org 1336dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.comstatic const char kDefaultsConfigStr[] = "defaults"; 1337dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.comstatic const char kExcludeConfigChar = '~'; 1338dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com 133909fd4d216963c498c24ba355accce9337a5029a8scroggo@google.comstatic SkString configUsage() { 13400f567c6cb6944d0fc1ce18214c3459ba6b23fdf0scroggo@google.com SkString result; 13410f567c6cb6944d0fc1ce18214c3459ba6b23fdf0scroggo@google.com result.appendf("Space delimited list of which configs to run. Possible options: ["); 13425867c0f03262a3ce11c6790d5bd75ce0ebcb197cscroggo@google.com for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); ++i) { 1343dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com SkASSERT(gRec[i].fName != kDefaultsConfigStr); 13445867c0f03262a3ce11c6790d5bd75ce0ebcb197cscroggo@google.com if (i > 0) { 13450f567c6cb6944d0fc1ce18214c3459ba6b23fdf0scroggo@google.com result.append("|"); 13465867c0f03262a3ce11c6790d5bd75ce0ebcb197cscroggo@google.com } 134709fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com result.appendf("%s", gRec[i].fName); 13485867c0f03262a3ce11c6790d5bd75ce0ebcb197cscroggo@google.com } 13490f567c6cb6944d0fc1ce18214c3459ba6b23fdf0scroggo@google.com result.append("]\n"); 13500f567c6cb6944d0fc1ce18214c3459ba6b23fdf0scroggo@google.com result.appendf("The default value is: \""); 1351dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com SkString firstDefault; 1352dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com SkString allButFirstDefaults; 1353dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com SkString nonDefault; 13540f567c6cb6944d0fc1ce18214c3459ba6b23fdf0scroggo@google.com for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); ++i) { 13550f567c6cb6944d0fc1ce18214c3459ba6b23fdf0scroggo@google.com if (gRec[i].fRunByDefault) { 13560f567c6cb6944d0fc1ce18214c3459ba6b23fdf0scroggo@google.com if (i > 0) { 13570f567c6cb6944d0fc1ce18214c3459ba6b23fdf0scroggo@google.com result.append(" "); 13580f567c6cb6944d0fc1ce18214c3459ba6b23fdf0scroggo@google.com } 1359dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com result.append(gRec[i].fName); 1360dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com if (firstDefault.isEmpty()) { 1361dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com firstDefault = gRec[i].fName; 1362dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com } else { 1363dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com if (!allButFirstDefaults.isEmpty()) { 1364dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com allButFirstDefaults.append(" "); 1365dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com } 1366dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com allButFirstDefaults.append(gRec[i].fName); 1367dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com } 1368dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com } else { 1369dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com nonDefault = gRec[i].fName; 13700f567c6cb6944d0fc1ce18214c3459ba6b23fdf0scroggo@google.com } 13710f567c6cb6944d0fc1ce18214c3459ba6b23fdf0scroggo@google.com } 1372dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com result.append("\"\n"); 1373dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com result.appendf("\"%s\" evaluates to the default set of configs.\n", kDefaultsConfigStr); 1374dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com result.appendf("Prepending \"%c\" on a config name excludes it from the set of configs to run.\n" 1375dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com "Exclusions always override inclusions regardless of order.\n", 1376dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com kExcludeConfigChar); 1377dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com result.appendf("E.g. \"--config %s %c%s %s\" will run these configs:\n\t%s %s", 1378dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com kDefaultsConfigStr, 1379dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com kExcludeConfigChar, 1380dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com firstDefault.c_str(), 1381dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com nonDefault.c_str(), 1382dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com allButFirstDefaults.c_str(), 1383dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com nonDefault.c_str()); 138409fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com return result; 138509fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com} 138609fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com 13870dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.orgstatic SkString pdfRasterizerUsage() { 13880dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org SkString result; 13890dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org result.appendf("Space delimited list of which PDF rasterizers to run. Possible options: ["); 13900dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org // For this (and further) loops through kPDFRasterizers, there is a typecast to int to avoid 13910dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org // the compiler giving an "comparison of unsigned expression < 0 is always false" warning 13920dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org // and turning it into a build-breaking error. 13930dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org for (int i = 0; i < (int)SK_ARRAY_COUNT(kPDFRasterizers); ++i) { 13940dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org if (i > 0) { 13950dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org result.append(" "); 13960dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org } 13970dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org result.append(kPDFRasterizers[i].fName); 13980dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org } 13990dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org result.append("]\n"); 14000dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org result.append("The default value is: \""); 14010dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org for (int i = 0; i < (int)SK_ARRAY_COUNT(kPDFRasterizers); ++i) { 14020dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org if (kPDFRasterizers[i].fRunByDefault) { 14030dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org if (i > 0) { 14040dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org result.append(" "); 14050dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org } 14060dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org result.append(kPDFRasterizers[i].fName); 14070dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org } 14080dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org } 14090dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org result.append("\""); 14100dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org return result; 14110dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org} 14120dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org 14136f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com// Macro magic to convert a numeric preprocessor token into a string. 14146f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com// Adapted from http://stackoverflow.com/questions/240353/convert-a-preprocessor-token-to-a-string 14156f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com// This should probably be moved into one of our common headers... 14166f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com#define TOSTRING_INTERNAL(x) #x 14176f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com#define TOSTRING(x) TOSTRING_INTERNAL(x) 14186f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com 14197d519305bb52eadf6b8265c6720642193791a364scroggo@google.com// Alphabetized ignoring "no" prefix ("readPath", "noreplay", "resourcePath"). 14200f567c6cb6944d0fc1ce18214c3459ba6b23fdf0scroggo@google.comDEFINE_string(config, "", configUsage().c_str()); 1421f8afb2bd5853f9d66448ba1f23251f8c93340bf6vandebo@chromium.orgDEFINE_string(pdfRasterizers, "default", pdfRasterizerUsage().c_str()); 14225e49738c99f573b2e5ba342f6ec8bfa3bcf125e4epoger@google.comDEFINE_bool(deferred, false, "Exercise the deferred rendering test pass."); 1423b17ccc992da94e55cef07cedf5491911d78dfa3fcommit-bot@chromium.orgDEFINE_bool(dryRun, false, "Don't actually run the tests, just print what would have been done."); 142409fd4d216963c498c24ba355accce9337a5029a8scroggo@google.comDEFINE_string(excludeConfig, "", "Space delimited list of configs to skip."); 142509fd4d216963c498c24ba355accce9337a5029a8scroggo@google.comDEFINE_bool(forceBWtext, false, "Disable text anti-aliasing."); 14260b735631b7d22316693629a4110c7e95b2a7633escroggo@google.com#if SK_SUPPORT_GPU 142709fd4d216963c498c24ba355accce9337a5029a8scroggo@google.comDEFINE_string(gpuCacheSize, "", "<bytes> <count>: Limit the gpu cache to byte size or " 14286f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com "object count. " TOSTRING(DEFAULT_CACHE_VALUE) " for either value means " 14296f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com "use the default. 0 for either disables the cache."); 14300b735631b7d22316693629a4110c7e95b2a7633escroggo@google.com#endif 143109fd4d216963c498c24ba355accce9337a5029a8scroggo@google.comDEFINE_bool(hierarchy, false, "Whether to use multilevel directory structure " 143209fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com "when reading/writing files."); 14335079d2c2a0dc0deacecccc6ef9d1c45c6c7982e4epoger@google.comDEFINE_string(ignoreErrorTypes, kDefaultIgnorableErrorTypes.asString(" ").c_str(), 14345079d2c2a0dc0deacecccc6ef9d1c45c6c7982e4epoger@google.com "Space-separated list of ErrorTypes that should be ignored. If any *other* error " 14355079d2c2a0dc0deacecccc6ef9d1c45c6c7982e4epoger@google.com "types are encountered, the tool will exit with a nonzero return value."); 1436f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.comDEFINE_string(ignoreFailuresFile, "", "Path to file containing a list of tests for which we " 1437f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com "should ignore failures.\n" 1438f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com "The file should list one test per line, except for comment lines starting with #"); 14396dda827913a3dbdb84934f4f1d79c0b702169e5ccommit-bot@chromium.orgDEFINE_bool2(leaks, l, false, "show leaked ref cnt'd objects."); 1440512c9b65fc9fd6d298892719aeda2a8bcd377ac5caryclark@google.comDEFINE_string(match, "", "[~][^]substring[$] [...] of test name to run.\n" 1441512c9b65fc9fd6d298892719aeda2a8bcd377ac5caryclark@google.com "Multiple matches may be separated by spaces.\n" 1442512c9b65fc9fd6d298892719aeda2a8bcd377ac5caryclark@google.com "~ causes a matching test to always be skipped\n" 1443512c9b65fc9fd6d298892719aeda2a8bcd377ac5caryclark@google.com "^ requires the start of the test to match\n" 1444512c9b65fc9fd6d298892719aeda2a8bcd377ac5caryclark@google.com "$ requires the end of the test to match\n" 1445512c9b65fc9fd6d298892719aeda2a8bcd377ac5caryclark@google.com "^ and $ requires an exact match\n" 1446512c9b65fc9fd6d298892719aeda2a8bcd377ac5caryclark@google.com "If a test does not match any list entry,\n" 1447512c9b65fc9fd6d298892719aeda2a8bcd377ac5caryclark@google.com "it is skipped unless some list entry starts with ~"); 14485f99545de67ee729b4b17f1aae56f8c9dcf460f9epoger@google.comDEFINE_string(missingExpectationsPath, "", "Write images for tests without expectations " 14495f99545de67ee729b4b17f1aae56f8c9dcf460f9epoger@google.com "into this directory."); 145009fd4d216963c498c24ba355accce9337a5029a8scroggo@google.comDEFINE_string(mismatchPath, "", "Write images for tests that failed due to " 145109fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com "pixel mismatches into this directory."); 145209fd4d216963c498c24ba355accce9337a5029a8scroggo@google.comDEFINE_string(modulo, "", "[--modulo <remainder> <divisor>]: only run tests for which " 145309fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com "testIndex %% divisor == remainder."); 14545e49738c99f573b2e5ba342f6ec8bfa3bcf125e4epoger@google.comDEFINE_bool(pipe, false, "Exercise the SkGPipe replay test pass."); 1455d393b17cf3427bd6f6255f8670067d9aa529e409commit-bot@chromium.orgDEFINE_bool(quadtree, false, "Exercise the QuadTree variant of SkPicture test pass."); 145609fd4d216963c498c24ba355accce9337a5029a8scroggo@google.comDEFINE_string2(readPath, r, "", "Read reference images from this dir, and report " 145709fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com "any differences between those and the newly generated ones."); 14585e49738c99f573b2e5ba342f6ec8bfa3bcf125e4epoger@google.comDEFINE_bool(replay, false, "Exercise the SkPicture replay test pass."); 1459ac8f3a4f133d059c74ea20c106b963235ee6e48edjsollen@google.com#if SK_SUPPORT_GPU 1460ac8f3a4f133d059c74ea20c106b963235ee6e48edjsollen@google.comDEFINE_bool(resetGpuContext, false, "Reset the GrContext prior to running each GM."); 1461ac8f3a4f133d059c74ea20c106b963235ee6e48edjsollen@google.com#endif 14625e49738c99f573b2e5ba342f6ec8bfa3bcf125e4epoger@google.comDEFINE_bool(rtree, false, "Exercise the R-Tree variant of SkPicture test pass."); 14635e49738c99f573b2e5ba342f6ec8bfa3bcf125e4epoger@google.comDEFINE_bool(serialize, false, "Exercise the SkPicture serialization & deserialization test pass."); 1464caac3db48f74676889006b5520b766b572b5e9b2epoger@google.comDEFINE_bool(simulatePipePlaybackFailure, false, "Simulate a rendering failure in pipe mode only."); 146509fd4d216963c498c24ba355accce9337a5029a8scroggo@google.comDEFINE_bool(tiledPipe, false, "Exercise tiled SkGPipe replay."); 14665e49738c99f573b2e5ba342f6ec8bfa3bcf125e4epoger@google.comDEFINE_bool(tileGrid, false, "Exercise the tile grid variant of SkPicture."); 146709fd4d216963c498c24ba355accce9337a5029a8scroggo@google.comDEFINE_string(tileGridReplayScales, "", "Space separated list of floating-point scale " 146809fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com "factors to be used for tileGrid playback testing. Default value: 1.0"); 1469b0f8b430de74a51f35dbfbff5284a04f8d70ec48epoger@google.comDEFINE_bool2(verbose, v, false, "Give more detail (e.g. list all GMs run, more info about " 1470b0f8b430de74a51f35dbfbff5284a04f8d70ec48epoger@google.com "each test)."); 14716f7f14d061b045a58a888ee5450b4596797dc453epoger@google.comDEFINE_bool(writeChecksumBasedFilenames, false, "When writing out actual images, use checksum-" 14726f7f14d061b045a58a888ee5450b4596797dc453epoger@google.com "based filenames, as rebaseline.py will use when downloading them from Google Storage"); 14736f7f14d061b045a58a888ee5450b4596797dc453epoger@google.comDEFINE_string(writeJsonSummaryPath, "", "Write a JSON-formatted result summary to this file."); 147409fd4d216963c498c24ba355accce9337a5029a8scroggo@google.comDEFINE_string2(writePath, w, "", "Write rendered images into this directory."); 1475604e0c249ef0e11a1b8bc41195081363fd86d892scroggo@google.comDEFINE_string2(writePicturePath, p, "", "Write .skp files into this directory."); 1476d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.comDEFINE_int32(pdfJpegQuality, -1, "Encodes images in JPEG at quality level N, " 1477d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com "which can be in range 0-100). N = -1 will disable JPEG compression. " 1478d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com "Default is N = 100, maximum quality."); 1479f4f9df4c193620167dc6f202f1b72245f4a260cdcommit-bot@chromium.org// TODO(edisonn): pass a matrix instead of forcePerspectiveMatrix 1480f4f9df4c193620167dc6f202f1b72245f4a260cdcommit-bot@chromium.org// Either the 9 numbers defining the matrix 1481f4f9df4c193620167dc6f202f1b72245f4a260cdcommit-bot@chromium.org// or probably more readable would be to replace it with a set of a few predicates 1482f4f9df4c193620167dc6f202f1b72245f4a260cdcommit-bot@chromium.org// Like --prerotate 100 200 10 --posttranslate 10, 10 1483f4f9df4c193620167dc6f202f1b72245f4a260cdcommit-bot@chromium.org// Probably define spacial names like centerx, centery, top, bottom, left, right 1484f4f9df4c193620167dc6f202f1b72245f4a260cdcommit-bot@chromium.org// then we can write something reabable like --rotate centerx centery 90 1485f4f9df4c193620167dc6f202f1b72245f4a260cdcommit-bot@chromium.orgDEFINE_bool(forcePerspectiveMatrix, false, "Force a perspective matrix."); 14865e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.orgDEFINE_bool(useDocumentInsteadOfDevice, false, "Use SkDocument::CreateFoo instead of SkFooDevice."); 148773a7ea3ae0d37ee28f90d6b38c49fda052638253edisonn@google.comDEFINE_int32(pdfRasterDpi, 72, "Scale at which at which the non suported " 148873a7ea3ae0d37ee28f90d6b38c49fda052638253edisonn@google.com "features in PDF are rasterized. Must be be in range 0-10000. " 148973a7ea3ae0d37ee28f90d6b38c49fda052638253edisonn@google.com "Default is 72. N = 0 will disable rasterizing features like " 149073a7ea3ae0d37ee28f90d6b38c49fda052638253edisonn@google.com "text shadows or perspective bitmaps."); 1491672588b684d484dce6ae251e9e163e4a46924322reed@google.comstatic SkData* encode_to_dct_data(size_t*, const SkBitmap& bitmap) { 1492d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com // Filter output of warnings that JPEG is not available for the image. 1493608ea6508ae2e9ea05ea863ba50fc27d44d2eae9commit-bot@chromium.org if (bitmap.width() >= 65500 || bitmap.height() >= 65500) return NULL; 1494608ea6508ae2e9ea05ea863ba50fc27d44d2eae9commit-bot@chromium.org if (FLAGS_pdfJpegQuality == -1) return NULL; 1495d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com 1496608ea6508ae2e9ea05ea863ba50fc27d44d2eae9commit-bot@chromium.org SkBitmap bm = bitmap; 1497d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com#if defined(SK_BUILD_FOR_MAC) 1498d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com // Workaround bug #1043 where bitmaps with referenced pixels cause 1499d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com // CGImageDestinationFinalize to crash 1500d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com SkBitmap copy; 1501d5f032d46baa42f836d06d7372fba8f022a20dfacommit-bot@chromium.org bitmap.deepCopyTo(©); 1502608ea6508ae2e9ea05ea863ba50fc27d44d2eae9commit-bot@chromium.org bm = copy; 1503d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com#endif 1504d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com 1505608ea6508ae2e9ea05ea863ba50fc27d44d2eae9commit-bot@chromium.org SkPixelRef* pr = bm.pixelRef(); 1506608ea6508ae2e9ea05ea863ba50fc27d44d2eae9commit-bot@chromium.org if (pr != NULL) { 1507608ea6508ae2e9ea05ea863ba50fc27d44d2eae9commit-bot@chromium.org SkData* data = pr->refEncodedData(); 1508608ea6508ae2e9ea05ea863ba50fc27d44d2eae9commit-bot@chromium.org if (data != NULL) { 1509608ea6508ae2e9ea05ea863ba50fc27d44d2eae9commit-bot@chromium.org return data; 1510608ea6508ae2e9ea05ea863ba50fc27d44d2eae9commit-bot@chromium.org } 1511608ea6508ae2e9ea05ea863ba50fc27d44d2eae9commit-bot@chromium.org } 1512608ea6508ae2e9ea05ea863ba50fc27d44d2eae9commit-bot@chromium.org 1513608ea6508ae2e9ea05ea863ba50fc27d44d2eae9commit-bot@chromium.org return SkImageEncoder::EncodeData(bm, 1514608ea6508ae2e9ea05ea863ba50fc27d44d2eae9commit-bot@chromium.org SkImageEncoder::kJPEG_Type, 1515608ea6508ae2e9ea05ea863ba50fc27d44d2eae9commit-bot@chromium.org FLAGS_pdfJpegQuality); 1516d9dfa18372119c8e1318125d2075fa80e0819094edisonn@google.com} 15177d519305bb52eadf6b8265c6720642193791a364scroggo@google.com 15185867c0f03262a3ce11c6790d5bd75ce0ebcb197cscroggo@google.comstatic int findConfig(const char config[]) { 15195867c0f03262a3ce11c6790d5bd75ce0ebcb197cscroggo@google.com for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); i++) { 15205867c0f03262a3ce11c6790d5bd75ce0ebcb197cscroggo@google.com if (!strcmp(config, gRec[i].fName)) { 152109fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com return (int) i; 15225867c0f03262a3ce11c6790d5bd75ce0ebcb197cscroggo@google.com } 15235867c0f03262a3ce11c6790d5bd75ce0ebcb197cscroggo@google.com } 15245867c0f03262a3ce11c6790d5bd75ce0ebcb197cscroggo@google.com return -1; 15255867c0f03262a3ce11c6790d5bd75ce0ebcb197cscroggo@google.com} 15265867c0f03262a3ce11c6790d5bd75ce0ebcb197cscroggo@google.com 15270dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.orgstatic const PDFRasterizerData* findPDFRasterizer(const char rasterizer[]) { 15280dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org for (int i = 0; i < (int)SK_ARRAY_COUNT(kPDFRasterizers); i++) { 15290dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org if (!strcmp(rasterizer, kPDFRasterizers[i].fName)) { 15300dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org return &kPDFRasterizers[i]; 15310dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org } 15320dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org } 15330dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org return NULL; 15340dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org} 15350dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org 1536fb2cd425c2271c3d42c9667753b33ae71f05ef1breed@google.comtemplate <typename T> void appendUnique(SkTDArray<T>* array, const T& value) { 1537fb2cd425c2271c3d42c9667753b33ae71f05ef1breed@google.com int index = array->find(value); 1538fb2cd425c2271c3d42c9667753b33ae71f05ef1breed@google.com if (index < 0) { 1539fb2cd425c2271c3d42c9667753b33ae71f05ef1breed@google.com *array->append() = value; 1540fb2cd425c2271c3d42c9667753b33ae71f05ef1breed@google.com } 1541fb2cd425c2271c3d42c9667753b33ae71f05ef1breed@google.com} 1542fb2cd425c2271c3d42c9667753b33ae71f05ef1breed@google.com 154380724dfeb320d1152128cd33636c9024952432d3epoger@google.com/** 154480724dfeb320d1152128cd33636c9024952432d3epoger@google.com * Run this test in a number of different drawing modes (pipe, 154580724dfeb320d1152128cd33636c9024952432d3epoger@google.com * deferred, tiled, etc.), confirming that the resulting bitmaps all 154680724dfeb320d1152128cd33636c9024952432d3epoger@google.com * *exactly* match comparisonBitmap. 154780724dfeb320d1152128cd33636c9024952432d3epoger@google.com * 154880724dfeb320d1152128cd33636c9024952432d3epoger@google.com * Returns all errors encountered while doing so. 154980724dfeb320d1152128cd33636c9024952432d3epoger@google.com */ 15506f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.comErrorCombination run_multiple_modes(GMMain &gmmain, GM *gm, const ConfigData &compareConfig, 15516f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com const SkBitmap &comparisonBitmap, 15526f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com const SkTDArray<SkScalar> &tileGridReplayScales); 15536f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.comErrorCombination run_multiple_modes(GMMain &gmmain, GM *gm, const ConfigData &compareConfig, 15546f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com const SkBitmap &comparisonBitmap, 15556f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com const SkTDArray<SkScalar> &tileGridReplayScales) { 15566f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com ErrorCombination errorsForAllModes; 155780724dfeb320d1152128cd33636c9024952432d3epoger@google.com uint32_t gmFlags = gm->getFlags(); 155838aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org const SkString shortNamePlusConfig = gmmain.make_shortname_plus_config(gm->getName(), 1559659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com compareConfig.fName); 1560c8263e704135436f71a585801966294d6deadeebepoger@google.com 1561c8263e704135436f71a585801966294d6deadeebepoger@google.com SkPicture* pict = gmmain.generate_new_picture(gm, kNone_BbhType, 0); 1562c8263e704135436f71a585801966294d6deadeebepoger@google.com SkAutoUnref aur(pict); 1563c8263e704135436f71a585801966294d6deadeebepoger@google.com if (FLAGS_replay) { 1564c8263e704135436f71a585801966294d6deadeebepoger@google.com const char renderModeDescriptor[] = "-replay"; 1565c8263e704135436f71a585801966294d6deadeebepoger@google.com if (gmFlags & GM::kSkipPicture_Flag) { 1566659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com gmmain.RecordTestResults(kIntentionallySkipped_ErrorType, shortNamePlusConfig, 1567659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com renderModeDescriptor); 1568c8263e704135436f71a585801966294d6deadeebepoger@google.com errorsForAllModes.add(kIntentionallySkipped_ErrorType); 1569c8263e704135436f71a585801966294d6deadeebepoger@google.com } else { 157080724dfeb320d1152128cd33636c9024952432d3epoger@google.com SkBitmap bitmap; 157180724dfeb320d1152128cd33636c9024952432d3epoger@google.com gmmain.generate_image_from_picture(gm, compareConfig, pict, &bitmap); 1572c8263e704135436f71a585801966294d6deadeebepoger@google.com errorsForAllModes.add(gmmain.compare_test_results_to_reference_bitmap( 157338aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org gm->getName(), compareConfig.fName, renderModeDescriptor, bitmap, 1574659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com &comparisonBitmap)); 157580724dfeb320d1152128cd33636c9024952432d3epoger@google.com } 1576c8263e704135436f71a585801966294d6deadeebepoger@google.com } 157780724dfeb320d1152128cd33636c9024952432d3epoger@google.com 1578c8263e704135436f71a585801966294d6deadeebepoger@google.com if (FLAGS_serialize) { 1579c8263e704135436f71a585801966294d6deadeebepoger@google.com const char renderModeDescriptor[] = "-serialize"; 1580c8263e704135436f71a585801966294d6deadeebepoger@google.com if (gmFlags & GM::kSkipPicture_Flag) { 1581659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com gmmain.RecordTestResults(kIntentionallySkipped_ErrorType, shortNamePlusConfig, 1582659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com renderModeDescriptor); 1583c8263e704135436f71a585801966294d6deadeebepoger@google.com errorsForAllModes.add(kIntentionallySkipped_ErrorType); 1584c8263e704135436f71a585801966294d6deadeebepoger@google.com } else { 158580724dfeb320d1152128cd33636c9024952432d3epoger@google.com SkPicture* repict = gmmain.stream_to_new_picture(*pict); 158680724dfeb320d1152128cd33636c9024952432d3epoger@google.com SkAutoUnref aurr(repict); 158780724dfeb320d1152128cd33636c9024952432d3epoger@google.com SkBitmap bitmap; 158880724dfeb320d1152128cd33636c9024952432d3epoger@google.com gmmain.generate_image_from_picture(gm, compareConfig, repict, &bitmap); 1589c8263e704135436f71a585801966294d6deadeebepoger@google.com errorsForAllModes.add(gmmain.compare_test_results_to_reference_bitmap( 159038aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org gm->getName(), compareConfig.fName, renderModeDescriptor, bitmap, 1591659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com &comparisonBitmap)); 159280724dfeb320d1152128cd33636c9024952432d3epoger@google.com } 159380724dfeb320d1152128cd33636c9024952432d3epoger@google.com } 159480724dfeb320d1152128cd33636c9024952432d3epoger@google.com 1595c8263e704135436f71a585801966294d6deadeebepoger@google.com if ((1 == FLAGS_writePicturePath.count()) && 1596c8263e704135436f71a585801966294d6deadeebepoger@google.com !(gmFlags & GM::kSkipPicture_Flag)) { 1597c8263e704135436f71a585801966294d6deadeebepoger@google.com const char* pictureSuffix = "skp"; 1598659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com // TODO(epoger): Make sure this still works even though the 1599659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com // filename now contains the config name (it used to contain 1600659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com // just the shortName). I think this is actually an 1601659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com // *improvement*, because now runs with different configs will 1602659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com // write out their SkPictures to separate files rather than 1603659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com // overwriting each other. But we should make sure it doesn't 1604659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com // break anybody. 160538aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org SkString path = gmmain.make_filename(FLAGS_writePicturePath[0], gm->getName(), 1606659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com compareConfig.fName, "", pictureSuffix); 1607c8263e704135436f71a585801966294d6deadeebepoger@google.com SkFILEWStream stream(path.c_str()); 1608c8263e704135436f71a585801966294d6deadeebepoger@google.com pict->serialize(&stream); 160980724dfeb320d1152128cd33636c9024952432d3epoger@google.com } 161080724dfeb320d1152128cd33636c9024952432d3epoger@google.com 1611c8263e704135436f71a585801966294d6deadeebepoger@google.com if (FLAGS_rtree) { 1612c8263e704135436f71a585801966294d6deadeebepoger@google.com const char renderModeDescriptor[] = "-rtree"; 1613d393b17cf3427bd6f6255f8670067d9aa529e409commit-bot@chromium.org if ((gmFlags & GM::kSkipPicture_Flag) || (gmFlags & GM::kSkipTiled_Flag)) { 1614d393b17cf3427bd6f6255f8670067d9aa529e409commit-bot@chromium.org gmmain.RecordTestResults(kIntentionallySkipped_ErrorType, shortNamePlusConfig, 1615d393b17cf3427bd6f6255f8670067d9aa529e409commit-bot@chromium.org renderModeDescriptor); 1616d393b17cf3427bd6f6255f8670067d9aa529e409commit-bot@chromium.org errorsForAllModes.add(kIntentionallySkipped_ErrorType); 1617d393b17cf3427bd6f6255f8670067d9aa529e409commit-bot@chromium.org } else { 1618d393b17cf3427bd6f6255f8670067d9aa529e409commit-bot@chromium.org SkPicture* pict = gmmain.generate_new_picture(gm, kRTree_BbhType, 0); 1619d393b17cf3427bd6f6255f8670067d9aa529e409commit-bot@chromium.org SkAutoUnref aur(pict); 1620d393b17cf3427bd6f6255f8670067d9aa529e409commit-bot@chromium.org SkBitmap bitmap; 1621d393b17cf3427bd6f6255f8670067d9aa529e409commit-bot@chromium.org gmmain.generate_image_from_picture(gm, compareConfig, pict, &bitmap); 1622d393b17cf3427bd6f6255f8670067d9aa529e409commit-bot@chromium.org errorsForAllModes.add(gmmain.compare_test_results_to_reference_bitmap( 1623d393b17cf3427bd6f6255f8670067d9aa529e409commit-bot@chromium.org gm->getName(), compareConfig.fName, renderModeDescriptor, bitmap, 1624d393b17cf3427bd6f6255f8670067d9aa529e409commit-bot@chromium.org &comparisonBitmap)); 1625d393b17cf3427bd6f6255f8670067d9aa529e409commit-bot@chromium.org } 1626d393b17cf3427bd6f6255f8670067d9aa529e409commit-bot@chromium.org } 1627d393b17cf3427bd6f6255f8670067d9aa529e409commit-bot@chromium.org 1628d393b17cf3427bd6f6255f8670067d9aa529e409commit-bot@chromium.org if (FLAGS_quadtree) { 1629d393b17cf3427bd6f6255f8670067d9aa529e409commit-bot@chromium.org const char renderModeDescriptor[] = "-quadtree"; 1630d393b17cf3427bd6f6255f8670067d9aa529e409commit-bot@chromium.org if ((gmFlags & GM::kSkipPicture_Flag) || (gmFlags & GM::kSkipTiled_Flag)) { 1631659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com gmmain.RecordTestResults(kIntentionallySkipped_ErrorType, shortNamePlusConfig, 1632659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com renderModeDescriptor); 1633c8263e704135436f71a585801966294d6deadeebepoger@google.com errorsForAllModes.add(kIntentionallySkipped_ErrorType); 1634c8263e704135436f71a585801966294d6deadeebepoger@google.com } else { 1635d393b17cf3427bd6f6255f8670067d9aa529e409commit-bot@chromium.org SkPicture* pict = gmmain.generate_new_picture(gm, kQuadTree_BbhType, 0); 163680724dfeb320d1152128cd33636c9024952432d3epoger@google.com SkAutoUnref aur(pict); 163780724dfeb320d1152128cd33636c9024952432d3epoger@google.com SkBitmap bitmap; 1638c8263e704135436f71a585801966294d6deadeebepoger@google.com gmmain.generate_image_from_picture(gm, compareConfig, pict, &bitmap); 16396f6568b27eae62fea23ab8192c6da02ab892bb5eepoger@google.com errorsForAllModes.add(gmmain.compare_test_results_to_reference_bitmap( 164038aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org gm->getName(), compareConfig.fName, renderModeDescriptor, bitmap, 1641659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com &comparisonBitmap)); 164280724dfeb320d1152128cd33636c9024952432d3epoger@google.com } 164380724dfeb320d1152128cd33636c9024952432d3epoger@google.com } 164480724dfeb320d1152128cd33636c9024952432d3epoger@google.com 1645c8263e704135436f71a585801966294d6deadeebepoger@google.com if (FLAGS_tileGrid) { 1646c8263e704135436f71a585801966294d6deadeebepoger@google.com for(int scaleIndex = 0; scaleIndex < tileGridReplayScales.count(); ++scaleIndex) { 1647c8263e704135436f71a585801966294d6deadeebepoger@google.com SkScalar replayScale = tileGridReplayScales[scaleIndex]; 1648c8263e704135436f71a585801966294d6deadeebepoger@google.com SkString renderModeDescriptor("-tilegrid"); 1649c8263e704135436f71a585801966294d6deadeebepoger@google.com if (SK_Scalar1 != replayScale) { 1650c8263e704135436f71a585801966294d6deadeebepoger@google.com renderModeDescriptor += "-scale-"; 1651c8263e704135436f71a585801966294d6deadeebepoger@google.com renderModeDescriptor.appendScalar(replayScale); 1652c8263e704135436f71a585801966294d6deadeebepoger@google.com } 165380724dfeb320d1152128cd33636c9024952432d3epoger@google.com 1654c8263e704135436f71a585801966294d6deadeebepoger@google.com if ((gmFlags & GM::kSkipPicture_Flag) || 1655d4d44f08d73933dd64fffa75042aa19d45b772casenorblanco@chromium.org (gmFlags & GM::kSkipTiled_Flag) || 1656c8263e704135436f71a585801966294d6deadeebepoger@google.com ((gmFlags & GM::kSkipScaledReplay_Flag) && replayScale != 1)) { 1657659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com gmmain.RecordTestResults(kIntentionallySkipped_ErrorType, shortNamePlusConfig, 1658c8263e704135436f71a585801966294d6deadeebepoger@google.com renderModeDescriptor.c_str()); 1659c8263e704135436f71a585801966294d6deadeebepoger@google.com errorsForAllModes.add(kIntentionallySkipped_ErrorType); 1660c8263e704135436f71a585801966294d6deadeebepoger@google.com } else { 1661c8263e704135436f71a585801966294d6deadeebepoger@google.com // We record with the reciprocal scale to obtain a replay 1662c8263e704135436f71a585801966294d6deadeebepoger@google.com // result that can be validated against comparisonBitmap. 1663c8263e704135436f71a585801966294d6deadeebepoger@google.com SkScalar recordScale = SkScalarInvert(replayScale); 1664c8263e704135436f71a585801966294d6deadeebepoger@google.com SkPicture* pict = gmmain.generate_new_picture( 16659f1c241e0d8a756fca1ec2dacb565eec83166d5frobertphillips gm, kTileGrid_BbhType, 0, recordScale); 1666c8263e704135436f71a585801966294d6deadeebepoger@google.com SkAutoUnref aur(pict); 1667c8263e704135436f71a585801966294d6deadeebepoger@google.com SkBitmap bitmap; 1668c8263e704135436f71a585801966294d6deadeebepoger@google.com // We cannot yet pass 'true' to generate_image_from_picture to 1669c8263e704135436f71a585801966294d6deadeebepoger@google.com // perform actual tiled rendering (see Issue 1198 - 1670c8263e704135436f71a585801966294d6deadeebepoger@google.com // https://code.google.com/p/skia/issues/detail?id=1198) 1671c8263e704135436f71a585801966294d6deadeebepoger@google.com gmmain.generate_image_from_picture(gm, compareConfig, pict, &bitmap, 1672c8263e704135436f71a585801966294d6deadeebepoger@google.com replayScale /*, true */); 1673c8263e704135436f71a585801966294d6deadeebepoger@google.com errorsForAllModes.add(gmmain.compare_test_results_to_reference_bitmap( 167438aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org gm->getName(), compareConfig.fName, renderModeDescriptor.c_str(), bitmap, 1675659c8c06cdc6c825004515240f81a8dafb2b4b0fepoger@google.com &comparisonBitmap)); 1676c8263e704135436f71a585801966294d6deadeebepoger@google.com } 167780724dfeb320d1152128cd33636c9024952432d3epoger@google.com } 1678c8263e704135436f71a585801966294d6deadeebepoger@google.com } 167980724dfeb320d1152128cd33636c9024952432d3epoger@google.com 1680c8263e704135436f71a585801966294d6deadeebepoger@google.com // run the pipe centric GM steps 1681c8263e704135436f71a585801966294d6deadeebepoger@google.com if (FLAGS_pipe) { 1682c8263e704135436f71a585801966294d6deadeebepoger@google.com errorsForAllModes.add(gmmain.test_pipe_playback(gm, compareConfig, comparisonBitmap, 1683c8263e704135436f71a585801966294d6deadeebepoger@google.com FLAGS_simulatePipePlaybackFailure)); 1684c8263e704135436f71a585801966294d6deadeebepoger@google.com if (FLAGS_tiledPipe) { 1685c8263e704135436f71a585801966294d6deadeebepoger@google.com errorsForAllModes.add(gmmain.test_tiled_pipe_playback(gm, compareConfig, 1686c8263e704135436f71a585801966294d6deadeebepoger@google.com comparisonBitmap)); 168780724dfeb320d1152128cd33636c9024952432d3epoger@google.com } 168880724dfeb320d1152128cd33636c9024952432d3epoger@google.com } 168980724dfeb320d1152128cd33636c9024952432d3epoger@google.com return errorsForAllModes; 169080724dfeb320d1152128cd33636c9024952432d3epoger@google.com} 169180724dfeb320d1152128cd33636c9024952432d3epoger@google.com 169285195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org 169385195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org/** 169485195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org * Run this test in a number of different configs (8888, 565, PDF, 169585195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org * etc.), confirming that the resulting bitmaps match expectations 169685195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org * (which may be different for each config). 169785195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org * 169885195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org * Returns all errors encountered while doing so. 169985195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org */ 170085195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.orgErrorCombination run_multiple_configs(GMMain &gmmain, GM *gm, 170185195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org const SkTDArray<size_t> &configs, 170285195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org const SkTDArray<const PDFRasterizerData*> &pdfRasterizers, 170385195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org const SkTDArray<SkScalar> &tileGridReplayScales, 170485195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org GrContextFactory *grFactory); 170585195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.orgErrorCombination run_multiple_configs(GMMain &gmmain, GM *gm, 170685195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org const SkTDArray<size_t> &configs, 170785195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org const SkTDArray<const PDFRasterizerData*> &pdfRasterizers, 170885195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org const SkTDArray<SkScalar> &tileGridReplayScales, 170985195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org GrContextFactory *grFactory) { 171085195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org const char renderModeDescriptor[] = ""; 171185195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org ErrorCombination errorsForAllConfigs; 171285195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org uint32_t gmFlags = gm->getFlags(); 171385195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org 171485195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org for (int i = 0; i < configs.count(); i++) { 171585195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org ConfigData config = gRec[configs[i]]; 171638aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org const SkString shortNamePlusConfig = gmmain.make_shortname_plus_config(gm->getName(), 171785195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org config.fName); 171885195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org 171985195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org // Skip any tests that we don't even need to try. 172085195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org // If any of these were skipped on a per-GM basis, record them as 172185195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org // kIntentionallySkipped. 172285195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org if (kPDF_Backend == config.fBackend) { 172385195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org if (gmFlags & GM::kSkipPDF_Flag) { 172485195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org gmmain.RecordSkippedTest(shortNamePlusConfig, 172585195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org renderModeDescriptor, 172685195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org config.fBackend); 172785195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org errorsForAllConfigs.add(kIntentionallySkipped_ErrorType); 172885195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org continue; 172985195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org } 173085195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org } 173185195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org if ((gmFlags & GM::kSkip565_Flag) && 173285195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org (kRaster_Backend == config.fBackend) && 1733ddd014e65264e3f18b2d4305dd2fbc81549f5180reed (kRGB_565_SkColorType == config.fColorType)) { 173485195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org gmmain.RecordSkippedTest(shortNamePlusConfig, 173585195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org renderModeDescriptor, 173685195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org config.fBackend); 173785195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org errorsForAllConfigs.add(kIntentionallySkipped_ErrorType); 173885195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org continue; 173985195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org } 174085195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org if (((gmFlags & GM::kSkipGPU_Flag) && kGPU_Backend == config.fBackend) || 174185195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org ((gmFlags & GM::kGPUOnly_Flag) && kGPU_Backend != config.fBackend)) { 174285195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org gmmain.RecordSkippedTest(shortNamePlusConfig, 174385195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org renderModeDescriptor, 174485195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org config.fBackend); 174585195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org errorsForAllConfigs.add(kIntentionallySkipped_ErrorType); 174685195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org continue; 174785195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org } 174885195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org 174985195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org // Now we know that we want to run this test and record its 175085195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org // success or failure. 175185195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org ErrorCombination errorsForThisConfig; 175285195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org GrSurface* gpuTarget = NULL; 175385195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org#if SK_SUPPORT_GPU 175485195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org SkAutoTUnref<GrSurface> auGpuTarget; 175585195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org if ((errorsForThisConfig.isEmpty()) && (kGPU_Backend == config.fBackend)) { 175685195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org if (FLAGS_resetGpuContext) { 175785195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org grFactory->destroyContexts(); 175885195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org } 175985195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org GrContext* gr = grFactory->get(config.fGLContextType); 176085195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org bool grSuccess = false; 176185195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org if (gr) { 176285195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org // create a render target to back the device 176385195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org GrTextureDesc desc; 176485195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org desc.fConfig = kSkia8888_GrPixelConfig; 176585195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org desc.fFlags = kRenderTarget_GrTextureFlagBit; 176685195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org desc.fWidth = gm->getISize().width(); 176785195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org desc.fHeight = gm->getISize().height(); 176885195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org desc.fSampleCnt = config.fSampleCnt; 176985195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org auGpuTarget.reset(gr->createUncachedTexture(desc, NULL, 0)); 177085195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org if (NULL != auGpuTarget) { 177185195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org gpuTarget = auGpuTarget; 177285195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org grSuccess = true; 177385195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org // Set the user specified cache limits if non-default. 177485195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org size_t bytes; 177585195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org int count; 177695c2003740c4cd01fd1b02ed93b9de7227b1d0f5commit-bot@chromium.org gr->getResourceCacheLimits(&count, &bytes); 177785195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org if (DEFAULT_CACHE_VALUE != gGpuCacheSizeBytes) { 177885195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org bytes = static_cast<size_t>(gGpuCacheSizeBytes); 177985195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org } 178085195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org if (DEFAULT_CACHE_VALUE != gGpuCacheSizeCount) { 178185195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org count = gGpuCacheSizeCount; 178285195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org } 178395c2003740c4cd01fd1b02ed93b9de7227b1d0f5commit-bot@chromium.org gr->setResourceCacheLimits(count, bytes); 178485195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org } 178585195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org } 178685195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org if (!grSuccess) { 178785195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org errorsForThisConfig.add(kNoGpuContext_ErrorType); 178885195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org } 178985195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org } 179085195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org#endif 179185195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org 179285195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org SkBitmap comparisonBitmap; 179385195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org 179485195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org const char* writePath; 179585195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org if (FLAGS_writePath.count() == 1) { 179685195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org writePath = FLAGS_writePath[0]; 179785195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org } else { 179885195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org writePath = NULL; 179985195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org } 180085195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org 180185195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org if (errorsForThisConfig.isEmpty()) { 180285195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org errorsForThisConfig.add(gmmain.test_drawing(gm, config, pdfRasterizers, 180385195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org writePath, gpuTarget, 180485195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org &comparisonBitmap)); 180585195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org gmmain.RecordTestResults(errorsForThisConfig, shortNamePlusConfig, ""); 180685195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org } 180785195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org 180885195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org // TODO: run only if gmmain.test_drawing succeeded. 180985195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org if (kRaster_Backend == config.fBackend) { 181085195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org run_multiple_modes(gmmain, gm, config, comparisonBitmap, tileGridReplayScales); 181185195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org } 181285195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org 181385195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org if (FLAGS_deferred && errorsForThisConfig.isEmpty() && 181485195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org (kGPU_Backend == config.fBackend || kRaster_Backend == config.fBackend)) { 181585195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org errorsForThisConfig.add(gmmain.test_deferred_drawing(gm, config, comparisonBitmap, 181685195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org gpuTarget)); 181785195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org } 181885195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org 181985195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org errorsForAllConfigs.add(errorsForThisConfig); 182085195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org } 182185195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org return errorsForAllConfigs; 182285195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org} 182385195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org 182485195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org 1825310478e72c63e639373465216271b81f1e4a9136epoger@google.com/** 1826f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com * Read individual lines from a file, pushing them into the given array. 1827f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com * 1828f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com * @param filename path to the file to read 1829f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com * @param lines array of strings to add the lines to 1830f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com * @returns true if able to read lines from the file 1831f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com */ 1832f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.comstatic bool read_lines_from_file(const char* filename, SkTArray<SkString> &lines) { 1833f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com SkAutoTUnref<SkStream> streamWrapper(SkStream::NewFromFile(filename)); 1834f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com SkStream *stream = streamWrapper.get(); 1835f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com if (!stream) { 18362b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org SkDebugf("unable to read file '%s'\n", filename); 1837f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com return false; 1838f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com } 1839f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com 1840f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com char c; 1841f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com SkString line; 1842f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com while (1 == stream->read(&c, 1)) { 1843f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com // If we hit either CR or LF, we've completed a line. 1844f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com // 1845f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com // TODO: If the file uses both CR and LF, this will return an extra blank 1846f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com // line for each line of the file. Which is OK for current purposes... 1847f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com // 1848f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com // TODO: Does this properly handle unicode? It doesn't matter for 1849f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com // current purposes... 1850f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com if ((c == 0x0d) || (c == 0x0a)) { 1851f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com lines.push_back(line); 1852f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com line.reset(); 1853f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com } else { 1854f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com line.append(&c, 1); 1855f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com } 1856f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com } 1857f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com lines.push_back(line); 1858f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com return true; 1859f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com} 1860f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com 1861f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com/** 1862310478e72c63e639373465216271b81f1e4a9136epoger@google.com * Return a list of all entries in an array of strings as a single string 1863310478e72c63e639373465216271b81f1e4a9136epoger@google.com * of this form: 1864310478e72c63e639373465216271b81f1e4a9136epoger@google.com * "item1", "item2", "item3" 1865310478e72c63e639373465216271b81f1e4a9136epoger@google.com */ 1866310478e72c63e639373465216271b81f1e4a9136epoger@google.comSkString list_all(const SkTArray<SkString> &stringArray); 1867310478e72c63e639373465216271b81f1e4a9136epoger@google.comSkString list_all(const SkTArray<SkString> &stringArray) { 1868310478e72c63e639373465216271b81f1e4a9136epoger@google.com SkString total; 1869310478e72c63e639373465216271b81f1e4a9136epoger@google.com for (int i = 0; i < stringArray.count(); i++) { 1870310478e72c63e639373465216271b81f1e4a9136epoger@google.com if (i > 0) { 1871310478e72c63e639373465216271b81f1e4a9136epoger@google.com total.append(", "); 1872310478e72c63e639373465216271b81f1e4a9136epoger@google.com } 1873310478e72c63e639373465216271b81f1e4a9136epoger@google.com total.append("\""); 1874310478e72c63e639373465216271b81f1e4a9136epoger@google.com total.append(stringArray[i]); 1875310478e72c63e639373465216271b81f1e4a9136epoger@google.com total.append("\""); 1876310478e72c63e639373465216271b81f1e4a9136epoger@google.com } 1877310478e72c63e639373465216271b81f1e4a9136epoger@google.com return total; 1878310478e72c63e639373465216271b81f1e4a9136epoger@google.com} 1879310478e72c63e639373465216271b81f1e4a9136epoger@google.com 1880310478e72c63e639373465216271b81f1e4a9136epoger@google.com/** 1881310478e72c63e639373465216271b81f1e4a9136epoger@google.com * Return a list of configuration names, as a single string of this form: 1882310478e72c63e639373465216271b81f1e4a9136epoger@google.com * "item1", "item2", "item3" 1883310478e72c63e639373465216271b81f1e4a9136epoger@google.com * 1884310478e72c63e639373465216271b81f1e4a9136epoger@google.com * @param configs configurations, as a list of indices into gRec 1885310478e72c63e639373465216271b81f1e4a9136epoger@google.com */ 1886310478e72c63e639373465216271b81f1e4a9136epoger@google.comSkString list_all_config_names(const SkTDArray<size_t> &configs); 1887310478e72c63e639373465216271b81f1e4a9136epoger@google.comSkString list_all_config_names(const SkTDArray<size_t> &configs) { 1888310478e72c63e639373465216271b81f1e4a9136epoger@google.com SkString total; 1889310478e72c63e639373465216271b81f1e4a9136epoger@google.com for (int i = 0; i < configs.count(); i++) { 1890310478e72c63e639373465216271b81f1e4a9136epoger@google.com if (i > 0) { 1891310478e72c63e639373465216271b81f1e4a9136epoger@google.com total.append(", "); 1892310478e72c63e639373465216271b81f1e4a9136epoger@google.com } 1893310478e72c63e639373465216271b81f1e4a9136epoger@google.com total.append("\""); 1894310478e72c63e639373465216271b81f1e4a9136epoger@google.com total.append(gRec[configs[i]].fName); 1895310478e72c63e639373465216271b81f1e4a9136epoger@google.com total.append("\""); 1896310478e72c63e639373465216271b81f1e4a9136epoger@google.com } 1897310478e72c63e639373465216271b81f1e4a9136epoger@google.com return total; 1898310478e72c63e639373465216271b81f1e4a9136epoger@google.com} 1899310478e72c63e639373465216271b81f1e4a9136epoger@google.com 19000dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.orgstatic bool prepare_subdirectories(const char *root, bool useFileHierarchy, 19010dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org const SkTDArray<size_t> &configs, 19020dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org const SkTDArray<const PDFRasterizerData*>& pdfRasterizers) { 1903fdea3259d01572fdc09fec5ae84258a6e162da65epoger@google.com if (!sk_mkdir(root)) { 1904fdea3259d01572fdc09fec5ae84258a6e162da65epoger@google.com return false; 1905fdea3259d01572fdc09fec5ae84258a6e162da65epoger@google.com } 1906fdea3259d01572fdc09fec5ae84258a6e162da65epoger@google.com if (useFileHierarchy) { 1907fdea3259d01572fdc09fec5ae84258a6e162da65epoger@google.com for (int i = 0; i < configs.count(); i++) { 1908fdea3259d01572fdc09fec5ae84258a6e162da65epoger@google.com ConfigData config = gRec[configs[i]]; 1909fdea3259d01572fdc09fec5ae84258a6e162da65epoger@google.com SkString subdir; 1910fdea3259d01572fdc09fec5ae84258a6e162da65epoger@google.com subdir.appendf("%s%c%s", root, SkPATH_SEPARATOR, config.fName); 1911fdea3259d01572fdc09fec5ae84258a6e162da65epoger@google.com if (!sk_mkdir(subdir.c_str())) { 1912fdea3259d01572fdc09fec5ae84258a6e162da65epoger@google.com return false; 1913fdea3259d01572fdc09fec5ae84258a6e162da65epoger@google.com } 19140dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org 19150dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org if (config.fBackend == kPDF_Backend) { 19160dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org for (int j = 0; j < pdfRasterizers.count(); j++) { 19170dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org SkString pdfSubdir = subdir; 19188fc3766c58ec879389c3c83c96a73e50ff59eb78vandebo@chromium.org pdfSubdir.appendf("-%s", pdfRasterizers[j]->fName); 19190dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org if (!sk_mkdir(pdfSubdir.c_str())) { 19200dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org return false; 19210dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org } 19220dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org } 19230dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org } 1924fdea3259d01572fdc09fec5ae84258a6e162da65epoger@google.com } 1925fdea3259d01572fdc09fec5ae84258a6e162da65epoger@google.com } 1926fdea3259d01572fdc09fec5ae84258a6e162da65epoger@google.com return true; 1927fdea3259d01572fdc09fec5ae84258a6e162da65epoger@google.com} 1928fdea3259d01572fdc09fec5ae84258a6e162da65epoger@google.com 1929ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.orgstatic bool parse_flags_configs(SkTDArray<size_t>* outConfigs, 1930ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org GrContextFactory* grFactory) { 1931fb2cd425c2271c3d42c9667753b33ae71f05ef1breed@google.com SkTDArray<size_t> excludeConfigs; 193209fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com 193309fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com for (int i = 0; i < FLAGS_config.count(); i++) { 1934dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com const char* config = FLAGS_config[i]; 1935dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com bool exclude = false; 1936dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com if (*config == kExcludeConfigChar) { 1937dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com exclude = true; 1938dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com config += 1; 1939dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com } 1940dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com int index = findConfig(config); 194109fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com if (index >= 0) { 1942dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com if (exclude) { 1943dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com *excludeConfigs.append() = index; 1944dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com } else { 1945ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org appendUnique<size_t>(outConfigs, index); 1946dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com } 1947dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com } else if (0 == strcmp(kDefaultsConfigStr, config)) { 1948ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org if (exclude) { 19492b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org SkDebugf("%c%s is not allowed.\n", 19502b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org kExcludeConfigChar, kDefaultsConfigStr); 1951ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org return false; 1952ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org } 1953dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com for (size_t c = 0; c < SK_ARRAY_COUNT(gRec); ++c) { 1954dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com if (gRec[c].fRunByDefault) { 1955ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org appendUnique<size_t>(outConfigs, c); 1956dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com } 1957dd8e353bef35b2656b83499289b409af3b0e3f10bsalomon@google.com } 195809fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com } else { 19592b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org SkDebugf("unrecognized config %s\n", config); 1960ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org return false; 196109fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com } 196209fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com } 19637d519305bb52eadf6b8265c6720642193791a364scroggo@google.com 196409fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com for (int i = 0; i < FLAGS_excludeConfig.count(); i++) { 196509fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com int index = findConfig(FLAGS_excludeConfig[i]); 196609fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com if (index >= 0) { 196709fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com *excludeConfigs.append() = index; 19680b735631b7d22316693629a4110c7e95b2a7633escroggo@google.com } else { 19692b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org SkDebugf("unrecognized excludeConfig %s\n", FLAGS_excludeConfig[i]); 1970ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org return false; 197109fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com } 197209fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com } 197309fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com 1974ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org if (outConfigs->count() == 0) { 1975ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org // if no config is specified by user, add the defaults 1976ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); ++i) { 1977ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org if (gRec[i].fRunByDefault) { 1978ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org *outConfigs->append() = i; 1979ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org } 1980ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org } 1981ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org } 1982ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org // now remove any explicitly excluded configs 1983ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org for (int i = 0; i < excludeConfigs.count(); ++i) { 1984ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org int index = outConfigs->find(excludeConfigs[i]); 1985ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org if (index >= 0) { 1986ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org outConfigs->remove(index); 1987ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org // now assert that there was only one copy in configs[] 1988ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org SkASSERT(outConfigs->find(excludeConfigs[i]) < 0); 1989ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org } 1990ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org } 1991fb2cd425c2271c3d42c9667753b33ae71f05ef1breed@google.com 1992ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org#if SK_SUPPORT_GPU 1993ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org SkASSERT(grFactory != NULL); 1994ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org for (int i = 0; i < outConfigs->count(); ++i) { 1995ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org size_t index = (*outConfigs)[i]; 1996ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org if (kGPU_Backend == gRec[index].fBackend) { 1997ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org GrContext* ctx = grFactory->get(gRec[index].fGLContextType); 1998ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org if (NULL == ctx) { 19992b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org SkDebugf("GrContext could not be created for config %s. Config will be skipped.\n", 20002b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org gRec[index].fName); 2001ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org outConfigs->remove(i); 2002ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org --i; 2003ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org continue; 2004ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org } 2005ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org if (gRec[index].fSampleCnt > ctx->getMaxSampleCount()) { 20062b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org SkDebugf("Sample count (%d) of config %s is not supported." 20072b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org " Config will be skipped.\n", 20082b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org gRec[index].fSampleCnt, gRec[index].fName); 2009ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org outConfigs->remove(i); 2010ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org --i; 2011ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org } 20124c75f241cb75f202cfa51569ba8dc4749a28a9f7bsalomon@google.com } 20134c75f241cb75f202cfa51569ba8dc4749a28a9f7bsalomon@google.com } 2014ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org#endif 20154c75f241cb75f202cfa51569ba8dc4749a28a9f7bsalomon@google.com 2016ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org if (outConfigs->isEmpty()) { 20172b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org SkDebugf("No configs to run."); 2018ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org return false; 2019ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org } 2020ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org 2021ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org // now show the user the set of configs that will be run. 2022ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org SkString configStr("These configs will be run:"); 2023ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org // show the user the config that will run. 2024ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org for (int i = 0; i < outConfigs->count(); ++i) { 2025ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org configStr.appendf(" %s", gRec[(*outConfigs)[i]].fName); 2026ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org } 20272b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org SkDebugf("%s\n", configStr.c_str()); 2028ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org 2029ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org return true; 2030ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org} 2031ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org 20320dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.orgstatic bool parse_flags_pdf_rasterizers(const SkTDArray<size_t>& configs, 20330dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org SkTDArray<const PDFRasterizerData*>* outRasterizers) { 20340dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org // No need to run this check (and display the PDF rasterizers message) 20350dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org // if no PDF backends are in the configs. 20360dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org bool configHasPDF = false; 20370dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org for (int i = 0; i < configs.count(); i++) { 20380dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org if (gRec[configs[i]].fBackend == kPDF_Backend) { 20390dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org configHasPDF = true; 20400dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org break; 20410dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org } 20420dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org } 20430dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org if (!configHasPDF) { 20440dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org return true; 20450dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org } 20460dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org 2047f8afb2bd5853f9d66448ba1f23251f8c93340bf6vandebo@chromium.org if (FLAGS_pdfRasterizers.count() == 1 && 2048f8afb2bd5853f9d66448ba1f23251f8c93340bf6vandebo@chromium.org !strcmp(FLAGS_pdfRasterizers[0], "default")) { 20490dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org for (int i = 0; i < (int)SK_ARRAY_COUNT(kPDFRasterizers); ++i) { 20500dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org if (kPDFRasterizers[i].fRunByDefault) { 20510dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org *outRasterizers->append() = &kPDFRasterizers[i]; 20520dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org } 20530dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org } 2054f8afb2bd5853f9d66448ba1f23251f8c93340bf6vandebo@chromium.org } else { 2055f8afb2bd5853f9d66448ba1f23251f8c93340bf6vandebo@chromium.org for (int i = 0; i < FLAGS_pdfRasterizers.count(); i++) { 2056f8afb2bd5853f9d66448ba1f23251f8c93340bf6vandebo@chromium.org const char* rasterizer = FLAGS_pdfRasterizers[i]; 2057f8afb2bd5853f9d66448ba1f23251f8c93340bf6vandebo@chromium.org const PDFRasterizerData* rasterizerPtr = 2058f8afb2bd5853f9d66448ba1f23251f8c93340bf6vandebo@chromium.org findPDFRasterizer(rasterizer); 2059f8afb2bd5853f9d66448ba1f23251f8c93340bf6vandebo@chromium.org if (rasterizerPtr == NULL) { 20602b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org SkDebugf("unrecognized rasterizer %s\n", rasterizer); 2061f8afb2bd5853f9d66448ba1f23251f8c93340bf6vandebo@chromium.org return false; 2062f8afb2bd5853f9d66448ba1f23251f8c93340bf6vandebo@chromium.org } 2063f8afb2bd5853f9d66448ba1f23251f8c93340bf6vandebo@chromium.org appendUnique<const PDFRasterizerData*>(outRasterizers, 2064f8afb2bd5853f9d66448ba1f23251f8c93340bf6vandebo@chromium.org rasterizerPtr); 2065f8afb2bd5853f9d66448ba1f23251f8c93340bf6vandebo@chromium.org } 20660dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org } 20670dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org 20680dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org // now show the user the set of configs that will be run. 20690dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org SkString configStr("These PDF rasterizers will be run:"); 20700dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org // show the user the config that will run. 20710dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org for (int i = 0; i < outRasterizers->count(); ++i) { 20720dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org configStr.appendf(" %s", (*outRasterizers)[i]->fName); 20730dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org } 20742b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org SkDebugf("%s\n", configStr.c_str()); 20750dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org 20760dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org return true; 20770dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org} 20780dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org 2079ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.orgstatic bool parse_flags_ignore_error_types(ErrorCombination* outErrorTypes) { 20809677a84b4055ab084b2aae6adeab31ab1c7a95b7commit-bot@chromium.org if (FLAGS_ignoreErrorTypes.count() > 0) { 2081ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org *outErrorTypes = ErrorCombination(); 20829677a84b4055ab084b2aae6adeab31ab1c7a95b7commit-bot@chromium.org for (int i = 0; i < FLAGS_ignoreErrorTypes.count(); i++) { 20839677a84b4055ab084b2aae6adeab31ab1c7a95b7commit-bot@chromium.org ErrorType type; 20849677a84b4055ab084b2aae6adeab31ab1c7a95b7commit-bot@chromium.org const char *name = FLAGS_ignoreErrorTypes[i]; 20859677a84b4055ab084b2aae6adeab31ab1c7a95b7commit-bot@chromium.org if (!getErrorTypeByName(name, &type)) { 20862b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org SkDebugf("cannot find ErrorType with name '%s'\n", name); 2087ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org return false; 20889677a84b4055ab084b2aae6adeab31ab1c7a95b7commit-bot@chromium.org } else { 2089ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org outErrorTypes->add(type); 20909677a84b4055ab084b2aae6adeab31ab1c7a95b7commit-bot@chromium.org } 20919677a84b4055ab084b2aae6adeab31ab1c7a95b7commit-bot@chromium.org } 20929677a84b4055ab084b2aae6adeab31ab1c7a95b7commit-bot@chromium.org } 2093ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org return true; 2094ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org} 2095ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org 20963a882dda0787e6957cfb37f6b5a68bcd31ce5cf7epoger@google.com/** 20973e62ebf93b43139202ce803245411467c7ed13ffcommit-bot@chromium.org * Replace contents of ignoreTestNames with a list of test names, indicating 20983a882dda0787e6957cfb37f6b5a68bcd31ce5cf7epoger@google.com * which tests' failures should be ignored. 20993a882dda0787e6957cfb37f6b5a68bcd31ce5cf7epoger@google.com */ 21003e62ebf93b43139202ce803245411467c7ed13ffcommit-bot@chromium.orgstatic bool parse_flags_ignore_tests(SkTArray<SkString> &ignoreTestNames) { 21013e62ebf93b43139202ce803245411467c7ed13ffcommit-bot@chromium.org ignoreTestNames.reset(); 2102f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com 2103f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com // Parse --ignoreFailuresFile 2104f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com for (int i = 0; i < FLAGS_ignoreFailuresFile.count(); i++) { 2105f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com SkTArray<SkString> linesFromFile; 2106f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com if (!read_lines_from_file(FLAGS_ignoreFailuresFile[i], linesFromFile)) { 2107f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com return false; 2108f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com } else { 2109f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com for (int j = 0; j < linesFromFile.count(); j++) { 2110f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com SkString thisLine = linesFromFile[j]; 2111f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com if (thisLine.isEmpty() || thisLine.startsWith('#')) { 2112f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com // skip this line 2113f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com } else { 21143e62ebf93b43139202ce803245411467c7ed13ffcommit-bot@chromium.org ignoreTestNames.push_back(thisLine); 2115f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com } 2116f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com } 2117f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com } 2118f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com } 2119f711f320a34216fc9f64839b90b99a1492c54e09epoger@google.com 21203a882dda0787e6957cfb37f6b5a68bcd31ce5cf7epoger@google.com return true; 21213a882dda0787e6957cfb37f6b5a68bcd31ce5cf7epoger@google.com} 21223a882dda0787e6957cfb37f6b5a68bcd31ce5cf7epoger@google.com 2123ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.orgstatic bool parse_flags_modulo(int* moduloRemainder, int* moduloDivisor) { 2124ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org if (FLAGS_modulo.count() == 2) { 2125ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org *moduloRemainder = atoi(FLAGS_modulo[0]); 2126ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org *moduloDivisor = atoi(FLAGS_modulo[1]); 2127ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org if (*moduloRemainder < 0 || *moduloDivisor <= 0 || 2128ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org *moduloRemainder >= *moduloDivisor) { 21292b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org SkDebugf("invalid modulo values."); 2130ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org return false; 2131ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org } 2132ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org } 2133ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org return true; 2134ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org} 21359677a84b4055ab084b2aae6adeab31ab1c7a95b7commit-bot@chromium.org 21369677a84b4055ab084b2aae6adeab31ab1c7a95b7commit-bot@chromium.org#if SK_SUPPORT_GPU 2137ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.orgstatic bool parse_flags_gpu_cache(int* sizeBytes, int* sizeCount) { 21389677a84b4055ab084b2aae6adeab31ab1c7a95b7commit-bot@chromium.org if (FLAGS_gpuCacheSize.count() > 0) { 21399677a84b4055ab084b2aae6adeab31ab1c7a95b7commit-bot@chromium.org if (FLAGS_gpuCacheSize.count() != 2) { 21402b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org SkDebugf("--gpuCacheSize requires two arguments\n"); 2141ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org return false; 21429677a84b4055ab084b2aae6adeab31ab1c7a95b7commit-bot@chromium.org } 2143ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org *sizeBytes = atoi(FLAGS_gpuCacheSize[0]); 2144ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org *sizeCount = atoi(FLAGS_gpuCacheSize[1]); 21459677a84b4055ab084b2aae6adeab31ab1c7a95b7commit-bot@chromium.org } else { 2146ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org *sizeBytes = DEFAULT_CACHE_VALUE; 2147ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org *sizeCount = DEFAULT_CACHE_VALUE; 21489677a84b4055ab084b2aae6adeab31ab1c7a95b7commit-bot@chromium.org } 2149ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org return true; 2150ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org} 21519677a84b4055ab084b2aae6adeab31ab1c7a95b7commit-bot@chromium.org#endif 21529677a84b4055ab084b2aae6adeab31ab1c7a95b7commit-bot@chromium.org 2153ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.orgstatic bool parse_flags_tile_grid_replay_scales(SkTDArray<SkScalar>* outScales) { 2154ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org *outScales->append() = SK_Scalar1; // By default only test at scale 1.0 21559677a84b4055ab084b2aae6adeab31ab1c7a95b7commit-bot@chromium.org if (FLAGS_tileGridReplayScales.count() > 0) { 2156ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org outScales->reset(); 21579677a84b4055ab084b2aae6adeab31ab1c7a95b7commit-bot@chromium.org for (int i = 0; i < FLAGS_tileGridReplayScales.count(); i++) { 21589677a84b4055ab084b2aae6adeab31ab1c7a95b7commit-bot@chromium.org double val = atof(FLAGS_tileGridReplayScales[i]); 21599677a84b4055ab084b2aae6adeab31ab1c7a95b7commit-bot@chromium.org if (0 < val) { 2160ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org *outScales->append() = SkDoubleToScalar(val); 21619677a84b4055ab084b2aae6adeab31ab1c7a95b7commit-bot@chromium.org } 21629677a84b4055ab084b2aae6adeab31ab1c7a95b7commit-bot@chromium.org } 2163ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org if (0 == outScales->count()) { 21649677a84b4055ab084b2aae6adeab31ab1c7a95b7commit-bot@chromium.org // Should have at least one scale 21652b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org SkDebugf("--tileGridReplayScales requires at least one scale.\n"); 2166ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org return false; 2167c5205629da1e6e4aca83a2a1b3ce08f4bee360fdscroggo@google.com } 2168c5205629da1e6e4aca83a2a1b3ce08f4bee360fdscroggo@google.com } 2169ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org return true; 2170ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org} 21719677a84b4055ab084b2aae6adeab31ab1c7a95b7commit-bot@chromium.org 2172ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.orgstatic bool parse_flags_gmmain_paths(GMMain* gmmain) { 2173ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org gmmain->fUseFileHierarchy = FLAGS_hierarchy; 2174ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org gmmain->fWriteChecksumBasedFilenames = FLAGS_writeChecksumBasedFilenames; 21759677a84b4055ab084b2aae6adeab31ab1c7a95b7commit-bot@chromium.org 2176ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org if (FLAGS_mismatchPath.count() == 1) { 2177ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org gmmain->fMismatchPath = FLAGS_mismatchPath[0]; 2178c5205629da1e6e4aca83a2a1b3ce08f4bee360fdscroggo@google.com } 2179c5205629da1e6e4aca83a2a1b3ce08f4bee360fdscroggo@google.com 2180ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org if (FLAGS_missingExpectationsPath.count() == 1) { 2181ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org gmmain->fMissingExpectationsPath = FLAGS_missingExpectationsPath[0]; 218209fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com } 21838570b5c8695052378491b0c61e745d736fe85c8drobertphillips@google.com 218409fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com if (FLAGS_readPath.count() == 1) { 218509fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com const char* readPath = FLAGS_readPath[0]; 218637269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com if (!sk_exists(readPath)) { 21872b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org SkDebugf("readPath %s does not exist!\n", readPath); 2188ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org return false; 218937269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com } 219037269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com if (sk_isdir(readPath)) { 2191b0f8b430de74a51f35dbfbff5284a04f8d70ec48epoger@google.com if (FLAGS_verbose) { 21922b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org SkDebugf("reading from %s\n", readPath); 2193b0f8b430de74a51f35dbfbff5284a04f8d70ec48epoger@google.com } 2194ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org gmmain->fExpectationsSource.reset(SkNEW_ARGS( 2195b0f8b430de74a51f35dbfbff5284a04f8d70ec48epoger@google.com IndividualImageExpectationsSource, (readPath))); 219637269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com } else { 2197b0f8b430de74a51f35dbfbff5284a04f8d70ec48epoger@google.com if (FLAGS_verbose) { 21982b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org SkDebugf("reading expectations from JSON summary file %s\n", readPath); 2199b0f8b430de74a51f35dbfbff5284a04f8d70ec48epoger@google.com } 2200ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org gmmain->fExpectationsSource.reset(SkNEW_ARGS(JsonExpectationsSource, (readPath))); 220137269607334b99bf814c7dc6b426745d9b7c7e3fepoger@google.com } 2202f32f6e8323d201ede639ba66e1614783428a166dchudy@google.com } 2203ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org return true; 2204ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org} 2205ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org 2206ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.orgstatic bool parse_flags_jpeg_quality() { 2207ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org if (FLAGS_pdfJpegQuality < -1 || FLAGS_pdfJpegQuality > 100) { 22082b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org SkDebugf("%s\n", "pdfJpegQuality must be in [-1 .. 100] range."); 2209ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org return false; 2210ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org } 2211ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org return true; 2212ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org} 2213ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org 2214ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.orgint tool_main(int argc, char** argv); 2215ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.orgint tool_main(int argc, char** argv) { 221630e6e2af14e84216b1c113fd7500d0822bc81daamtklein SetupCrashHandler(); 2217ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org 22186dda827913a3dbdb84934f4f1d79c0b702169e5ccommit-bot@chromium.org SkString usage; 22196dda827913a3dbdb84934f4f1d79c0b702169e5ccommit-bot@chromium.org usage.printf("Run the golden master tests.\n"); 22206dda827913a3dbdb84934f4f1d79c0b702169e5ccommit-bot@chromium.org SkCommandLineFlags::SetUsage(usage.c_str()); 22216dda827913a3dbdb84934f4f1d79c0b702169e5ccommit-bot@chromium.org SkCommandLineFlags::Parse(argc, argv); 22226dda827913a3dbdb84934f4f1d79c0b702169e5ccommit-bot@chromium.org 2223ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org#if SK_ENABLE_INST_COUNT 22246dda827913a3dbdb84934f4f1d79c0b702169e5ccommit-bot@chromium.org if (FLAGS_leaks) { 22256dda827913a3dbdb84934f4f1d79c0b702169e5ccommit-bot@chromium.org gPrintInstCount = true; 22266dda827913a3dbdb84934f4f1d79c0b702169e5ccommit-bot@chromium.org } 2227ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org#endif 2228ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org 2229ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org SkGraphics::Init(); 2230ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org 2231ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org setSystemPreferences(); 2232ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org GMMain gmmain; 2233ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org 2234ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org SkTDArray<size_t> configs; 22350dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org 2236ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org int moduloRemainder = -1; 2237ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org int moduloDivisor = -1; 22380dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org SkTDArray<const PDFRasterizerData*> pdfRasterizers; 2239ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org SkTDArray<SkScalar> tileGridReplayScales; 2240ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org#if SK_SUPPORT_GPU 2241ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org GrContextFactory* grFactory = new GrContextFactory; 2242ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org#else 2243ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org GrContextFactory* grFactory = NULL; 2244ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org#endif 2245ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org 2246b17ccc992da94e55cef07cedf5491911d78dfa3fcommit-bot@chromium.org if (FLAGS_dryRun) { 2247b17ccc992da94e55cef07cedf5491911d78dfa3fcommit-bot@chromium.org SkDebugf( "Doing a dry run; no tests will actually be executed.\n"); 2248b17ccc992da94e55cef07cedf5491911d78dfa3fcommit-bot@chromium.org } 2249b17ccc992da94e55cef07cedf5491911d78dfa3fcommit-bot@chromium.org 2250ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org if (!parse_flags_modulo(&moduloRemainder, &moduloDivisor) || 2251ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org !parse_flags_ignore_error_types(&gmmain.fIgnorableErrorTypes) || 22523e62ebf93b43139202ce803245411467c7ed13ffcommit-bot@chromium.org !parse_flags_ignore_tests(gmmain.fIgnorableTestNames) || 2253ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org#if SK_SUPPORT_GPU 2254ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org !parse_flags_gpu_cache(&gGpuCacheSizeBytes, &gGpuCacheSizeCount) || 2255ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org#endif 2256ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org !parse_flags_tile_grid_replay_scales(&tileGridReplayScales) || 2257ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org !parse_flags_jpeg_quality() || 2258ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org !parse_flags_configs(&configs, grFactory) || 22590dcbece326ce2fa1f9046aa69a21bb99de08714avandebo@chromium.org !parse_flags_pdf_rasterizers(configs, &pdfRasterizers) || 2260ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org !parse_flags_gmmain_paths(&gmmain)) { 2261ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org return -1; 2262ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org } 2263ab882bf205affcd29f62f764681bfdf09fde004ecommit-bot@chromium.org 2264b0f8b430de74a51f35dbfbff5284a04f8d70ec48epoger@google.com if (FLAGS_verbose) { 2265b0f8b430de74a51f35dbfbff5284a04f8d70ec48epoger@google.com if (FLAGS_writePath.count() == 1) { 22662b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org SkDebugf("writing to %s\n", FLAGS_writePath[0]); 2267b0f8b430de74a51f35dbfbff5284a04f8d70ec48epoger@google.com } 2268fdea3259d01572fdc09fec5ae84258a6e162da65epoger@google.com if (NULL != gmmain.fMismatchPath) { 22692b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org SkDebugf("writing mismatches to %s\n", gmmain.fMismatchPath); 2270fdea3259d01572fdc09fec5ae84258a6e162da65epoger@google.com } 22715f99545de67ee729b4b17f1aae56f8c9dcf460f9epoger@google.com if (NULL != gmmain.fMissingExpectationsPath) { 22722b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org SkDebugf("writing images without expectations to %s\n", 22732b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org gmmain.fMissingExpectationsPath); 22745f99545de67ee729b4b17f1aae56f8c9dcf460f9epoger@google.com } 2275b0f8b430de74a51f35dbfbff5284a04f8d70ec48epoger@google.com if (FLAGS_writePicturePath.count() == 1) { 22762b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org SkDebugf("writing pictures to %s\n", FLAGS_writePicturePath[0]); 2277b0f8b430de74a51f35dbfbff5284a04f8d70ec48epoger@google.com } 2278bcbc1788b478b1e54079318ad073e8490aa66faetfarina if (!GetResourcePath().isEmpty()) { 2279bcbc1788b478b1e54079318ad073e8490aa66faetfarina SkDebugf("reading resources from %s\n", GetResourcePath().c_str()); 2280b0f8b430de74a51f35dbfbff5284a04f8d70ec48epoger@google.com } 22818570b5c8695052378491b0c61e745d736fe85c8drobertphillips@google.com } 22828570b5c8695052378491b0c61e745d736fe85c8drobertphillips@google.com 2283310478e72c63e639373465216271b81f1e4a9136epoger@google.com int gmsRun = 0; 2284ae7b8f3e7ba88baf5f64fdd2f6a70a55367a7ee1reed@google.com int gmIndex = -1; 2285ae7b8f3e7ba88baf5f64fdd2f6a70a55367a7ee1reed@google.com SkString moduloStr; 2286ae7b8f3e7ba88baf5f64fdd2f6a70a55367a7ee1reed@google.com 2287b17ccc992da94e55cef07cedf5491911d78dfa3fcommit-bot@chromium.org if (!FLAGS_dryRun) { 2288b17ccc992da94e55cef07cedf5491911d78dfa3fcommit-bot@chromium.org // If we will be writing out files, prepare subdirectories. 2289b17ccc992da94e55cef07cedf5491911d78dfa3fcommit-bot@chromium.org if (FLAGS_writePath.count() == 1) { 2290b17ccc992da94e55cef07cedf5491911d78dfa3fcommit-bot@chromium.org if (!prepare_subdirectories(FLAGS_writePath[0], gmmain.fUseFileHierarchy, 2291b17ccc992da94e55cef07cedf5491911d78dfa3fcommit-bot@chromium.org configs, pdfRasterizers)) { 2292b17ccc992da94e55cef07cedf5491911d78dfa3fcommit-bot@chromium.org return -1; 2293b17ccc992da94e55cef07cedf5491911d78dfa3fcommit-bot@chromium.org } 2294e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com } 2295b17ccc992da94e55cef07cedf5491911d78dfa3fcommit-bot@chromium.org if (NULL != gmmain.fMismatchPath) { 2296b17ccc992da94e55cef07cedf5491911d78dfa3fcommit-bot@chromium.org if (!prepare_subdirectories(gmmain.fMismatchPath, gmmain.fUseFileHierarchy, 2297b17ccc992da94e55cef07cedf5491911d78dfa3fcommit-bot@chromium.org configs, pdfRasterizers)) { 2298b17ccc992da94e55cef07cedf5491911d78dfa3fcommit-bot@chromium.org return -1; 2299b17ccc992da94e55cef07cedf5491911d78dfa3fcommit-bot@chromium.org } 2300e8ebeb1f8fde6525bbab988c6090a5d3ab19855bepoger@google.com } 2301b17ccc992da94e55cef07cedf5491911d78dfa3fcommit-bot@chromium.org if (NULL != gmmain.fMissingExpectationsPath) { 2302b17ccc992da94e55cef07cedf5491911d78dfa3fcommit-bot@chromium.org if (!prepare_subdirectories(gmmain.fMissingExpectationsPath, gmmain.fUseFileHierarchy, 2303b17ccc992da94e55cef07cedf5491911d78dfa3fcommit-bot@chromium.org configs, pdfRasterizers)) { 2304b17ccc992da94e55cef07cedf5491911d78dfa3fcommit-bot@chromium.org return -1; 2305b17ccc992da94e55cef07cedf5491911d78dfa3fcommit-bot@chromium.org } 23065f99545de67ee729b4b17f1aae56f8c9dcf460f9epoger@google.com } 23075f99545de67ee729b4b17f1aae56f8c9dcf460f9epoger@google.com } 23087361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com Iter iter; 23097361f54294d65a5c42ce5cf1cd56d0fd7122e268bsalomon@google.com GM* gm; 231000dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com while ((gm = iter.next()) != NULL) { 2311f4f9df4c193620167dc6f202f1b72245f4a260cdcommit-bot@chromium.org if (FLAGS_forcePerspectiveMatrix) { 2312f4f9df4c193620167dc6f202f1b72245f4a260cdcommit-bot@chromium.org SkMatrix perspective; 2313f4f9df4c193620167dc6f202f1b72245f4a260cdcommit-bot@chromium.org perspective.setIdentity(); 2314f4f9df4c193620167dc6f202f1b72245f4a260cdcommit-bot@chromium.org perspective.setPerspY(SkScalarDiv(SK_Scalar1, SkIntToScalar(1000))); 2315f4f9df4c193620167dc6f202f1b72245f4a260cdcommit-bot@chromium.org perspective.setSkewX(SkScalarDiv(SkIntToScalar(8), 2316f4f9df4c193620167dc6f202f1b72245f4a260cdcommit-bot@chromium.org SkIntToScalar(25))); 2317f4f9df4c193620167dc6f202f1b72245f4a260cdcommit-bot@chromium.org 2318f4f9df4c193620167dc6f202f1b72245f4a260cdcommit-bot@chromium.org gm->setStarterMatrix(perspective); 231965caeaf32d09f5886f3c740cfef2f1c26ef9cb50skia.committer@gmail.com } 23207fd2d70ad39661588de5910abe1006e073419f20scroggo@google.com SkAutoTDelete<GM> adgm(gm); 2321ae7b8f3e7ba88baf5f64fdd2f6a70a55367a7ee1reed@google.com ++gmIndex; 232282cb65ba18150e1ff5b6a0e78a8630d59d4d4af9epoger@google.com if (moduloRemainder >= 0) { 232382cb65ba18150e1ff5b6a0e78a8630d59d4d4af9epoger@google.com if ((gmIndex % moduloDivisor) != moduloRemainder) { 2324ae7b8f3e7ba88baf5f64fdd2f6a70a55367a7ee1reed@google.com continue; 2325ae7b8f3e7ba88baf5f64fdd2f6a70a55367a7ee1reed@google.com } 232682cb65ba18150e1ff5b6a0e78a8630d59d4d4af9epoger@google.com moduloStr.printf("[%d.%d] ", gmIndex, moduloDivisor); 2327ae7b8f3e7ba88baf5f64fdd2f6a70a55367a7ee1reed@google.com } 2328ae7b8f3e7ba88baf5f64fdd2f6a70a55367a7ee1reed@google.com 232938aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org const char* shortName = gm->getName(); 2330586db93c447b753364d50fadc5426de4fef9a759sglez@google.com 2331a6f37e77c1c95f0a06ac55ff659cb7b8dfabefcfcommit-bot@chromium.org if (SkCommandLineFlags::ShouldSkip(FLAGS_match, shortName)) { 2332ece2b0297c1d55c46b4c63ba7a54f518a490a502reed@google.com continue; 2333ece2b0297c1d55c46b4c63ba7a54f518a490a502reed@google.com } 2334ece2b0297c1d55c46b4c63ba7a54f518a490a502reed@google.com 2335310478e72c63e639373465216271b81f1e4a9136epoger@google.com gmsRun++; 23369875dd14af6d768da8d1a4be58b98fc91ceca0ddtomhudson@google.com SkISize size = gm->getISize(); 23372b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org SkDebugf("%sdrawing... %s [%d %d]\n", moduloStr.c_str(), shortName, 23382b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org size.width(), size.height()); 2339b17ccc992da94e55cef07cedf5491911d78dfa3fcommit-bot@chromium.org if (!FLAGS_dryRun) 2340b17ccc992da94e55cef07cedf5491911d78dfa3fcommit-bot@chromium.org run_multiple_configs(gmmain, gm, configs, pdfRasterizers, tileGridReplayScales, grFactory); 234100dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com } 2342310478e72c63e639373465216271b81f1e4a9136epoger@google.com 2343b17ccc992da94e55cef07cedf5491911d78dfa3fcommit-bot@chromium.org if (FLAGS_dryRun) 2344b17ccc992da94e55cef07cedf5491911d78dfa3fcommit-bot@chromium.org return 0; 2345b17ccc992da94e55cef07cedf5491911d78dfa3fcommit-bot@chromium.org 2346310478e72c63e639373465216271b81f1e4a9136epoger@google.com SkTArray<SkString> modes; 2347310478e72c63e639373465216271b81f1e4a9136epoger@google.com gmmain.GetRenderModesEncountered(modes); 234885195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org int modeCount = modes.count(); 234985195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org 235085195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org // Now that we have run all the tests and thus know the full set of renderModes that we 235185195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org // tried to run, we can call RecordTestResults() to record the cases in which we skipped 235285195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org // ALL renderModes. 235385195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org // See http://skbug.com/1994 and https://codereview.chromium.org/129203002/ 235485195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org int testCount = gmmain.fTestsSkippedOnAllRenderModes.count(); 235585195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org for (int testNum = 0; testNum < testCount; ++testNum) { 235685195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org const SkString &shortNamePlusConfig = gmmain.fTestsSkippedOnAllRenderModes[testNum]; 235785195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org for (int modeNum = 0; modeNum < modeCount; ++modeNum) { 235885195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org gmmain.RecordTestResults(kIntentionallySkipped_ErrorType, shortNamePlusConfig, 235985195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org modes[modeNum].c_str()); 236085195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org } 236185195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org } 236285195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org 2363c8263e704135436f71a585801966294d6deadeebepoger@google.com bool reportError = false; 2364c8263e704135436f71a585801966294d6deadeebepoger@google.com if (gmmain.NumSignificantErrors() > 0) { 2365c8263e704135436f71a585801966294d6deadeebepoger@google.com reportError = true; 2366c8263e704135436f71a585801966294d6deadeebepoger@google.com } 236785195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org 236885195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org // We test every GM against every config, and for every raster config also test every mode. 236985195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org int rasterConfigs = 0; 237085195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org for (int i = 0; i < configs.count(); i++) { 237185195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org if (gRec[configs[i]].fBackend == kRaster_Backend) { 237285195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org rasterConfigs++; 237385195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org } 237485195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org } 237585195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org // For raster configs, we run all renderModes; for non-raster configs, just default renderMode 237685195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org const int expectedNumberOfTests = rasterConfigs * gmsRun * modeCount 237785195486939b19a88b25b3ba0a1ad6640980fb5acommit-bot@chromium.org + (configs.count() - rasterConfigs) * gmsRun; 2378310478e72c63e639373465216271b81f1e4a9136epoger@google.com 2379310478e72c63e639373465216271b81f1e4a9136epoger@google.com // Output summary to stdout. 238051dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com if (FLAGS_verbose) { 23812b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org SkDebugf("Ran %d GMs\n", gmsRun); 23822b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org SkDebugf("... over %2d configs [%s]\n", configs.count(), 23832b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org list_all_config_names(configs).c_str()); 23842b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org SkDebugf("... and %2d modes [%s]\n", modeCount, list_all(modes).c_str()); 23852b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org SkDebugf("... so there should be a total of %d tests.\n", expectedNumberOfTests); 238651dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com } 238751dbabee67ea1285e1115e535d26944d4da99be5epoger@google.com gmmain.ListErrors(FLAGS_verbose); 23885f9f2f574fe9b195f5f3e40edeb2e28b673511fdrobertphillips@google.com 238907947d95657743a9c4c3bfec31e1205eb81e5910epoger@google.com // TODO(epoger): Enable this check for Android, too, once we resolve 239007947d95657743a9c4c3bfec31e1205eb81e5910epoger@google.com // https://code.google.com/p/skia/issues/detail?id=1222 239107947d95657743a9c4c3bfec31e1205eb81e5910epoger@google.com // ('GM is unexpectedly skipping tests on Android') 239207947d95657743a9c4c3bfec31e1205eb81e5910epoger@google.com#ifndef SK_BUILD_FOR_ANDROID 2393c8263e704135436f71a585801966294d6deadeebepoger@google.com if (expectedNumberOfTests != gmmain.fTestsRun) { 23942b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org SkDebugf("expected %d tests, but ran or skipped %d tests\n", 23952b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org expectedNumberOfTests, gmmain.fTestsRun); 2396c8263e704135436f71a585801966294d6deadeebepoger@google.com reportError = true; 2397c8263e704135436f71a585801966294d6deadeebepoger@google.com } 2398c8263e704135436f71a585801966294d6deadeebepoger@google.com#endif 2399c8263e704135436f71a585801966294d6deadeebepoger@google.com 240009fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com if (FLAGS_writeJsonSummaryPath.count() == 1) { 240176c913db20de7ae1baa49ae66e943bf7f40781ccepoger@google.com Json::Value root = CreateJsonTree( 240276c913db20de7ae1baa49ae66e943bf7f40781ccepoger@google.com gmmain.fJsonExpectedResults, 240376c913db20de7ae1baa49ae66e943bf7f40781ccepoger@google.com gmmain.fJsonActualResults_Failed, gmmain.fJsonActualResults_FailureIgnored, 240476c913db20de7ae1baa49ae66e943bf7f40781ccepoger@google.com gmmain.fJsonActualResults_NoComparison, gmmain.fJsonActualResults_Succeeded); 2405ee8a8e3931c1d3f39755ee8beaf0c7cb1ba91888epoger@google.com std::string jsonStdString = root.toStyledString(); 240609fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com SkFILEWStream stream(FLAGS_writeJsonSummaryPath[0]); 2407ee8a8e3931c1d3f39755ee8beaf0c7cb1ba91888epoger@google.com stream.write(jsonStdString.c_str(), jsonStdString.length()); 2408ee8a8e3931c1d3f39755ee8beaf0c7cb1ba91888epoger@google.com } 2409ee8a8e3931c1d3f39755ee8beaf0c7cb1ba91888epoger@google.com 2410cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#if SK_SUPPORT_GPU 24115f9f2f574fe9b195f5f3e40edeb2e28b673511fdrobertphillips@google.com 24125955202c805c7ef1448103cbf666972ea9d1ded1robertphillips@google.com#if GR_CACHE_STATS 24135f9f2f574fe9b195f5f3e40edeb2e28b673511fdrobertphillips@google.com for (int i = 0; i < configs.count(); i++) { 24145f9f2f574fe9b195f5f3e40edeb2e28b673511fdrobertphillips@google.com ConfigData config = gRec[configs[i]]; 24155f9f2f574fe9b195f5f3e40edeb2e28b673511fdrobertphillips@google.com 2416b0f8b430de74a51f35dbfbff5284a04f8d70ec48epoger@google.com if (FLAGS_verbose && (kGPU_Backend == config.fBackend)) { 24175f9f2f574fe9b195f5f3e40edeb2e28b673511fdrobertphillips@google.com GrContext* gr = grFactory->get(config.fGLContextType); 24185f9f2f574fe9b195f5f3e40edeb2e28b673511fdrobertphillips@google.com 24192b3a204bf68c9e41e62e0f2db5dfe263ea811424commit-bot@chromium.org SkDebugf("config: %s %x\n", config.fName, gr); 24205f9f2f574fe9b195f5f3e40edeb2e28b673511fdrobertphillips@google.com gr->printCacheStats(); 24215f9f2f574fe9b195f5f3e40edeb2e28b673511fdrobertphillips@google.com } 24225f9f2f574fe9b195f5f3e40edeb2e28b673511fdrobertphillips@google.com } 24235f9f2f574fe9b195f5f3e40edeb2e28b673511fdrobertphillips@google.com#endif 24245f9f2f574fe9b195f5f3e40edeb2e28b673511fdrobertphillips@google.com 24258065ec50f1937c1562810bfe2b216abfb98362b3commit-bot@chromium.org#if GR_DUMP_FONT_CACHE 24268065ec50f1937c1562810bfe2b216abfb98362b3commit-bot@chromium.org for (int i = 0; i < configs.count(); i++) { 24278065ec50f1937c1562810bfe2b216abfb98362b3commit-bot@chromium.org ConfigData config = gRec[configs[i]]; 24288065ec50f1937c1562810bfe2b216abfb98362b3commit-bot@chromium.org 24298065ec50f1937c1562810bfe2b216abfb98362b3commit-bot@chromium.org if (kGPU_Backend == config.fBackend) { 24308065ec50f1937c1562810bfe2b216abfb98362b3commit-bot@chromium.org GrContext* gr = grFactory->get(config.fGLContextType); 24318065ec50f1937c1562810bfe2b216abfb98362b3commit-bot@chromium.org 24328065ec50f1937c1562810bfe2b216abfb98362b3commit-bot@chromium.org gr->dumpFontCache(); 24338065ec50f1937c1562810bfe2b216abfb98362b3commit-bot@chromium.org } 24348065ec50f1937c1562810bfe2b216abfb98362b3commit-bot@chromium.org } 24358065ec50f1937c1562810bfe2b216abfb98362b3commit-bot@chromium.org#endif 24368065ec50f1937c1562810bfe2b216abfb98362b3commit-bot@chromium.org 2437977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com delete grFactory; 2438cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#endif 2439977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com SkGraphics::Term(); 2440977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com 2441c8263e704135436f71a585801966294d6deadeebepoger@google.com return (reportError) ? -1 : 0; 244200dae86f5872b60927b28a32b375bc01cd7c61c9reed@android.com} 24435987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.com 244409fd4d216963c498c24ba355accce9337a5029a8scroggo@google.comvoid GMMain::installFilter(SkCanvas* canvas) { 244509fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com if (FLAGS_forceBWtext) { 244609fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com canvas->setDrawFilter(SkNEW(BWTextDrawFilter))->unref(); 244709fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com } 244809fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com} 244909fd4d216963c498c24ba355accce9337a5029a8scroggo@google.com 24507158e6acca1b1ecc321d4d514a31cba11b5ead60borenet@google.com#if !defined(SK_BUILD_FOR_IOS) && !defined(SK_BUILD_FOR_NACL) 24515987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.comint main(int argc, char * const argv[]) { 24525987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.com return tool_main(argc, (char**) argv); 24535987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.com} 24545987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.com#endif 2455