aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/doc/SkDocument_PDF.cpp
diff options
context:
space:
mode:
authorGravatar halcanary <halcanary@google.com>2015-03-31 12:30:20 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2015-03-31 12:30:20 -0700
commit37c46cad21632cfc1411b08d73af37a1fffe2944 (patch)
tree9184735eca86ec7110cd970be674d19d4812e1f6 /src/doc/SkDocument_PDF.cpp
parente0f812a7a107986dfa72e6855c1608b077428136 (diff)
SkPDF: Factor SkPDFCatalog into SkPDFObjNumMap and SkPDFSubstituteMap
Motivation: Keep separate features separate. Also, future linearization work will need to have several objNumMap objects share a substituteMap. Also "catalog" has a specific meaning in PDF. This catalog did not map to that catalog. - Modify SkPDFObject::emitObject and SkPDFObject::addResources interface to requiore SkPDFObjNumMap and SkPDFSubstituteMap. - SkPDFObjNumMap const in SkPDFObject::emitObject. - Remove SkPDFCatalog.cpp/.h - Modify SkDocument_PDF.cpp to use new functions - Fold in SkPDFStream::populate - Fold in SkPDFBitmap::emitDict - Move SkPDFObjNumMap and SkPDFSubstituteMap to SkPDFTypes.h - Note (via assert) that SkPDFArray & SkPDFDict don't need to check substitutes. - Remove extra space from SkPDFDict serialization. - SkPDFBitmap SkPDFType0Font SkPDFGraphicState SkPDFStream updated to new interface. - PDFPrimitivesTest updated for new interface. BUG=skia:3585 Review URL: https://codereview.chromium.org/1049753002
Diffstat (limited to 'src/doc/SkDocument_PDF.cpp')
-rw-r--r--src/doc/SkDocument_PDF.cpp33
1 files changed, 17 insertions, 16 deletions
diff --git a/src/doc/SkDocument_PDF.cpp b/src/doc/SkDocument_PDF.cpp
index 3b46fb646e..0b62e2c74e 100644
--- a/src/doc/SkDocument_PDF.cpp
+++ b/src/doc/SkDocument_PDF.cpp
@@ -7,7 +7,6 @@
#include "SkDocument.h"
#include "SkPDFCanon.h"
-#include "SkPDFCatalog.h"
#include "SkPDFDevice.h"
#include "SkPDFFont.h"
#include "SkPDFResourceDict.h"
@@ -24,7 +23,8 @@ static void emit_pdf_header(SkWStream* stream) {
}
static void emit_pdf_footer(SkWStream* stream,
- SkPDFCatalog* catalog,
+ const SkPDFObjNumMap& objNumMap,
+ const SkPDFSubstituteMap& substitutes,
SkPDFObject* docCatalog,
int64_t objCount,
int32_t xRefFileOffset) {
@@ -35,7 +35,7 @@ static void emit_pdf_footer(SkWStream* stream,
trailerDict.insert("Root", new SkPDFObjRef(docCatalog))->unref();
stream->writeText("trailer\n");
- trailerDict.emitObject(stream, catalog);
+ trailerDict.emitObject(stream, objNumMap, substitutes);
stream->writeText("\nstartxref\n");
stream->writeBigDecAsText(xRefFileOffset);
stream->writeText("\n%%EOF");
@@ -43,8 +43,8 @@ static void emit_pdf_footer(SkWStream* stream,
static void perform_font_subsetting(
const SkTDArray<const SkPDFDevice*>& pageDevices,
- SkPDFCatalog* catalog) {
- SkASSERT(catalog);
+ SkPDFSubstituteMap* substituteMap) {
+ SkASSERT(substituteMap);
SkPDFGlyphSetMap usage;
for (int i = 0; i < pageDevices.count(); ++i) {
@@ -56,7 +56,7 @@ static void perform_font_subsetting(
SkAutoTUnref<SkPDFFont> subsetFont(
entry->fFont->getFontSubset(entry->fGlyphSet));
if (subsetFont) {
- catalog->setSubstitute(entry->fFont, subsetFont.get());
+ substituteMap->setSubstitute(entry->fFont, subsetFont.get());
}
entry = iterator.next();
}
@@ -183,7 +183,6 @@ static bool emit_pdf_document(const SkTDArray<const SkPDFDevice*>& pageDevices,
pageDevices[i]->appendDestinations(dests, page.get());
pages.push(page.detach());
}
- SkPDFCatalog catalog;
SkTDArray<SkPDFDict*> pageTree;
SkAutoTUnref<SkPDFDict> docCatalog(SkNEW_ARGS(SkPDFDict, ("Catalog")));
@@ -209,22 +208,24 @@ static bool emit_pdf_document(const SkTDArray<const SkPDFDevice*>& pageDevices,
}
// Build font subsetting info before proceeding.
- perform_font_subsetting(pageDevices, &catalog);
+ SkPDFSubstituteMap substitutes;
+ perform_font_subsetting(pageDevices, &substitutes);
- if (catalog.addObject(docCatalog.get())) {
- docCatalog->addResources(&catalog);
+ SkPDFObjNumMap objNumMap;
+ if (objNumMap.addObject(docCatalog.get())) {
+ docCatalog->addResources(&objNumMap, substitutes);
}
size_t baseOffset = SkToOffT(stream->bytesWritten());
emit_pdf_header(stream);
SkTDArray<int32_t> offsets;
- for (int i = 0; i < catalog.objects().count(); ++i) {
- SkPDFObject* object = catalog.objects()[i];
+ for (int i = 0; i < objNumMap.objects().count(); ++i) {
+ SkPDFObject* object = objNumMap.objects()[i];
offsets.push(SkToS32(stream->bytesWritten() - baseOffset));
- SkASSERT(object == catalog.getSubstituteObject(object));
- SkASSERT(catalog.getObjectNumber(object) == i + 1);
+ SkASSERT(object == substitutes.getSubstitute(object));
+ SkASSERT(objNumMap.getObjectNumber(object) == i + 1);
stream->writeDecAsText(i + 1);
stream->writeText(" 0 obj\n"); // Generation number is always 0.
- object->emitObject(stream, &catalog);
+ object->emitObject(stream, objNumMap, substitutes);
stream->writeText("\nendobj\n");
}
int32_t xRefFileOffset = SkToS32(stream->bytesWritten() - baseOffset);
@@ -240,7 +241,7 @@ static bool emit_pdf_document(const SkTDArray<const SkPDFDevice*>& pageDevices,
stream->writeBigDecAsText(offsets[i], 10);
stream->writeText(" 00000 n \n");
}
- emit_pdf_footer(stream, &catalog, docCatalog.get(), objCount,
+ emit_pdf_footer(stream, objNumMap, substitutes, docCatalog.get(), objCount,
xRefFileOffset);
// The page tree has both child and parent pointers, so it creates a