Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(35)

Side by Side Diff: gm/gmmain.cpp

Issue 24811002: Update the SkDocument interface to allow for 1) abort won't emit pdf, 2) close can report success/f… (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: move SkPDFDevice in separate files, and various fixes Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698