SkPDF: More IndirectRefs

  * Reserve PDFIndirectReference for each new page.
  * SkPDFDocument::getPage returns PDFIndirectReference.
  * SkPDFDevice::appendDests takes a PDFIndirectReference.
  * generate_page_tree() respects page reservations, and
    returns PDFIndirectReference.
  * SkPDFDocument::fDests no longer sk_sp<>.
  * ProcSets moved back to ResourceDict.
  * StructTreeRoot builder moved to SkPDFTag::MakeStructTree.

Bug: skia:8630

Change-Id: Ie22e6b47d6d7b40bc47434794d26f7c43b7b241c
Reviewed-on: https://skia-review.googlesource.com/c/178934
Auto-Submit: Hal Canary <halcanary@google.com>
Reviewed-by: Herb Derby <herb@google.com>
Commit-Queue: Hal Canary <halcanary@google.com>
diff --git a/src/pdf/SkPDFDocumentPriv.h b/src/pdf/SkPDFDocumentPriv.h
index 27810dd..a432a20 100644
--- a/src/pdf/SkPDFDocumentPriv.h
+++ b/src/pdf/SkPDFDocumentPriv.h
@@ -85,7 +85,7 @@
     SkPDFCanon* canon() { return &fCanon; }
     const SkPDF::Metadata& metadata() const { return fMetadata; }
 
-    sk_sp<SkPDFDict> getPage(int pageIndex) const;
+    SkPDFIndirectReference getPage(size_t pageIndex) const;
     // Returns -1 if no mark ID.
     int getMarkIdForNodeId(int nodeId);
 
@@ -94,6 +94,8 @@
     void endObject();
 
     SkExecutor* executor() const { return fExecutor; }
+    size_t currentPageIndex() { return fPages.size(); }
+    size_t pageCount() { return fPageRefs.size(); }
 
 private:
     sk_sp<SkPDFTag> recursiveBuildTagTree(const SkPDF::StructureElementNode& node,
@@ -103,7 +105,8 @@
     SkPDFCanon fCanon;
     SkCanvas fCanvas;
     std::vector<sk_sp<SkPDFDict>> fPages;
-    sk_sp<SkPDFDict> fDests;
+    std::vector<SkPDFIndirectReference> fPageRefs;
+    SkPDFDict fDests;
     sk_sp<SkPDFDevice> fPageDevice;
     SkUUID fUUID;
     SkPDFIndirectReference fInfoDict;