aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/pdf/SkPDFDevice.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/pdf/SkPDFDevice.cpp')
-rw-r--r--src/pdf/SkPDFDevice.cpp63
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);
+ }
}
}
}