| 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 | 
|---|