revert r7892

git-svn-id: http://skia.googlecode.com/svn/trunk@7896 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/pdf/SkPDFDocument.cpp b/src/pdf/SkPDFDocument.cpp
index fc09286..c7266d8 100644
--- a/src/pdf/SkPDFDocument.cpp
+++ b/src/pdf/SkPDFDocument.cpp
@@ -14,13 +14,21 @@
 #include "SkPDFPage.h"
 #include "SkPDFTypes.h"
 #include "SkStream.h"
-#include "SkTSet.h"
 
-static void addResourcesToCatalog(bool firstPage,
-                                  SkTSet<SkPDFObject*>* resourceSet,
-                                  SkPDFCatalog* catalog) {
-    for (int i = 0; i < resourceSet->count(); i++) {
-        catalog->addObject((*resourceSet)[i], firstPage);
+// Add the resources, starting at firstIndex to the catalog, removing any dupes.
+// A hash table would be really nice here.
+static void addResourcesToCatalog(int firstIndex, bool firstPage,
+                          SkTDArray<SkPDFObject*>* resourceList,
+                          SkPDFCatalog* catalog) {
+    for (int i = firstIndex; i < resourceList->count(); i++) {
+        int index = resourceList->find((*resourceList)[i]);
+        if (index != i) {
+            (*resourceList)[i]->unref();
+            resourceList->removeShuffle(i);
+            i--;
+        } else {
+            catalog->addObject((*resourceList)[i], firstPage);
+        }
     }
 }
 
@@ -49,12 +57,11 @@
 
 SkPDFDocument::SkPDFDocument(Flags flags)
         : fXRefFileOffset(0),
+          fSecondPageFirstResourceIndex(0),
           fTrailerDict(NULL) {
     fCatalog.reset(new SkPDFCatalog(flags));
     fDocCatalog = SkNEW_ARGS(SkPDFDict, ("Catalog"));
     fCatalog->addObject(fDocCatalog, true);
-    fFirstPageResources = NULL;
-    fOtherPageResources = NULL;
 }
 
 SkPDFDocument::~SkPDFDocument() {
@@ -66,14 +73,11 @@
         fPageTree[i]->clear();
     }
     fPageTree.safeUnrefAll();
-    fFirstPageResources->safeUnrefAll();
-    fOtherPageResources->safeUnrefAll();
+    fPageResources.safeUnrefAll();
     fSubstitutes.safeUnrefAll();
 
     fDocCatalog->unref();
     SkSafeUnref(fTrailerDict);
-    SkDELETE(fFirstPageResources);
-    SkDELETE(fOtherPageResources);
 }
 
 bool SkPDFDocument::emitPDF(SkWStream* stream) {
@@ -86,9 +90,6 @@
         }
     }
 
-    fFirstPageResources = SkNEW(SkTSet<SkPDFObject*>);
-    fOtherPageResources = SkNEW(SkTSet<SkPDFObject*>);
-
     // We haven't emitted the document before if fPageTree is empty.
     if (fPageTree.isEmpty()) {
         SkPDFDict* pageTreeRoot;
@@ -107,35 +108,15 @@
         */
 
         bool firstPage = true;
-        /* The references returned in newResources are transfered to
-         * fFirstPageResources or fOtherPageResources depending on firstPage and
-         * knownResources doesn't have a reference but just relies on the other
-         * two sets to maintain a reference.
-         */
-        SkTSet<SkPDFObject*> knownResources;
-
-        // mergeInto returns the number of duplicates.
-        // If there are duplicates, there is a bug and we mess ref counting.
-        int duplicates = 0;
-        knownResources.mergeInto(*fFirstPageResources);
         for (int i = 0; i < fPages.count(); i++) {
-            if (i == 1) {
+            int resourceCount = fPageResources.count();
+            fPages[i]->finalizePage(fCatalog.get(), firstPage, &fPageResources);
+            addResourcesToCatalog(resourceCount, firstPage, &fPageResources,
+                                  fCatalog.get());
+            if (i == 0) {
                 firstPage = false;
-                duplicates = knownResources.mergeInto(*fOtherPageResources);
+                fSecondPageFirstResourceIndex = fPageResources.count();
             }
-            SkTSet<SkPDFObject*> newResources;
-            fPages[i]->finalizePage(
-                fCatalog.get(), firstPage, knownResources, &newResources);
-            addResourcesToCatalog(firstPage, &newResources, fCatalog.get());
-            if (firstPage) {
-                duplicates = fFirstPageResources->mergeInto(newResources);
-            } else {
-                duplicates = fOtherPageResources->mergeInto(newResources);
-            }
-            SkASSERT(duplicates == 0);             
-
-            duplicates = knownResources.mergeInto(newResources);
-            SkASSERT(duplicates == 0); 
         }
 
         // Build font subsetting info before proceeding.
@@ -147,8 +128,8 @@
         fileOffset += fCatalog->setFileOffset(fPages[0], fileOffset);
         fileOffset += fPages[0]->getPageSize(fCatalog.get(),
                 (size_t) fileOffset);
-        for (int i = 0; i < fFirstPageResources->count(); i++) {
-            fileOffset += fCatalog->setFileOffset((*fFirstPageResources)[i],
+        for (int i = 0; i < fSecondPageFirstResourceIndex; i++) {
+            fileOffset += fCatalog->setFileOffset(fPageResources[i],
                                                   fileOffset);
         }
         // Add the size of resources of substitute objects used on page 1.
@@ -166,9 +147,11 @@
             fileOffset += fPages[i]->getPageSize(fCatalog.get(), fileOffset);
         }
 
-        for (int i = 0; i < fOtherPageResources->count(); i++) {
-            fileOffset += fCatalog->setFileOffset(
-                (*fOtherPageResources)[i], fileOffset);
+        for (int i = fSecondPageFirstResourceIndex;
+                 i < fPageResources.count();
+                 i++) {
+            fileOffset += fCatalog->setFileOffset(fPageResources[i],
+                                                  fileOffset);
         }
 
         fileOffset += fCatalog->setSubstituteResourcesOffsets(fileOffset,
@@ -180,8 +163,8 @@
     fDocCatalog->emitObject(stream, fCatalog.get(), true);
     fPages[0]->emitObject(stream, fCatalog.get(), true);
     fPages[0]->emitPage(stream, fCatalog.get());
-    for (int i = 0; i < fFirstPageResources->count(); i++) {
-        (*fFirstPageResources)[i]->emit(stream, fCatalog.get(), true);
+    for (int i = 0; i < fSecondPageFirstResourceIndex; i++) {
+        fPageResources[i]->emit(stream, fCatalog.get(), true);
     }
     fCatalog->emitSubstituteResources(stream, true);
     // TODO(vandebo): Support linearized format
@@ -198,8 +181,10 @@
         fPages[i]->emitPage(stream, fCatalog.get());
     }
 
-    for (int i = 0; i < fOtherPageResources->count(); i++) {
-        (*fOtherPageResources)[i]->emit(stream, fCatalog.get(), true);
+    for (int i = fSecondPageFirstResourceIndex;
+            i < fPageResources.count();
+            i++) {
+        fPageResources[i]->emit(stream, fCatalog.get(), true);
     }
 
     fCatalog->emitSubstituteResources(stream, false);