diff options
author | halcanary <halcanary@google.com> | 2015-03-31 12:30:20 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-03-31 12:30:20 -0700 |
commit | 37c46cad21632cfc1411b08d73af37a1fffe2944 (patch) | |
tree | 9184735eca86ec7110cd970be674d19d4812e1f6 /src/doc/SkDocument_PDF.cpp | |
parent | e0f812a7a107986dfa72e6855c1608b077428136 (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.cpp | 33 |
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 |