reed@google.com | 99ac02b | 2013-06-07 20:30:16 +0000 | [diff] [blame] | 1 | /* |
| 2 | * Copyright 2013 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 | |
| 8 | #include "SkDocument.h" |
halcanary | a1f1ee9 | 2015-02-20 06:17:26 -0800 | [diff] [blame] | 9 | #include "SkPDFCanon.h" |
commit-bot@chromium.org | b5a6651 | 2013-10-09 21:09:00 +0000 | [diff] [blame] | 10 | #include "SkPDFDocument.h" |
reed | 5867736 | 2014-10-09 05:30:10 -0700 | [diff] [blame] | 11 | #include "SkPDFDevice.h" |
reed@google.com | 99ac02b | 2013-06-07 20:30:16 +0000 | [diff] [blame] | 12 | |
halcanary | 7a01184 | 2015-03-25 07:52:56 -0700 | [diff] [blame^] | 13 | namespace { |
reed@google.com | 99ac02b | 2013-06-07 20:30:16 +0000 | [diff] [blame] | 14 | class SkDocument_PDF : public SkDocument { |
| 15 | public: |
halcanary | 8c92dc1 | 2015-02-19 18:50:05 -0800 | [diff] [blame] | 16 | SkDocument_PDF(SkWStream* stream, |
halcanary | 792c80f | 2015-02-20 07:21:05 -0800 | [diff] [blame] | 17 | void (*doneProc)(SkWStream*, bool), |
commit-bot@chromium.org | 8c29490 | 2013-10-21 17:14:37 +0000 | [diff] [blame] | 18 | SkScalar rasterDpi) |
halcanary | 8c92dc1 | 2015-02-19 18:50:05 -0800 | [diff] [blame] | 19 | : SkDocument(stream, doneProc) |
halcanary | 8c92dc1 | 2015-02-19 18:50:05 -0800 | [diff] [blame] | 20 | , fRasterDpi(rasterDpi) {} |
skia.committer@gmail.com | 6319367 | 2013-06-08 07:01:13 +0000 | [diff] [blame] | 21 | |
reed@google.com | 99ac02b | 2013-06-07 20:30:16 +0000 | [diff] [blame] | 22 | virtual ~SkDocument_PDF() { |
| 23 | // subclasses must call close() in their destructors |
| 24 | this->close(); |
| 25 | } |
| 26 | |
| 27 | protected: |
| 28 | virtual SkCanvas* onBeginPage(SkScalar width, SkScalar height, |
commit-bot@chromium.org | 5e00989 | 2013-10-14 13:42:12 +0000 | [diff] [blame] | 29 | const SkRect& trimBox) SK_OVERRIDE { |
halcanary | a1f1ee9 | 2015-02-20 06:17:26 -0800 | [diff] [blame] | 30 | SkASSERT(!fCanvas.get()); |
reed@google.com | 99ac02b | 2013-06-07 20:30:16 +0000 | [diff] [blame] | 31 | |
halcanary | a1f1ee9 | 2015-02-20 06:17:26 -0800 | [diff] [blame] | 32 | SkISize pageSize = SkISize::Make( |
| 33 | SkScalarRoundToInt(width), SkScalarRoundToInt(height)); |
halcanary | 7a01184 | 2015-03-25 07:52:56 -0700 | [diff] [blame^] | 34 | SkAutoTUnref<SkPDFDevice> device( |
| 35 | SkPDFDevice::Create(pageSize, fRasterDpi, &fCanon)); |
| 36 | fCanvas.reset(SkNEW_ARGS(SkCanvas, (device.get()))); |
| 37 | fPageDevices.push(device.detach()); |
halcanary | be519ad | 2014-11-10 14:22:14 -0800 | [diff] [blame] | 38 | fCanvas->clipRect(trimBox); |
halcanary | 93f8161 | 2014-11-10 14:01:57 -0800 | [diff] [blame] | 39 | fCanvas->translate(trimBox.x(), trimBox.y()); |
halcanary | a1f1ee9 | 2015-02-20 06:17:26 -0800 | [diff] [blame] | 40 | return fCanvas.get(); |
reed@google.com | 99ac02b | 2013-06-07 20:30:16 +0000 | [diff] [blame] | 41 | } |
| 42 | |
mtklein | 72c9faa | 2015-01-09 10:06:39 -0800 | [diff] [blame] | 43 | void onEndPage() SK_OVERRIDE { |
halcanary | a1f1ee9 | 2015-02-20 06:17:26 -0800 | [diff] [blame] | 44 | SkASSERT(fCanvas.get()); |
reed@google.com | 99ac02b | 2013-06-07 20:30:16 +0000 | [diff] [blame] | 45 | fCanvas->flush(); |
halcanary | a1f1ee9 | 2015-02-20 06:17:26 -0800 | [diff] [blame] | 46 | fCanvas.reset(NULL); |
reed@google.com | 99ac02b | 2013-06-07 20:30:16 +0000 | [diff] [blame] | 47 | } |
| 48 | |
mtklein | 72c9faa | 2015-01-09 10:06:39 -0800 | [diff] [blame] | 49 | bool onClose(SkWStream* stream) SK_OVERRIDE { |
halcanary | a1f1ee9 | 2015-02-20 06:17:26 -0800 | [diff] [blame] | 50 | SkASSERT(!fCanvas.get()); |
reed@google.com | 99ac02b | 2013-06-07 20:30:16 +0000 | [diff] [blame] | 51 | |
halcanary | 7a01184 | 2015-03-25 07:52:56 -0700 | [diff] [blame^] | 52 | bool success = SkPDFDocument::EmitPDF(fPageDevices, stream); |
| 53 | fPageDevices.unrefAll(); |
halcanary | 2e3f9d8 | 2015-02-27 12:41:03 -0800 | [diff] [blame] | 54 | fCanon.reset(); |
commit-bot@chromium.org | b5a6651 | 2013-10-09 21:09:00 +0000 | [diff] [blame] | 55 | return success; |
| 56 | } |
| 57 | |
mtklein | 72c9faa | 2015-01-09 10:06:39 -0800 | [diff] [blame] | 58 | void onAbort() SK_OVERRIDE { |
halcanary | 7a01184 | 2015-03-25 07:52:56 -0700 | [diff] [blame^] | 59 | fPageDevices.unrefAll(); |
halcanary | 2e3f9d8 | 2015-02-27 12:41:03 -0800 | [diff] [blame] | 60 | fCanon.reset(); |
reed@google.com | 99ac02b | 2013-06-07 20:30:16 +0000 | [diff] [blame] | 61 | } |
| 62 | |
| 63 | private: |
halcanary | a1f1ee9 | 2015-02-20 06:17:26 -0800 | [diff] [blame] | 64 | SkPDFCanon fCanon; |
halcanary | 7a01184 | 2015-03-25 07:52:56 -0700 | [diff] [blame^] | 65 | SkTDArray<SkPDFDevice*> fPageDevices; |
halcanary | a1f1ee9 | 2015-02-20 06:17:26 -0800 | [diff] [blame] | 66 | SkAutoTUnref<SkCanvas> fCanvas; |
| 67 | SkScalar fRasterDpi; |
reed@google.com | 99ac02b | 2013-06-07 20:30:16 +0000 | [diff] [blame] | 68 | }; |
halcanary | 7a01184 | 2015-03-25 07:52:56 -0700 | [diff] [blame^] | 69 | } // namespace |
reed@google.com | 99ac02b | 2013-06-07 20:30:16 +0000 | [diff] [blame] | 70 | /////////////////////////////////////////////////////////////////////////////// |
| 71 | |
halcanary | 8c92dc1 | 2015-02-19 18:50:05 -0800 | [diff] [blame] | 72 | SkDocument* SkDocument::CreatePDF(SkWStream* stream, SkScalar dpi) { |
| 73 | return stream ? SkNEW_ARGS(SkDocument_PDF, (stream, NULL, dpi)) : NULL; |
reed@google.com | 99ac02b | 2013-06-07 20:30:16 +0000 | [diff] [blame] | 74 | } |
| 75 | |
robertphillips@google.com | 701b405 | 2013-11-18 16:26:25 +0000 | [diff] [blame] | 76 | static void delete_wstream(SkWStream* stream, bool aborted) { |
reed@google.com | 99ac02b | 2013-06-07 20:30:16 +0000 | [diff] [blame] | 77 | SkDELETE(stream); |
| 78 | } |
| 79 | |
halcanary | 8c92dc1 | 2015-02-19 18:50:05 -0800 | [diff] [blame] | 80 | SkDocument* SkDocument::CreatePDF(const char path[], SkScalar dpi) { |
reed@google.com | 99ac02b | 2013-06-07 20:30:16 +0000 | [diff] [blame] | 81 | SkFILEWStream* stream = SkNEW_ARGS(SkFILEWStream, (path)); |
| 82 | if (!stream->isValid()) { |
| 83 | SkDELETE(stream); |
| 84 | return NULL; |
| 85 | } |
halcanary | 8c92dc1 | 2015-02-19 18:50:05 -0800 | [diff] [blame] | 86 | return SkNEW_ARGS(SkDocument_PDF, (stream, delete_wstream, dpi)); |
reed@google.com | 99ac02b | 2013-06-07 20:30:16 +0000 | [diff] [blame] | 87 | } |