Index: src/doc/SkDocument_PDF.cpp |
diff --git a/src/doc/SkDocument_PDF.cpp b/src/doc/SkDocument_PDF.cpp |
index 1e2148bc885da643602e03486104096afe88b184..274a6581e81f32093ced292cfe247e1cd5a440b4 100644 |
--- a/src/doc/SkDocument_PDF.cpp |
+++ b/src/doc/SkDocument_PDF.cpp |
@@ -31,7 +31,7 @@ static void emit_pdf_footer(SkWStream* stream, |
// TODO(vandebo): Linearized format will take a Prev entry too. |
// TODO(vandebo): PDF/A requires an ID entry. |
trailerDict.insertInt("Size", int(objCount)); |
- trailerDict.insert("Root", new SkPDFObjRef(docCatalog))->unref(); |
+ trailerDict.insertObjRef("Root", SkRef(docCatalog)); |
stream->writeText("trailer\n"); |
trailerDict.emitObject(stream, objNumMap, substitutes); |
@@ -61,24 +61,20 @@ static void perform_font_subsetting( |
} |
} |
+static SkPDFObject* create_pdf_page_content(const SkPDFDevice* pageDevice) { |
+ SkAutoTDelete<SkStreamAsset> content(pageDevice->content()); |
+ return SkNEW_ARGS(SkPDFStream, (content.get())); |
tomhudson
2015/05/04 18:15:04
Ugh, I really need to internalize your memory mana
hal.canary
2015/05/05 14:37:50
Yes. SkStreamRewindableFromSkStream should be alm
|
+} |
+ |
static SkPDFDict* create_pdf_page(const SkPDFDevice* pageDevice) { |
SkAutoTUnref<SkPDFDict> page(SkNEW_ARGS(SkPDFDict, ("Page"))); |
- SkAutoTUnref<SkPDFDict> deviceResourceDict( |
- pageDevice->createResourceDict()); |
- page->insert("Resources", deviceResourceDict.get()); |
- |
- SkAutoTUnref<SkPDFArray> mediaBox(pageDevice->copyMediaBox()); |
- page->insert("MediaBox", mediaBox.get()); |
- |
- SkPDFArray* annots = pageDevice->getAnnotations(); |
- if (annots && annots->size() > 0) { |
- page->insert("Annots", annots); |
+ page->insertObject("Resources", pageDevice->createResourceDict()); |
+ page->insertObject("MediaBox", pageDevice->copyMediaBox()); |
+ if (SkPDFArray* annots = pageDevice->getAnnotations()) { |
+ SkASSERT(annots->size() > 0); |
+ page->insertObject("Annots", SkRef(annots)); |
} |
- |
- SkAutoTDelete<SkStreamAsset> content(pageDevice->content()); |
- SkAutoTUnref<SkPDFStream> contentStream( |
- SkNEW_ARGS(SkPDFStream, (content.get()))); |
- page->insert("Contents", new SkPDFObjRef(contentStream.get()))->unref(); |
+ page->insertObjRef("Contents", create_pdf_page_content(pageDevice)); |
return page.detach(); |
} |
@@ -114,16 +110,14 @@ static void generate_page_tree(const SkTDArray<SkPDFDict*>& pages, |
break; |
} |
- SkPDFDict* newNode = new SkPDFDict("Pages"); |
- SkAutoTUnref<SkPDFObjRef> newNodeRef(new SkPDFObjRef(newNode)); |
- |
+ SkAutoTUnref<SkPDFDict> newNode(new SkPDFDict("Pages")); |
SkAutoTUnref<SkPDFArray> kids(new SkPDFArray); |
kids->reserve(kNodeSize); |
int count = 0; |
for (; i < curNodes.count() && count < kNodeSize; i++, count++) { |
- curNodes[i]->insert("Parent", newNodeRef.get()); |
- kids->append(new SkPDFObjRef(curNodes[i]))->unref(); |
+ curNodes[i]->insertObjRef("Parent", SkRef(newNode.get())); |
+ kids->appendObjRef(SkRef(curNodes[i])); |
// TODO(vandebo): put the objects in strict access order. |
// Probably doesn't matter because they are so small. |
@@ -145,9 +139,9 @@ static void generate_page_tree(const SkTDArray<SkPDFDict*>& pages, |
if (i == curNodes.count()) { |
pageCount = ((pages.count() - 1) % treeCapacity) + 1; |
} |
- newNode->insert("Count", new SkPDFInt(pageCount))->unref(); |
- newNode->insert("Kids", kids.get()); |
- nextRoundNodes.push(newNode); // Transfer reference. |
+ newNode->insertInt("Count", pageCount); |
+ newNode->insertObject("Kids", kids.detach()); |
+ nextRoundNodes.push(newNode.detach()); // Transfer reference. |
} |
curNodes = nextRoundNodes; |
@@ -184,24 +178,21 @@ static bool emit_pdf_document(const SkTDArray<const SkPDFDevice*>& pageDevices, |
SkPDFDict* pageTreeRoot; |
generate_page_tree(pages, &pageTree, &pageTreeRoot); |
+ docCatalog->insertObjRef("Pages", SkRef(pageTreeRoot)); |
- docCatalog->insert("Pages", new SkPDFObjRef(pageTreeRoot))->unref(); |
+ if (dests->size() > 0) { |
+ docCatalog->insertObjRef("Dests", dests.detach()); |
+ } |
/* TODO(vandebo): output intent |
SkAutoTUnref<SkPDFDict> outputIntent = new SkPDFDict("OutputIntent"); |
- outputIntent->insert("S", new SkPDFName("GTS_PDFA1"))->unref(); |
- outputIntent->insert("OutputConditionIdentifier", |
- new SkPDFString("sRGB"))->unref(); |
- SkAutoTUnref<SkPDFArray> intentArray = new SkPDFArray; |
- intentArray->append(outputIntent.get()); |
- docCatalog->insert("OutputIntent", intentArray.get()); |
+ outputIntent->insertName("S", "GTS_PDFA1"); |
+ outputIntent->insertString("OutputConditionIdentifier", "sRGB"); |
+ SkAutoTUnref<SkPDFArray> intentArray(new SkPDFArray); |
+ intentArray->appendObject(SkRef(outputIntent.get())); |
+ docCatalog->insertObject("OutputIntent", intentArray.detach()); |
*/ |
- if (dests->size() > 0) { |
- docCatalog->insert("Dests", SkNEW_ARGS(SkPDFObjRef, (dests.get()))) |
- ->unref(); |
- } |
- |
// Build font subsetting info before proceeding. |
SkPDFSubstituteMap substitutes; |
perform_font_subsetting(pageDevices, &substitutes); |