diff -r 000000000000 -r 6474c204b198 gfx/skia/trunk/src/doc/SkDocument_PDF.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gfx/skia/trunk/src/doc/SkDocument_PDF.cpp Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,108 @@ +/* + * 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)); +}