1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/gfx/skia/trunk/src/doc/SkDocument_PDF.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,108 @@ 1.4 +/* 1.5 + * Copyright 2013 Google Inc. 1.6 + * 1.7 + * Use of this source code is governed by a BSD-style license that can be 1.8 + * found in the LICENSE file. 1.9 + */ 1.10 + 1.11 +#include "SkDocument.h" 1.12 +#include "SkPDFDocument.h" 1.13 +#include "SkPDFDeviceFlattener.h" 1.14 + 1.15 +class SkDocument_PDF : public SkDocument { 1.16 +public: 1.17 + SkDocument_PDF(SkWStream* stream, void (*doneProc)(SkWStream*,bool), 1.18 + SkPicture::EncodeBitmap encoder, 1.19 + SkScalar rasterDpi) 1.20 + : SkDocument(stream, doneProc) 1.21 + , fEncoder(encoder) 1.22 + , fRasterDpi(rasterDpi) { 1.23 + fDoc = SkNEW(SkPDFDocument); 1.24 + fCanvas = NULL; 1.25 + fDevice = NULL; 1.26 + } 1.27 + 1.28 + virtual ~SkDocument_PDF() { 1.29 + // subclasses must call close() in their destructors 1.30 + this->close(); 1.31 + } 1.32 + 1.33 +protected: 1.34 + virtual SkCanvas* onBeginPage(SkScalar width, SkScalar height, 1.35 + const SkRect& trimBox) SK_OVERRIDE { 1.36 + SkASSERT(NULL == fCanvas); 1.37 + SkASSERT(NULL == fDevice); 1.38 + 1.39 + SkSize mediaBoxSize; 1.40 + mediaBoxSize.set(width, height); 1.41 + 1.42 + fDevice = SkNEW_ARGS(SkPDFDeviceFlattener, (mediaBoxSize, &trimBox)); 1.43 + if (fEncoder) { 1.44 + fDevice->setDCTEncoder(fEncoder); 1.45 + } 1.46 + if (fRasterDpi != 0) { 1.47 + fDevice->setRasterDpi(fRasterDpi); 1.48 + } 1.49 + fCanvas = SkNEW_ARGS(SkCanvas, (fDevice)); 1.50 + return fCanvas; 1.51 + } 1.52 + 1.53 + virtual void onEndPage() SK_OVERRIDE { 1.54 + SkASSERT(fCanvas); 1.55 + SkASSERT(fDevice); 1.56 + 1.57 + fCanvas->flush(); 1.58 + fDoc->appendPage(fDevice); 1.59 + 1.60 + fCanvas->unref(); 1.61 + fDevice->unref(); 1.62 + 1.63 + fCanvas = NULL; 1.64 + fDevice = NULL; 1.65 + } 1.66 + 1.67 + virtual bool onClose(SkWStream* stream) SK_OVERRIDE { 1.68 + SkASSERT(NULL == fCanvas); 1.69 + SkASSERT(NULL == fDevice); 1.70 + 1.71 + bool success = fDoc->emitPDF(stream); 1.72 + SkDELETE(fDoc); 1.73 + fDoc = NULL; 1.74 + return success; 1.75 + } 1.76 + 1.77 + virtual void onAbort() SK_OVERRIDE { 1.78 + SkDELETE(fDoc); 1.79 + fDoc = NULL; 1.80 + } 1.81 + 1.82 +private: 1.83 + SkPDFDocument* fDoc; 1.84 + SkPDFDeviceFlattener* fDevice; 1.85 + SkCanvas* fCanvas; 1.86 + SkPicture::EncodeBitmap fEncoder; 1.87 + SkScalar fRasterDpi; 1.88 +}; 1.89 + 1.90 +/////////////////////////////////////////////////////////////////////////////// 1.91 + 1.92 +SkDocument* SkDocument::CreatePDF(SkWStream* stream, void (*done)(SkWStream*,bool), 1.93 + SkPicture::EncodeBitmap enc, 1.94 + SkScalar dpi) { 1.95 + return stream ? SkNEW_ARGS(SkDocument_PDF, (stream, done, enc, dpi)) : NULL; 1.96 +} 1.97 + 1.98 +static void delete_wstream(SkWStream* stream, bool aborted) { 1.99 + SkDELETE(stream); 1.100 +} 1.101 + 1.102 +SkDocument* SkDocument::CreatePDF(const char path[], 1.103 + SkPicture::EncodeBitmap enc, 1.104 + SkScalar dpi) { 1.105 + SkFILEWStream* stream = SkNEW_ARGS(SkFILEWStream, (path)); 1.106 + if (!stream->isValid()) { 1.107 + SkDELETE(stream); 1.108 + return NULL; 1.109 + } 1.110 + return SkNEW_ARGS(SkDocument_PDF, (stream, delete_wstream, enc, dpi)); 1.111 +}