blob: 8387cccbd5fe361fff4685a9fa7320c0e81590bb [file] [log] [blame]
reed@google.com99ac02b2013-06-07 20:30:16 +00001/*
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"
halcanarya1f1ee92015-02-20 06:17:26 -08009#include "SkPDFCanon.h"
commit-bot@chromium.orgb5a66512013-10-09 21:09:00 +000010#include "SkPDFDocument.h"
reed58677362014-10-09 05:30:10 -070011#include "SkPDFDevice.h"
reed@google.com99ac02b2013-06-07 20:30:16 +000012
halcanary7a011842015-03-25 07:52:56 -070013namespace {
reed@google.com99ac02b2013-06-07 20:30:16 +000014class SkDocument_PDF : public SkDocument {
15public:
halcanary8c92dc12015-02-19 18:50:05 -080016 SkDocument_PDF(SkWStream* stream,
halcanary792c80f2015-02-20 07:21:05 -080017 void (*doneProc)(SkWStream*, bool),
commit-bot@chromium.org8c294902013-10-21 17:14:37 +000018 SkScalar rasterDpi)
halcanary8c92dc12015-02-19 18:50:05 -080019 : SkDocument(stream, doneProc)
halcanary8c92dc12015-02-19 18:50:05 -080020 , fRasterDpi(rasterDpi) {}
skia.committer@gmail.com63193672013-06-08 07:01:13 +000021
reed@google.com99ac02b2013-06-07 20:30:16 +000022 virtual ~SkDocument_PDF() {
23 // subclasses must call close() in their destructors
24 this->close();
25 }
26
27protected:
28 virtual SkCanvas* onBeginPage(SkScalar width, SkScalar height,
commit-bot@chromium.org5e009892013-10-14 13:42:12 +000029 const SkRect& trimBox) SK_OVERRIDE {
halcanarya1f1ee92015-02-20 06:17:26 -080030 SkASSERT(!fCanvas.get());
reed@google.com99ac02b2013-06-07 20:30:16 +000031
halcanarya1f1ee92015-02-20 06:17:26 -080032 SkISize pageSize = SkISize::Make(
33 SkScalarRoundToInt(width), SkScalarRoundToInt(height));
halcanary7a011842015-03-25 07:52:56 -070034 SkAutoTUnref<SkPDFDevice> device(
35 SkPDFDevice::Create(pageSize, fRasterDpi, &fCanon));
36 fCanvas.reset(SkNEW_ARGS(SkCanvas, (device.get())));
37 fPageDevices.push(device.detach());
halcanarybe519ad2014-11-10 14:22:14 -080038 fCanvas->clipRect(trimBox);
halcanary93f81612014-11-10 14:01:57 -080039 fCanvas->translate(trimBox.x(), trimBox.y());
halcanarya1f1ee92015-02-20 06:17:26 -080040 return fCanvas.get();
reed@google.com99ac02b2013-06-07 20:30:16 +000041 }
42
mtklein72c9faa2015-01-09 10:06:39 -080043 void onEndPage() SK_OVERRIDE {
halcanarya1f1ee92015-02-20 06:17:26 -080044 SkASSERT(fCanvas.get());
reed@google.com99ac02b2013-06-07 20:30:16 +000045 fCanvas->flush();
halcanarya1f1ee92015-02-20 06:17:26 -080046 fCanvas.reset(NULL);
reed@google.com99ac02b2013-06-07 20:30:16 +000047 }
48
mtklein72c9faa2015-01-09 10:06:39 -080049 bool onClose(SkWStream* stream) SK_OVERRIDE {
halcanarya1f1ee92015-02-20 06:17:26 -080050 SkASSERT(!fCanvas.get());
reed@google.com99ac02b2013-06-07 20:30:16 +000051
halcanary7a011842015-03-25 07:52:56 -070052 bool success = SkPDFDocument::EmitPDF(fPageDevices, stream);
53 fPageDevices.unrefAll();
halcanary2e3f9d82015-02-27 12:41:03 -080054 fCanon.reset();
commit-bot@chromium.orgb5a66512013-10-09 21:09:00 +000055 return success;
56 }
57
mtklein72c9faa2015-01-09 10:06:39 -080058 void onAbort() SK_OVERRIDE {
halcanary7a011842015-03-25 07:52:56 -070059 fPageDevices.unrefAll();
halcanary2e3f9d82015-02-27 12:41:03 -080060 fCanon.reset();
reed@google.com99ac02b2013-06-07 20:30:16 +000061 }
62
63private:
halcanarya1f1ee92015-02-20 06:17:26 -080064 SkPDFCanon fCanon;
halcanary7a011842015-03-25 07:52:56 -070065 SkTDArray<SkPDFDevice*> fPageDevices;
halcanarya1f1ee92015-02-20 06:17:26 -080066 SkAutoTUnref<SkCanvas> fCanvas;
67 SkScalar fRasterDpi;
reed@google.com99ac02b2013-06-07 20:30:16 +000068};
halcanary7a011842015-03-25 07:52:56 -070069} // namespace
reed@google.com99ac02b2013-06-07 20:30:16 +000070///////////////////////////////////////////////////////////////////////////////
71
halcanary8c92dc12015-02-19 18:50:05 -080072SkDocument* SkDocument::CreatePDF(SkWStream* stream, SkScalar dpi) {
73 return stream ? SkNEW_ARGS(SkDocument_PDF, (stream, NULL, dpi)) : NULL;
reed@google.com99ac02b2013-06-07 20:30:16 +000074}
75
robertphillips@google.com701b4052013-11-18 16:26:25 +000076static void delete_wstream(SkWStream* stream, bool aborted) {
reed@google.com99ac02b2013-06-07 20:30:16 +000077 SkDELETE(stream);
78}
79
halcanary8c92dc12015-02-19 18:50:05 -080080SkDocument* SkDocument::CreatePDF(const char path[], SkScalar dpi) {
reed@google.com99ac02b2013-06-07 20:30:16 +000081 SkFILEWStream* stream = SkNEW_ARGS(SkFILEWStream, (path));
82 if (!stream->isValid()) {
83 SkDELETE(stream);
84 return NULL;
85 }
halcanary8c92dc12015-02-19 18:50:05 -080086 return SkNEW_ARGS(SkDocument_PDF, (stream, delete_wstream, dpi));
reed@google.com99ac02b2013-06-07 20:30:16 +000087}