Home | History | Annotate | Download | only in core
      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 "SkRefCnt.h"
     12 #include "SkScalar.h"
     13 
     14 class SkCanvas;
     15 class SkWStream;
     16 struct SkRect;
     17 
     18 /** SK_ScalarDefaultDPI is 72 dots per inch. */
     19 static constexpr SkScalar SK_ScalarDefaultRasterDPI = 72.0f;
     20 
     21 /**
     22  *  High-level API for creating a document-based canvas. To use..
     23  *
     24  *  1. Create a document, specifying a stream to store the output.
     25  *  2. For each "page" of content:
     26  *      a. canvas = doc->beginPage(...)
     27  *      b. draw_my_content(canvas);
     28  *      c. doc->endPage();
     29  *  3. Close the document with doc->close().
     30  */
     31 class SK_API SkDocument : public SkRefCnt {
     32 public:
     33 
     34     /**
     35      *  Begin a new page for the document, returning the canvas that will draw
     36      *  into the page. The document owns this canvas, and it will go out of
     37      *  scope when endPage() or close() is called, or the document is deleted.
     38      */
     39     SkCanvas* beginPage(SkScalar width, SkScalar height, const SkRect* content = nullptr);
     40 
     41     /**
     42      *  Call endPage() when the content for the current page has been drawn
     43      *  (into the canvas returned by beginPage()). After this call the canvas
     44      *  returned by beginPage() will be out-of-scope.
     45      */
     46     void endPage();
     47 
     48     /**
     49      *  Call close() when all pages have been drawn. This will close the file
     50      *  or stream holding the document's contents. After close() the document
     51      *  can no longer add new pages. Deleting the document will automatically
     52      *  call close() if need be.
     53      */
     54     void close();
     55 
     56     /**
     57      *  Call abort() to stop producing the document immediately.
     58      *  The stream output must be ignored, and should not be trusted.
     59      */
     60     void abort();
     61 
     62 protected:
     63     SkDocument(SkWStream*);
     64 
     65     // note: subclasses must call close() in their destructor, as the base class
     66     // cannot do this for them.
     67     virtual ~SkDocument();
     68 
     69     virtual SkCanvas* onBeginPage(SkScalar width, SkScalar height) = 0;
     70     virtual void onEndPage() = 0;
     71     virtual void onClose(SkWStream*) = 0;
     72     virtual void onAbort() = 0;
     73 
     74     // Allows subclasses to write to the stream as pages are written.
     75     SkWStream* getStream() { return fStream; }
     76 
     77     enum State {
     78         kBetweenPages_State,
     79         kInPage_State,
     80         kClosed_State
     81     };
     82     State getState() const { return fState; }
     83 
     84 private:
     85     SkWStream* fStream;
     86     State      fState;
     87 
     88     typedef SkRefCnt INHERITED;
     89 };
     90 
     91 #endif
     92