summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2017-03-03 12:41:23 +0100
committerTor Andersson <tor.andersson@artifex.com>2017-03-03 13:07:52 +0100
commite3a4ea32fed4ae837df1c918275950bb8f7a326f (patch)
tree5c6dbe2440675c215d88a5f318084cee8a1651d7
parent4c16a5371c109be8d52eae8690ab96ceebf1349b (diff)
downloadmupdf-e3a4ea32fed4ae837df1c918275950bb8f7a326f.tar.xz
Fix 697554: Use the first 'cmap' table that matches.
The bug report has an embedded truetype font with 7 different mac roman cmaps. Only the first one has the expected behavior, but we were picking up the last one.
-rw-r--r--source/pdf/pdf-font.c77
1 files changed, 53 insertions, 24 deletions
diff --git a/source/pdf/pdf-font.c b/source/pdf/pdf-font.c
index eaeac3c0..e3be140a 100644
--- a/source/pdf/pdf-font.c
+++ b/source/pdf/pdf-font.c
@@ -565,6 +565,54 @@ pdf_new_font_desc(fz_context *ctx)
* Simple fonts (Type1 and TrueType)
*/
+static FT_CharMap
+select_type1_cmap(FT_Face face)
+{
+ int i;
+ for (i = 0; i < face->num_charmaps; i++)
+ if (face->charmaps[i]->platform_id == 7)
+ return face->charmaps[i];
+ if (face->num_charmaps > 0)
+ return face->charmaps[0];
+ return NULL;
+}
+
+static FT_CharMap
+select_truetype_cmap(FT_Face face, int symbolic)
+{
+ int i;
+
+ /* First look for a Microsoft symbolic cmap, if applicable */
+ if (symbolic)
+ {
+ for (i = 0; i < face->num_charmaps; i++)
+ if (face->charmaps[i]->platform_id == 3 && face->charmaps[i]->encoding_id == 0)
+ return face->charmaps[i];
+ }
+
+ /* Then look for a Microsoft Unicode cmap */
+ for (i = 0; i < face->num_charmaps; i++)
+ if (face->charmaps[i]->platform_id == 3 && face->charmaps[i]->encoding_id == 1)
+ return face->charmaps[i];
+
+ /* Finally look for an Apple MacRoman cmap */
+ for (i = 0; i < face->num_charmaps; i++)
+ if (face->charmaps[i]->platform_id == 1 && face->charmaps[i]->encoding_id == 0)
+ return face->charmaps[i];
+
+ if (face->num_charmaps > 0)
+ return face->charmaps[0];
+ return NULL;
+}
+
+static FT_CharMap
+select_unknown_cmap(FT_Face face)
+{
+ if (face->num_charmaps > 0)
+ return face->charmaps[0];
+ return NULL;
+}
+
static pdf_font_desc *
pdf_load_simple_font_by_name(fz_context *ctx, pdf_document *doc, pdf_obj *dict, char *basefont)
{
@@ -640,31 +688,12 @@ pdf_load_simple_font_by_name(fz_context *ctx, pdf_document *doc, pdf_obj *dict,
symbolic = fontdesc->flags & 4;
- if (face->num_charmaps > 0)
- cmap = face->charmaps[0];
+ if (kind == TYPE1)
+ cmap = select_type1_cmap(face);
+ else if (kind == TRUETYPE)
+ cmap = select_truetype_cmap(face, symbolic);
else
- cmap = NULL;
-
- for (i = 0; i < face->num_charmaps; i++)
- {
- FT_CharMap test = face->charmaps[i];
-
- if (kind == TYPE1)
- {
- if (test->platform_id == 7)
- cmap = test;
- }
-
- if (kind == TRUETYPE)
- {
- if (test->platform_id == 1 && test->encoding_id == 0)
- cmap = test;
- if (test->platform_id == 3 && test->encoding_id == 1)
- cmap = test;
- if (symbolic && test->platform_id == 3 && test->encoding_id == 0)
- cmap = test;
- }
- }
+ cmap = select_unknown_cmap(face);
if (cmap)
{