From 5bd26d32ab85d09dccabbdc6dd944ef36ac32423 Mon Sep 17 00:00:00 2001 From: "edisonn@google.com" Date: Thu, 28 Feb 2013 14:01:44 +0000 Subject: [PATCH] revert r7892 git-svn-id: http://skia.googlecode.com/svn/trunk@7896 2bbb7eff-a529-9590-31e7-b0007b416f81 --- gyp/pdf.gyp | 2 - include/pdf/SkPDFDevice.h | 12 +----- include/pdf/SkPDFDocument.h | 4 +- src/pdf/SkPDFCatalog.cpp | 30 +++++++-------- src/pdf/SkPDFCatalog.h | 6 +-- src/pdf/SkPDFDevice.cpp | 63 +++++++++++--------------------- src/pdf/SkPDFDocument.cpp | 85 ++++++++++++++++++------------------------- src/pdf/SkPDFFont.cpp | 5 +-- src/pdf/SkPDFFont.h | 3 +- src/pdf/SkPDFFormXObject.cpp | 20 ++++++---- src/pdf/SkPDFFormXObject.h | 5 +-- src/pdf/SkPDFGraphicState.cpp | 6 +-- src/pdf/SkPDFGraphicState.h | 3 +- src/pdf/SkPDFImage.cpp | 5 +-- src/pdf/SkPDFImage.h | 3 +- src/pdf/SkPDFPage.cpp | 5 +-- src/pdf/SkPDFPage.h | 6 +-- src/pdf/SkPDFShader.cpp | 18 +++------ src/pdf/SkPDFTypes.cpp | 22 ++++------- src/pdf/SkPDFTypes.h | 30 +++++---------- tests/PDFPrimitivesTest.cpp | 6 +-- 21 files changed, 129 insertions(+), 210 deletions(-) diff --git a/gyp/pdf.gyp b/gyp/pdf.gyp index 081df01..7b3b9ea 100644 --- a/gyp/pdf.gyp +++ b/gyp/pdf.gyp @@ -12,7 +12,6 @@ 'include_dirs': [ '../include/config', '../include/core', - '../include/images', '../include/pdf', '../src/core', # needed to get SkGlyphCache.h and SkTextFormatParams.h '../src/utils', # needed to get SkBitSet.h @@ -44,7 +43,6 @@ '../src/pdf/SkPDFTypes.h', '../src/pdf/SkPDFUtils.cpp', '../src/pdf/SkPDFUtils.h', - '../src/pdf/SkTSet.h', ], # This section makes all targets that depend on this target # #define SK_SUPPORT_PDF and have access to the pdf header files. diff --git a/include/pdf/SkPDFDevice.h b/include/pdf/SkPDFDevice.h index f42ecb8..a13d617 100644 --- a/include/pdf/SkPDFDevice.h +++ b/include/pdf/SkPDFDevice.h @@ -29,7 +29,6 @@ class SkPDFGraphicState; class SkPDFObject; class SkPDFShader; class SkPDFStream; -template class SK_API SkTSet; // Private classes. struct ContentEntry; @@ -131,19 +130,12 @@ public: SK_API SkPDFDict* getResourceDict(); /** Get the list of resources (PDF objects) used on this page. - * This method will add to newResourceObjects any objects that this method - * depends on, but not already in knownResourceObjects. This might operate - * recursively so if this object depends on another object and that object - * depends on two more, all three objects will be added. - * - * @param knownResourceObjects The set of resources to be ignored. - * @param newResourceObjects The set to append dependant resources to. + * @param resourceList A list to append the resources to. * @param recursive If recursive is true, get the resources of the * device's resources recursively. (Useful for adding * objects to the catalog.) */ - SK_API void getResources(const SkTSet& knownResourceObjects, - SkTSet* newResourceObjects, + SK_API void getResources(SkTDArray* resourceList, bool recursive) const; /** Get the fonts used on this device. diff --git a/include/pdf/SkPDFDocument.h b/include/pdf/SkPDFDocument.h index 443e8c2..167634e 100644 --- a/include/pdf/SkPDFDocument.h +++ b/include/pdf/SkPDFDocument.h @@ -21,7 +21,6 @@ class SkPDFDict; class SkPDFPage; class SkPDFObject; class SkWStream; -template class SK_API SkTSet; /** \class SkPDFDocument @@ -77,8 +76,7 @@ private: SkTDArray fPages; SkTDArray fPageTree; SkPDFDict* fDocCatalog; - SkTSet* fFirstPageResources; - SkTSet* fOtherPageResources; + SkTDArray fPageResources; SkTDArray fSubstitutes; int fSecondPageFirstResourceIndex; diff --git a/src/pdf/SkPDFCatalog.cpp b/src/pdf/SkPDFCatalog.cpp index 6e84455..c0f6fb0 100644 --- a/src/pdf/SkPDFCatalog.cpp +++ b/src/pdf/SkPDFCatalog.cpp @@ -168,16 +168,12 @@ void SkPDFCatalog::setSubstitute(SkPDFObject* original, fSubstituteMap.append(1, &newMapping); // Add resource objects of substitute object to catalog. - SkTSet* targetSet = getSubstituteList(onFirstPage); - SkTSet newResourceObjects; - newMapping.fSubstitute->getResources(*targetSet, &newResourceObjects); - for (int i = 0; i < newResourceObjects.count(); ++i) { - addObject(newResourceObjects[i], onFirstPage); - } - // mergeInto returns the number of duplicates. - // If there are duplicates, there is a bug and we mess ref counting. - SkDEBUGCODE(int duplicates =) targetSet->mergeInto(newResourceObjects); - SkASSERT(duplicates == 0); + SkTDArray* targetList = getSubstituteList(onFirstPage); + int existingSize = targetList->count(); + newMapping.fSubstitute->getResources(targetList); + for (int i = existingSize; i < targetList->count(); ++i) { + addObject((*targetList)[i], onFirstPage); + } } SkPDFObject* SkPDFCatalog::getSubstituteObject(SkPDFObject* object) { @@ -191,22 +187,22 @@ SkPDFObject* SkPDFCatalog::getSubstituteObject(SkPDFObject* object) { off_t SkPDFCatalog::setSubstituteResourcesOffsets(off_t fileOffset, bool firstPage) { - SkTSet* targetSet = getSubstituteList(firstPage); + SkTDArray* targetList = getSubstituteList(firstPage); off_t offsetSum = fileOffset; - for (int i = 0; i < targetSet->count(); ++i) { - offsetSum += setFileOffset((*targetSet)[i], offsetSum); + for (int i = 0; i < targetList->count(); ++i) { + offsetSum += setFileOffset((*targetList)[i], offsetSum); } return offsetSum - fileOffset; } void SkPDFCatalog::emitSubstituteResources(SkWStream *stream, bool firstPage) { - SkTSet* targetSet = getSubstituteList(firstPage); - for (int i = 0; i < targetSet->count(); ++i) { - (*targetSet)[i]->emit(stream, this, true); + SkTDArray* targetList = getSubstituteList(firstPage); + for (int i = 0; i < targetList->count(); ++i) { + (*targetList)[i]->emit(stream, this, true); } } -SkTSet* SkPDFCatalog::getSubstituteList(bool firstPage) { +SkTDArray* SkPDFCatalog::getSubstituteList(bool firstPage) { return firstPage ? &fSubstituteResourcesFirstPage : &fSubstituteResourcesRemaining; } diff --git a/src/pdf/SkPDFCatalog.h b/src/pdf/SkPDFCatalog.h index c7c6d6e..d5825ac 100644 --- a/src/pdf/SkPDFCatalog.h +++ b/src/pdf/SkPDFCatalog.h @@ -115,8 +115,8 @@ private: // TODO(arthurhsu): Make this a hash if it's a performance problem. SkTDArray fSubstituteMap; - SkTSet fSubstituteResourcesFirstPage; - SkTSet fSubstituteResourcesRemaining; + SkTDArray fSubstituteResourcesFirstPage; + SkTDArray fSubstituteResourcesRemaining; // Number of objects on the first page. uint32_t fFirstPageCount; @@ -131,7 +131,7 @@ private: int assignObjNum(SkPDFObject* obj); - SkTSet* getSubstituteList(bool firstPage); + SkTDArray* getSubstituteList(bool firstPage); }; #endif diff --git a/src/pdf/SkPDFDevice.cpp b/src/pdf/SkPDFDevice.cpp index 7fb6db0..aabc6b3 100644 --- a/src/pdf/SkPDFDevice.cpp +++ b/src/pdf/SkPDFDevice.cpp @@ -32,7 +32,6 @@ #include "SkTemplates.h" #include "SkTypeface.h" #include "SkTypes.h" -#include "SkTSet.h" // Utility functions @@ -1176,57 +1175,39 @@ SkPDFDict* SkPDFDevice::getResourceDict() { return fResourceDict; } -void SkPDFDevice::getResources(const SkTSet& knownResourceObjects, - SkTSet* newResourceObjects, +void SkPDFDevice::getResources(SkTDArray* resourceList, bool recursive) const { - // TODO: reserve not correct if we need to recursively explore. - newResourceObjects->setReserve(newResourceObjects->count() + - fGraphicStateResources.count() + - fXObjectResources.count() + - fFontResources.count() + - fShaderResources.count()); + resourceList->setReserve(resourceList->count() + + fGraphicStateResources.count() + + fXObjectResources.count() + + fFontResources.count() + + fShaderResources.count()); for (int i = 0; i < fGraphicStateResources.count(); i++) { - if (!knownResourceObjects.contains(fGraphicStateResources[i]) && - !newResourceObjects->contains(fGraphicStateResources[i])) { - newResourceObjects->add(fGraphicStateResources[i]); - fGraphicStateResources[i]->ref(); - if (recursive) { - fGraphicStateResources[i]->getResources(knownResourceObjects, - newResourceObjects); - } + resourceList->push(fGraphicStateResources[i]); + fGraphicStateResources[i]->ref(); + if (recursive) { + fGraphicStateResources[i]->getResources(resourceList); } } for (int i = 0; i < fXObjectResources.count(); i++) { - if (!knownResourceObjects.contains(fXObjectResources[i]) && - !newResourceObjects->contains(fXObjectResources[i])) { - newResourceObjects->add(fXObjectResources[i]); - fXObjectResources[i]->ref(); - if (recursive) { - fXObjectResources[i]->getResources(knownResourceObjects, - newResourceObjects); - } + resourceList->push(fXObjectResources[i]); + fXObjectResources[i]->ref(); + if (recursive) { + fXObjectResources[i]->getResources(resourceList); } } for (int i = 0; i < fFontResources.count(); i++) { - if (!knownResourceObjects.contains(fFontResources[i]) && - !newResourceObjects->contains(fFontResources[i])) { - newResourceObjects->add(fFontResources[i]); - fFontResources[i]->ref(); - if (recursive) { - fFontResources[i]->getResources(knownResourceObjects, - newResourceObjects); - } + resourceList->push(fFontResources[i]); + fFontResources[i]->ref(); + if (recursive) { + fFontResources[i]->getResources(resourceList); } } for (int i = 0; i < fShaderResources.count(); i++) { - if (!knownResourceObjects.contains(fShaderResources[i]) && - !newResourceObjects->contains(fShaderResources[i])) { - newResourceObjects->add(fShaderResources[i]); - fShaderResources[i]->ref(); - if (recursive) { - fShaderResources[i]->getResources(knownResourceObjects, - newResourceObjects); - } + resourceList->push(fShaderResources[i]); + fShaderResources[i]->ref(); + if (recursive) { + fShaderResources[i]->getResources(resourceList); } } } 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* 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* 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 @@ static void perform_font_subsetting(SkPDFCatalog* catalog, 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 @@ SkPDFDocument::~SkPDFDocument() { 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 @@ bool SkPDFDocument::emitPDF(SkWStream* stream) { } } - fFirstPageResources = SkNEW(SkTSet); - fOtherPageResources = SkNEW(SkTSet); - // We haven't emitted the document before if fPageTree is empty. if (fPageTree.isEmpty()) { SkPDFDict* pageTreeRoot; @@ -107,35 +108,15 @@ bool SkPDFDocument::emitPDF(SkWStream* stream) { */ 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 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); - } - SkTSet 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); + fSecondPageFirstResourceIndex = fPageResources.count(); } - SkASSERT(duplicates == 0); - - duplicates = knownResources.mergeInto(newResources); - SkASSERT(duplicates == 0); } // Build font subsetting info before proceeding. @@ -147,8 +128,8 @@ bool SkPDFDocument::emitPDF(SkWStream* stream) { 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 @@ bool SkPDFDocument::emitPDF(SkWStream* stream) { 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 @@ bool SkPDFDocument::emitPDF(SkWStream* stream) { 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 @@ bool SkPDFDocument::emitPDF(SkWStream* stream) { 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); diff --git a/src/pdf/SkPDFFont.cpp b/src/pdf/SkPDFFont.cpp index af58ac7..89b4fc9 100644 --- a/src/pdf/SkPDFFont.cpp +++ b/src/pdf/SkPDFFont.cpp @@ -716,9 +716,8 @@ SkPDFFont::~SkPDFFont() { fResources.unrefAll(); } -void SkPDFFont::getResources(const SkTSet& knownResourceObjects, - SkTSet* newResourceObjects) { - GetResourcesHelper(&fResources, knownResourceObjects, newResourceObjects); +void SkPDFFont::getResources(SkTDArray* resourceList) { + GetResourcesHelper(&fResources, resourceList); } SkTypeface* SkPDFFont::typeface() { diff --git a/src/pdf/SkPDFFont.h b/src/pdf/SkPDFFont.h index d3aae89..693b911 100644 --- a/src/pdf/SkPDFFont.h +++ b/src/pdf/SkPDFFont.h @@ -81,8 +81,7 @@ class SkPDFFont : public SkPDFDict { public: virtual ~SkPDFFont(); - virtual void getResources(const SkTSet& knownResourceObjects, - SkTSet* newResourceObjects); + virtual void getResources(SkTDArray* resourceList); /** Returns the typeface represented by this class. Returns NULL for the * default typeface. diff --git a/src/pdf/SkPDFFormXObject.cpp b/src/pdf/SkPDFFormXObject.cpp index 884e6db..5e33995 100644 --- a/src/pdf/SkPDFFormXObject.cpp +++ b/src/pdf/SkPDFFormXObject.cpp @@ -20,8 +20,16 @@ SkPDFFormXObject::SkPDFFormXObject(SkPDFDevice* device) { // We don't want to keep around device because we'd have two copies // of content, so reference or copy everything we need (content and // resources). - SkTSet emptySet; - device->getResources(emptySet, &fResources, false); + device->getResources(&fResources, false); + + // Fail fast if in the tree of resources a child references a parent. + // If there is an issue, getResources will end up consuming all memory. + // TODO: A better approach might be for all SkPDFObject to keep track + // of possible cycles. +#ifdef SK_DEBUG + SkTDArray dummy_resourceList; + getResources(&dummy_resourceList); +#endif SkAutoTUnref content(device->content()); setData(content.get()); @@ -56,10 +64,6 @@ SkPDFFormXObject::~SkPDFFormXObject() { fResources.unrefAll(); } -void SkPDFFormXObject::getResources( - const SkTSet& knownResourceObjects, - SkTSet* newResourceObjects) { - GetResourcesHelper(&fResources.toArray(), - knownResourceObjects, - newResourceObjects); +void SkPDFFormXObject::getResources(SkTDArray* resourceList) { + GetResourcesHelper(&fResources, resourceList); } diff --git a/src/pdf/SkPDFFormXObject.h b/src/pdf/SkPDFFormXObject.h index b1a6f74..0c49152 100644 --- a/src/pdf/SkPDFFormXObject.h +++ b/src/pdf/SkPDFFormXObject.h @@ -39,11 +39,10 @@ public: virtual ~SkPDFFormXObject(); // The SkPDFObject interface. - virtual void getResources(const SkTSet& knownResourceObjects, - SkTSet* newResourceObjects); + virtual void getResources(SkTDArray* resourceList); private: - SkTSet fResources; + SkTDArray fResources; }; #endif diff --git a/src/pdf/SkPDFGraphicState.cpp b/src/pdf/SkPDFGraphicState.cpp index 61929b3..558deb7 100644 --- a/src/pdf/SkPDFGraphicState.cpp +++ b/src/pdf/SkPDFGraphicState.cpp @@ -59,10 +59,8 @@ SkPDFGraphicState::~SkPDFGraphicState() { fResources.unrefAll(); } -void SkPDFGraphicState::getResources( - const SkTSet& knownResourceObjects, - SkTSet* newResourceObjects) { - GetResourcesHelper(&fResources, knownResourceObjects, newResourceObjects); +void SkPDFGraphicState::getResources(SkTDArray* resourceList) { + GetResourcesHelper(&fResources, resourceList); } void SkPDFGraphicState::emitObject(SkWStream* stream, SkPDFCatalog* catalog, diff --git a/src/pdf/SkPDFGraphicState.h b/src/pdf/SkPDFGraphicState.h index 64f34f8..af01737 100644 --- a/src/pdf/SkPDFGraphicState.h +++ b/src/pdf/SkPDFGraphicState.h @@ -30,8 +30,7 @@ class SkPDFGraphicState : public SkPDFDict { public: virtual ~SkPDFGraphicState(); - virtual void getResources(const SkTSet& knownResourceObjects, - SkTSet* newResourceObjects); + virtual void getResources(SkTDArray* resourceList); // Override emitObject and getOutputSize so that we can populate // the dictionary on demand. diff --git a/src/pdf/SkPDFImage.cpp b/src/pdf/SkPDFImage.cpp index 9c57fba..1b93f6e 100644 --- a/src/pdf/SkPDFImage.cpp +++ b/src/pdf/SkPDFImage.cpp @@ -287,9 +287,8 @@ SkPDFImage* SkPDFImage::addSMask(SkPDFImage* mask) { return mask; } -void SkPDFImage::getResources(const SkTSet& knownResourceObjects, - SkTSet* newResourceObjects) { - GetResourcesHelper(&fResources, knownResourceObjects, newResourceObjects); +void SkPDFImage::getResources(SkTDArray* resourceList) { + GetResourcesHelper(&fResources, resourceList); } SkPDFImage::SkPDFImage(SkStream* imageData, const SkBitmap& bitmap, diff --git a/src/pdf/SkPDFImage.h b/src/pdf/SkPDFImage.h index 69aa7da..48b0157 100644 --- a/src/pdf/SkPDFImage.h +++ b/src/pdf/SkPDFImage.h @@ -49,8 +49,7 @@ public: SkPDFImage* addSMask(SkPDFImage* mask); // The SkPDFObject interface. - virtual void getResources(const SkTSet& knownResourceObjects, - SkTSet* newResourceObjects); + virtual void getResources(SkTDArray* resourceList); private: SkTDArray fResources; diff --git a/src/pdf/SkPDFPage.cpp b/src/pdf/SkPDFPage.cpp index cad1099..f47f8ff 100644 --- a/src/pdf/SkPDFPage.cpp +++ b/src/pdf/SkPDFPage.cpp @@ -21,8 +21,7 @@ SkPDFPage::SkPDFPage(SkPDFDevice* content) SkPDFPage::~SkPDFPage() {} void SkPDFPage::finalizePage(SkPDFCatalog* catalog, bool firstPage, - const SkTSet& knownResourceObjects, - SkTSet* newResourceObjects) { + SkTDArray* resourceObjects) { if (fContentStream.get() == NULL) { insert("Resources", fDevice->getResourceDict()); SkSafeUnref(this->insert("MediaBox", fDevice->copyMediaBox())); @@ -39,7 +38,7 @@ void SkPDFPage::finalizePage(SkPDFCatalog* catalog, bool firstPage, insert("Contents", new SkPDFObjRef(fContentStream.get()))->unref(); } catalog->addObject(fContentStream.get(), firstPage); - fDevice->getResources(knownResourceObjects, newResourceObjects, true); + fDevice->getResources(resourceObjects, true); } off_t SkPDFPage::getPageSize(SkPDFCatalog* catalog, off_t fileOffset) { diff --git a/src/pdf/SkPDFPage.h b/src/pdf/SkPDFPage.h index 17fd437..72ba335 100644 --- a/src/pdf/SkPDFPage.h +++ b/src/pdf/SkPDFPage.h @@ -40,15 +40,13 @@ public: * that the page is part of. * @param catalog The catalog to add page content objects to. * @param firstPage Indicate if this is the first page of a document. - * @param newResourceObjects All the resource objects (recursively) used on + * @param resourceObjects All the resource objects (recursively) used on * the page are added to this array. This gives * the caller a chance to deduplicate resources * across pages. - * @param knownResourceObjects The set of resources to be ignored. */ void finalizePage(SkPDFCatalog* catalog, bool firstPage, - const SkTSet& knownResourceObjects, - SkTSet* newResourceObjects); + SkTDArray* resourceObjects); /** Determine the size of the page content and store to the catalog * the offsets of all nonresource-indirect objects that make up the page diff --git a/src/pdf/SkPDFShader.cpp b/src/pdf/SkPDFShader.cpp index b3e57cb..7958de3 100644 --- a/src/pdf/SkPDFShader.cpp +++ b/src/pdf/SkPDFShader.cpp @@ -425,11 +425,8 @@ public: virtual bool isValid() { return fResources.count() > 0; } - void getResources(const SkTSet& knownResourceObjects, - SkTSet* newResourceObjects) { - GetResourcesHelper(&fResources, - knownResourceObjects, - newResourceObjects); + void getResources(SkTDArray* resourceList) { + GetResourcesHelper(&fResources, resourceList); } private: @@ -451,15 +448,12 @@ public: virtual bool isValid() { return size() > 0; } - void getResources(const SkTSet& knownResourceObjects, - SkTSet* newResourceObjects) { - GetResourcesHelper(&fResources.toArray(), - knownResourceObjects, - newResourceObjects); + void getResources(SkTDArray* resourceList) { + GetResourcesHelper(&fResources, resourceList); } private: - SkTSet fResources; + SkTDArray fResources; SkAutoTDelete fState; }; @@ -838,7 +832,7 @@ SkPDFImageShader::SkPDFImageShader(SkPDFShader::State* state) : fState(state) { // Put the canvas into the pattern stream (fContent). SkAutoTUnref content(pattern.content()); setData(content.get()); - pattern.getResources(fResources, &fResources, false); + pattern.getResources(&fResources, false); insertName("Type", "Pattern"); insertInt("PatternType", 1); diff --git a/src/pdf/SkPDFTypes.cpp b/src/pdf/SkPDFTypes.cpp index 6c7120b..59250c8 100644 --- a/src/pdf/SkPDFTypes.cpp +++ b/src/pdf/SkPDFTypes.cpp @@ -41,8 +41,7 @@ size_t SkPDFObject::getOutputSize(SkPDFCatalog* catalog, bool indirect) { return buffer.getOffset(); } -void SkPDFObject::getResources(const SkTSet& knownResourceObjects, - SkTSet* newResourceObjects) {} +void SkPDFObject::getResources(SkTDArray* resourceList) {} void SkPDFObject::emitIndirectObject(SkWStream* stream, SkPDFCatalog* catalog) { catalog->emitObjectNumber(stream, this); @@ -62,21 +61,14 @@ void SkPDFObject::AddResourceHelper(SkPDFObject* resource, resource->ref(); } -void SkPDFObject::GetResourcesHelper( - const SkTDArray* resources, - const SkTSet& knownResourceObjects, - SkTSet* newResourceObjects) { +void SkPDFObject::GetResourcesHelper(SkTDArray* resources, + SkTDArray* result) { if (resources->count()) { - newResourceObjects->setReserve( - newResourceObjects->count() + resources->count()); + result->setReserve(result->count() + resources->count()); for (int i = 0; i < resources->count(); i++) { - if (!knownResourceObjects.contains((*resources)[i]) && - !newResourceObjects->contains((*resources)[i])) { - newResourceObjects->add((*resources)[i]); - (*resources)[i]->ref(); - (*resources)[i]->getResources(knownResourceObjects, - newResourceObjects); - } + result->push((*resources)[i]); + (*resources)[i]->ref(); + (*resources)[i]->getResources(result); } } } diff --git a/src/pdf/SkPDFTypes.h b/src/pdf/SkPDFTypes.h index 49fbbde..03799d0 100644 --- a/src/pdf/SkPDFTypes.h +++ b/src/pdf/SkPDFTypes.h @@ -14,7 +14,6 @@ #include "SkScalar.h" #include "SkString.h" #include "SkTDArray.h" -#include "SkTSet.h" #include "SkTypes.h" class SkPDFCatalog; @@ -39,16 +38,13 @@ public: virtual size_t getOutputSize(SkPDFCatalog* catalog, bool indirect); /** For non-primitive objects (i.e. objects defined outside this file), - * this method will add to newResourceObjects any objects that this method - * depends on, but not already in knownResourceObjects. This operates - * recursively so if this object depends on another object and that object - * depends on two more, all three objects will be added. - * - * @param knownResourceObjects The set of resources to be ignored. - * @param newResourceObjects The set to append dependant resources to. + * this method will add to resourceList any objects that this method + * depends on. This operates recursively so if this object depends on + * another object and that object depends on two more, all three objects + * will be added. + * @param resourceList The list to append dependant resources to. */ - virtual void getResources(const SkTSet& knownResourceObjects, - SkTSet* newResourceObjects); + virtual void getResources(SkTDArray* resourceList); /** Emit this object unless the catalog has a substitute object, in which * case emit that. @@ -78,16 +74,10 @@ public: /** Static helper function to copy and reference the resources (and all * their subresources) into a new list. * @param resources The resource list. - * @param newResourceObjects All the resource objects (recursively) used on - * the page are added to this array. This gives - * the caller a chance to deduplicate resources - * across pages. - * @param knownResourceObjects The set of resources to be ignored. - */ - static void GetResourcesHelper( - const SkTDArray* resources, - const SkTSet& knownResourceObjects, - SkTSet* newResourceObjects); + * @param result The list to add to. + */ + static void GetResourcesHelper(SkTDArray* resources, + SkTDArray* result); protected: /** Subclasses must implement this method to print the object to the diff --git a/tests/PDFPrimitivesTest.cpp b/tests/PDFPrimitivesTest.cpp index 899daad..9d52fcd 100644 --- a/tests/PDFPrimitivesTest.cpp +++ b/tests/PDFPrimitivesTest.cpp @@ -21,10 +21,10 @@ class SkPDFTestDict : public SkPDFDict { public: - virtual void getResources(const SkTSet& knownResourceObjects, - SkTSet* newResourceObjects) { + void getResources(SkTDArray* resourceList) { + resourceList->setReserve(resourceList->count() + fResources.count()); for (int i = 0; i < fResources.count(); i++) { - newResourceObjects->add(fResources[i]); + resourceList->push(fResources[i]); fResources[i]->ref(); } } -- 2.7.4