Index: src/pdf/SkPDFDocument.cpp |
diff --git a/src/pdf/SkPDFDocument.cpp b/src/pdf/SkPDFDocument.cpp |
index c522b39516ee3cdbfa06458aea3131bb076ab37f..0b62c64e80a922453b9c118ae1c9514a0745537d 100644 |
--- a/src/pdf/SkPDFDocument.cpp |
+++ b/src/pdf/SkPDFDocument.cpp |
@@ -82,33 +82,6 @@ SkPDFDocument::~SkPDFDocument() { |
SkDELETE(fOtherPageResources); |
} |
-namespace { |
-class Streamer { |
-public: |
- Streamer(SkPDFCatalog* cat, SkWStream* out) |
- : fCat(cat), fOut(out), fBaseOffset(SkToOffT(out->bytesWritten())) { |
- } |
- |
- void stream(SkPDFObject* object) { |
- fCat->setFileOffset(object, this->offset()); |
- SkPDFObject* realObject = fCat->getSubstituteObject(object); |
- fCat->emitObjectNumber(fOut, realObject); |
- fOut->writeText(" obj\n"); |
- realObject->emitObject(fOut, fCat); |
- fOut->writeText("\nendobj\n"); |
- } |
- |
- off_t offset() { |
- return SkToOffT(fOut->bytesWritten()) - fBaseOffset; |
- } |
- |
-private: |
- SkPDFCatalog* const fCat; |
- SkWStream* const fOut; |
- const off_t fBaseOffset; |
-}; |
-} // namespace |
- |
bool SkPDFDocument::emitPDF(SkWStream* stream) { |
if (fPages.isEmpty()) { |
return false; |
@@ -187,47 +160,23 @@ bool SkPDFDocument::emitPDF(SkWStream* stream) { |
perform_font_subsetting(fCatalog.get(), fPages, &fSubstitutes); |
} |
- Streamer out(fCatalog, stream); |
- emitHeader(stream); |
- |
- out.stream(fDocCatalog); |
- out.stream(fPages[0]); |
- out.stream(fPages[0]->getContentStream()); |
- |
- for (int i = 0; i < fFirstPageResources->count(); i++) { |
- out.stream((*fFirstPageResources)[i]); |
- } |
- |
- SkTSet<SkPDFObject*>* firstPageSubstituteResources = |
- fCatalog->getSubstituteList(true); |
- for (int i = 0; i < firstPageSubstituteResources->count(); ++i) { |
- out.stream((*firstPageSubstituteResources)[i]); |
- } |
- // TODO(vandebo): Support linearized format |
- // if (fPages.size() > 1) { |
- // // TODO(vandebo): Save the file offset for the first page xref table. |
- // fCatalog->emitXrefTable(stream, true); |
- // } |
- |
- for (int i = 0; i < fPageTree.count(); i++) { |
- out.stream(fPageTree[i]); |
- } |
- |
- for (int i = 1; i < fPages.count(); i++) { |
- out.stream(fPages[i]->getContentStream()); |
+ SkPDFObjectSet resourceSet; |
+ if (resourceSet.add(fDocCatalog)) { |
+ fDocCatalog->addResources(&resourceSet, fCatalog); |
} |
- |
- for (int i = 0; i < fOtherPageResources->count(); i++) { |
- out.stream((*fOtherPageResources)[i]); |
- } |
- |
- SkTSet<SkPDFObject*>* otherSubstituteResources = |
- fCatalog->getSubstituteList(false); |
- for (int i = 0; i < otherSubstituteResources->count(); ++i) { |
- out.stream((*otherSubstituteResources)[i]); |
+ off_t baseOffset = SkToOffT(stream->bytesWritten()); |
+ emitHeader(stream); |
+ for (int i = 0; i < resourceSet.count(); ++i) { |
+ SkPDFObject* object = resourceSet[i]; |
+ fCatalog->setFileOffset(object, |
+ SkToOffT(stream->bytesWritten()) - baseOffset); |
+ SkASSERT(object == fCatalog->getSubstituteObject(object)); |
+ fCatalog->emitObjectNumber(stream, object); |
+ stream->writeText(" obj\n"); |
+ object->emitObject(stream, fCatalog); |
+ stream->writeText("\nendobj\n"); |
} |
- |
- fXRefFileOffset = out.offset(); |
+ fXRefFileOffset = SkToOffT(stream->bytesWritten()) - baseOffset; |
int64_t objCount = fCatalog->emitXrefTable(stream, fPages.count() > 1); |
emitFooter(stream, objCount); |
return true; |