diff options
author | edisonn@google.com <edisonn@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-04-02 15:33:08 +0000 |
---|---|---|
committer | edisonn@google.com <edisonn@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-04-02 15:33:08 +0000 |
commit | 6addb1930013ebb2f984045141650fd7afcfa90f (patch) | |
tree | dd4c38a7cb519486ecf9cf54c2f7a65ec85dcfca /src/pdf/SkPDFTypes.cpp | |
parent | c52570475f00d5b62b8d82ba50b4b911dc38ce43 (diff) |
resubmit https://code.google.com/p/skia/source/detail?r=7883 (in the meantime we
added capability to collect minidump and callstack if buildbot fails with heap
coruption in windows, and a NPE bug was fixed in SkPDFDocument, when document was destroyed without ever beeing used and a field was NULL + a few minor conflicts have been resolved)
git-svn-id: http://skia.googlecode.com/svn/trunk@8487 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/pdf/SkPDFTypes.cpp')
-rw-r--r-- | src/pdf/SkPDFTypes.cpp | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/src/pdf/SkPDFTypes.cpp b/src/pdf/SkPDFTypes.cpp index d479a22432..ed02d2bd12 100644 --- a/src/pdf/SkPDFTypes.cpp +++ b/src/pdf/SkPDFTypes.cpp @@ -41,7 +41,8 @@ size_t SkPDFObject::getOutputSize(SkPDFCatalog* catalog, bool indirect) { return buffer.getOffset(); } -void SkPDFObject::getResources(SkTDArray<SkPDFObject*>* resourceList) {} +void SkPDFObject::getResources(const SkTSet<SkPDFObject*>& knownResourceObjects, + SkTSet<SkPDFObject*>* newResourceObjects) {} void SkPDFObject::emitIndirectObject(SkWStream* stream, SkPDFCatalog* catalog) { catalog->emitObjectNumber(stream, this); @@ -61,14 +62,21 @@ void SkPDFObject::AddResourceHelper(SkPDFObject* resource, resource->ref(); } -void SkPDFObject::GetResourcesHelper(SkTDArray<SkPDFObject*>* resources, - SkTDArray<SkPDFObject*>* result) { +void SkPDFObject::GetResourcesHelper( + const SkTDArray<SkPDFObject*>* resources, + const SkTSet<SkPDFObject*>& knownResourceObjects, + SkTSet<SkPDFObject*>* newResourceObjects) { if (resources->count()) { - result->setReserve(result->count() + resources->count()); + newResourceObjects->setReserve( + newResourceObjects->count() + resources->count()); for (int i = 0; i < resources->count(); i++) { - result->push((*resources)[i]); - (*resources)[i]->ref(); - (*resources)[i]->getResources(result); + if (!knownResourceObjects.contains((*resources)[i]) && + !newResourceObjects->contains((*resources)[i])) { + newResourceObjects->add((*resources)[i]); + (*resources)[i]->ref(); + (*resources)[i]->getResources(knownResourceObjects, + newResourceObjects); + } } } } |