| Index: src/pdf/SkPDFFont.cpp
|
| ===================================================================
|
| --- src/pdf/SkPDFFont.cpp (revision 11071)
|
| +++ src/pdf/SkPDFFont.cpp (working copy)
|
| @@ -342,7 +342,9 @@
|
|
|
| } // namespace
|
|
|
| -static void append_tounicode_header(SkDynamicMemoryWStream* cmap) {
|
| +static void append_tounicode_header(SkDynamicMemoryWStream* cmap,
|
| + uint16_t firstGlypthID,
|
| + uint16_t lastGlypthID) {
|
| // 12 dict begin: 12 is an Adobe-suggested value. Shall not change.
|
| // It's there to prevent old version Adobe Readers from malfunctioning.
|
| const char* kHeader =
|
| @@ -365,17 +367,20 @@
|
|
|
| // The CMapName must be consistent to /CIDSystemInfo above.
|
| // /CMapType 2 means ToUnicode.
|
| - // We specify codespacerange from 0x0000 to 0xFFFF because we convert our
|
| - // code table from unsigned short (16-bits). Codespace range just tells the
|
| - // PDF processor the valid range. It does not matter whether a complete
|
| - // mapping is provided or not.
|
| - const char* kTypeInfo =
|
| + // Codespace range just tells the PDF processor the valid range.
|
| + const char* kTypeInfoHeader =
|
| "/CMapName /Adobe-Identity-UCS def\n"
|
| "/CMapType 2 def\n"
|
| - "1 begincodespacerange\n"
|
| - "<0000> <FFFF>\n"
|
| - "endcodespacerange\n";
|
| - cmap->writeText(kTypeInfo);
|
| + "1 begincodespacerange\n";
|
| + cmap->writeText(kTypeInfoHeader);
|
| +
|
| + // e.g. "<0000> <FFFF>\n"
|
| + SkString range;
|
| + range.appendf("<%04X> <%04X>\n", firstGlypthID, lastGlypthID);
|
| + cmap->writeText(range.c_str());
|
| +
|
| + const char* kTypeInfoFooter = "endcodespacerange\n";
|
| + cmap->writeText(kTypeInfoFooter);
|
| }
|
|
|
| static void append_cmap_footer(SkDynamicMemoryWStream* cmap) {
|
| @@ -469,11 +474,15 @@
|
| // ( see caller in tests/ToUnicode.cpp )
|
| void append_cmap_sections(const SkTDArray<SkUnichar>& glyphToUnicode,
|
| const SkPDFGlyphSet* subset,
|
| - SkDynamicMemoryWStream* cmap);
|
| + SkDynamicMemoryWStream* cmap,
|
| + uint16_t firstGlypthID,
|
| + uint16_t lastGlypthID);
|
|
|
| void append_cmap_sections(const SkTDArray<SkUnichar>& glyphToUnicode,
|
| const SkPDFGlyphSet* subset,
|
| - SkDynamicMemoryWStream* cmap) {
|
| + SkDynamicMemoryWStream* cmap,
|
| + uint16_t firstGlypthID,
|
| + uint16_t lastGlypthID) {
|
| if (glyphToUnicode.isEmpty()) {
|
| return;
|
| }
|
| @@ -498,12 +507,19 @@
|
| glyphToUnicode[i] == currentRangeEntry.fUnicode + i -
|
| currentRangeEntry.fStart;
|
| if (!inSubset || !inRange) {
|
| - if (currentRangeEntry.fEnd > currentRangeEntry.fStart) {
|
| - bfrangeEntries.push(currentRangeEntry);
|
| - } else {
|
| + BFRange range = {(uint16_t)SkMax32(firstGlypthID,
|
| + currentRangeEntry.fStart),
|
| + (uint16_t)SkMin32(lastGlypthID,
|
| + currentRangeEntry.fEnd),
|
| + currentRangeEntry.fUnicode};
|
| + if (range.fEnd > range.fStart) {
|
| + bfrangeEntries.push(range);
|
| + } else if (range.fStart == range.fEnd &&
|
| + firstGlypthID <= range.fStart &&
|
| + range.fEnd <= lastGlypthID) {
|
| BFChar* entry = bfcharEntries.append();
|
| - entry->fGlyphId = currentRangeEntry.fStart;
|
| - entry->fUnicode = currentRangeEntry.fUnicode;
|
| + entry->fGlyphId = range.fStart;
|
| + entry->fUnicode = range.fUnicode;
|
| }
|
| rangeEmpty = true;
|
| }
|
| @@ -526,10 +542,13 @@
|
|
|
| static SkPDFStream* generate_tounicode_cmap(
|
| const SkTDArray<SkUnichar>& glyphToUnicode,
|
| - const SkPDFGlyphSet* subset) {
|
| + const SkPDFGlyphSet* subset,
|
| + uint16_t firstGlypthID,
|
| + uint16_t lastGlypthID) {
|
| SkDynamicMemoryWStream cmap;
|
| - append_tounicode_header(&cmap);
|
| - append_cmap_sections(glyphToUnicode, subset, &cmap);
|
| + append_tounicode_header(&cmap, firstGlypthID, lastGlypthID);
|
| + append_cmap_sections(glyphToUnicode, subset, &cmap,
|
| + firstGlypthID, lastGlypthID);
|
| append_cmap_footer(&cmap);
|
| SkAutoTUnref<SkMemoryStream> cmapStream(new SkMemoryStream());
|
| cmapStream->setData(cmap.copyToData())->unref();
|
| @@ -1014,7 +1033,8 @@
|
| return;
|
| }
|
| SkAutoTUnref<SkPDFStream> pdfCmap(
|
| - generate_tounicode_cmap(fFontInfo->fGlyphToUnicode, subset));
|
| + generate_tounicode_cmap(fFontInfo->fGlyphToUnicode, subset,
|
| + firstGlyphID(), lastGlyphID()));
|
| addResource(pdfCmap.get());
|
| insert("ToUnicode", new SkPDFObjRef(pdfCmap.get()))->unref();
|
| }
|
|
|