SkDocument.h revision ef284a84f503adfd08ee52b5aee142c548698ea4
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 1199ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com#include "SkRect.h" 1299ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com#include "SkRefCnt.h" 1399ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com 1499ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.comclass SkCanvas; 1599ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.comclass SkWStream; 1699ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com 1799ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com/** 1899ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * High-level API for creating a document-based canvas. To use.. 1999ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * 2099ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * 1. Create a document, specifying a stream to store the output. 2199ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * 2. For each "page" of content: 2299ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * a. canvas = doc->beginPage(...) 2399ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * b. draw_my_content(canvas); 2499ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * c. doc->endPage(); 2599ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * 3. Close the document with doc->close(). 2699ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com */ 2799ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.comclass SkDocument : public SkRefCnt { 2899ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.compublic: 29ef284a84f503adfd08ee52b5aee142c548698ea4commit-bot@chromium.org SK_DECLARE_INST_COUNT(SkDocument) 30ef284a84f503adfd08ee52b5aee142c548698ea4commit-bot@chromium.org 3199ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com /** 3299ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * Create a PDF-backed document, writing the results into a file. 3399ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * If there is an error trying to create the doc, returns NULL. 3499ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com */ 3599ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com static SkDocument* CreatePDF(const char filename[]); 3699ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com 3799ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com /** 3899ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * Create a PDF-backed document, writing the results into a stream. 3999ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * If there is an error trying to create the doc, returns NULL. 4099ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * 4199ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * The document may write to the stream at anytime during its lifetime, 4299ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * until either close() is called or the document is deleted. Once close() 4399ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * has been called, and all of the data has been written to the stream, 4499ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * if there is a Done proc provided, it will be called with the stream. 4599ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * The proc can delete the stream, or whatever it needs to do. 4699ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com */ 4799ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com static SkDocument* CreatePDF(SkWStream*, void (*Done)(SkWStream*) = NULL); 4899ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com 4999ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com /** 5099ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * Begin a new page for the document, returning the canvas that will draw 5199ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * into the page. The document owns this canvas, and it will go out of 5299ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * scope when endPage() or close() is called, or the document is deleted. 5399ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com */ 5499ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com SkCanvas* beginPage(SkScalar width, SkScalar height, 5599ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com const SkRect* content = NULL); 5699ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com 5799ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com /** 5899ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * Call endPage() when the content for the current page has been drawn 5999ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * (into the canvas returned by beginPage()). After this call the canvas 6099ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * returned by beginPage() will be out-of-scope. 6199ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com */ 6299ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com void endPage(); 6399ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com 6499ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com /** 6599ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * Call close() when all pages have been drawn. This will close the file 6699ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * or stream holding the document's contents. After close() the document 6799ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * can no longer add new pages. Deleting the document will automatically 6899ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com * call close() if need be. 6999ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com */ 7099ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com void close(); 7199ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com 7299ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.comprotected: 7399ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com SkDocument(SkWStream*, void (*)(SkWStream*)); 7499ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com // note: subclasses must call close() in their destructor, as the base class 7599ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com // cannot do this for them. 7699ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com virtual ~SkDocument(); 7799ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com 7899ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com virtual SkCanvas* onBeginPage(SkScalar width, SkScalar height, 7999ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com const SkRect& content) = 0; 8099ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com virtual void onEndPage() = 0; 8199ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com virtual void onClose(SkWStream*) = 0; 8299ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com 8399ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com enum State { 8499ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com kBetweenPages_State, 8599ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com kInPage_State, 8699ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com kClosed_State 8799ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com }; 8899ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com State getState() const { return fState; } 8999ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com 9099ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.comprivate: 9199ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com SkWStream* fStream; 9299ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com void (*fDoneProc)(SkWStream*); 936319367bdcbf5e5050632ab97973f5035d0dd8faskia.committer@gmail.com State fState; 94ef284a84f503adfd08ee52b5aee142c548698ea4commit-bot@chromium.org 95ef284a84f503adfd08ee52b5aee142c548698ea4commit-bot@chromium.org typedef SkRefCnt INHERITED; 9699ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com}; 9799ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com 9899ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com#endif 99