| Index: src/pdf/SkPDFFont.cpp
|
| diff --git a/src/pdf/SkPDFFont.cpp b/src/pdf/SkPDFFont.cpp
|
| index 65a6f5db4b6a2f0da4702f48a3a6de6b952e9f52..53de79b2a924217bf98669a7dfb26ac788604dd1 100644
|
| --- a/src/pdf/SkPDFFont.cpp
|
| +++ b/src/pdf/SkPDFFont.cpp
|
| @@ -460,7 +460,7 @@ static void append_bfrange_section(const SkTDArray<BFRange>& bfrange,
|
| // endbfchar endbfrange
|
| //
|
| // Adobe Technote 5014 said: "Code mappings (unlike codespace ranges) may
|
| -// overlap, but succeeding maps superceded preceding maps."
|
| +// overlap, but succeeding maps supersede preceding maps."
|
| //
|
| // In case of searching text in PDF, bfrange will have higher precedence so
|
| // typing char id 0x0014 in search box will get glyph id 0x0004 first. However,
|
| @@ -475,28 +475,35 @@ static void append_bfrange_section(const SkTDArray<BFRange>& bfrange,
|
| void append_cmap_sections(const SkTDArray<SkUnichar>& glyphToUnicode,
|
| const SkPDFGlyphSet* subset,
|
| SkDynamicMemoryWStream* cmap,
|
| + bool multiByteGlyphs,
|
| uint16_t firstGlyphID,
|
| uint16_t lastGlyphID);
|
|
|
| void append_cmap_sections(const SkTDArray<SkUnichar>& glyphToUnicode,
|
| const SkPDFGlyphSet* subset,
|
| SkDynamicMemoryWStream* cmap,
|
| + bool multiByteGlyphs,
|
| uint16_t firstGlyphID,
|
| uint16_t lastGlyphID) {
|
| if (glyphToUnicode.isEmpty()) {
|
| return;
|
| }
|
| + int glyphOffset = 0;
|
| + if (!multiByteGlyphs) {
|
| + glyphOffset = firstGlyphID - 1;
|
| + }
|
|
|
| SkTDArray<BFChar> bfcharEntries;
|
| SkTDArray<BFRange> bfrangeEntries;
|
|
|
| BFRange currentRangeEntry = {0, 0, 0};
|
| bool rangeEmpty = true;
|
| - const int limit = SkMin32(lastGlyphID + 1, glyphToUnicode.count());
|
| + const int limit =
|
| + SkMin32(lastGlyphID + 1, glyphToUnicode.count()) - glyphOffset;
|
|
|
| - for (int i = firstGlyphID; i < limit + 1; ++i) {
|
| + for (int i = firstGlyphID - glyphOffset; i < limit + 1; ++i) {
|
| bool inSubset = i < limit &&
|
| - (subset == NULL || subset->has(i));
|
| + (subset == NULL || subset->has(i + glyphOffset));
|
| if (!rangeEmpty) {
|
| // PDF spec requires bfrange not changing the higher byte,
|
| // e.g. <1035> <10FF> <2222> is ok, but
|
| @@ -505,8 +512,8 @@ void append_cmap_sections(const SkTDArray<SkUnichar>& glyphToUnicode,
|
| i == currentRangeEntry.fEnd + 1 &&
|
| i >> 8 == currentRangeEntry.fStart >> 8 &&
|
| i < limit &&
|
| - glyphToUnicode[i] == currentRangeEntry.fUnicode + i -
|
| - currentRangeEntry.fStart;
|
| + glyphToUnicode[i + glyphOffset] ==
|
| + currentRangeEntry.fUnicode + i - currentRangeEntry.fStart;
|
| if (!inSubset || !inRange) {
|
| if (currentRangeEntry.fEnd > currentRangeEntry.fStart) {
|
| bfrangeEntries.push(currentRangeEntry);
|
| @@ -522,7 +529,7 @@ void append_cmap_sections(const SkTDArray<SkUnichar>& glyphToUnicode,
|
| currentRangeEntry.fEnd = i;
|
| if (rangeEmpty) {
|
| currentRangeEntry.fStart = i;
|
| - currentRangeEntry.fUnicode = glyphToUnicode[i];
|
| + currentRangeEntry.fUnicode = glyphToUnicode[i + glyphOffset];
|
| rangeEmpty = false;
|
| }
|
| }
|
| @@ -537,11 +544,16 @@ void append_cmap_sections(const SkTDArray<SkUnichar>& glyphToUnicode,
|
| static SkPDFStream* generate_tounicode_cmap(
|
| const SkTDArray<SkUnichar>& glyphToUnicode,
|
| const SkPDFGlyphSet* subset,
|
| + bool multiByteGlyphs,
|
| uint16_t firstGlyphID,
|
| uint16_t lastGlyphID) {
|
| SkDynamicMemoryWStream cmap;
|
| - append_tounicode_header(&cmap, firstGlyphID, lastGlyphID);
|
| - append_cmap_sections(glyphToUnicode, subset, &cmap,
|
| + if (multiByteGlyphs) {
|
| + append_tounicode_header(&cmap, firstGlyphID, lastGlyphID);
|
| + } else {
|
| + append_tounicode_header(&cmap, 1, lastGlyphID - firstGlyphID + 1);
|
| + }
|
| + append_cmap_sections(glyphToUnicode, subset, &cmap, multiByteGlyphs,
|
| firstGlyphID, lastGlyphID);
|
| append_cmap_footer(&cmap);
|
| SkAutoTUnref<SkMemoryStream> cmapStream(new SkMemoryStream());
|
| @@ -1044,7 +1056,8 @@ void SkPDFFont::populateToUnicodeTable(const SkPDFGlyphSet* subset) {
|
| }
|
| SkAutoTUnref<SkPDFStream> pdfCmap(
|
| generate_tounicode_cmap(fFontInfo->fGlyphToUnicode, subset,
|
| - firstGlyphID(), lastGlyphID()));
|
| + multiByteGlyphs(), firstGlyphID(),
|
| + lastGlyphID()));
|
| addResource(pdfCmap.get());
|
| insert("ToUnicode", new SkPDFObjRef(pdfCmap.get()))->unref();
|
| }
|
| @@ -1459,8 +1472,8 @@ bool SkPDFType3Font::populate(int16_t glyphID) {
|
| }
|
|
|
| insert("FontBBox", makeFontBBox(bbox, 1000))->unref();
|
| - insertInt("FirstChar", firstGlyphID());
|
| - insertInt("LastChar", lastGlyphID());
|
| + insertInt("FirstChar", 1);
|
| + insertInt("LastChar", lastGlyphID() - firstGlyphID() + 1);
|
| insert("Widths", widthArray.get());
|
| insertName("CIDToGIDMap", "Identity");
|
|
|
|
|