Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(700)

Unified Diff: src/pdf/SkPDFDocument.cpp

Issue 870333002: Simplify reference management in SkPDF (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: tests Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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;

Powered by Google App Engine
This is Rietveld 408576698