OLD | NEW |
| (Empty) |
1 /* | |
2 * Copyright 2014 Google Inc. | |
3 * | |
4 * Use of this source code is governed by a BSD-style license that can be | |
5 * found in the LICENSE file. | |
6 */ | |
7 #include "SkCanvas.h" | |
8 #include "SkDocument.h" | |
9 #include "SkForceLinking.h" | |
10 #include "SkGraphics.h" | |
11 #include "SkNullCanvas.h" | |
12 #include "SkPicture.h" | |
13 #include "SkStream.h" | |
14 #include "SkTemplates.h" | |
15 #include "PageCachingDocument.h" | |
16 #include "ProcStats.h" | |
17 #include "flags/SkCommandLineFlags.h" | |
18 | |
19 DEFINE_string2(readPath, | |
20 r, | |
21 "", | |
22 "(Required) The path to a .skp Skia Picture file."); | |
23 DEFINE_string2(writePath, w, "", "If set, write PDF output to this file."); | |
24 DEFINE_bool(cachePages, false, "Use a PageCachingDocument."); | |
25 DEFINE_bool(nullCanvas, true, "Render to a SkNullCanvas as a control."); | |
26 | |
27 __SK_FORCE_IMAGE_DECODER_LINKING; | |
28 | |
29 namespace { | |
30 class NullWStream : public SkWStream { | |
31 public: | |
32 NullWStream() : fBytesWritten(0) { | |
33 } | |
34 bool write(const void*, size_t size) override { | |
35 fBytesWritten += size; | |
36 return true; | |
37 } | |
38 size_t bytesWritten() const override { | |
39 return fBytesWritten; | |
40 } | |
41 size_t fBytesWritten; | |
42 }; | |
43 | |
44 SkDocument* CreatePDFDocument(SkWStream* out) { | |
45 if (FLAGS_cachePages) { | |
46 return CreatePageCachingDocument(out); | |
47 } else { | |
48 return SkDocument::CreatePDF(out); | |
49 } | |
50 } | |
51 } // namespace | |
52 | |
53 int main(int argc, char** argv) { | |
54 SkCommandLineFlags::Parse(argc, argv); | |
55 if (FLAGS_readPath.isEmpty()) { | |
56 SkDebugf("Error: missing requires --readPath option\n"); | |
57 return 1; | |
58 } | |
59 const char* path = FLAGS_readPath[0]; | |
60 SkFILEStream inputStream(path); | |
61 | |
62 if (!inputStream.isValid()) { | |
63 SkDebugf("Could not open file %s\n", path); | |
64 return 2; | |
65 } | |
66 SkAutoGraphics ag; | |
67 SkAutoTUnref<SkPicture> picture(SkPicture::CreateFromStream(&inputStream)); | |
68 if (NULL == picture.get()) { | |
69 SkDebugf("Could not read an SkPicture from %s\n", path); | |
70 return 3; | |
71 } | |
72 | |
73 int width = picture->cullRect().width(); | |
74 int height = picture->cullRect().height(); | |
75 | |
76 const int kLetterWidth = 612; // 8.5 * 72 | |
77 const int kLetterHeight = 792; // 11 * 72 | |
78 SkRect letterRect = SkRect::MakeWH(SkIntToScalar(kLetterWidth), | |
79 SkIntToScalar(kLetterHeight)); | |
80 | |
81 int xPages = ((width - 1) / kLetterWidth) + 1; | |
82 int yPages = ((height - 1) / kLetterHeight) + 1; | |
83 | |
84 SkAutoTDelete<SkWStream> out(SkNEW(NullWStream)); | |
85 | |
86 if (!FLAGS_writePath.isEmpty()) { | |
87 SkAutoTDelete<SkFILEWStream> fileStream( | |
88 SkNEW_ARGS(SkFILEWStream, (FLAGS_writePath[0]))); | |
89 if (!fileStream->isValid()) { | |
90 SkDebugf("Can't open file \"%s\" for writing.", FLAGS_writePath[0]); | |
91 return 1; | |
92 } | |
93 out.reset(fileStream.detach()); | |
94 } | |
95 | |
96 SkCanvas* nullCanvas = SkCreateNullCanvas(); | |
97 | |
98 SkAutoTUnref<SkDocument> pdfDocument; | |
99 if (!FLAGS_nullCanvas) { | |
100 pdfDocument.reset(CreatePDFDocument(out.get())); | |
101 } | |
102 | |
103 for (int y = 0; y < yPages; ++y) { | |
104 for (int x = 0; x < xPages; ++x) { | |
105 SkCanvas* canvas; | |
106 if (FLAGS_nullCanvas) { | |
107 canvas = nullCanvas; | |
108 } else { | |
109 int w = SkTMin(kLetterWidth, width - (x * kLetterWidth)); | |
110 int h = SkTMin(kLetterHeight, height - (y * kLetterHeight)); | |
111 canvas = pdfDocument->beginPage(w, h); | |
112 } | |
113 { | |
114 SkAutoCanvasRestore autoCanvasRestore(canvas, true); | |
115 canvas->clipRect(letterRect); | |
116 canvas->translate(SkIntToScalar(-kLetterWidth * x), | |
117 SkIntToScalar(-kLetterHeight * y)); | |
118 picture->playback(canvas); | |
119 //canvas->drawPicture(picture); | |
120 } | |
121 canvas->flush(); | |
122 if (!FLAGS_nullCanvas) { | |
123 pdfDocument->endPage(); | |
124 } | |
125 } | |
126 } | |
127 if (!FLAGS_nullCanvas) { | |
128 pdfDocument->close(); | |
129 pdfDocument.reset(NULL); | |
130 } | |
131 printf(SK_SIZE_T_SPECIFIER "\t%4d\n", | |
132 inputStream.getLength(), | |
133 sk_tools::getMaxResidentSetSizeMB()); | |
134 return 0; | |
135 } | |
OLD | NEW |