• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
2 /*
3  * Copyright 2010 The Android Open Source Project
4  *
5  * Use of this source code is governed by a BSD-style license that can be
6  * found in the LICENSE file.
7  */
8 
9 
10 #ifndef SkPDFPage_DEFINED
11 #define SkPDFPage_DEFINED
12 
13 #include "SkPDFTypes.h"
14 #include "SkPDFStream.h"
15 #include "SkRefCnt.h"
16 #include "SkTDArray.h"
17 
18 class SkPDFCatalog;
19 class SkPDFDevice;
20 class SkWStream;
21 
22 /** \class SkPDFPage
23 
24     A SkPDFPage contains meta information about a page, is used in the page
25     tree and points to the content of the page.
26 */
27 class SkPDFPage : public SkPDFDict {
28     SK_DECLARE_INST_COUNT(SkPDFPage)
29 public:
30     /** Create a PDF page with the passed PDF device.  The device need not
31      *  have content on it yet.
32      *  @param content    The page content.
33      */
34     explicit SkPDFPage(SkPDFDevice* content);
35     ~SkPDFPage();
36 
37     /** Before a page and its contents can be sized and emitted, it must
38      *  be finalized.  No changes to the PDFDevice will be honored after
39      *  finalizePage has been called.  This function adds the page content
40      *  to the passed catalog, so it must be called for each document
41      *  that the page is part of.
42      *  @param catalog         The catalog to add page content objects to.
43      *  @param firstPage       Indicate if this is the first page of a document.
44      *  @param newResourceObjects All the resource objects (recursively) used on
45      *                         the page are added to this array.  This gives
46      *                         the caller a chance to deduplicate resources
47      *                         across pages.
48      *  @param knownResourceObjects  The set of resources to be ignored.
49      */
50     void finalizePage(SkPDFCatalog* catalog, bool firstPage,
51                       const SkTSet<SkPDFObject*>& knownResourceObjects,
52                       SkTSet<SkPDFObject*>* newResourceObjects);
53 
54     /** Add destinations for this page to the supplied dictionary.
55      *  @param dict       Dictionary to add destinations to.
56      */
57     void appendDestinations(SkPDFDict* dict);
58 
59     /** Determine the size of the page content and store to the catalog
60      *  the offsets of all nonresource-indirect objects that make up the page
61      *  content.  This must be called before emitPage(), but after finalizePage.
62      *  @param catalog    The catalog to add the object offsets to.
63      *  @param fileOffset The file offset where the page content will be
64      *                    emitted.
65      */
66     off_t getPageSize(SkPDFCatalog* catalog, off_t fileOffset);
67 
68     /** Output the page content to the passed stream.
69      *  @param stream     The writable output stream to send the content to.
70      *  @param catalog    The active object catalog.
71      */
72     void emitPage(SkWStream* stream, SkPDFCatalog* catalog);
73 
74     /** Generate a page tree for the passed vector of pages.  New objects are
75      *  added to the catalog.  The pageTree vector is populated with all of
76      *  the 'Pages' dictionaries as well as the 'Page' objects.  Page trees
77      *  have both parent and children links, creating reference cycles, so
78      *  it must be torn down explicitly.  The first page is not added to
79      *  the pageTree dictionary array so the caller can handle it specially.
80      *  @param pages      The ordered vector of page objects.
81      *  @param catalog    The catalog to add new objects into.
82      *  @param pageTree   An output vector with all of the internal and leaf
83      *                    nodes of the pageTree.
84      *  @param rootNode   An output parameter set to the root node.
85      */
86     static void GeneratePageTree(const SkTDArray<SkPDFPage*>& pages,
87                                  SkPDFCatalog* catalog,
88                                  SkTDArray<SkPDFDict*>* pageTree,
89                                  SkPDFDict** rootNode);
90 
91     /** Get the fonts used on this page.
92      */
93     const SkTDArray<SkPDFFont*>& getFontResources() const;
94 
95     /** Returns a SkPDFGlyphSetMap which represents glyph usage of every font
96      *  that shows on this page.
97      */
98     const SkPDFGlyphSetMap& getFontGlyphUsage() const;
99 
100 private:
101     // Multiple pages may reference the content.
102     SkAutoTUnref<SkPDFDevice> fDevice;
103 
104     // Once the content is finalized, put it into a stream for output.
105     SkAutoTUnref<SkPDFStream> fContentStream;
106     typedef SkPDFDict INHERITED;
107 };
108 
109 #endif
110