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 * |
11 * If you make changes to this, re-run the self-tests at gm/tests/run.sh | 11 * If you make changes to this, re-run the self-tests at gm/tests/run.sh |
12 * to make sure they still pass... you may need to change the expected | 12 * to make sure they still pass... you may need to change the expected |
13 * results of the self-test. | 13 * results of the self-test. |
14 */ | 14 */ |
15 | 15 |
16 #include "gm.h" | 16 #include "gm.h" |
17 #include "gm_error.h" | 17 #include "gm_error.h" |
18 #include "gm_expectations.h" | 18 #include "gm_expectations.h" |
19 #include "system_preferences.h" | 19 #include "system_preferences.h" |
20 #include "SkBitmap.h" | 20 #include "SkBitmap.h" |
21 #include "SkColorPriv.h" | 21 #include "SkColorPriv.h" |
22 #include "SkCommandLineFlags.h" | 22 #include "SkCommandLineFlags.h" |
23 #include "SkData.h" | 23 #include "SkData.h" |
24 #include "SkDeferredCanvas.h" | 24 #include "SkDeferredCanvas.h" |
25 #include "SkDevice.h" | 25 #include "SkDevice.h" |
| 26 #include "SkDocument.h" |
26 #include "SkDrawFilter.h" | 27 #include "SkDrawFilter.h" |
27 #include "SkForceLinking.h" | 28 #include "SkForceLinking.h" |
28 #include "SkGPipe.h" | 29 #include "SkGPipe.h" |
29 #include "SkGraphics.h" | 30 #include "SkGraphics.h" |
30 #include "SkImageDecoder.h" | 31 #include "SkImageDecoder.h" |
31 #include "SkImageEncoder.h" | 32 #include "SkImageEncoder.h" |
32 #include "SkOSFile.h" | 33 #include "SkOSFile.h" |
33 #include "SkPDFRasterizer.h" | 34 #include "SkPDFRasterizer.h" |
34 #include "SkPicture.h" | 35 #include "SkPicture.h" |
35 #include "SkRefCnt.h" | 36 #include "SkRefCnt.h" |
| 37 #include "SkScalar.h" |
36 #include "SkStream.h" | 38 #include "SkStream.h" |
37 #include "SkTArray.h" | 39 #include "SkTArray.h" |
38 #include "SkTDict.h" | 40 #include "SkTDict.h" |
39 #include "SkTileGridPicture.h" | 41 #include "SkTileGridPicture.h" |
40 #include "SamplePipeControllers.h" | 42 #include "SamplePipeControllers.h" |
41 | 43 |
42 #ifdef SK_DEBUG | 44 #ifdef SK_DEBUG |
43 static const bool kDebugOnly = true; | 45 static const bool kDebugOnly = true; |
44 #else | 46 #else |
45 static const bool kDebugOnly = false; | 47 static const bool kDebugOnly = false; |
(...skipping 562 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
608 } | 610 } |
609 } else { | 611 } else { |
610 SkCanvas canvas(*bitmap); | 612 SkCanvas canvas(*bitmap); |
611 installFilter(&canvas); | 613 installFilter(&canvas); |
612 canvas.scale(scale, scale); | 614 canvas.scale(scale, scale); |
613 canvas.drawPicture(*pict); | 615 canvas.drawPicture(*pict); |
614 complete_bitmap(bitmap); | 616 complete_bitmap(bitmap); |
615 } | 617 } |
616 } | 618 } |
617 | 619 |
618 static void generate_pdf(GM* gm, SkDynamicMemoryWStream& pdf) { | 620 static bool generate_pdf(GM* gm, SkDynamicMemoryWStream& pdf) { |
619 #ifdef SK_SUPPORT_PDF | 621 #ifdef SK_SUPPORT_PDF |
620 SkMatrix initialTransform = gm->getInitialTransform(); | 622 SkMatrix initialTransform = gm->getInitialTransform(); |
621 SkISize pageSize = gm->getISize(); | 623 SkISize pageISize = gm->getISize(); |
622 SkPDFDevice* dev = NULL; | 624 SkAutoTUnref<SkDocument> pdfDoc(SkDocument::CreatePDF(&pdf, NULL, encode
_to_dct_data)); |
623 if (initialTransform.isIdentity()) { | 625 |
624 dev = new SkPDFDevice(pageSize, pageSize, initialTransform); | 626 if (!pdfDoc.get()) { |
625 } else { | 627 return false; |
626 SkRect content = SkRect::MakeWH(SkIntToScalar(pageSize.width()), | |
627 SkIntToScalar(pageSize.height())); | |
628 initialTransform.mapRect(&content); | |
629 content.intersect(0, 0, SkIntToScalar(pageSize.width()), | |
630 SkIntToScalar(pageSize.height())); | |
631 SkISize contentSize = | |
632 SkISize::Make(SkScalarRoundToInt(content.width()), | |
633 SkScalarRoundToInt(content.height())); | |
634 dev = new SkPDFDevice(pageSize, contentSize, initialTransform); | |
635 } | 628 } |
636 dev->setDCTEncoder(encode_to_dct_data); | |
637 SkAutoUnref aur(dev); | |
638 | 629 |
639 SkCanvas c(dev); | 630 SkCanvas* canvas = NULL; |
640 invokeGM(gm, &c, true, false); | 631 canvas = pdfDoc->beginPage(SkIntToScalar(pageISize.width()), |
| 632 SkIntToScalar(pageISize.height())); |
| 633 canvas->concat(initialTransform); |
641 | 634 |
642 SkPDFDocument doc; | 635 invokeGM(gm, canvas, true, false); |
643 doc.appendPage(dev); | 636 |
644 doc.emitPDF(&pdf); | 637 return pdfDoc->close(); |
645 #endif | 638 #endif // SK_SUPPORT_PDF |
| 639 return true; // Do not report failure if pdf is not supported. |
646 } | 640 } |
647 | 641 |
648 static void generate_xps(GM* gm, SkDynamicMemoryWStream& xps) { | 642 static void generate_xps(GM* gm, SkDynamicMemoryWStream& xps) { |
649 #ifdef SK_SUPPORT_XPS | 643 #ifdef SK_SUPPORT_XPS |
650 SkISize size = gm->getISize(); | 644 SkISize size = gm->getISize(); |
651 | 645 |
652 SkSize trimSize = SkSize::Make(SkIntToScalar(size.width()), | 646 SkSize trimSize = SkSize::Make(SkIntToScalar(size.width()), |
653 SkIntToScalar(size.height())); | 647 SkIntToScalar(size.height())); |
654 static const SkScalar inchesPerMeter = SkScalarDiv(10000, 254); | 648 static const SkScalar inchesPerMeter = SkScalarDiv(10000, 254); |
655 static const SkScalar upm = 72 * inchesPerMeter; | 649 static const SkScalar upm = 72 * inchesPerMeter; |
(...skipping 371 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1027 BitmapAndDigest bitmapAndDigest(*bitmap); | 1021 BitmapAndDigest bitmapAndDigest(*bitmap); |
1028 errors.add(compare_test_results_to_stored_expectations( | 1022 errors.add(compare_test_results_to_stored_expectations( |
1029 gm, gRec, gRec.fName, &bitmapAndDigest)); | 1023 gm, gRec, gRec.fName, &bitmapAndDigest)); |
1030 | 1024 |
1031 if (writePath && (gRec.fFlags & kWrite_ConfigFlag)) { | 1025 if (writePath && (gRec.fFlags & kWrite_ConfigFlag)) { |
1032 path = make_bitmap_filename(writePath, gm->shortName(), gRec.fNa
me, | 1026 path = make_bitmap_filename(writePath, gm->shortName(), gRec.fNa
me, |
1033 "", bitmapAndDigest.fDigest); | 1027 "", bitmapAndDigest.fDigest); |
1034 errors.add(write_bitmap(path, bitmapAndDigest.fBitmap)); | 1028 errors.add(write_bitmap(path, bitmapAndDigest.fBitmap)); |
1035 } | 1029 } |
1036 } else if (gRec.fBackend == kPDF_Backend) { | 1030 } else if (gRec.fBackend == kPDF_Backend) { |
1037 generate_pdf(gm, document); | 1031 if (!generate_pdf(gm, document)) { |
| 1032 errors.add(kRenderPdfFailed_ErrorType); |
| 1033 } else { |
| 1034 SkAutoTUnref<SkStreamAsset> documentStream(document.detachAsStre
am()); |
| 1035 if (writePath && (gRec.fFlags & kWrite_ConfigFlag)) { |
| 1036 path = make_filename(writePath, gm->shortName(), gRec.fName,
"", "pdf"); |
| 1037 errors.add(write_document(path, documentStream)); |
| 1038 } |
1038 | 1039 |
1039 SkAutoTUnref<SkStreamAsset> documentStream(document.detachAsStream()
); | 1040 if (!(gm->getFlags() & GM::kSkipPDFRasterization_Flag)) { |
1040 if (writePath && (gRec.fFlags & kWrite_ConfigFlag)) { | 1041 for (int i = 0; i < pdfRasterizers.count(); i++) { |
1041 path = make_filename(writePath, gm->shortName(), gRec.fName, "",
"pdf"); | 1042 SkBitmap pdfBitmap; |
1042 errors.add(write_document(path, documentStream)); | 1043 SkASSERT(documentStream->rewind()); |
1043 } | 1044 bool success = (*pdfRasterizers[i]->fRasterizerFunction)
( |
| 1045 documentStream.get(), &pdfBitmap); |
| 1046 if (!success) { |
| 1047 gm_fprintf(stderr, "FAILED to render PDF for %s usin
g renderer %s\n", |
| 1048 gm->shortName(), |
| 1049 pdfRasterizers[i]->fName); |
| 1050 continue; |
| 1051 } |
1044 | 1052 |
1045 if (!(gm->getFlags() & GM::kSkipPDFRasterization_Flag)) { | 1053 SkString configName(gRec.fName); |
1046 for (int i = 0; i < pdfRasterizers.count(); i++) { | 1054 configName.append("-"); |
1047 SkBitmap pdfBitmap; | 1055 configName.append(pdfRasterizers[i]->fName); |
1048 SkASSERT(documentStream->rewind()); | 1056 |
1049 bool success = (*pdfRasterizers[i]->fRasterizerFunction)( | 1057 BitmapAndDigest bitmapAndDigest(pdfBitmap); |
1050 documentStream.get(), &pdfBitmap); | 1058 errors.add(compare_test_results_to_stored_expectations( |
1051 if (!success) { | 1059 gm, gRec, configName.c_str(), &bitmapAndDiges
t)); |
1052 gm_fprintf(stderr, "FAILED to render PDF for %s using re
nderer %s\n", | 1060 |
1053 gm->shortName(), | 1061 if (writePath && (gRec.fFlags & kWrite_ConfigFlag)) { |
1054 pdfRasterizers[i]->fName); | 1062 path = make_bitmap_filename(writePath, gm->shortName
(), |
1055 continue; | 1063 configName.c_str(), |
| 1064 "", bitmapAndDigest.fDig
est); |
| 1065 errors.add(write_bitmap(path, bitmapAndDigest.fBitma
p)); |
| 1066 } |
1056 } | 1067 } |
1057 | 1068 } else { |
1058 SkString configName(gRec.fName); | 1069 errors.add(kIntentionallySkipped_ErrorType); |
1059 configName.append("-"); | |
1060 configName.append(pdfRasterizers[i]->fName); | |
1061 | |
1062 BitmapAndDigest bitmapAndDigest(pdfBitmap); | |
1063 errors.add(compare_test_results_to_stored_expectations( | |
1064 gm, gRec, configName.c_str(), &bitmapAndDigest)); | |
1065 | |
1066 if (writePath && (gRec.fFlags & kWrite_ConfigFlag)) { | |
1067 path = make_bitmap_filename(writePath, gm->shortName(),
configName.c_str(), | |
1068 "", bitmapAndDigest.fDigest)
; | |
1069 errors.add(write_bitmap(path, bitmapAndDigest.fBitmap)); | |
1070 } | |
1071 } | 1070 } |
1072 } else { | |
1073 errors.add(kIntentionallySkipped_ErrorType); | |
1074 } | 1071 } |
1075 } else if (gRec.fBackend == kXPS_Backend) { | 1072 } else if (gRec.fBackend == kXPS_Backend) { |
1076 generate_xps(gm, document); | 1073 generate_xps(gm, document); |
1077 SkAutoTUnref<SkStreamAsset> documentStream(document.detachAsStream()
); | 1074 SkAutoTUnref<SkStreamAsset> documentStream(document.detachAsStream()
); |
1078 | 1075 |
1079 errors.add(compare_test_results_to_stored_expectations( | 1076 errors.add(compare_test_results_to_stored_expectations( |
1080 gm, gRec, gRec.fName, NULL)); | 1077 gm, gRec, gRec.fName, NULL)); |
1081 | 1078 |
1082 if (writePath && (gRec.fFlags & kWrite_ConfigFlag)) { | 1079 if (writePath && (gRec.fFlags & kWrite_ConfigFlag)) { |
1083 path = make_filename(writePath, gm->shortName(), gRec.fName, "",
"xps"); | 1080 path = make_filename(writePath, gm->shortName(), gRec.fName, "",
"xps"); |
(...skipping 1193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2277 if (FLAGS_forceBWtext) { | 2274 if (FLAGS_forceBWtext) { |
2278 canvas->setDrawFilter(SkNEW(BWTextDrawFilter))->unref(); | 2275 canvas->setDrawFilter(SkNEW(BWTextDrawFilter))->unref(); |
2279 } | 2276 } |
2280 } | 2277 } |
2281 | 2278 |
2282 #if !defined(SK_BUILD_FOR_IOS) && !defined(SK_BUILD_FOR_NACL) | 2279 #if !defined(SK_BUILD_FOR_IOS) && !defined(SK_BUILD_FOR_NACL) |
2283 int main(int argc, char * const argv[]) { | 2280 int main(int argc, char * const argv[]) { |
2284 return tool_main(argc, (char**) argv); | 2281 return tool_main(argc, (char**) argv); |
2285 } | 2282 } |
2286 #endif | 2283 #endif |
OLD | NEW |