199ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com/*
299ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * Copyright 2013 Google Inc.
399ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com *
499ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * Use of this source code is governed by a BSD-style license that can be
599ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * found in the LICENSE file.
699ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com */
799ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com
899ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com#include "SkDocument.h"
9b5a6651f9f69570d964382134d64360915db9a29commit-bot@chromium.org#include "SkPDFDocument.h"
105e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org#include "SkPDFDeviceFlattener.h"
1199ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com
1299ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.comclass SkDocument_PDF : public SkDocument {
1399ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.compublic:
14701b40543d5d124dfa1e59b051cba9d2aaf61670robertphillips@google.com    SkDocument_PDF(SkWStream* stream, void (*doneProc)(SkWStream*,bool),
158c294900f31d8d032b62182f011019276d27d5d0commit-bot@chromium.org                   SkPicture::EncodeBitmap encoder,
168c294900f31d8d032b62182f011019276d27d5d0commit-bot@chromium.org                   SkScalar rasterDpi)
17b5a6651f9f69570d964382134d64360915db9a29commit-bot@chromium.org            : SkDocument(stream, doneProc)
188c294900f31d8d032b62182f011019276d27d5d0commit-bot@chromium.org            , fEncoder(encoder)
198c294900f31d8d032b62182f011019276d27d5d0commit-bot@chromium.org            , fRasterDpi(rasterDpi) {
2099ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        fDoc = SkNEW(SkPDFDocument);
2199ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        fCanvas = NULL;
2299ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        fDevice = NULL;
2399ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    }
246319367bdcbf5e5050632ab97973f5035d0dd8faskia.committer@gmail.com
2599ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    virtual ~SkDocument_PDF() {
2699ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        // subclasses must call close() in their destructors
2799ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        this->close();
2899ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    }
2999ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com
3099ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.comprotected:
3199ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    virtual SkCanvas* onBeginPage(SkScalar width, SkScalar height,
325e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org                                  const SkRect& trimBox) SK_OVERRIDE {
3399ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        SkASSERT(NULL == fCanvas);
3499ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        SkASSERT(NULL == fDevice);
3599ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com
365e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org        SkSize mediaBoxSize;
375e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org        mediaBoxSize.set(width, height);
3899ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com
395e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org        fDevice = SkNEW_ARGS(SkPDFDeviceFlattener, (mediaBoxSize, &trimBox));
40b5a6651f9f69570d964382134d64360915db9a29commit-bot@chromium.org        if (fEncoder) {
41b5a6651f9f69570d964382134d64360915db9a29commit-bot@chromium.org            fDevice->setDCTEncoder(fEncoder);
42b5a6651f9f69570d964382134d64360915db9a29commit-bot@chromium.org        }
438c294900f31d8d032b62182f011019276d27d5d0commit-bot@chromium.org        if (fRasterDpi != 0) {
448c294900f31d8d032b62182f011019276d27d5d0commit-bot@chromium.org            fDevice->setRasterDpi(fRasterDpi);
458c294900f31d8d032b62182f011019276d27d5d0commit-bot@chromium.org        }
4699ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        fCanvas = SkNEW_ARGS(SkCanvas, (fDevice));
4799ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        return fCanvas;
4899ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    }
4999ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com
5099ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    virtual void onEndPage() SK_OVERRIDE {
5199ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        SkASSERT(fCanvas);
5299ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        SkASSERT(fDevice);
5399ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com
5499ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        fCanvas->flush();
5599ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        fDoc->appendPage(fDevice);
5699ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com
5799ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        fCanvas->unref();
5899ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        fDevice->unref();
5999ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com
6099ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        fCanvas = NULL;
6199ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        fDevice = NULL;
6299ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    }
6399ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com
64b5a6651f9f69570d964382134d64360915db9a29commit-bot@chromium.org    virtual bool onClose(SkWStream* stream) SK_OVERRIDE {
6599ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        SkASSERT(NULL == fCanvas);
6699ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        SkASSERT(NULL == fDevice);
6799ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com
68b5a6651f9f69570d964382134d64360915db9a29commit-bot@chromium.org        bool success = fDoc->emitPDF(stream);
69b5a6651f9f69570d964382134d64360915db9a29commit-bot@chromium.org        SkDELETE(fDoc);
70b5a6651f9f69570d964382134d64360915db9a29commit-bot@chromium.org        fDoc = NULL;
71b5a6651f9f69570d964382134d64360915db9a29commit-bot@chromium.org        return success;
72b5a6651f9f69570d964382134d64360915db9a29commit-bot@chromium.org    }
73b5a6651f9f69570d964382134d64360915db9a29commit-bot@chromium.org
74b5a6651f9f69570d964382134d64360915db9a29commit-bot@chromium.org    virtual void onAbort() SK_OVERRIDE {
7599ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        SkDELETE(fDoc);
7699ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        fDoc = NULL;
7799ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    }
7899ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com
7999ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.comprivate:
8099ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    SkPDFDocument*  fDoc;
815e00989a283111cef05bed8102e45c16651e43e4commit-bot@chromium.org    SkPDFDeviceFlattener* fDevice;
8299ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    SkCanvas*       fCanvas;
83b5a6651f9f69570d964382134d64360915db9a29commit-bot@chromium.org    SkPicture::EncodeBitmap fEncoder;
848c294900f31d8d032b62182f011019276d27d5d0commit-bot@chromium.org    SkScalar        fRasterDpi;
8599ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com};
8699ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com
8799ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com///////////////////////////////////////////////////////////////////////////////
8899ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com
89701b40543d5d124dfa1e59b051cba9d2aaf61670robertphillips@google.comSkDocument* SkDocument::CreatePDF(SkWStream* stream, void (*done)(SkWStream*,bool),
908c294900f31d8d032b62182f011019276d27d5d0commit-bot@chromium.org                                  SkPicture::EncodeBitmap enc,
918c294900f31d8d032b62182f011019276d27d5d0commit-bot@chromium.org                                  SkScalar dpi) {
928c294900f31d8d032b62182f011019276d27d5d0commit-bot@chromium.org    return stream ? SkNEW_ARGS(SkDocument_PDF, (stream, done, enc, dpi)) : NULL;
9399ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com}
9499ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com
95701b40543d5d124dfa1e59b051cba9d2aaf61670robertphillips@google.comstatic void delete_wstream(SkWStream* stream, bool aborted) {
9699ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    SkDELETE(stream);
9799ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com}
9899ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com
998c294900f31d8d032b62182f011019276d27d5d0commit-bot@chromium.orgSkDocument* SkDocument::CreatePDF(const char path[],
1008c294900f31d8d032b62182f011019276d27d5d0commit-bot@chromium.org                                  SkPicture::EncodeBitmap enc,
1018c294900f31d8d032b62182f011019276d27d5d0commit-bot@chromium.org                                  SkScalar dpi) {
10299ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    SkFILEWStream* stream = SkNEW_ARGS(SkFILEWStream, (path));
10399ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    if (!stream->isValid()) {
10499ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        SkDELETE(stream);
10599ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        return NULL;
10699ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    }
1078c294900f31d8d032b62182f011019276d27d5d0commit-bot@chromium.org    return SkNEW_ARGS(SkDocument_PDF, (stream, delete_wstream, enc, dpi));
10899ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com}
109