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 public: 29 /** Create a PDF page with the passed PDF device. The device need not 30 * have content on it yet. 31 * @param content The page content. 32 */ 33 explicit SkPDFPage(SkPDFDevice* content); 34 ~SkPDFPage(); 35 36 /** Before a page and its contents can be sized and emitted, it must 37 * be finalized. No changes to the PDFDevice will be honored after 38 * finalizePage has been called. This function adds the page content 39 * to the passed catalog, so it must be called for each document 40 * that the page is part of. 41 * @param catalog The catalog to add page content objects to. 42 * @param firstPage Indicate if this is the first page of a document. 43 * @param newResourceObjects All the resource objects (recursively) used on 44 * the page are added to this array. This gives 45 * the caller a chance to deduplicate resources 46 * across pages. 47 * @param knownResourceObjects The set of resources to be ignored. 48 */ 49 void finalizePage(SkPDFCatalog* catalog, bool firstPage, 50 const SkTSet<SkPDFObject*>& knownResourceObjects, 51 SkTSet<SkPDFObject*>* newResourceObjects); 52 53 /** Add destinations for this page to the supplied dictionary. 54 * @param dict Dictionary to add destinations to. 55 */ 56 void appendDestinations(SkPDFDict* dict); 57 58 /** Determine the size of the page content and store to the catalog 59 * the offsets of all nonresource-indirect objects that make up the page 60 * content. This must be called before emitPage(), but after finalizePage. 61 * @param catalog The catalog to add the object offsets to. 62 * @param fileOffset The file offset where the page content will be 63 * emitted. 64 */ 65 off_t getPageSize(SkPDFCatalog* catalog, off_t fileOffset); 66 67 /** Output the page content to the passed stream. 68 * @param stream The writable output stream to send the content to. 69 * @param catalog The active object catalog. 70 */ 71 void emitPage(SkWStream* stream, SkPDFCatalog* catalog); 72 73 /** Generate a page tree for the passed vector of pages. New objects are 74 * added to the catalog. The pageTree vector is populated with all of 75 * the 'Pages' dictionaries as well as the 'Page' objects. Page trees 76 * have both parent and children links, creating reference cycles, so 77 * it must be torn down explicitly. The first page is not added to 78 * the pageTree dictionary array so the caller can handle it specially. 79 * @param pages The ordered vector of page objects. 80 * @param catalog The catalog to add new objects into. 81 * @param pageTree An output vector with all of the internal and leaf 82 * nodes of the pageTree. 83 * @param rootNode An output parameter set to the root node. 84 */ 85 static void GeneratePageTree(const SkTDArray<SkPDFPage*>& pages, 86 SkPDFCatalog* catalog, 87 SkTDArray<SkPDFDict*>* pageTree, 88 SkPDFDict** rootNode); 89 90 /** Get the fonts used on this page. 91 */ 92 const SkTDArray<SkPDFFont*>& getFontResources() const; 93 94 /** Returns a SkPDFGlyphSetMap which represents glyph usage of every font 95 * that shows on this page. 96 */ 97 const SkPDFGlyphSetMap& getFontGlyphUsage() const; 98 99 private: 100 // Multiple pages may reference the content. 101 SkAutoTUnref<SkPDFDevice> fDevice; 102 103 // Once the content is finalized, put it into a stream for output. 104 SkAutoTUnref<SkPDFStream> fContentStream; 105 }; 106 107 #endif 108