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#ifndef SkDocument_DEFINED 999ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com#define SkDocument_DEFINED 1099ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com 11b5a6651f9f69570d964382134d64360915db9a29commit-bot@chromium.org#include "SkBitmap.h" 12b5a6651f9f69570d964382134d64360915db9a29commit-bot@chromium.org#include "SkPicture.h" 1399ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com#include "SkRect.h" 1499ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com#include "SkRefCnt.h" 1599ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com 1699ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.comclass SkCanvas; 1799ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.comclass SkWStream; 1899ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com 198c294900f31d8d032b62182f011019276d27d5d0commit-bot@chromium.org/** SK_ScalarDefaultDPI is 72 DPI. 208c294900f31d8d032b62182f011019276d27d5d0commit-bot@chromium.org*/ 214b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org#define SK_ScalarDefaultRasterDPI 72.0f 228c294900f31d8d032b62182f011019276d27d5d0commit-bot@chromium.org 2399ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com/** 2499ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * High-level API for creating a document-based canvas. To use.. 2599ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * 2699ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * 1. Create a document, specifying a stream to store the output. 2799ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * 2. For each "page" of content: 2899ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * a. canvas = doc->beginPage(...) 2999ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * b. draw_my_content(canvas); 3099ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * c. doc->endPage(); 3199ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * 3. Close the document with doc->close(). 3299ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com */ 3399ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.comclass SkDocument : public SkRefCnt { 3499ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.compublic: 35ef284a84f503adfd08ee52b5aee142c548698ea4commit-bot@chromium.org SK_DECLARE_INST_COUNT(SkDocument) 36ef284a84f503adfd08ee52b5aee142c548698ea4commit-bot@chromium.org 3799ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com /** 3899ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * Create a PDF-backed document, writing the results into a file. 3999ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * If there is an error trying to create the doc, returns NULL. 40b5a6651f9f69570d964382134d64360915db9a29commit-bot@chromium.org * encoder sets the DCTEncoder for images, to encode a bitmap 41b5a6651f9f69570d964382134d64360915db9a29commit-bot@chromium.org * as JPEG (DCT). 428c294900f31d8d032b62182f011019276d27d5d0commit-bot@chromium.org * rasterDpi - the DPI at which features without native PDF support 438c294900f31d8d032b62182f011019276d27d5d0commit-bot@chromium.org * will be rasterized (e.g. draw image with perspective, 448c294900f31d8d032b62182f011019276d27d5d0commit-bot@chromium.org * draw text with perspective, ...) 458c294900f31d8d032b62182f011019276d27d5d0commit-bot@chromium.org * A larger DPI would create a PDF that reflects the original 468c294900f31d8d032b62182f011019276d27d5d0commit-bot@chromium.org * intent with better fidelity, but it can make for larger 478c294900f31d8d032b62182f011019276d27d5d0commit-bot@chromium.org * PDF files too, which would use more memory while rendering, 488c294900f31d8d032b62182f011019276d27d5d0commit-bot@chromium.org * and it would be slower to be processed or sent online or 498c294900f31d8d032b62182f011019276d27d5d0commit-bot@chromium.org * to printer. 5099ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com */ 518c294900f31d8d032b62182f011019276d27d5d0commit-bot@chromium.org static SkDocument* CreatePDF( 528c294900f31d8d032b62182f011019276d27d5d0commit-bot@chromium.org const char filename[], 538c294900f31d8d032b62182f011019276d27d5d0commit-bot@chromium.org SkPicture::EncodeBitmap encoder = NULL, 548c294900f31d8d032b62182f011019276d27d5d0commit-bot@chromium.org SkScalar rasterDpi = SK_ScalarDefaultRasterDPI); 5599ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com 5699ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com /** 5799ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * Create a PDF-backed document, writing the results into a stream. 5899ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * If there is an error trying to create the doc, returns NULL. 5999ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * 6099ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * The document may write to the stream at anytime during its lifetime, 6199ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * until either close() is called or the document is deleted. Once close() 6299ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * has been called, and all of the data has been written to the stream, 6399ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * if there is a Done proc provided, it will be called with the stream. 6499ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * The proc can delete the stream, or whatever it needs to do. 65b5a6651f9f69570d964382134d64360915db9a29commit-bot@chromium.org * encoder sets the DCTEncoder for images, to encode a bitmap 66b5a6651f9f69570d964382134d64360915db9a29commit-bot@chromium.org * as JPEG (DCT). 67701b40543d5d124dfa1e59b051cba9d2aaf61670robertphillips@google.com * Done - clean up method intended to allow deletion of the stream. 68701b40543d5d124dfa1e59b051cba9d2aaf61670robertphillips@google.com * Its aborted parameter is true if the cleanup is due to an abort 69701b40543d5d124dfa1e59b051cba9d2aaf61670robertphillips@google.com * call. It is false otherwise. 708c294900f31d8d032b62182f011019276d27d5d0commit-bot@chromium.org * rasterDpi - the DPI at which features without native PDF support 718c294900f31d8d032b62182f011019276d27d5d0commit-bot@chromium.org * will be rasterized (e.g. draw image with perspective, 728c294900f31d8d032b62182f011019276d27d5d0commit-bot@chromium.org * draw text with perspective, ...) 738c294900f31d8d032b62182f011019276d27d5d0commit-bot@chromium.org * A larger DPI would create a PDF that reflects the original 748c294900f31d8d032b62182f011019276d27d5d0commit-bot@chromium.org * intent with better fidelity, but it can make for larger 758c294900f31d8d032b62182f011019276d27d5d0commit-bot@chromium.org * PDF files too, which would use more memory while rendering, 768c294900f31d8d032b62182f011019276d27d5d0commit-bot@chromium.org * and it would be slower to be processed or sent online or 778c294900f31d8d032b62182f011019276d27d5d0commit-bot@chromium.org * to printer. */ 788c294900f31d8d032b62182f011019276d27d5d0commit-bot@chromium.org static SkDocument* CreatePDF( 79701b40543d5d124dfa1e59b051cba9d2aaf61670robertphillips@google.com SkWStream*, void (*Done)(SkWStream*,bool aborted) = NULL, 808c294900f31d8d032b62182f011019276d27d5d0commit-bot@chromium.org SkPicture::EncodeBitmap encoder = NULL, 818c294900f31d8d032b62182f011019276d27d5d0commit-bot@chromium.org SkScalar rasterDpi = SK_ScalarDefaultRasterDPI); 8299ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com 8399ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com /** 8499ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * Begin a new page for the document, returning the canvas that will draw 8599ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * into the page. The document owns this canvas, and it will go out of 8699ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * scope when endPage() or close() is called, or the document is deleted. 8799ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com */ 8899ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com SkCanvas* beginPage(SkScalar width, SkScalar height, 8999ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com const SkRect* content = NULL); 9099ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com 9199ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com /** 9299ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * Call endPage() when the content for the current page has been drawn 9399ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * (into the canvas returned by beginPage()). After this call the canvas 9499ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * returned by beginPage() will be out-of-scope. 9599ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com */ 9699ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com void endPage(); 9799ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com 9899ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com /** 9999ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * Call close() when all pages have been drawn. This will close the file 10099ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * or stream holding the document's contents. After close() the document 10199ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * can no longer add new pages. Deleting the document will automatically 10299ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * call close() if need be. 103b5a6651f9f69570d964382134d64360915db9a29commit-bot@chromium.org * Returns true on success or false on failure. 10499ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com */ 105b5a6651f9f69570d964382134d64360915db9a29commit-bot@chromium.org bool close(); 106b5a6651f9f69570d964382134d64360915db9a29commit-bot@chromium.org 107b5a6651f9f69570d964382134d64360915db9a29commit-bot@chromium.org /** 108b5a6651f9f69570d964382134d64360915db9a29commit-bot@chromium.org * Call abort() to stop producing the document immediately. 109b5a6651f9f69570d964382134d64360915db9a29commit-bot@chromium.org * The stream output must be ignored, and should not be trusted. 110b5a6651f9f69570d964382134d64360915db9a29commit-bot@chromium.org */ 111b5a6651f9f69570d964382134d64360915db9a29commit-bot@chromium.org void abort(); 11299ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com 11399ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.comprotected: 114701b40543d5d124dfa1e59b051cba9d2aaf61670robertphillips@google.com SkDocument(SkWStream*, void (*)(SkWStream*, bool aborted)); 11599ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com // note: subclasses must call close() in their destructor, as the base class 11699ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com // cannot do this for them. 11799ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com virtual ~SkDocument(); 11899ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com 11999ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com virtual SkCanvas* onBeginPage(SkScalar width, SkScalar height, 12099ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com const SkRect& content) = 0; 12199ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com virtual void onEndPage() = 0; 122b5a6651f9f69570d964382134d64360915db9a29commit-bot@chromium.org virtual bool onClose(SkWStream*) = 0; 123b5a6651f9f69570d964382134d64360915db9a29commit-bot@chromium.org virtual void onAbort() = 0; 12499ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com 12599ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com enum State { 12699ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com kBetweenPages_State, 12799ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com kInPage_State, 12899ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com kClosed_State 12999ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com }; 13099ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com State getState() const { return fState; } 13199ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com 13299ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.comprivate: 13399ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com SkWStream* fStream; 134701b40543d5d124dfa1e59b051cba9d2aaf61670robertphillips@google.com void (*fDoneProc)(SkWStream*, bool aborted); 1356319367bdcbf5e5050632ab97973f5035d0dd8faskia.committer@gmail.com State fState; 136ef284a84f503adfd08ee52b5aee142c548698ea4commit-bot@chromium.org 137ef284a84f503adfd08ee52b5aee142c548698ea4commit-bot@chromium.org typedef SkRefCnt INHERITED; 13899ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com}; 13999ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com 14099ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com#endif 141