summaryrefslogtreecommitdiff
path: root/Build/source/texk/dvipdfm-x
diff options
context:
space:
mode:
authorKhaled Hosny <khaledhosny@eglug.org>2014-07-27 23:04:49 +0000
committerKhaled Hosny <khaledhosny@eglug.org>2014-07-27 23:04:49 +0000
commit5795568a60dba76e57cdb78fda5aab4e6e135991 (patch)
tree0a2586ae809d714303ed3a6b76b623765af408bd /Build/source/texk/dvipdfm-x
parent378fc061ff4879abb4983d8e48f593f1b4b779d9 (diff)
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
Diffstat (limited to 'Build/source/texk/dvipdfm-x')
-rw-r--r--Build/source/texk/dvipdfm-x/ChangeLog5
-rw-r--r--Build/source/texk/dvipdfm-x/cff.c14
-rw-r--r--Build/source/texk/dvipdfm-x/cff.h1
-rw-r--r--Build/source/texk/dvipdfm-x/cid.c3
-rw-r--r--Build/source/texk/dvipdfm-x/cid_p.h1
-rw-r--r--Build/source/texk/dvipdfm-x/cidtype0.c4
-rw-r--r--Build/source/texk/dvipdfm-x/fontmap.c4
-rw-r--r--Build/source/texk/dvipdfm-x/fontmap.h2
-rw-r--r--Build/source/texk/dvipdfm-x/pdfdev.c29
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 <gzjjgod@gmail.com>
+
+ * 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 <peb@mppmu.mpg.de>
* 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;