blob: b9b55f8dce688cefa8f1e555200d5a8a93f36f79 [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"
reed@google.com99ac02b2013-06-07 20:30:16 +00009#include "SkPDFDevice.h"
commit-bot@chromium.orgb5a66512013-10-09 21:09:00 +000010#include "SkPDFDocument.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,
30 const SkRect& content) SK_OVERRIDE {
31 SkASSERT(NULL == fCanvas);
32 SkASSERT(NULL == fDevice);
33
34 SkISize pageS, contentS;
35 SkMatrix matrix;
36
37 pageS.set(SkScalarRoundToInt(width), SkScalarRoundToInt(height));
38 contentS.set(SkScalarRoundToInt(content.width()),
39 SkScalarRoundToInt(content.height()));
40 matrix.setTranslate(content.fLeft, content.fTop);
41
42 fDevice = SkNEW_ARGS(SkPDFDevice, (pageS, contentS, matrix));
commit-bot@chromium.orgb5a66512013-10-09 21:09:00 +000043 if (fEncoder) {
44 fDevice->setDCTEncoder(fEncoder);
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.orgb5a66512013-10-09 21:09:00 +000081 SkPDFDevice* 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;
reed@google.com99ac02b2013-06-07 20:30:16 +000084};
85
86///////////////////////////////////////////////////////////////////////////////
87
commit-bot@chromium.orgb5a66512013-10-09 21:09:00 +000088SkDocument* SkDocument::CreatePDF(SkWStream* stream, void (*done)(SkWStream*),
89 SkPicture::EncodeBitmap enc) {
90 return stream ? SkNEW_ARGS(SkDocument_PDF, (stream, done, enc)) : NULL;
reed@google.com99ac02b2013-06-07 20:30:16 +000091}
92
93static void delete_wstream(SkWStream* stream) {
94 SkDELETE(stream);
95}
96
commit-bot@chromium.orgb5a66512013-10-09 21:09:00 +000097SkDocument* SkDocument::CreatePDF(const char path[], SkPicture::EncodeBitmap enc) {
reed@google.com99ac02b2013-06-07 20:30:16 +000098 SkFILEWStream* stream = SkNEW_ARGS(SkFILEWStream, (path));
99 if (!stream->isValid()) {
100 SkDELETE(stream);
101 return NULL;
102 }
commit-bot@chromium.orgb5a66512013-10-09 21:09:00 +0000103 return SkNEW_ARGS(SkDocument_PDF, (stream, delete_wstream, enc));
reed@google.com99ac02b2013-06-07 20:30:16 +0000104}