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