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

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: make Created 5 years, 10 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
« no previous file with comments | « src/pdf/SkPDFCatalog.cpp ('k') | src/pdf/SkPDFFont.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/pdf/SkPDFDocument.cpp
diff --git a/src/pdf/SkPDFDocument.cpp b/src/pdf/SkPDFDocument.cpp
index c522b39516ee3cdbfa06458aea3131bb076ab37f..75af5a947b81ee7cbaa4e5a14e670820dfbfe093 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,52 +160,29 @@ 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());
+ SkTSet<SkPDFObject*> 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));
+ stream->writeDecAsText(fCatalog->getObjectNumber(object));
+ stream->writeText(" 0 obj\n"); // Generation number is always 0.
+ 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;
}
+// TODO(halcanary): remove this method, since it is unused.
bool SkPDFDocument::setPage(int pageNumber, SkPDFDevice* pdfDevice) {
if (!fPageTree.isEmpty()) {
return false;
@@ -266,6 +216,7 @@ bool SkPDFDocument::appendPage(SkPDFDevice* pdfDevice) {
}
// Deprecated.
+// TODO(halcanary): remove
void SkPDFDocument::getCountOfFontTypes(
int counts[SkAdvancedTypefaceMetrics::kOther_Font + 2]) const {
sk_bzero(counts, sizeof(int) *
@@ -290,6 +241,7 @@ void SkPDFDocument::getCountOfFontTypes(
counts[SkAdvancedTypefaceMetrics::kOther_Font + 1] = notEmbeddable;
}
+// TODO(halcanary): expose notEmbeddableCount in SkDocument
void SkPDFDocument::getCountOfFontTypes(
int counts[SkAdvancedTypefaceMetrics::kOther_Font + 1],
int* notSubsettableCount,
@@ -334,6 +286,7 @@ void SkPDFDocument::emitHeader(SkWStream* stream) {
stream->writeText("\n");
}
+//TODO(halcanary): remove this function
size_t SkPDFDocument::headerSize() {
SkDynamicMemoryWStream buffer;
emitHeader(&buffer);
« no previous file with comments | « src/pdf/SkPDFCatalog.cpp ('k') | src/pdf/SkPDFFont.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698