diff options
author | Khaled Hosny <khaledhosny@eglug.org> | 2013-02-21 18:25:07 +0000 |
---|---|---|
committer | Khaled Hosny <khaledhosny@eglug.org> | 2013-02-21 18:25:07 +0000 |
commit | 95680f656950d7174b0db6bdc1bacc38e92ebd65 (patch) | |
tree | 0c0a7a2424ce87103d777cc6f4a0b67cce1c2656 /Build/source | |
parent | 03686fa0451b803da7a3aed60b3f41ffadb5e63a (diff) |
Get glyph name from FreeType
Instead of reading 'post' table directly, this should handle CFF fonts
where the 'post' table has no glyph names.
git-svn-id: svn://tug.org/texlive/trunk@29188 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source')
-rw-r--r-- | Build/source/texk/xdvipdfmx/ChangeLog | 5 | ||||
-rw-r--r-- | Build/source/texk/xdvipdfmx/src/tt_cmap.c | 79 |
2 files changed, 45 insertions, 39 deletions
diff --git a/Build/source/texk/xdvipdfmx/ChangeLog b/Build/source/texk/xdvipdfmx/ChangeLog index 1db8ddeddf6..de8443704a8 100644 --- a/Build/source/texk/xdvipdfmx/ChangeLog +++ b/Build/source/texk/xdvipdfmx/ChangeLog @@ -1,3 +1,8 @@ +2013-02-21 Khaled Hosny <khaledhosny@eglug.org> + + * src/tt_cmap.c: Use FT_Get_Glyph_Name() instead of reading 'post' table + directly, to handle CFF fonts where the 'post' table has no glyph names. + 2013-02-15 Khaled Hosny <khaledhosny@eglug.org> * src/cidtype2.c: Fix loading *.dfont files on non-Mac platforms. diff --git a/Build/source/texk/xdvipdfmx/src/tt_cmap.c b/Build/source/texk/xdvipdfmx/src/tt_cmap.c index 614d26ad72e..441789239f6 100644 --- a/Build/source/texk/xdvipdfmx/src/tt_cmap.c +++ b/Build/source/texk/xdvipdfmx/src/tt_cmap.c @@ -43,7 +43,6 @@ #include "tt_aux.h" #include "tt_gsub.h" -#include "tt_post.h" #include "unicode.h" #include "agl.h" @@ -848,7 +847,7 @@ handle_CIDFont (sfnt *sfont, static USHORT handle_subst_glyphs (CMap *cmap, CMap *cmap_add, const char *used_glyphs, - struct tt_post_table *post) + sfnt *sfont) { USHORT count; USHORT i, gid; @@ -868,33 +867,41 @@ handle_subst_glyphs (CMap *cmap, if (!is_used_char2(used_glyphs, gid)) continue; - if (!cmap_add && post) { - /* JK: try to look up Unicode values from the glyph name... - requires access to 'post' table */ + if (!cmap_add) { +#if XETEX + if (FT_HAS_GLYPH_NAMES(sfont->ft_face)) { + /* JK: try to look up Unicode values from the glyph name... */ #define MAX_UNICODES 16 - long unicodes[MAX_UNICODES]; - int unicode_count = -1; - int k; - if (gid < post->numberOfGlyphs && post->glyphNamePtr[gid] != NULL) { - unicode_count = agl_get_unicodes(post->glyphNamePtr[gid], unicodes, MAX_UNICODES); - } - if (unicode_count == -1) - MESG("No Unicode mapping available: GID=%u, name=%s\n", gid, - gid < post->numberOfGlyphs ? post->glyphNamePtr[gid] : "(none)"); - else { - /* the Unicode characters go into wbuf[2] and following, in UTF16BE */ - /* we rely on WBUF_SIZE being more than adequate for MAX_UNICODES */ - unsigned char* p = wbuf + 2; - len = 0; - for (k = 0; k < unicode_count; ++k) { - len += UC_sput_UTF16BE(unicodes[k], &p, wbuf+WBUF_SIZE); - } - wbuf[0] = (gid >> 8) & 0xff; - wbuf[1] = gid & 0xff; - CMap_add_bfchar(cmap, wbuf, 2, wbuf + 2, len); +#define MAX_NAME 256 + static char name[MAX_NAME] = "(none)"; + long unicodes[MAX_UNICODES]; + int unicode_count = -1; + FT_Error err = FT_Get_Glyph_Name(sfont->ft_face, gid, name, MAX_NAME); + if (!err) { + unicode_count = agl_get_unicodes(name, unicodes, MAX_UNICODES); + } +#undef MAX_UNICODES +#undef MAX_NAME + if (unicode_count == -1) { + WARN("No Unicode mapping available: GID=%u, name=%s", gid, name); + } else { + /* the Unicode characters go into wbuf[2] and following, in UTF16BE */ + /* we rely on WBUF_SIZE being more than adequate for MAX_UNICODES */ + unsigned char* p = wbuf + 2; + int k; + len = 0; + for (k = 0; k < unicode_count; ++k) { + len += UC_sput_UTF16BE(unicodes[k], &p, wbuf+WBUF_SIZE); + } + wbuf[0] = (gid >> 8) & 0xff; + wbuf[1] = gid & 0xff; + CMap_add_bfchar(cmap, wbuf, 2, wbuf + 2, len); + } } - } - else { +#else + WARN("No Unicode mapping available: GID=%u", gid); +#endif + } else { wbuf[0] = (gid >> 8) & 0xff; wbuf[1] = gid & 0xff; inbuf = wbuf; @@ -934,7 +941,7 @@ static pdf_obj * create_ToUnicode_cmap4 (struct cmap4 *map, const char *cmap_name, CMap *cmap_add, const char *used_glyphs, - struct tt_post_table *post) + sfnt *sfont) { pdf_obj *stream = NULL; CMap *cmap; @@ -988,7 +995,7 @@ create_ToUnicode_cmap4 (struct cmap4 *map, } } - count += handle_subst_glyphs(cmap, cmap_add, used_glyphs_copy, post); + count += handle_subst_glyphs(cmap, cmap_add, used_glyphs_copy, sfont); if (count < 1) stream = NULL; @@ -1005,7 +1012,7 @@ static pdf_obj * create_ToUnicode_cmap12 (struct cmap12 *map, const char *cmap_name, CMap *cmap_add, const char *used_glyphs, - struct tt_post_table *post) + sfnt *sfont) { pdf_obj *stream = NULL; CMap *cmap; @@ -1043,7 +1050,7 @@ create_ToUnicode_cmap12 (struct cmap12 *map, } } - count += handle_subst_glyphs(cmap, cmap_add, used_glyphs_copy, post); + count += handle_subst_glyphs(cmap, cmap_add, used_glyphs_copy, sfont); if (count < 1) stream = NULL; @@ -1085,7 +1092,6 @@ otf_create_ToUnicode_stream (const char *font_name, FILE *fp = NULL; sfnt *sfont; long offset = 0; - struct tt_post_table *ttpost = NULL; int i; /* replace slash in map name with dash to make the output cmap name valid, @@ -1157,8 +1163,6 @@ otf_create_ToUnicode_stream (const char *font_name, cmap_add = CMap_cache_get(cmap_add_id); } - ttpost = tt_read_post_table(sfont); - CMap_set_silent(1); /* many warnings without this... */ for (i = 0; i < sizeof(cmap_plat_encs) / sizeof(cmap_plat_enc_rec); ++i) { ttcmap = tt_cmap_read(sfont, cmap_plat_encs[i].platform, cmap_plat_encs[i].encoding); @@ -1166,12 +1170,12 @@ otf_create_ToUnicode_stream (const char *font_name, continue; if (ttcmap->format == 4) { cmap_obj = create_ToUnicode_cmap4(ttcmap->map, - cmap_name, cmap_add, used_glyphs, ttpost); + cmap_name, cmap_add, used_glyphs, sfont); break; } if (ttcmap->format == 12) { cmap_obj = create_ToUnicode_cmap12(ttcmap->map, - cmap_name, cmap_add, used_glyphs, ttpost); + cmap_name, cmap_add, used_glyphs, sfont); break; } } @@ -1180,9 +1184,6 @@ otf_create_ToUnicode_stream (const char *font_name, tt_cmap_release(ttcmap); CMap_set_silent(0); - if (ttpost != NULL) - tt_release_post_table(ttpost); - if (cmap_obj) { res_id = pdf_defineresource("CMap", cmap_name, cmap_obj, PDF_RES_FLUSH_IMMEDIATE); |