Index: src/pdf/SkPDFDevice.cpp |
diff --git a/src/pdf/SkPDFDevice.cpp b/src/pdf/SkPDFDevice.cpp |
index db0825af3a9f39d19dcc2a009690484cd32e8137..59a8028a76209151e249c35827506346ea68ef87 100644 |
--- a/src/pdf/SkPDFDevice.cpp |
+++ b/src/pdf/SkPDFDevice.cpp |
@@ -20,6 +20,7 @@ |
#include "SkPDFFormXObject.h" |
#include "SkPDFGraphicState.h" |
#include "SkPDFImage.h" |
+#include "SkPDFResourceDict.h" |
#include "SkPDFShader.h" |
#include "SkPDFStream.h" |
#include "SkPDFTypes.h" |
@@ -1134,123 +1135,46 @@ void SkPDFDevice::setDrawingArea(DrawingArea drawingArea) { |
fDrawingArea = drawingArea; |
} |
-SkPDFDict* SkPDFDevice::getResourceDict() { |
+SkPDFResourceDict* SkPDFDevice::getResourceDict() { |
if (NULL == fResourceDict) { |
- fResourceDict = SkNEW(SkPDFDict); |
+ fResourceDict = SkNEW_ARGS(SkPDFResourceDict, (true)); |
if (fGraphicStateResources.count()) { |
- SkAutoTUnref<SkPDFDict> extGState(new SkPDFDict()); |
for (int i = 0; i < fGraphicStateResources.count(); i++) { |
- SkString nameString("G"); |
- nameString.appendS32(i); |
- extGState->insert( |
- nameString.c_str(), |
- new SkPDFObjRef(fGraphicStateResources[i]))->unref(); |
+ fResourceDict->insertResourceAsRef( |
+ SkPDFResourceDict::kExtGState_ResourceType, |
+ i, fGraphicStateResources[i]); |
} |
- fResourceDict->insert("ExtGState", extGState.get()); |
} |
if (fXObjectResources.count()) { |
- SkAutoTUnref<SkPDFDict> xObjects(new SkPDFDict()); |
for (int i = 0; i < fXObjectResources.count(); i++) { |
- SkString nameString("X"); |
- nameString.appendS32(i); |
- xObjects->insert( |
- nameString.c_str(), |
- new SkPDFObjRef(fXObjectResources[i]))->unref(); |
+ fResourceDict->insertResourceAsRef( |
+ SkPDFResourceDict::kXObject_ResourceType, |
+ i, fXObjectResources[i]); |
} |
- fResourceDict->insert("XObject", xObjects.get()); |
} |
if (fFontResources.count()) { |
- SkAutoTUnref<SkPDFDict> fonts(new SkPDFDict()); |
for (int i = 0; i < fFontResources.count(); i++) { |
- SkString nameString("F"); |
- nameString.appendS32(i); |
- fonts->insert(nameString.c_str(), |
- new SkPDFObjRef(fFontResources[i]))->unref(); |
+ fResourceDict->insertResourceAsRef( |
+ SkPDFResourceDict::kFont_ResourceType, |
+ i, fFontResources[i]); |
} |
- fResourceDict->insert("Font", fonts.get()); |
} |
if (fShaderResources.count()) { |
SkAutoTUnref<SkPDFDict> patterns(new SkPDFDict()); |
for (int i = 0; i < fShaderResources.count(); i++) { |
- SkString nameString("P"); |
- nameString.appendS32(i); |
- patterns->insert(nameString.c_str(), |
- new SkPDFObjRef(fShaderResources[i]))->unref(); |
+ fResourceDict->insertResourceAsRef( |
+ SkPDFResourceDict::kPattern_ResourceType, |
+ i, fShaderResources[i]); |
} |
- fResourceDict->insert("Pattern", patterns.get()); |
} |
- |
- // For compatibility, add all proc sets (only used for output to PS |
- // devices). |
- const char procs[][7] = {"PDF", "Text", "ImageB", "ImageC", "ImageI"}; |
- SkAutoTUnref<SkPDFArray> procSets(new SkPDFArray()); |
- procSets->reserve(SK_ARRAY_COUNT(procs)); |
- for (size_t i = 0; i < SK_ARRAY_COUNT(procs); i++) |
- procSets->appendName(procs[i]); |
- fResourceDict->insert("ProcSet", procSets.get()); |
} |
return fResourceDict; |
} |
-void SkPDFDevice::getResources(const SkTSet<SkPDFObject*>& knownResourceObjects, |
- SkTSet<SkPDFObject*>* newResourceObjects, |
- 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()); |
- 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); |
- } |
- } |
- } |
- 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); |
- } |
- } |
- } |
- 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); |
- } |
- } |
- } |
- 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); |
- } |
- } |
- } |
-} |
- |
const SkTDArray<SkPDFFont*>& SkPDFDevice::getFontResources() const { |
return fFontResources; |
} |