blob: 695929f32f796322f0027ad88c1917d7f3b416a9 [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:
commit-bot@chromium.orgb5a66512013-10-09 21:09:00 +000014 SkDocument_PDF(SkWStream* stream, void (*doneProc)(SkWStream*),
15 SkPicture::EncodeBitmap encoder)
16 : SkDocument(stream, doneProc)
17 , fEncoder(encoder) {
reed@google.com99ac02b2013-06-07 20:30:16 +000018 fDoc = SkNEW(SkPDFDocument);
19 fCanvas = NULL;
20 fDevice = NULL;
21 }
skia.committer@gmail.com63193672013-06-08 07:01:13 +000022
reed@google.com99ac02b2013-06-07 20:30:16 +000023 virtual ~SkDocument_PDF() {
24 // subclasses must call close() in their destructors
25 this->close();
26 }
27
28protected:
29 virtual SkCanvas* onBeginPage(SkScalar width, SkScalar height,
commit-bot@chromium.org5e009892013-10-14 13:42:12 +000030 const SkRect& trimBox) SK_OVERRIDE {
reed@google.com99ac02b2013-06-07 20:30:16 +000031 SkASSERT(NULL == fCanvas);
32 SkASSERT(NULL == fDevice);
33
commit-bot@chromium.org5e009892013-10-14 13:42:12 +000034 SkSize mediaBoxSize;
35 mediaBoxSize.set(width, height);
reed@google.com99ac02b2013-06-07 20:30:16 +000036
commit-bot@chromium.org5e009892013-10-14 13:42:12 +000037 fDevice = SkNEW_ARGS(SkPDFDeviceFlattener, (mediaBoxSize, &trimBox));
commit-bot@chromium.orgb5a66512013-10-09 21:09:00 +000038 if (fEncoder) {
39 fDevice->setDCTEncoder(fEncoder);
40 }
reed@google.com99ac02b2013-06-07 20:30:16 +000041 fCanvas = SkNEW_ARGS(SkCanvas, (fDevice));
42 return fCanvas;
43 }
44
45 virtual void onEndPage() SK_OVERRIDE {
46 SkASSERT(fCanvas);
47 SkASSERT(fDevice);
48
49 fCanvas->flush();
50 fDoc->appendPage(fDevice);
51
52 fCanvas->unref();
53 fDevice->unref();
54
55 fCanvas = NULL;
56 fDevice = NULL;
57 }
58
commit-bot@chromium.orgb5a66512013-10-09 21:09:00 +000059 virtual bool onClose(SkWStream* stream) SK_OVERRIDE {
reed@google.com99ac02b2013-06-07 20:30:16 +000060 SkASSERT(NULL == fCanvas);
61 SkASSERT(NULL == fDevice);
62
commit-bot@chromium.orgb5a66512013-10-09 21:09:00 +000063 bool success = fDoc->emitPDF(stream);
64 SkDELETE(fDoc);
65 fDoc = NULL;
66 return success;
67 }
68
69 virtual void onAbort() SK_OVERRIDE {
reed@google.com99ac02b2013-06-07 20:30:16 +000070 SkDELETE(fDoc);
71 fDoc = NULL;
72 }
73
74private:
75 SkPDFDocument* fDoc;
commit-bot@chromium.org5e009892013-10-14 13:42:12 +000076 SkPDFDeviceFlattener* fDevice;
reed@google.com99ac02b2013-06-07 20:30:16 +000077 SkCanvas* fCanvas;
commit-bot@chromium.orgb5a66512013-10-09 21:09:00 +000078 SkPicture::EncodeBitmap fEncoder;
reed@google.com99ac02b2013-06-07 20:30:16 +000079};
80
81///////////////////////////////////////////////////////////////////////////////
82
commit-bot@chromium.orgb5a66512013-10-09 21:09:00 +000083SkDocument* SkDocument::CreatePDF(SkWStream* stream, void (*done)(SkWStream*),
84 SkPicture::EncodeBitmap enc) {
85 return stream ? SkNEW_ARGS(SkDocument_PDF, (stream, done, enc)) : NULL;
reed@google.com99ac02b2013-06-07 20:30:16 +000086}
87
88static void delete_wstream(SkWStream* stream) {
89 SkDELETE(stream);
90}
91
commit-bot@chromium.orgb5a66512013-10-09 21:09:00 +000092SkDocument* SkDocument::CreatePDF(const char path[], SkPicture::EncodeBitmap enc) {
reed@google.com99ac02b2013-06-07 20:30:16 +000093 SkFILEWStream* stream = SkNEW_ARGS(SkFILEWStream, (path));
94 if (!stream->isValid()) {
95 SkDELETE(stream);
96 return NULL;
97 }
commit-bot@chromium.orgb5a66512013-10-09 21:09:00 +000098 return SkNEW_ARGS(SkDocument_PDF, (stream, delete_wstream, enc));
reed@google.com99ac02b2013-06-07 20:30:16 +000099}