diff options
author | Tor Andersson <tor.andersson@artifex.com> | 2017-03-03 12:41:23 +0100 |
---|---|---|
committer | Tor Andersson <tor.andersson@artifex.com> | 2017-03-03 13:07:52 +0100 |
commit | e3a4ea32fed4ae837df1c918275950bb8f7a326f (patch) | |
tree | 5c6dbe2440675c215d88a5f318084cee8a1651d7 | |
parent | 4c16a5371c109be8d52eae8690ab96ceebf1349b (diff) | |
download | mupdf-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.c | 77 |
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) { |