[PDF] Add setPage method to SkPDFDocument.

BUG=312

Review URL: http://codereview.appspot.com/4763047

git-svn-id: http://skia.googlecode.com/svn/trunk@1892 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/pdf/SkPDFDocument.cpp b/src/pdf/SkPDFDocument.cpp
index faa9360..3b7609f 100644
--- a/src/pdf/SkPDFDocument.cpp
+++ b/src/pdf/SkPDFDocument.cpp
@@ -56,8 +56,14 @@
 }
 
 bool SkPDFDocument::emitPDF(SkWStream* stream) {
-    if (fPages.isEmpty())
+    if (fPages.isEmpty()) {
         return false;
+    }
+    for (int i = 0; i < fPages.count(); i++) {
+        if (fPages[i] == NULL) {
+            return false;
+        }
+    }
 
     // We haven't emitted the document before if fPageTree is empty.
     if (fPageTree.count() == 0) {
@@ -147,17 +153,36 @@
     return true;
 }
 
-bool SkPDFDocument::appendPage(const SkRefPtr<SkPDFDevice>& pdfDevice) {
-    if (fPageTree.count() != 0)
+bool SkPDFDocument::setPage(int pageNumber,
+                            const SkRefPtr<SkPDFDevice>& pdfDevice) {
+    if (fPageTree.count() != 0) {
         return false;
+    }
+
+    pageNumber--;
+    SkASSERT(pageNumber >= 0);
+
+    if (pageNumber > fPages.count()) {
+        int oldSize = fPages.count();
+        fPages.setCount(pageNumber + 1);
+        for (int i = oldSize; i <= pageNumber; i++) {
+            fPages[i] = NULL;
+        }
+    }
+
+    SkPDFPage* page = new SkPDFPage(pdfDevice);
+    SkSafeUnref(fPages[pageNumber]);
+    fPages[pageNumber] = page; // Reference from new passed to fPages.
+    return true;
+}
+
+bool SkPDFDocument::appendPage(const SkRefPtr<SkPDFDevice>& pdfDevice) {
+    if (fPageTree.count() != 0) {
+        return false;
+    }
 
     SkPDFPage* page = new SkPDFPage(pdfDevice);
     fPages.push(page);  // Reference from new passed to fPages.
-    // The rest of the pages will be added to the catalog along with the rest
-    // of the page tree.  But the first page has to be marked as such, so we
-    // handle it here.
-    if (fPages.count() == 1)
-        fCatalog.addObject(page, true);
     return true;
 }
 
diff --git a/src/pdf/SkPDFPage.cpp b/src/pdf/SkPDFPage.cpp
index 2a8183d..c162d51 100644
--- a/src/pdf/SkPDFPage.cpp
+++ b/src/pdf/SkPDFPage.cpp
@@ -114,6 +114,7 @@
                     catalog->addObject(curNodes[i], false);
                 } else {
                     SkSafeUnref(curNodes[i]);
+                    catalog->addObject(curNodes[i], true);
                 }
             }