1 /* 2 * Copyright 2013 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef SkDocument_DEFINED 9 #define SkDocument_DEFINED 10 11 #include "SkBitmap.h" 12 #include "SkPicture.h" 13 #include "SkRect.h" 14 #include "SkRefCnt.h" 15 16 class SkCanvas; 17 class SkWStream; 18 19 /** SK_ScalarDefaultDPI is 72 DPI. 20 */ 21 #define SK_ScalarDefaultRasterDPI 72.0f 22 23 /** 24 * High-level API for creating a document-based canvas. To use.. 25 * 26 * 1. Create a document, specifying a stream to store the output. 27 * 2. For each "page" of content: 28 * a. canvas = doc->beginPage(...) 29 * b. draw_my_content(canvas); 30 * c. doc->endPage(); 31 * 3. Close the document with doc->close(). 32 */ 33 class SkDocument : public SkRefCnt { 34 public: 35 SK_DECLARE_INST_COUNT(SkDocument) 36 37 /** 38 * Create a PDF-backed document, writing the results into a file. 39 * If there is an error trying to create the doc, returns NULL. 40 * encoder sets the DCTEncoder for images, to encode a bitmap 41 * as JPEG (DCT). 42 * rasterDpi - the DPI at which features without native PDF support 43 * will be rasterized (e.g. draw image with perspective, 44 * draw text with perspective, ...) 45 * A larger DPI would create a PDF that reflects the original 46 * intent with better fidelity, but it can make for larger 47 * PDF files too, which would use more memory while rendering, 48 * and it would be slower to be processed or sent online or 49 * to printer. 50 */ 51 static SkDocument* CreatePDF( 52 const char filename[], 53 SkPicture::EncodeBitmap encoder = NULL, 54 SkScalar rasterDpi = SK_ScalarDefaultRasterDPI); 55 56 /** 57 * Create a PDF-backed document, writing the results into a stream. 58 * If there is an error trying to create the doc, returns NULL. 59 * 60 * The document may write to the stream at anytime during its lifetime, 61 * until either close() is called or the document is deleted. Once close() 62 * has been called, and all of the data has been written to the stream, 63 * if there is a Done proc provided, it will be called with the stream. 64 * The proc can delete the stream, or whatever it needs to do. 65 * encoder sets the DCTEncoder for images, to encode a bitmap 66 * as JPEG (DCT). 67 * Done - clean up method intended to allow deletion of the stream. 68 * Its aborted parameter is true if the cleanup is due to an abort 69 * call. It is false otherwise. 70 * rasterDpi - the DPI at which features without native PDF support 71 * will be rasterized (e.g. draw image with perspective, 72 * draw text with perspective, ...) 73 * A larger DPI would create a PDF that reflects the original 74 * intent with better fidelity, but it can make for larger 75 * PDF files too, which would use more memory while rendering, 76 * and it would be slower to be processed or sent online or 77 * to printer. */ 78 static SkDocument* CreatePDF( 79 SkWStream*, void (*Done)(SkWStream*,bool aborted) = NULL, 80 SkPicture::EncodeBitmap encoder = NULL, 81 SkScalar rasterDpi = SK_ScalarDefaultRasterDPI); 82 83 /** 84 * Begin a new page for the document, returning the canvas that will draw 85 * into the page. The document owns this canvas, and it will go out of 86 * scope when endPage() or close() is called, or the document is deleted. 87 */ 88 SkCanvas* beginPage(SkScalar width, SkScalar height, 89 const SkRect* content = NULL); 90 91 /** 92 * Call endPage() when the content for the current page has been drawn 93 * (into the canvas returned by beginPage()). After this call the canvas 94 * returned by beginPage() will be out-of-scope. 95 */ 96 void endPage(); 97 98 /** 99 * Call close() when all pages have been drawn. This will close the file 100 * or stream holding the document's contents. After close() the document 101 * can no longer add new pages. Deleting the document will automatically 102 * call close() if need be. 103 * Returns true on success or false on failure. 104 */ 105 bool close(); 106 107 /** 108 * Call abort() to stop producing the document immediately. 109 * The stream output must be ignored, and should not be trusted. 110 */ 111 void abort(); 112 113 protected: 114 SkDocument(SkWStream*, void (*)(SkWStream*, bool aborted)); 115 // note: subclasses must call close() in their destructor, as the base class 116 // cannot do this for them. 117 virtual ~SkDocument(); 118 119 virtual SkCanvas* onBeginPage(SkScalar width, SkScalar height, 120 const SkRect& content) = 0; 121 virtual void onEndPage() = 0; 122 virtual bool onClose(SkWStream*) = 0; 123 virtual void onAbort() = 0; 124 125 enum State { 126 kBetweenPages_State, 127 kInPage_State, 128 kClosed_State 129 }; getState()130 State getState() const { return fState; } 131 132 private: 133 SkWStream* fStream; 134 void (*fDoneProc)(SkWStream*, bool aborted); 135 State fState; 136 137 typedef SkRefCnt INHERITED; 138 }; 139 140 #endif 141