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