/* * Copyright 2013 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "SkDocument.h" #include "SkPDFDocument.h" #include "SkPDFDeviceFlattener.h" class SkDocument_PDF : public SkDocument { public: SkDocument_PDF(SkWStream* stream, void (*doneProc)(SkWStream*,bool), SkPicture::EncodeBitmap encoder, SkScalar rasterDpi) : SkDocument(stream, doneProc) , fEncoder(encoder) , fRasterDpi(rasterDpi) { fDoc = SkNEW(SkPDFDocument); fCanvas = NULL; fDevice = NULL; } virtual ~SkDocument_PDF() { // subclasses must call close() in their destructors this->close(); } protected: virtual SkCanvas* onBeginPage(SkScalar width, SkScalar height, const SkRect& trimBox) SK_OVERRIDE { SkASSERT(NULL == fCanvas); SkASSERT(NULL == fDevice); SkSize mediaBoxSize; mediaBoxSize.set(width, height); fDevice = SkNEW_ARGS(SkPDFDeviceFlattener, (mediaBoxSize, &trimBox)); if (fEncoder) { fDevice->setDCTEncoder(fEncoder); } if (fRasterDpi != 0) { fDevice->setRasterDpi(fRasterDpi); } fCanvas = SkNEW_ARGS(SkCanvas, (fDevice)); return fCanvas; } virtual void onEndPage() SK_OVERRIDE { SkASSERT(fCanvas); SkASSERT(fDevice); fCanvas->flush(); fDoc->appendPage(fDevice); fCanvas->unref(); fDevice->unref(); fCanvas = NULL; fDevice = NULL; } virtual bool onClose(SkWStream* stream) SK_OVERRIDE { SkASSERT(NULL == fCanvas); SkASSERT(NULL == fDevice); bool success = fDoc->emitPDF(stream); SkDELETE(fDoc); fDoc = NULL; return success; } virtual void onAbort() SK_OVERRIDE { SkDELETE(fDoc); fDoc = NULL; } private: SkPDFDocument* fDoc; SkPDFDeviceFlattener* fDevice; SkCanvas* fCanvas; SkPicture::EncodeBitmap fEncoder; SkScalar fRasterDpi; }; /////////////////////////////////////////////////////////////////////////////// SkDocument* SkDocument::CreatePDF(SkWStream* stream, void (*done)(SkWStream*,bool), SkPicture::EncodeBitmap enc, SkScalar dpi) { return stream ? SkNEW_ARGS(SkDocument_PDF, (stream, done, enc, dpi)) : NULL; } static void delete_wstream(SkWStream* stream, bool aborted) { SkDELETE(stream); } SkDocument* SkDocument::CreatePDF(const char path[], SkPicture::EncodeBitmap enc, SkScalar dpi) { SkFILEWStream* stream = SkNEW_ARGS(SkFILEWStream, (path)); if (!stream->isValid()) { SkDELETE(stream); return NULL; } return SkNEW_ARGS(SkDocument_PDF, (stream, delete_wstream, enc, dpi)); }