blob: 142099375cbf3c5405c6c29d1db320780e170a41 [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"
commit-bot@chromium.orgb5a66512013-10-09 21:09:00 +00009#include "SkPDFDocument.h"
commit-bot@chromium.org5e009892013-10-14 13:42:12 +000010#include "SkPDFDeviceFlattener.h"
reed@google.com99ac02b2013-06-07 20:30:16 +000011
12class SkDocument_PDF : public SkDocument {
13public:
robertphillips@google.com701b4052013-11-18 16:26:25 +000014 SkDocument_PDF(SkWStream* stream, void (*doneProc)(SkWStream*,bool),
commit-bot@chromium.org8c294902013-10-21 17:14:37 +000015 SkPicture::EncodeBitmap encoder,
16 SkScalar rasterDpi)
commit-bot@chromium.orgb5a66512013-10-09 21:09:00 +000017 : SkDocument(stream, doneProc)
commit-bot@chromium.org8c294902013-10-21 17:14:37 +000018 , fEncoder(encoder)
19 , fRasterDpi(rasterDpi) {
reed@google.com99ac02b2013-06-07 20:30:16 +000020 fDoc = SkNEW(SkPDFDocument);
21 fCanvas = NULL;
22 fDevice = NULL;
23 }
skia.committer@gmail.com63193672013-06-08 07:01:13 +000024
reed@google.com99ac02b2013-06-07 20:30:16 +000025 virtual ~SkDocument_PDF() {
26 // subclasses must call close() in their destructors
27 this->close();
28 }
29
30protected:
31 virtual SkCanvas* onBeginPage(SkScalar width, SkScalar height,
commit-bot@chromium.org5e009892013-10-14 13:42:12 +000032 const SkRect& trimBox) SK_OVERRIDE {
reed@google.com99ac02b2013-06-07 20:30:16 +000033 SkASSERT(NULL == fCanvas);
34 SkASSERT(NULL == fDevice);
35
commit-bot@chromium.org5e009892013-10-14 13:42:12 +000036 SkSize mediaBoxSize;
37 mediaBoxSize.set(width, height);
reed@google.com99ac02b2013-06-07 20:30:16 +000038
commit-bot@chromium.org5e009892013-10-14 13:42:12 +000039 fDevice = SkNEW_ARGS(SkPDFDeviceFlattener, (mediaBoxSize, &trimBox));
commit-bot@chromium.orgb5a66512013-10-09 21:09:00 +000040 if (fEncoder) {
41 fDevice->setDCTEncoder(fEncoder);
42 }
commit-bot@chromium.org8c294902013-10-21 17:14:37 +000043 if (fRasterDpi != 0) {
44 fDevice->setRasterDpi(fRasterDpi);
45 }
reed@google.com99ac02b2013-06-07 20:30:16 +000046 fCanvas = SkNEW_ARGS(SkCanvas, (fDevice));
47 return fCanvas;
48 }
49
50 virtual void onEndPage() SK_OVERRIDE {
51 SkASSERT(fCanvas);
52 SkASSERT(fDevice);
53
54 fCanvas->flush();
55 fDoc->appendPage(fDevice);
56
57 fCanvas->unref();
58 fDevice->unref();
59
60 fCanvas = NULL;
61 fDevice = NULL;
62 }
63
commit-bot@chromium.orgb5a66512013-10-09 21:09:00 +000064 virtual bool onClose(SkWStream* stream) SK_OVERRIDE {
reed@google.com99ac02b2013-06-07 20:30:16 +000065 SkASSERT(NULL == fCanvas);
66 SkASSERT(NULL == fDevice);
67
commit-bot@chromium.orgb5a66512013-10-09 21:09:00 +000068 bool success = fDoc->emitPDF(stream);
69 SkDELETE(fDoc);
70 fDoc = NULL;
71 return success;
72 }
73
74 virtual void onAbort() SK_OVERRIDE {
reed@google.com99ac02b2013-06-07 20:30:16 +000075 SkDELETE(fDoc);
76 fDoc = NULL;
77 }
78
79private:
80 SkPDFDocument* fDoc;
commit-bot@chromium.org5e009892013-10-14 13:42:12 +000081 SkPDFDeviceFlattener* fDevice;
reed@google.com99ac02b2013-06-07 20:30:16 +000082 SkCanvas* fCanvas;
commit-bot@chromium.orgb5a66512013-10-09 21:09:00 +000083 SkPicture::EncodeBitmap fEncoder;
commit-bot@chromium.org8c294902013-10-21 17:14:37 +000084 SkScalar fRasterDpi;
reed@google.com99ac02b2013-06-07 20:30:16 +000085};
86
87///////////////////////////////////////////////////////////////////////////////
88
robertphillips@google.com701b4052013-11-18 16:26:25 +000089SkDocument* SkDocument::CreatePDF(SkWStream* stream, void (*done)(SkWStream*,bool),
commit-bot@chromium.org8c294902013-10-21 17:14:37 +000090 SkPicture::EncodeBitmap enc,
91 SkScalar dpi) {
92 return stream ? SkNEW_ARGS(SkDocument_PDF, (stream, done, enc, dpi)) : NULL;
reed@google.com99ac02b2013-06-07 20:30:16 +000093}
94
robertphillips@google.com701b4052013-11-18 16:26:25 +000095static void delete_wstream(SkWStream* stream, bool aborted) {
reed@google.com99ac02b2013-06-07 20:30:16 +000096 SkDELETE(stream);
97}
98
commit-bot@chromium.org8c294902013-10-21 17:14:37 +000099SkDocument* SkDocument::CreatePDF(const char path[],
100 SkPicture::EncodeBitmap enc,
101 SkScalar dpi) {
reed@google.com99ac02b2013-06-07 20:30:16 +0000102 SkFILEWStream* stream = SkNEW_ARGS(SkFILEWStream, (path));
103 if (!stream->isValid()) {
104 SkDELETE(stream);
105 return NULL;
106 }
commit-bot@chromium.org8c294902013-10-21 17:14:37 +0000107 return SkNEW_ARGS(SkDocument_PDF, (stream, delete_wstream, enc, dpi));
reed@google.com99ac02b2013-06-07 20:30:16 +0000108}