diff options
author | 2013-03-19 17:19:05 +0000 | |
---|---|---|
committer | 2013-03-19 17:19:05 +0000 | |
commit | 66bedbb02dbd252f46c1fad862d0561a0bb3f94b (patch) | |
tree | 79627a69234e8df7883dfbc9243c7120aba2952e /src/pdf/SkPDFDevice.cpp | |
parent | f315451f78760e6e2066c09da3644ce93e0580e6 (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. a few minor conflicts have been resolved)
Review URL: https://codereview.chromium.org/12840004
git-svn-id: http://skia.googlecode.com/svn/trunk@8233 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/pdf/SkPDFDevice.cpp')
-rw-r--r-- | src/pdf/SkPDFDevice.cpp | 63 |
1 files changed, 41 insertions, 22 deletions
diff --git a/src/pdf/SkPDFDevice.cpp b/src/pdf/SkPDFDevice.cpp index 8f0f3d255e..fa5904ee47 100644 --- a/src/pdf/SkPDFDevice.cpp +++ b/src/pdf/SkPDFDevice.cpp @@ -29,6 +29,7 @@ #include "SkTextFormatParams.h" #include "SkTemplates.h" #include "SkTypefacePriv.h" +#include "SkTSet.h" // Utility functions @@ -1179,39 +1180,57 @@ SkPDFDict* SkPDFDevice::getResourceDict() { return fResourceDict; } -void SkPDFDevice::getResources(SkTDArray<SkPDFObject*>* resourceList, +void SkPDFDevice::getResources(const SkTSet<SkPDFObject*>& knownResourceObjects, + SkTSet<SkPDFObject*>* newResourceObjects, bool recursive) const { - resourceList->setReserve(resourceList->count() + - fGraphicStateResources.count() + - fXObjectResources.count() + - fFontResources.count() + - fShaderResources.count()); + // TODO: reserve not correct if we need to recursively explore. + newResourceObjects->setReserve(newResourceObjects->count() + + fGraphicStateResources.count() + + fXObjectResources.count() + + fFontResources.count() + + fShaderResources.count()); for (int i = 0; i < fGraphicStateResources.count(); i++) { - resourceList->push(fGraphicStateResources[i]); - fGraphicStateResources[i]->ref(); - if (recursive) { - fGraphicStateResources[i]->getResources(resourceList); + if (!knownResourceObjects.contains(fGraphicStateResources[i]) && + !newResourceObjects->contains(fGraphicStateResources[i])) { + newResourceObjects->add(fGraphicStateResources[i]); + fGraphicStateResources[i]->ref(); + if (recursive) { + fGraphicStateResources[i]->getResources(knownResourceObjects, + newResourceObjects); + } } } for (int i = 0; i < fXObjectResources.count(); i++) { - resourceList->push(fXObjectResources[i]); - fXObjectResources[i]->ref(); - if (recursive) { - fXObjectResources[i]->getResources(resourceList); + if (!knownResourceObjects.contains(fXObjectResources[i]) && + !newResourceObjects->contains(fXObjectResources[i])) { + newResourceObjects->add(fXObjectResources[i]); + fXObjectResources[i]->ref(); + if (recursive) { + fXObjectResources[i]->getResources(knownResourceObjects, + newResourceObjects); + } } } for (int i = 0; i < fFontResources.count(); i++) { - resourceList->push(fFontResources[i]); - fFontResources[i]->ref(); - if (recursive) { - fFontResources[i]->getResources(resourceList); + if (!knownResourceObjects.contains(fFontResources[i]) && + !newResourceObjects->contains(fFontResources[i])) { + newResourceObjects->add(fFontResources[i]); + fFontResources[i]->ref(); + if (recursive) { + fFontResources[i]->getResources(knownResourceObjects, + newResourceObjects); + } } } for (int i = 0; i < fShaderResources.count(); i++) { - resourceList->push(fShaderResources[i]); - fShaderResources[i]->ref(); - if (recursive) { - fShaderResources[i]->getResources(resourceList); + if (!knownResourceObjects.contains(fShaderResources[i]) && + !newResourceObjects->contains(fShaderResources[i])) { + newResourceObjects->add(fShaderResources[i]); + fShaderResources[i]->ref(); + if (recursive) { + fShaderResources[i]->getResources(knownResourceObjects, + newResourceObjects); + } } } } |