Index: src/pdf/SkPDFMakeToUnicodeCmap.cpp |
diff --git a/src/pdf/SkPDFMakeToUnicodeCmap.cpp b/src/pdf/SkPDFMakeToUnicodeCmap.cpp |
index 5186cbbda1955dbda41fcc25ed5600c5d41cb875..7fc5c59be35fcaddffb07522ecd6c1a411821496 100644 |
--- a/src/pdf/SkPDFMakeToUnicodeCmap.cpp |
+++ b/src/pdf/SkPDFMakeToUnicodeCmap.cpp |
@@ -10,8 +10,7 @@ |
#include "SkUtils.h" |
static void append_tounicode_header(SkDynamicMemoryWStream* cmap, |
- SkGlyphID firstGlyphID, |
- SkGlyphID lastGlyphID) { |
+ bool multibyte) { |
// 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 = |
@@ -26,8 +25,8 @@ static void append_tounicode_header(SkDynamicMemoryWStream* cmap, |
// different. This is not a reference object. |
const char* kSysInfo = |
"/CIDSystemInfo\n" |
- "<< /Registry (Adobe)\n" |
- "/Ordering (UCS)\n" |
+ "<< /Registry (Skia)\n" |
+ "/Ordering (SkiaOrdering)\n" |
Rik
2016/09/01 17:41:21
Please leave this as-is
|
"/Supplement 0\n" |
">> def\n"; |
cmap->writeText(kSysInfo); |
@@ -36,18 +35,16 @@ static void append_tounicode_header(SkDynamicMemoryWStream* cmap, |
// /CMapType 2 means ToUnicode. |
// Codespace range just tells the PDF processor the valid range. |
const char* kTypeInfoHeader = |
- "/CMapName /Adobe-Identity-UCS def\n" |
+ "/CMapName /Skia-Identity-SkiaOrdering def\n" |
"/CMapType 2 def\n" |
"1 begincodespacerange\n"; |
cmap->writeText(kTypeInfoHeader); |
- |
- // e.g. "<0000> <FFFF>\n" |
- SkString range; |
- range.appendf("<%04X> <%04X>\n", firstGlyphID, lastGlyphID); |
- cmap->writeText(range.c_str()); |
- |
- const char* kTypeInfoFooter = "endcodespacerange\n"; |
- cmap->writeText(kTypeInfoFooter); |
+ if (multibyte) { |
+ cmap->writeText("<0000> <FFFF>\n"); |
+ } else { |
+ cmap->writeText("<00> <FF>\n"); |
+ } |
+ cmap->writeText("endcodespacerange\n"); |
} |
static void append_cmap_footer(SkDynamicMemoryWStream* cmap) { |
@@ -82,7 +79,18 @@ static void write_utf16be(SkDynamicMemoryWStream* wStream, SkUnichar utf32) { |
} |
} |
+static void write_glyph(SkDynamicMemoryWStream* cmap, |
+ bool multiByte, |
+ SkGlyphID gid) { |
+ if (multiByte) { |
+ SkPDFUtils::WriteUInt16BE(cmap, gid); |
+ } else { |
+ SkPDFUtils::WriteUInt8(cmap, SkToU8(gid)); |
+ } |
+} |
+ |
static void append_bfchar_section(const SkTDArray<BFChar>& bfchar, |
+ bool multiByte, |
SkDynamicMemoryWStream* cmap) { |
// PDF spec defines that every bf* list can have at most 100 entries. |
for (int i = 0; i < bfchar.count(); i += 100) { |
@@ -92,7 +100,7 @@ static void append_bfchar_section(const SkTDArray<BFChar>& bfchar, |
cmap->writeText(" beginbfchar\n"); |
for (int j = 0; j < count; ++j) { |
cmap->writeText("<"); |
- SkPDFUtils::WriteUInt16BE(cmap, bfchar[i + j].fGlyphId); |
+ write_glyph(cmap, multiByte, bfchar[i + j].fGlyphId); |
cmap->writeText("> <"); |
write_utf16be(cmap, bfchar[i + j].fUnicode); |
cmap->writeText(">\n"); |
@@ -102,6 +110,7 @@ static void append_bfchar_section(const SkTDArray<BFChar>& bfchar, |
} |
static void append_bfrange_section(const SkTDArray<BFRange>& bfrange, |
+ bool multiByte, |
SkDynamicMemoryWStream* cmap) { |
// PDF spec defines that every bf* list can have at most 100 entries. |
for (int i = 0; i < bfrange.count(); i += 100) { |
@@ -111,9 +120,9 @@ static void append_bfrange_section(const SkTDArray<BFRange>& bfrange, |
cmap->writeText(" beginbfrange\n"); |
for (int j = 0; j < count; ++j) { |
cmap->writeText("<"); |
- SkPDFUtils::WriteUInt16BE(cmap, bfrange[i + j].fStart); |
+ write_glyph(cmap, multiByte, bfrange[i + j].fStart); |
cmap->writeText("> <"); |
- SkPDFUtils::WriteUInt16BE(cmap, bfrange[i + j].fEnd); |
+ write_glyph(cmap, multiByte, bfrange[i + j].fEnd); |
cmap->writeText("> <"); |
write_utf16be(cmap, bfrange[i + j].fUnicode); |
cmap->writeText(">\n"); |
@@ -206,8 +215,8 @@ void SkPDFAppendCmapSections(const SkTDArray<SkUnichar>& glyphToUnicode, |
// The spec requires all bfchar entries for a font must come before bfrange |
// entries. |
- append_bfchar_section(bfcharEntries, cmap); |
- append_bfrange_section(bfrangeEntries, cmap); |
+ append_bfchar_section(bfcharEntries, multiByteGlyphs, cmap); |
+ append_bfrange_section(bfrangeEntries, multiByteGlyphs, cmap); |
} |
sk_sp<SkPDFStream> SkPDFMakeToUnicodeCmap( |
@@ -217,11 +226,7 @@ sk_sp<SkPDFStream> SkPDFMakeToUnicodeCmap( |
SkGlyphID firstGlyphID, |
SkGlyphID lastGlyphID) { |
SkDynamicMemoryWStream cmap; |
- if (multiByteGlyphs) { |
- append_tounicode_header(&cmap, firstGlyphID, lastGlyphID); |
- } else { |
- append_tounicode_header(&cmap, 1, lastGlyphID - firstGlyphID + 1); |
- } |
+ append_tounicode_header(&cmap, multiByteGlyphs); |
SkPDFAppendCmapSections(glyphToUnicode, subset, &cmap, multiByteGlyphs, |
firstGlyphID, lastGlyphID); |
append_cmap_footer(&cmap); |