diff options
author | Nicolas Pena <npm@chromium.org> | 2017-05-16 17:01:30 -0400 |
---|---|---|
committer | Chromium commit bot <commit-bot@chromium.org> | 2017-05-16 22:02:47 +0000 |
commit | dde95d8be9bc2817e34429fc38ee6d89d6d5ab75 (patch) | |
tree | e901763a96a94d430f26b4895ec19dd6d1304d01 | |
parent | 9792f16f3ef27a1e0c7f0526cc69637a158e3010 (diff) | |
download | pdfium-dde95d8be9bc2817e34429fc38ee6d89d6d5ab75.tar.xz |
Small fix in CPDF_TrueTypeFont load
The ToUnicode map should not be ignored when it exists. Doing so can cause a
charcode to be assigned an incorrect glyph index, and will result in garbled
text.
Bug: chromium:665467
Change-Id: I21c1bf560a0731d974191d4189ea730ef9868334
Reviewed-on: https://pdfium-review.googlesource.com/5512
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Nicolás Peña <npm@chromium.org>
-rw-r--r-- | core/fpdfapi/font/cpdf_truetypefont.cpp | 40 | ||||
-rw-r--r-- | testing/resources/pixel/bug_665467.in | 93 | ||||
-rw-r--r-- | testing/resources/pixel/bug_665467.pdf | 106 | ||||
-rw-r--r-- | testing/resources/pixel/bug_665467_expected.pdf.0.png | bin | 0 -> 467 bytes | |||
-rw-r--r-- | testing/resources/pixel/bug_665467_expected_mac.pdf.0.png | bin | 0 -> 509 bytes |
5 files changed, 217 insertions, 22 deletions
diff --git a/core/fpdfapi/font/cpdf_truetypefont.cpp b/core/fpdfapi/font/cpdf_truetypefont.cpp index d78a5e0eb2..7f4512da05 100644 --- a/core/fpdfapi/font/cpdf_truetypefont.cpp +++ b/core/fpdfapi/font/cpdf_truetypefont.cpp @@ -125,28 +125,24 @@ void CPDF_TrueTypeFont::LoadGlyphMap() { } } } - if ((m_GlyphIndex[charcode] == 0 || m_GlyphIndex[charcode] == 0xffff) && - name) { - if (name[0] == '.' && strcmp(name, ".notdef") == 0) { - m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.GetFace(), 32); - } else { - m_GlyphIndex[charcode] = - FXFT_Get_Name_Index(m_Font.GetFace(), (char*)name); - if (m_GlyphIndex[charcode] == 0) { - if (bToUnicode) { - CFX_WideString wsUnicode = UnicodeFromCharCode(charcode); - if (!wsUnicode.IsEmpty()) { - m_GlyphIndex[charcode] = - FXFT_Get_Char_Index(m_Font.GetFace(), wsUnicode[0]); - m_Encoding.m_Unicodes[charcode] = wsUnicode[0]; - } - } - if (m_GlyphIndex[charcode] == 0) { - m_GlyphIndex[charcode] = - FXFT_Get_Char_Index(m_Font.GetFace(), charcode); - } - } - } + if ((m_GlyphIndex[charcode] != 0 && m_GlyphIndex[charcode] != 0xffff) || + !name) { + continue; + } + if (strcmp(name, ".notdef") == 0) { + m_GlyphIndex[charcode] = FXFT_Get_Char_Index(m_Font.GetFace(), 32); + continue; + } + m_GlyphIndex[charcode] = + FXFT_Get_Name_Index(m_Font.GetFace(), (char*)name); + if (m_GlyphIndex[charcode] != 0 || !bToUnicode) + continue; + + CFX_WideString wsUnicode = UnicodeFromCharCode(charcode); + if (!wsUnicode.IsEmpty()) { + m_GlyphIndex[charcode] = + FXFT_Get_Char_Index(m_Font.GetFace(), wsUnicode[0]); + m_Encoding.m_Unicodes[charcode] = wsUnicode[0]; } } return; diff --git a/testing/resources/pixel/bug_665467.in b/testing/resources/pixel/bug_665467.in new file mode 100644 index 0000000000..0166ee4c67 --- /dev/null +++ b/testing/resources/pixel/bug_665467.in @@ -0,0 +1,93 @@ +{{header}} +{{object 1 0}} +<< + /Type /Catalog + /Pages 2 0 R +>> +{{object 2 0}} +<< + /Type /Pages + /MediaBox [ 0 0 100 100 ] + /Count 1 + /Kids [ 3 0 R ] +>> +endobj +{{object 3 0}} +<< + /Type /Page + /Parent 2 0 R + /Resources + << + /Font << /F1 4 0 R >> + >> + /Contents 9 0 R +>> +endobj +{{object 4 0}} +<< + /Type /Font + /Subtype /TrueType + /BaseFont /ChromeSansMM + /Encoding 6 0 R + /FirstChar 32 + /LastChar 255 + /Name /F1 + /ToUnicode 7 0 R + /FontDescriptor 8 0 R +>> +endobj +{{object 6 0}} +<< + /Differences [ 161 /someunknownname ] + /Type /Encoding +>> +{{object 7 0}} << +>> +stream +/CIDInit /ProcSet findresource begin +12 dict begin +begincmap +/CIDSystemInfo +<</Registry (Adobe) +/Ordering (Identity) +/Supplement 0 +>> def +/CMapName /Adobe-Identity-H def +CMapType 2 def +1 begincodespacerange +<00> <FF> +endcodespacerange +1 beginbfchar +<A1> <043B> +endbfchar +endcmap +CMapName currentdict /CMap defineresource pop +end +end +endobj +{{object 8 0}} +<< + << /Ascent 1000 + /CapHeight 0 + /Descent -200 + /Flags 32 + /FontBBox [ -599 -207 1338 1034 ] + /FontName /ChromeSansMM + /ItalicAngle 0 + /StemV 0 + /Type /FontDescriptor +>> +{{object 9 0}} << +>> +stream +BT +50 50 Td /F1 15 Tf <A1> Tj +ET +endstream +endobj +{{xref}} +trailer << + /Root 1 0 R +>> +{{startxref}} +%%EOF diff --git a/testing/resources/pixel/bug_665467.pdf b/testing/resources/pixel/bug_665467.pdf new file mode 100644 index 0000000000..e0ec6ea28d --- /dev/null +++ b/testing/resources/pixel/bug_665467.pdf @@ -0,0 +1,106 @@ +%PDF-1.7 +% ò¤ô +1 0 obj +<< + /Type /Catalog + /Pages 2 0 R +>> +2 0 obj +<< + /Type /Pages + /MediaBox [ 0 0 100 100 ] + /Count 1 + /Kids [ 3 0 R ] +>> +endobj +3 0 obj +<< + /Type /Page + /Parent 2 0 R + /Resources + << + /Font << /F1 4 0 R >> + >> + /Contents 9 0 R +>> +endobj +4 0 obj +<< + /Type /Font + /Subtype /TrueType + /BaseFont /ChromeSansMM + /Encoding 6 0 R + /FirstChar 32 + /LastChar 255 + /Name /F1 + /ToUnicode 7 0 R + /FontDescriptor 8 0 R +>> +endobj +6 0 obj +<< + /Differences [ 161 /someunknownname ] + /Type /Encoding +>> +7 0 obj << +>> +stream +/CIDInit /ProcSet findresource begin +12 dict begin +begincmap +/CIDSystemInfo +<</Registry (Adobe) +/Ordering (Identity) +/Supplement 0 +>> def +/CMapName /Adobe-Identity-H def +CMapType 2 def +1 begincodespacerange +<00> <FF> +endcodespacerange +1 beginbfchar +<A1> <043B> +endbfchar +endcmap +CMapName currentdict /CMap defineresource pop +end +end +endobj +8 0 obj +<< + << /Ascent 1000 + /CapHeight 0 + /Descent -200 + /Flags 32 + /FontBBox [ -599 -207 1338 1034 ] + /FontName /ChromeSansMM + /ItalicAngle 0 + /StemV 0 + /Type /FontDescriptor +>> +9 0 obj << +>> +stream +BT +50 50 Td /F1 15 Tf <A1> Tj +ET +endstream +endobj +xref +0 10 +0000000000 65535 f +0000000015 00000 n +0000000061 00000 n +0000000154 00000 n +0000000272 00000 n +0000000000 65535 f +0000000459 00000 n +0000000531 00000 n +0000000892 00000 n +0000001081 00000 n +trailer << + /Root 1 0 R +>> +startxref +1152 +%%EOF diff --git a/testing/resources/pixel/bug_665467_expected.pdf.0.png b/testing/resources/pixel/bug_665467_expected.pdf.0.png Binary files differnew file mode 100644 index 0000000000..617cb0a916 --- /dev/null +++ b/testing/resources/pixel/bug_665467_expected.pdf.0.png diff --git a/testing/resources/pixel/bug_665467_expected_mac.pdf.0.png b/testing/resources/pixel/bug_665467_expected_mac.pdf.0.png Binary files differnew file mode 100644 index 0000000000..9f51dcb855 --- /dev/null +++ b/testing/resources/pixel/bug_665467_expected_mac.pdf.0.png |