From 5795568a60dba76e57cdb78fda5aab4e6e135991 Mon Sep 17 00:00:00 2001 From: Khaled Hosny Date: Sun, 27 Jul 2014 23:04:49 +0000 Subject: Fix CID-keyed fonts glyph lookup Keep cff_charsets parsed from CID font around if exists. Use the cff_charsets to do GID -> CID lookup. git-svn-id: svn://tug.org/texlive/trunk@34743 c570f23f-e606-0410-a88d-b1316a301751 --- Build/source/texk/dvipdfm-x/ChangeLog | 5 +++++ Build/source/texk/dvipdfm-x/cff.c | 14 ++++++++------ Build/source/texk/dvipdfm-x/cff.h | 1 + Build/source/texk/dvipdfm-x/cid.c | 3 +++ Build/source/texk/dvipdfm-x/cid_p.h | 1 + Build/source/texk/dvipdfm-x/cidtype0.c | 4 ++++ Build/source/texk/dvipdfm-x/fontmap.c | 4 ++++ Build/source/texk/dvipdfm-x/fontmap.h | 2 ++ Build/source/texk/dvipdfm-x/pdfdev.c | 29 ++++++++++++++++++++++++++++- 9 files changed, 56 insertions(+), 7 deletions(-) diff --git a/Build/source/texk/dvipdfm-x/ChangeLog b/Build/source/texk/dvipdfm-x/ChangeLog index c2106598e08..b80bd705cc4 100644 --- a/Build/source/texk/dvipdfm-x/ChangeLog +++ b/Build/source/texk/dvipdfm-x/ChangeLog @@ -1,3 +1,8 @@ +2014-07-27 Jiang Jiang + + * cff.c, cff.h, cid.c, cid_p.h, cidtype0.c, fontmap.c, fontmap.h, + pdfdev.c: Fix CID-keyed fonts glyph lookup with XeTeX. + 2014-07-26 Peter Breitenlohner * dpxfile.c: Add a default case to avoid compiler warnings. diff --git a/Build/source/texk/dvipdfm-x/cff.c b/Build/source/texk/dvipdfm-x/cff.c index 52aaab47528..b576a8b4f0f 100644 --- a/Build/source/texk/dvipdfm-x/cff.c +++ b/Build/source/texk/dvipdfm-x/cff.c @@ -1099,10 +1099,6 @@ cff_charsets_lookup (cff_font *cff, card16 cid) card16 cff_charsets_lookup_inverse (cff_font *cff, card16 gid) { - card16 sid = 0; - cff_charsets *charset; - card16 i; - if (cff->flag & (CHARSETS_ISOADOBE|CHARSETS_EXPERT|CHARSETS_EXPSUB)) { ERROR("Predefined CFF charsets not supported yet"); } else if (cff->charsets == NULL) { @@ -1113,9 +1109,15 @@ cff_charsets_lookup_inverse (cff_font *cff, card16 gid) return 0; /* .notdef */ } - charset = cff->charsets; + return cff_charsets_lookup_cid(cff->charsets, gid); +} + +card16 +cff_charsets_lookup_cid(cff_charsets *charset, card16 gid) +{ + card16 sid = 0; + card16 i; - sid = 0; switch (charset->format) { case 0: if (gid - 1 >= charset->num_entries) diff --git a/Build/source/texk/dvipdfm-x/cff.h b/Build/source/texk/dvipdfm-x/cff.h index 41c4c06887b..f495b9f2321 100644 --- a/Build/source/texk/dvipdfm-x/cff.h +++ b/Build/source/texk/dvipdfm-x/cff.h @@ -122,6 +122,7 @@ extern card16 cff_charsets_lookup (cff_font *cff, card16 cid); extern void cff_release_charsets (cff_charsets *charset); /* Returns SID or CID */ extern card16 cff_charsets_lookup_inverse (cff_font *cff, card16 gid); +extern card16 cff_charsets_lookup_cid(cff_charsets *charset, card16 gid); /* FDSelect */ extern long cff_read_fdselect (cff_font *cff); diff --git a/Build/source/texk/dvipdfm-x/cid.c b/Build/source/texk/dvipdfm-x/cid.c index 4d80097df1e..b82a3b713ae 100644 --- a/Build/source/texk/dvipdfm-x/cid.c +++ b/Build/source/texk/dvipdfm-x/cid.c @@ -569,6 +569,7 @@ CIDFont_cache_find (const char *map_name, opt->name = NULL; opt->csi = get_cidsysinfo(map_name, fmap_opt); opt->stemv = fmap_opt->stemv; + opt->cff_charsets = NULL; if (!opt->csi && cmap_csi) { /* @@ -648,6 +649,8 @@ CIDFont_cache_find (const char *map_name, font->options = opt; __cache->fonts[font_id] = font; (__cache->num)++; + + fmap_opt->cff_charsets = opt->cff_charsets; } } else if (opt) { release_opt(opt); diff --git a/Build/source/texk/dvipdfm-x/cid_p.h b/Build/source/texk/dvipdfm-x/cid_p.h index 80d2133d0c3..fb409b6847a 100644 --- a/Build/source/texk/dvipdfm-x/cid_p.h +++ b/Build/source/texk/dvipdfm-x/cid_p.h @@ -42,6 +42,7 @@ typedef struct int style; int embed; int stemv; + void *cff_charsets; } cid_opt; struct CIDFont diff --git a/Build/source/texk/dvipdfm-x/cidtype0.c b/Build/source/texk/dvipdfm-x/cidtype0.c index f8e67471369..1605a536515 100644 --- a/Build/source/texk/dvipdfm-x/cidtype0.c +++ b/Build/source/texk/dvipdfm-x/cidtype0.c @@ -753,6 +753,10 @@ CIDFont_type0_open (CIDFont *font, const char *name, return -1; } + cff_read_charsets(cffont); + opt->cff_charsets = cffont->charsets; + cffont->charsets = NULL; + csi = NEW(1, CIDSysInfo); csi->registry = cff_get_string(cffont, (s_SID)cff_dict_get(cffont->topdict, "ROS", 0)); diff --git a/Build/source/texk/dvipdfm-x/fontmap.c b/Build/source/texk/dvipdfm-x/fontmap.c index acb068efc3c..91c6de71db0 100644 --- a/Build/source/texk/dvipdfm-x/fontmap.c +++ b/Build/source/texk/dvipdfm-x/fontmap.c @@ -85,6 +85,8 @@ pdf_init_fontmap_record (fontmap_rec *mrec) #ifdef XETEX mrec->opt.ft_face = NULL; #endif + + mrec->opt.cff_charsets = NULL; } void @@ -154,6 +156,8 @@ pdf_copy_fontmap_record (fontmap_rec *dst, const fontmap_rec *src) #ifdef XETEX dst->opt.ft_face = src->opt.ft_face; #endif + + dst->opt.cff_charsets = src->opt.cff_charsets; } diff --git a/Build/source/texk/dvipdfm-x/fontmap.h b/Build/source/texk/dvipdfm-x/fontmap.h index 9ff6a378f7f..f7357088feb 100644 --- a/Build/source/texk/dvipdfm-x/fontmap.h +++ b/Build/source/texk/dvipdfm-x/fontmap.h @@ -50,6 +50,8 @@ typedef struct fontmap_opt { char *otl_tags; /* currently unused */ char *tounicode; /* not implemented yet */ + void *cff_charsets; + double design_size; /* unused */ char *charcoll; /* Adobe-Japan1-4, etc. */ diff --git a/Build/source/texk/dvipdfm-x/pdfdev.c b/Build/source/texk/dvipdfm-x/pdfdev.c index 7d27b913fe9..6fa42237542 100644 --- a/Build/source/texk/dvipdfm-x/pdfdev.c +++ b/Build/source/texk/dvipdfm-x/pdfdev.c @@ -52,6 +52,8 @@ #include "pdfdev.h" +#include "cff.h" + static int verbose = 0; void @@ -493,6 +495,8 @@ struct dev_font { int ucs_plane; int is_unicode; + + cff_charsets *cff_charsets; }; static struct dev_font *dev_fonts = NULL; @@ -954,8 +958,26 @@ handle_multibyte_string (struct dev_font *font, p = *str_ptr; length = *str_len; + if (ctype == -1 && font->cff_charsets) { /* freetype glyph indexes */ + /* Convert freetype glyph indexes to CID. */ + const unsigned char *inbuf = p; + unsigned char *outbuf = sbuf0; + for (i = 0; i < length; i += 2) { + unsigned int gid; + gid = *inbuf++ << 8; + gid += *inbuf++; + + gid = cff_charsets_lookup_cid(font->cff_charsets, gid); + + *outbuf++ = gid >> 8; + *outbuf++ = gid & 0xff; + } + + p = sbuf0; + length = outbuf - sbuf0; + } /* _FIXME_ */ - if (font->is_unicode) { /* UCS-4 */ + else if (font->is_unicode) { /* UCS-4 */ if (ctype == 1) { if (length * 4 >= FORMAT_BUF_SIZE) { WARN("Too long string..."); @@ -1291,8 +1313,11 @@ pdf_close_device (void) RELEASE(dev_fonts[i].tex_name); if (dev_fonts[i].resource) pdf_release_obj(dev_fonts[i].resource); + if (dev_fonts[i].cff_charsets) + cff_release_charsets(dev_fonts[i].cff_charsets); dev_fonts[i].tex_name = NULL; dev_fonts[i].resource = NULL; + dev_fonts[i].cff_charsets = NULL; } RELEASE(dev_fonts); } @@ -1474,6 +1499,8 @@ pdf_dev_locate_font (const char *font_name, spt_t ptsize) if (font->font_id < 0) return -1; + font->cff_charsets = mrec->opt.cff_charsets; + /* We found device font here. */ if (i < num_dev_fonts) { font->real_font_index = i; -- cgit v1.2.3