| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 /* | 8 /* |
| 9 * Code for the "gm" (Golden Master) rendering comparison tool. | 9 * Code for the "gm" (Golden Master) rendering comparison tool. |
| 10 * | 10 * |
| (...skipping 16 matching lines...) Expand all Loading... |
| 27 #include "SkDrawFilter.h" | 27 #include "SkDrawFilter.h" |
| 28 #include "SkForceLinking.h" | 28 #include "SkForceLinking.h" |
| 29 #include "SkGPipe.h" | 29 #include "SkGPipe.h" |
| 30 #include "SkGraphics.h" | 30 #include "SkGraphics.h" |
| 31 #include "SkImageDecoder.h" | 31 #include "SkImageDecoder.h" |
| 32 #include "SkImageEncoder.h" | 32 #include "SkImageEncoder.h" |
| 33 #include "SkJSONCPP.h" | 33 #include "SkJSONCPP.h" |
| 34 #include "SkOSFile.h" | 34 #include "SkOSFile.h" |
| 35 #include "SkPDFRasterizer.h" | 35 #include "SkPDFRasterizer.h" |
| 36 #include "SkPicture.h" | 36 #include "SkPicture.h" |
| 37 #include "SkQuadTreePicture.h" |
| 37 #include "SkRefCnt.h" | 38 #include "SkRefCnt.h" |
| 39 #include "SkRTreePicture.h" |
| 38 #include "SkScalar.h" | 40 #include "SkScalar.h" |
| 39 #include "SkStream.h" | 41 #include "SkStream.h" |
| 40 #include "SkString.h" | 42 #include "SkString.h" |
| 41 #include "SkSurface.h" | 43 #include "SkSurface.h" |
| 42 #include "SkTArray.h" | 44 #include "SkTArray.h" |
| 43 #include "SkTDict.h" | 45 #include "SkTDict.h" |
| 44 #include "SkTileGridPicture.h" | 46 #include "SkTileGridPicture.h" |
| 45 #include "SamplePipeControllers.h" | 47 #include "SamplePipeControllers.h" |
| 46 | 48 |
| 47 #ifdef SK_DEBUG | 49 #ifdef SK_DEBUG |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 132 kRaster_Backend, | 134 kRaster_Backend, |
| 133 kGPU_Backend, | 135 kGPU_Backend, |
| 134 kPDF_Backend, | 136 kPDF_Backend, |
| 135 kXPS_Backend, | 137 kXPS_Backend, |
| 136 }; | 138 }; |
| 137 | 139 |
| 138 enum BbhType { | 140 enum BbhType { |
| 139 kNone_BbhType, | 141 kNone_BbhType, |
| 140 kRTree_BbhType, | 142 kRTree_BbhType, |
| 141 kTileGrid_BbhType, | 143 kTileGrid_BbhType, |
| 144 kQuadTree_BbhType |
| 142 }; | 145 }; |
| 143 | 146 |
| 144 enum ConfigFlags { | 147 enum ConfigFlags { |
| 145 kNone_ConfigFlag = 0x0, | 148 kNone_ConfigFlag = 0x0, |
| 146 /* Write GM images if a write path is provided. */ | 149 /* Write GM images if a write path is provided. */ |
| 147 kWrite_ConfigFlag = 0x1, | 150 kWrite_ConfigFlag = 0x1, |
| 148 /* Read reference GM images if a read path is provided. */ | 151 /* Read reference GM images if a read path is provided. */ |
| 149 kRead_ConfigFlag = 0x2, | 152 kRead_ConfigFlag = 0x2, |
| 150 kRW_ConfigFlag = (kWrite_ConfigFlag | kRead_ConfigFlag), | 153 kRW_ConfigFlag = (kWrite_ConfigFlag | kRead_ConfigFlag), |
| 151 }; | 154 }; |
| (...skipping 859 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1011 int width = SkScalarCeilToInt(SkScalarMul(SkIntToScalar(gm->getISize().w
idth()), scale)); | 1014 int width = SkScalarCeilToInt(SkScalarMul(SkIntToScalar(gm->getISize().w
idth()), scale)); |
| 1012 int height = SkScalarCeilToInt(SkScalarMul(SkIntToScalar(gm->getISize().
height()), scale)); | 1015 int height = SkScalarCeilToInt(SkScalarMul(SkIntToScalar(gm->getISize().
height()), scale)); |
| 1013 | 1016 |
| 1014 SkAutoTUnref<SkPictureFactory> factory; | 1017 SkAutoTUnref<SkPictureFactory> factory; |
| 1015 if (kTileGrid_BbhType == bbhType) { | 1018 if (kTileGrid_BbhType == bbhType) { |
| 1016 SkTileGridPicture::TileGridInfo info; | 1019 SkTileGridPicture::TileGridInfo info; |
| 1017 info.fMargin.setEmpty(); | 1020 info.fMargin.setEmpty(); |
| 1018 info.fOffset.setZero(); | 1021 info.fOffset.setZero(); |
| 1019 info.fTileInterval.set(16, 16); | 1022 info.fTileInterval.set(16, 16); |
| 1020 factory.reset(SkNEW_ARGS(SkTileGridPictureFactory, (info))); | 1023 factory.reset(SkNEW_ARGS(SkTileGridPictureFactory, (info))); |
| 1021 } | 1024 } else if (kQuadTree_BbhType == bbhType) { |
| 1022 if (kNone_BbhType != bbhType) { | 1025 factory.reset(SkNEW(SkQuadTreePictureFactory)); |
| 1023 recordFlags |= SkPicture::kOptimizeForClippedPlayback_RecordingFlag; | 1026 } else if (kRTree_BbhType == bbhType) { |
| 1027 factory.reset(SkNEW(SkRTreePictureFactory)); |
| 1024 } | 1028 } |
| 1025 SkPictureRecorder recorder(factory); | 1029 SkPictureRecorder recorder(factory); |
| 1026 SkCanvas* cv = recorder.beginRecording(width, height, recordFlags); | 1030 SkCanvas* cv = recorder.beginRecording(width, height, recordFlags); |
| 1027 cv->scale(scale, scale); | 1031 cv->scale(scale, scale); |
| 1028 invokeGM(gm, cv, false, false); | 1032 invokeGM(gm, cv, false, false); |
| 1029 return recorder.endRecording(); | 1033 return recorder.endRecording(); |
| 1030 } | 1034 } |
| 1031 | 1035 |
| 1032 static SkPicture* stream_to_new_picture(const SkPicture& src) { | 1036 static SkPicture* stream_to_new_picture(const SkPicture& src) { |
| 1033 SkDynamicMemoryWStream storage; | 1037 SkDynamicMemoryWStream storage; |
| (...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1442 "^ and $ requires an exact match\n" | 1446 "^ and $ requires an exact match\n" |
| 1443 "If a test does not match any list entry,\n" | 1447 "If a test does not match any list entry,\n" |
| 1444 "it is skipped unless some list entry starts with ~"); | 1448 "it is skipped unless some list entry starts with ~"); |
| 1445 DEFINE_string(missingExpectationsPath, "", "Write images for tests without expec
tations " | 1449 DEFINE_string(missingExpectationsPath, "", "Write images for tests without expec
tations " |
| 1446 "into this directory."); | 1450 "into this directory."); |
| 1447 DEFINE_string(mismatchPath, "", "Write images for tests that failed due to " | 1451 DEFINE_string(mismatchPath, "", "Write images for tests that failed due to " |
| 1448 "pixel mismatches into this directory."); | 1452 "pixel mismatches into this directory."); |
| 1449 DEFINE_string(modulo, "", "[--modulo <remainder> <divisor>]: only run tests for
which " | 1453 DEFINE_string(modulo, "", "[--modulo <remainder> <divisor>]: only run tests for
which " |
| 1450 "testIndex %% divisor == remainder."); | 1454 "testIndex %% divisor == remainder."); |
| 1451 DEFINE_bool(pipe, false, "Exercise the SkGPipe replay test pass."); | 1455 DEFINE_bool(pipe, false, "Exercise the SkGPipe replay test pass."); |
| 1456 DEFINE_bool(quadtree, false, "Exercise the QuadTree variant of SkPicture test pa
ss."); |
| 1452 DEFINE_string2(readPath, r, "", "Read reference images from this dir, and report
" | 1457 DEFINE_string2(readPath, r, "", "Read reference images from this dir, and report
" |
| 1453 "any differences between those and the newly generated ones."); | 1458 "any differences between those and the newly generated ones."); |
| 1454 DEFINE_bool(replay, false, "Exercise the SkPicture replay test pass."); | 1459 DEFINE_bool(replay, false, "Exercise the SkPicture replay test pass."); |
| 1455 #if SK_SUPPORT_GPU | 1460 #if SK_SUPPORT_GPU |
| 1456 DEFINE_bool(resetGpuContext, false, "Reset the GrContext prior to running each G
M."); | 1461 DEFINE_bool(resetGpuContext, false, "Reset the GrContext prior to running each G
M."); |
| 1457 #endif | 1462 #endif |
| 1458 DEFINE_string2(resourcePath, i, "resources", "Directory that stores image resour
ces."); | 1463 DEFINE_string2(resourcePath, i, "resources", "Directory that stores image resour
ces."); |
| 1459 DEFINE_bool(rtree, false, "Exercise the R-Tree variant of SkPicture test pass.")
; | 1464 DEFINE_bool(rtree, false, "Exercise the R-Tree variant of SkPicture test pass.")
; |
| 1460 DEFINE_bool(serialize, false, "Exercise the SkPicture serialization & deserializ
ation test pass."); | 1465 DEFINE_bool(serialize, false, "Exercise the SkPicture serialization & deserializ
ation test pass."); |
| 1461 DEFINE_bool(simulatePipePlaybackFailure, false, "Simulate a rendering failure in
pipe mode only."); | 1466 DEFINE_bool(simulatePipePlaybackFailure, false, "Simulate a rendering failure in
pipe mode only."); |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1600 // overwriting each other. But we should make sure it doesn't | 1605 // overwriting each other. But we should make sure it doesn't |
| 1601 // break anybody. | 1606 // break anybody. |
| 1602 SkString path = gmmain.make_filename(FLAGS_writePicturePath[0], gm->getN
ame(), | 1607 SkString path = gmmain.make_filename(FLAGS_writePicturePath[0], gm->getN
ame(), |
| 1603 compareConfig.fName, "", pictureSuf
fix); | 1608 compareConfig.fName, "", pictureSuf
fix); |
| 1604 SkFILEWStream stream(path.c_str()); | 1609 SkFILEWStream stream(path.c_str()); |
| 1605 pict->serialize(&stream); | 1610 pict->serialize(&stream); |
| 1606 } | 1611 } |
| 1607 | 1612 |
| 1608 if (FLAGS_rtree) { | 1613 if (FLAGS_rtree) { |
| 1609 const char renderModeDescriptor[] = "-rtree"; | 1614 const char renderModeDescriptor[] = "-rtree"; |
| 1610 if ((gmFlags & GM::kSkipPicture_Flag) || | 1615 if ((gmFlags & GM::kSkipPicture_Flag) || (gmFlags & GM::kSkipTiled_Flag)
) { |
| 1611 (gmFlags & GM::kSkipTiled_Flag)) { | |
| 1612 gmmain.RecordTestResults(kIntentionallySkipped_ErrorType, shortNameP
lusConfig, | 1616 gmmain.RecordTestResults(kIntentionallySkipped_ErrorType, shortNameP
lusConfig, |
| 1613 renderModeDescriptor); | 1617 renderModeDescriptor); |
| 1614 errorsForAllModes.add(kIntentionallySkipped_ErrorType); | 1618 errorsForAllModes.add(kIntentionallySkipped_ErrorType); |
| 1615 } else { | 1619 } else { |
| 1616 SkPicture* pict = gmmain.generate_new_picture( | 1620 SkPicture* pict = gmmain.generate_new_picture(gm, kRTree_BbhType, 0)
; |
| 1617 gm, kRTree_BbhType, SkPicture::kOptimizeForClippedPlayback_Recor
dingFlag); | |
| 1618 SkAutoUnref aur(pict); | 1621 SkAutoUnref aur(pict); |
| 1619 SkBitmap bitmap; | 1622 SkBitmap bitmap; |
| 1620 gmmain.generate_image_from_picture(gm, compareConfig, pict, &bitmap)
; | 1623 gmmain.generate_image_from_picture(gm, compareConfig, pict, &bitmap)
; |
| 1621 errorsForAllModes.add(gmmain.compare_test_results_to_reference_bitma
p( | 1624 errorsForAllModes.add(gmmain.compare_test_results_to_reference_bitma
p( |
| 1622 gm->getName(), compareConfig.fName, renderModeDescriptor, bitmap
, | 1625 gm->getName(), compareConfig.fName, renderModeDescriptor, bitmap
, |
| 1623 &comparisonBitmap)); | 1626 &comparisonBitmap)); |
| 1624 } | 1627 } |
| 1625 } | 1628 } |
| 1626 | 1629 |
| 1630 if (FLAGS_quadtree) { |
| 1631 const char renderModeDescriptor[] = "-quadtree"; |
| 1632 if ((gmFlags & GM::kSkipPicture_Flag) || (gmFlags & GM::kSkipTiled_Flag)
) { |
| 1633 gmmain.RecordTestResults(kIntentionallySkipped_ErrorType, shortNameP
lusConfig, |
| 1634 renderModeDescriptor); |
| 1635 errorsForAllModes.add(kIntentionallySkipped_ErrorType); |
| 1636 } else { |
| 1637 SkPicture* pict = gmmain.generate_new_picture(gm, kQuadTree_BbhType,
0); |
| 1638 SkAutoUnref aur(pict); |
| 1639 SkBitmap bitmap; |
| 1640 gmmain.generate_image_from_picture(gm, compareConfig, pict, &bitmap)
; |
| 1641 errorsForAllModes.add(gmmain.compare_test_results_to_reference_bitma
p( |
| 1642 gm->getName(), compareConfig.fName, renderModeDescriptor, bitmap
, |
| 1643 &comparisonBitmap)); |
| 1644 } |
| 1645 } |
| 1646 |
| 1627 if (FLAGS_tileGrid) { | 1647 if (FLAGS_tileGrid) { |
| 1628 for(int scaleIndex = 0; scaleIndex < tileGridReplayScales.count(); ++sca
leIndex) { | 1648 for(int scaleIndex = 0; scaleIndex < tileGridReplayScales.count(); ++sca
leIndex) { |
| 1629 SkScalar replayScale = tileGridReplayScales[scaleIndex]; | 1649 SkScalar replayScale = tileGridReplayScales[scaleIndex]; |
| 1630 SkString renderModeDescriptor("-tilegrid"); | 1650 SkString renderModeDescriptor("-tilegrid"); |
| 1631 if (SK_Scalar1 != replayScale) { | 1651 if (SK_Scalar1 != replayScale) { |
| 1632 renderModeDescriptor += "-scale-"; | 1652 renderModeDescriptor += "-scale-"; |
| 1633 renderModeDescriptor.appendScalar(replayScale); | 1653 renderModeDescriptor.appendScalar(replayScale); |
| 1634 } | 1654 } |
| 1635 | 1655 |
| 1636 if ((gmFlags & GM::kSkipPicture_Flag) || | 1656 if ((gmFlags & GM::kSkipPicture_Flag) || |
| (...skipping 800 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2437 if (FLAGS_forceBWtext) { | 2457 if (FLAGS_forceBWtext) { |
| 2438 canvas->setDrawFilter(SkNEW(BWTextDrawFilter))->unref(); | 2458 canvas->setDrawFilter(SkNEW(BWTextDrawFilter))->unref(); |
| 2439 } | 2459 } |
| 2440 } | 2460 } |
| 2441 | 2461 |
| 2442 #if !defined(SK_BUILD_FOR_IOS) && !defined(SK_BUILD_FOR_NACL) | 2462 #if !defined(SK_BUILD_FOR_IOS) && !defined(SK_BUILD_FOR_NACL) |
| 2443 int main(int argc, char * const argv[]) { | 2463 int main(int argc, char * const argv[]) { |
| 2444 return tool_main(argc, (char**) argv); | 2464 return tool_main(argc, (char**) argv); |
| 2445 } | 2465 } |
| 2446 #endif | 2466 #endif |
| OLD | NEW |