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