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 SkSize pageSize = SkSize::Make(SkIntToScalar(pageISize.width()), |
623 if (initialTransform.isIdentity()) { | 625 SkIntToScalar(pageISize.height())); |
624 dev = new SkPDFDevice(pageSize, pageSize, initialTransform); | 626 SkAutoTUnref<SkDocument> pdfDoc(SkDocument::CreatePDF(&pdf, NULL, encode _to_dct_data)); |
reed1
2013/10/07 13:24:54
Can we move the SUPPORT_PDF check to inside Create
edisonn
2013/10/07 19:29:06
not really. Sk_SUPPORT_PDF is defined for dependen
| |
625 } else { | 627 SkCanvas* canvas = NULL; |
626 SkRect content = SkRect::MakeWH(SkIntToScalar(pageSize.width()), | 628 canvas = pdfDoc->beginPage(pageSize); |
627 SkIntToScalar(pageSize.height())); | 629 canvas->setMatrix(initialTransform); |
reed1
2013/10/07 13:24:54
can this be concat instead of setMatrix? The latte
edisonn
2013/10/07 19:29:06
Done.
| |
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 } | |
636 dev->setDCTEncoder(encode_to_dct_data); | |
637 SkAutoUnref aur(dev); | |
638 | 630 |
639 SkCanvas c(dev); | 631 invokeGM(gm, canvas, true, false); |
640 invokeGM(gm, &c, true, false); | |
641 | 632 |
642 SkPDFDocument doc; | 633 return pdfDoc->close(); |
643 doc.appendPage(dev); | |
644 doc.emitPDF(&pdf); | |
645 #endif | 634 #endif |
646 } | 635 } |
647 | 636 |
648 static void generate_xps(GM* gm, SkDynamicMemoryWStream& xps) { | 637 static void generate_xps(GM* gm, SkDynamicMemoryWStream& xps) { |
649 #ifdef SK_SUPPORT_XPS | 638 #ifdef SK_SUPPORT_XPS |
650 SkISize size = gm->getISize(); | 639 SkISize size = gm->getISize(); |
651 | 640 |
652 SkSize trimSize = SkSize::Make(SkIntToScalar(size.width()), | 641 SkSize trimSize = SkSize::Make(SkIntToScalar(size.width()), |
653 SkIntToScalar(size.height())); | 642 SkIntToScalar(size.height())); |
654 static const SkScalar inchesPerMeter = SkScalarDiv(10000, 254); | 643 static const SkScalar inchesPerMeter = SkScalarDiv(10000, 254); |
(...skipping 372 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1027 BitmapAndDigest bitmapAndDigest(*bitmap); | 1016 BitmapAndDigest bitmapAndDigest(*bitmap); |
1028 errors.add(compare_test_results_to_stored_expectations( | 1017 errors.add(compare_test_results_to_stored_expectations( |
1029 gm, gRec, gRec.fName, &bitmapAndDigest)); | 1018 gm, gRec, gRec.fName, &bitmapAndDigest)); |
1030 | 1019 |
1031 if (writePath && (gRec.fFlags & kWrite_ConfigFlag)) { | 1020 if (writePath && (gRec.fFlags & kWrite_ConfigFlag)) { |
1032 path = make_bitmap_filename(writePath, gm->shortName(), gRec.fNa me, | 1021 path = make_bitmap_filename(writePath, gm->shortName(), gRec.fNa me, |
1033 "", bitmapAndDigest.fDigest); | 1022 "", bitmapAndDigest.fDigest); |
1034 errors.add(write_bitmap(path, bitmapAndDigest.fBitmap)); | 1023 errors.add(write_bitmap(path, bitmapAndDigest.fBitmap)); |
1035 } | 1024 } |
1036 } else if (gRec.fBackend == kPDF_Backend) { | 1025 } else if (gRec.fBackend == kPDF_Backend) { |
1037 generate_pdf(gm, document); | 1026 if (!generate_pdf(gm, document)) { |
1027 errors.add(kRenderPdfFailed_ErrorType); | |
1028 } else { | |
1029 SkAutoTUnref<SkStreamAsset> documentStream(document.detachAsStre am()); | |
1030 if (writePath && (gRec.fFlags & kWrite_ConfigFlag)) { | |
1031 path = make_filename(writePath, gm->shortName(), gRec.fName, "", "pdf"); | |
1032 errors.add(write_document(path, documentStream)); | |
1033 } | |
1038 | 1034 |
1039 SkAutoTUnref<SkStreamAsset> documentStream(document.detachAsStream() ); | 1035 if (!(gm->getFlags() & GM::kSkipPDFRasterization_Flag)) { |
1040 if (writePath && (gRec.fFlags & kWrite_ConfigFlag)) { | 1036 for (int i = 0; i < pdfRasterizers.count(); i++) { |
1041 path = make_filename(writePath, gm->shortName(), gRec.fName, "", "pdf"); | 1037 SkBitmap pdfBitmap; |
1042 errors.add(write_document(path, documentStream)); | 1038 SkASSERT(documentStream->rewind()); |
1043 } | 1039 bool success = (*pdfRasterizers[i]->fRasterizerFunction) ( |
1040 documentStream.get(), &pdfBitmap); | |
1041 if (!success) { | |
1042 gm_fprintf(stderr, "FAILED to render PDF for %s usin g renderer %s\n", | |
1043 gm->shortName(), | |
1044 pdfRasterizers[i]->fName); | |
1045 continue; | |
1046 } | |
1044 | 1047 |
1045 if (!(gm->getFlags() & GM::kSkipPDFRasterization_Flag)) { | 1048 SkString configName(gRec.fName); |
1046 for (int i = 0; i < pdfRasterizers.count(); i++) { | 1049 configName.append("-"); |
1047 SkBitmap pdfBitmap; | 1050 configName.append(pdfRasterizers[i]->fName); |
1048 SkASSERT(documentStream->rewind()); | 1051 |
1049 bool success = (*pdfRasterizers[i]->fRasterizerFunction)( | 1052 BitmapAndDigest bitmapAndDigest(pdfBitmap); |
1050 documentStream.get(), &pdfBitmap); | 1053 errors.add(compare_test_results_to_stored_expectations( |
1051 if (!success) { | 1054 gm, gRec, configName.c_str(), &bitmapAndDiges t)); |
1052 gm_fprintf(stderr, "FAILED to render PDF for %s using re nderer %s\n", | 1055 |
1053 gm->shortName(), | 1056 if (writePath && (gRec.fFlags & kWrite_ConfigFlag)) { |
1054 pdfRasterizers[i]->fName); | 1057 path = make_bitmap_filename(writePath, gm->shortName (), |
1055 continue; | 1058 configName.c_str(), |
1059 "", bitmapAndDigest.fDig est); | |
1060 errors.add(write_bitmap(path, bitmapAndDigest.fBitma p)); | |
1061 } | |
1056 } | 1062 } |
1057 | 1063 } else { |
1058 SkString configName(gRec.fName); | 1064 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 } | 1065 } |
1072 } else { | |
1073 errors.add(kIntentionallySkipped_ErrorType); | |
1074 } | 1066 } |
1075 } else if (gRec.fBackend == kXPS_Backend) { | 1067 } else if (gRec.fBackend == kXPS_Backend) { |
1076 generate_xps(gm, document); | 1068 generate_xps(gm, document); |
1077 SkAutoTUnref<SkStreamAsset> documentStream(document.detachAsStream() ); | 1069 SkAutoTUnref<SkStreamAsset> documentStream(document.detachAsStream() ); |
1078 | 1070 |
1079 errors.add(compare_test_results_to_stored_expectations( | 1071 errors.add(compare_test_results_to_stored_expectations( |
1080 gm, gRec, gRec.fName, NULL)); | 1072 gm, gRec, gRec.fName, NULL)); |
1081 | 1073 |
1082 if (writePath && (gRec.fFlags & kWrite_ConfigFlag)) { | 1074 if (writePath && (gRec.fFlags & kWrite_ConfigFlag)) { |
1083 path = make_filename(writePath, gm->shortName(), gRec.fName, "", "xps"); | 1075 path = make_filename(writePath, gm->shortName(), gRec.fName, "", "xps"); |
(...skipping 1187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2271 if (FLAGS_forceBWtext) { | 2263 if (FLAGS_forceBWtext) { |
2272 canvas->setDrawFilter(SkNEW(BWTextDrawFilter))->unref(); | 2264 canvas->setDrawFilter(SkNEW(BWTextDrawFilter))->unref(); |
2273 } | 2265 } |
2274 } | 2266 } |
2275 | 2267 |
2276 #if !defined(SK_BUILD_FOR_IOS) && !defined(SK_BUILD_FOR_NACL) | 2268 #if !defined(SK_BUILD_FOR_IOS) && !defined(SK_BUILD_FOR_NACL) |
2277 int main(int argc, char * const argv[]) { | 2269 int main(int argc, char * const argv[]) { |
2278 return tool_main(argc, (char**) argv); | 2270 return tool_main(argc, (char**) argv); |
2279 } | 2271 } |
2280 #endif | 2272 #endif |
OLD | NEW |