summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJjgod Jiang <gzjjgod@gmail.com>2014-08-09 20:26:41 +0000
committerJjgod Jiang <gzjjgod@gmail.com>2014-08-09 20:26:41 +0000
commit0e536590d09e1c58b0521a2a311dcae285f08a59 (patch)
treefd9662cd5f18003a53dfa03b15f3e577bec5ec80
parent9462cc23f60af7fbd09a40aa7d70346354343fb0 (diff)
dvipdfm-x: Simplify ToUnicode handling
Remove used_glyphs and its supporting code for ToUnicode handling, because for CID fonts, glyph id can be looked up from cid which is stored in used_chars already, it simplified a lot of code and reduced memory usage. Continue dedup create_ToUnicode_cmap{4,12}() with add_to_cmap_if_used(). git-svn-id: svn://tug.org/texlive/trunk@34885 c570f23f-e606-0410-a88d-b1316a301751
-rw-r--r--Build/source/texk/dvipdfm-x/pdfdev.c14
-rw-r--r--Build/source/texk/dvipdfm-x/pdffont.c18
-rw-r--r--Build/source/texk/dvipdfm-x/pdffont.h1
-rw-r--r--Build/source/texk/dvipdfm-x/tt_cmap.c221
-rw-r--r--Build/source/texk/dvipdfm-x/tt_cmap.h2
-rw-r--r--Build/source/texk/dvipdfm-x/type0.c23
-rw-r--r--Build/source/texk/dvipdfm-x/type0.h2
7 files changed, 104 insertions, 177 deletions
diff --git a/Build/source/texk/dvipdfm-x/pdfdev.c b/Build/source/texk/dvipdfm-x/pdfdev.c
index 2819a3e79af..ec7605a6ab4 100644
--- a/Build/source/texk/dvipdfm-x/pdfdev.c
+++ b/Build/source/texk/dvipdfm-x/pdfdev.c
@@ -463,7 +463,6 @@ struct dev_font {
pdf_obj *resource;
char *used_chars;
- char *used_glyphs;
/* Font format:
* simple, composite or bitmap.
@@ -877,8 +876,6 @@ dev_set_font (int font_id)
if (!real_font->resource) {
real_font->resource = pdf_get_font_reference(real_font->font_id);
real_font->used_chars = pdf_get_font_usedchars(real_font->font_id);
- if (real_font->cff_charsets)
- real_font->used_glyphs = pdf_get_font_usedglyphs(real_font->font_id);
}
if (!real_font->used_on_this_page) {
@@ -1158,12 +1155,6 @@ pdf_dev_set_string (spt_t xpos, spt_t ypos,
length = instr_len;
if (font->format == PDF_FONTTYPE_COMPOSITE) {
- if (real_font->used_glyphs != NULL && ctype == -1) {
- for (i = 0; i < length; i += 2) {
- unsigned short gid = (str_ptr[i] << 8) | str_ptr[i + 1];
- add_to_used_chars2(real_font->used_glyphs, gid);
- }
- }
if (handle_multibyte_string(font, &str_ptr, &length, ctype) < 0) {
ERROR("Error in converting input string...");
return;
@@ -1171,10 +1162,6 @@ pdf_dev_set_string (spt_t xpos, spt_t ypos,
if (real_font->used_chars != NULL) {
for (i = 0; i < length; i += 2) {
unsigned short cid = (str_ptr[i] << 8) | str_ptr[i + 1];
- if (ctype == 2 && font->cff_charsets) {
- unsigned short gid = cff_charsets_lookup_gid(font->cff_charsets, cid);
- add_to_used_chars2(real_font->used_glyphs, gid);
- }
add_to_used_chars2(real_font->used_chars, cid);
}
}
@@ -1549,7 +1536,6 @@ pdf_dev_locate_font (const char *font_name, spt_t ptsize)
font->resource = NULL; /* Don't ref obj until font is actually used. */
font->used_chars = NULL;
- font->used_glyphs = NULL;
font->extend = 1.0;
font->slant = 0.0;
diff --git a/Build/source/texk/dvipdfm-x/pdffont.c b/Build/source/texk/dvipdfm-x/pdffont.c
index 56a354a15db..9dc400700f3 100644
--- a/Build/source/texk/dvipdfm-x/pdffont.c
+++ b/Build/source/texk/dvipdfm-x/pdffont.c
@@ -334,24 +334,6 @@ pdf_get_font_usedchars (int font_id)
}
}
-char *
-pdf_get_font_usedglyphs (int font_id)
-{
- pdf_font *font;
-
- CHECK_ID(font_id);
-
- font = GET_FONT(font_id);
- if (font->subtype == PDF_FONT_FONTTYPE_TYPE0) {
- Type0Font *t0font;
-
- t0font = Type0Font_cache_get(font->font_id);
- return Type0Font_get_usedglyphs(t0font);
- }
-
- return NULL;
-}
-
int
pdf_get_font_wmode (int font_id)
{
diff --git a/Build/source/texk/dvipdfm-x/pdffont.h b/Build/source/texk/dvipdfm-x/pdffont.h
index 38ca3a590e2..a833fe89dc1 100644
--- a/Build/source/texk/dvipdfm-x/pdffont.h
+++ b/Build/source/texk/dvipdfm-x/pdffont.h
@@ -63,7 +63,6 @@ extern int pdf_font_findresource (const char *font_name,
extern int pdf_get_font_subtype (int font_id);
extern pdf_obj *pdf_get_font_reference (int font_id);
extern char *pdf_get_font_usedchars (int font_id);
-extern char *pdf_get_font_usedglyphs (int font_id);
#if 0
extern char *pdf_get_font_fontname (int font_id); /* without unique tag */
diff --git a/Build/source/texk/dvipdfm-x/tt_cmap.c b/Build/source/texk/dvipdfm-x/tt_cmap.c
index f288891a195..d0e8af6db68 100644
--- a/Build/source/texk/dvipdfm-x/tt_cmap.c
+++ b/Build/source/texk/dvipdfm-x/tt_cmap.c
@@ -862,11 +862,13 @@ sfnt_get_glyphname(struct tt_post_table *post, cff_font *cffont, USHORT gid)
static USHORT
handle_subst_glyphs (CMap *cmap,
- CMap *cmap_add, const char *used_glyphs,
- sfnt *sfont, cff_font *cffont)
+ CMap *cmap_add,
+ const char *used_glyphs,
+ sfnt *sfont,
+ cff_font *cffont)
{
USHORT count;
- USHORT i, gid;
+ USHORT i;
struct tt_post_table *post = NULL;
if (!cmap_add)
@@ -882,10 +884,10 @@ handle_subst_glyphs (CMap *cmap,
continue;
for (j = 0; j < 8; j++) {
- gid = 8 * i + j;
+ USHORT gid = 8 * i + j;
if (!is_used_char2(used_glyphs, gid))
- continue;
+ continue;
if (!cmap_add) {
#define MAX_UNICODES 16
@@ -918,35 +920,33 @@ handle_subst_glyphs (CMap *cmap,
}
RELEASE(name);
} else {
- wbuf[0] = (gid >> 8) & 0xff;
- wbuf[1] = gid & 0xff;
- inbuf = wbuf;
- inbytesleft = 2;
- outbuf = wbuf + 2;
- outbytesleft = WBUF_SIZE - 2;
- CMap_decode(cmap_add,
- &inbuf , &inbytesleft,
- &outbuf, &outbytesleft);
- if (inbytesleft != 0) {
- WARN("CMap conversion failed...");
- } else {
- len = WBUF_SIZE - 2 - outbytesleft;
- CMap_add_bfchar(cmap, wbuf, 2, wbuf + 2, len);
- count++;
-
- if (verbose > VERBOSE_LEVEL_MIN) {
- long _i;
-
- MESG("otf_cmap>> Additional ToUnicode mapping: <%04X> <", gid);
- for (_i = 0; _i < len; _i++) {
- MESG("%02X", wbuf[2 + _i]);
- }
- MESG(">\n");
- }
+ wbuf[0] = (gid >> 8) & 0xff;
+ wbuf[1] = gid & 0xff;
- }
- }
+ inbuf = wbuf;
+ inbytesleft = 2;
+ outbuf = wbuf + 2;
+ outbytesleft = WBUF_SIZE - 2;
+ CMap_decode(cmap_add, &inbuf, &inbytesleft, &outbuf, &outbytesleft);
+
+ if (inbytesleft != 0) {
+ WARN("CMap conversion failed...");
+ } else {
+ len = WBUF_SIZE - 2 - outbytesleft;
+ CMap_add_bfchar(cmap, wbuf, 2, wbuf + 2, len);
+ count++;
+
+ if (verbose > VERBOSE_LEVEL_MIN) {
+ long _i;
+ MESG("otf_cmap>> Additional ToUnicode mapping: <%04X> <", gid);
+ for (_i = 0; _i < len; _i++) {
+ MESG("%02X", wbuf[2 + _i]);
+ }
+ MESG(">\n");
+ }
+ }
+ }
}
}
@@ -977,56 +977,69 @@ prepare_CIDFont_from_sfnt(sfnt* sfont)
}
static USHORT
+add_to_cmap_if_used (CMap *cmap,
+ cff_font *cffont,
+ char *used_chars,
+ USHORT gid,
+ ULONG ch)
+{
+ USHORT count = 0;
+ USHORT cid = cffont ? cff_charsets_lookup_inverse(cffont, gid) : gid;
+ if (is_used_char2(used_chars, cid)) {
+ int len;
+ unsigned char *p = wbuf + 2;
+
+ count++;
+
+ wbuf[0] = (cid >> 8) & 0xff;
+ wbuf[1] = (cid & 0xff);
+ len = UC_sput_UTF16BE((long) ch, &p, wbuf + WBUF_SIZE);
+ CMap_add_bfchar(cmap, wbuf, 2, wbuf + 2, len);
+
+ /* Skip PUA characters and alphabetic presentation forms, allowing
+ * handle_subst_glyphs() as it might find better mapping. Fixes the
+ * mapping of ligatures encoded in PUA in fonts like Linux Libertine
+ * and old Adobe fonts.
+ */
+ if (!is_PUA_or_presentation(ch)) {
+ /* Avoid duplicate entry
+ * There are problem when two Unicode code is mapped to
+ * single glyph...
+ */
+ used_chars[gid / 8] &= ~(1 << (7 - (gid % 8)));
+ }
+ }
+
+ return count;
+}
+
+static USHORT
create_ToUnicode_cmap4 (CMap *cmap,
struct cmap4 *map,
- char *used_glyphs,
+ char *used_chars,
cff_font *cffont)
{
- USHORT c0, c1, gid, count, ch;
- USHORT i, j, d, segCount;
+ USHORT count = 0, segCount = map->segCountX2 / 2;
+ USHORT i, j;
- segCount = map->segCountX2 / 2;
- for (count = 0, i = 0; i < segCount; i++) {
- c0 = map->startCount[i];
- c1 = map->endCount[i];
- d = map->idRangeOffset[i] / 2 - (segCount - i);
+ for (i = 0; i < segCount; i++) {
+ USHORT c0 = map->startCount[i];
+ USHORT c1 = map->endCount[i];
+ USHORT d = map->idRangeOffset[i] / 2 - (segCount - i);
for (j = 0; j <= c1 - c0; j++) {
- ch = c0 + j;
+ USHORT ch = c0 + j;
+ USHORT gid;
+
if (map->idRangeOffset[i] == 0) {
- gid = (ch + map->idDelta[i]) & 0xffff;
+ gid = (ch + map->idDelta[i]) & 0xffff;
} else if (c0 == 0xffff && c1 == 0xffff && map->idRangeOffset[i] == 0xffff) {
- /* this is for protection against some old broken fonts... */
- gid = 0;
+ /* this is for protection against some old broken fonts... */
+ gid = 0;
} else {
- gid = (map->glyphIndexArray[j+d] +
- map->idDelta[i]) & 0xffff;
+ gid = (map->glyphIndexArray[j + d] + map->idDelta[i]) & 0xffff;
}
- if (is_used_char2(used_glyphs, gid)) {
- unsigned int cid = cffont ? cff_charsets_lookup_inverse(cffont, gid) : gid;
- count++;
-
- wbuf[0] = (cid >> 8) & 0xff;
- wbuf[1] = (cid & 0xff);
-
- wbuf[2] = (ch >> 8) & 0xff;
- wbuf[3] = ch & 0xff;
- CMap_add_bfchar(cmap, wbuf, 2, wbuf+2, 2);
-
- /* Skip PUA characters and alphabetic presentation forms, allowing
- * handle_subst_glyphs() as it might find better mapping. Fixes the
- * mapping of ligatures encoded in PUA in fonts like Linux Libertine
- * and old Adobe fonts.
- */
- if (!is_PUA_or_presentation(ch)) {
- /* Avoid duplicate entry
- * There are problem when two Unicode code is mapped to
- * single glyph...
- */
- used_glyphs[gid/8] &= ~(1 << (7 - (gid % 8)));
- }
- count++;
- }
+ count += add_to_cmap_if_used(cmap, cffont, used_chars, gid, ch);
}
}
@@ -1036,45 +1049,17 @@ create_ToUnicode_cmap4 (CMap *cmap,
static USHORT
create_ToUnicode_cmap12 (CMap *cmap,
struct cmap12 *map,
- char *used_glyphs,
+ char *used_chars,
cff_font *cffont)
{
- ULONG i, ch;
- USHORT gid, count = 0;
+ ULONG i, ch, count = 0;
for (i = 0; i < map->nGroups; i++) {
for (ch = map->groups[i].startCharCode;
ch <= map->groups[i].endCharCode; ch++) {
- unsigned char *p;
- int len;
- long d;
-
- p = wbuf + 2;
- d = ch - map->groups[i].startCharCode;
- gid = (USHORT) ((map->groups[i].startGlyphID + d) & 0xffff);
- if (is_used_char2(used_glyphs, gid)) {
- unsigned int cid = cffont ? cff_charsets_lookup_inverse(cffont, gid) : gid;
- count++;
- wbuf[0] = (cid >> 8) & 0xff;
- wbuf[1] = (cid & 0xff);
- len = UC_sput_UTF16BE((long)ch, &p, wbuf+WBUF_SIZE);
-
- CMap_add_bfchar(cmap, wbuf, 2, wbuf+2, len);
-
- /* Skip PUA characters and alphabetic presentation forms, allowing
- * handle_subst_glyphs() as it might find better mapping. Fixes the
- * mapping of ligatures encoded in PUA in fonts like Linux Libertine
- * and old Adobe fonts.
- */
- if (!is_PUA_or_presentation(ch)) {
- /* Avoid duplicate entry
- * There are problem when two Unicode code is mapped to
- * single glyph...
- */
- used_glyphs[gid/8] &= ~(1 << (7 - (gid % 8)));
- }
- count++;
- }
+ long d = ch - map->groups[i].startCharCode;
+ USHORT gid = (USHORT) ((map->groups[i].startGlyphID + d) & 0xffff);
+ count += add_to_cmap_if_used(cmap, cffont, used_chars, gid, ch);
}
}
@@ -1085,14 +1070,13 @@ static pdf_obj *
create_ToUnicode_cmap (tt_cmap *ttcmap,
const char *cmap_name,
CMap *cmap_add,
- const char *used_glyphs,
+ const char *used_chars,
sfnt *sfont,
CMap *code_to_cid_cmap)
{
pdf_obj *stream = NULL;
CMap *cmap;
USHORT i, gid, count = 0;
- char used_glyphs_copy[8192];
cff_font *cffont = prepare_CIDFont_from_sfnt(sfont);
char is_cidfont = cffont && (cffont->flag & FONTTYPE_CIDFONT);
@@ -1105,23 +1089,21 @@ create_ToUnicode_cmap (tt_cmap *ttcmap,
if (code_to_cid_cmap && cffont && is_cidfont) {
for (i = 0; i < 8192; i++) {
- int j;
- long len;
+ int j;
- if (used_glyphs[i] == 0)
+ if (used_chars[i] == 0)
continue;
for (j = 0; j < 8; j++) {
- unsigned int cid;
+ USHORT cid = 8 * i + j;
int ch;
- gid = 8 * i + j;
- if (!is_used_char2(used_glyphs, gid))
+ if (!is_used_char2(used_chars, cid))
continue;
- cid = cff_charsets_lookup_inverse(cffont, gid);
ch = CMap_reverse_decode(code_to_cid_cmap, cid);
if (ch >= 0) {
+ long len;
unsigned char *p = wbuf + 2;
wbuf[0] = (cid >> 8) & 0xff;
wbuf[1] = cid & 0xff;
@@ -1132,24 +1114,25 @@ create_ToUnicode_cmap (tt_cmap *ttcmap,
}
}
} else {
- memcpy(used_glyphs_copy, used_glyphs, 8192);
+ char used_chars_copy[8192];
+ memcpy(used_chars_copy, used_chars, 8192);
/* For create_ToUnicode_cmap{4,12}(), cffont is for GID -> CID lookup,
* so it is only needed for CID fonts. */
switch (ttcmap->format) {
case 4:
- count = create_ToUnicode_cmap4(cmap, ttcmap->map, used_glyphs_copy,
+ count = create_ToUnicode_cmap4(cmap, ttcmap->map, used_chars_copy,
is_cidfont ? cffont : NULL);
break;
case 12:
- count = create_ToUnicode_cmap12(cmap, ttcmap->map, used_glyphs_copy,
+ count = create_ToUnicode_cmap12(cmap, ttcmap->map, used_chars_copy,
is_cidfont ? cffont : NULL);
break;
}
/* For handle_subst_glyphs(), cffont is for GID -> glyph name lookup, so
* it is only needed for non-CID fonts. */
- count += handle_subst_glyphs(cmap, cmap_add, used_glyphs_copy, sfont,
+ count += handle_subst_glyphs(cmap, cmap_add, used_chars_copy, sfont,
is_cidfont ? NULL : cffont);
}
@@ -1182,7 +1165,7 @@ static cmap_plat_enc_rec cmap_plat_encs[] = {
pdf_obj *
otf_create_ToUnicode_stream (const char *font_name,
int ttc_index, /* 0 for non-TTC */
- const char *used_glyphs,
+ const char *used_chars,
int cmap_id)
{
pdf_obj *cmap_ref = NULL;
@@ -1275,7 +1258,7 @@ otf_create_ToUnicode_stream (const char *font_name,
continue;
if (ttcmap->format == 4 || ttcmap->format == 12) {
- cmap_obj = create_ToUnicode_cmap(ttcmap, cmap_name, cmap_add, used_glyphs,
+ cmap_obj = create_ToUnicode_cmap(ttcmap, cmap_name, cmap_add, used_chars,
sfont, code_to_cid_cmap);
break;
}
diff --git a/Build/source/texk/dvipdfm-x/tt_cmap.h b/Build/source/texk/dvipdfm-x/tt_cmap.h
index afc492cb127..2e9bbbbbc17 100644
--- a/Build/source/texk/dvipdfm-x/tt_cmap.h
+++ b/Build/source/texk/dvipdfm-x/tt_cmap.h
@@ -68,7 +68,7 @@ extern void tt_cmap_release (tt_cmap *cmap);
/* Indirect reference */
extern pdf_obj *otf_create_ToUnicode_stream (const char *map_name,
int ttc_index,
- const char *used_glyphs,
+ const char *used_chars,
int cmap_id);
/* CMap ID */
extern int otf_load_Unicode_CMap (const char *map_name,
diff --git a/Build/source/texk/dvipdfm-x/type0.c b/Build/source/texk/dvipdfm-x/type0.c
index 060c9b9cfe8..5fe77a7f86d 100644
--- a/Build/source/texk/dvipdfm-x/type0.c
+++ b/Build/source/texk/dvipdfm-x/type0.c
@@ -85,7 +85,6 @@ struct Type0Font {
char *fontname; /* BaseFont */
char *encoding; /* "Identity-H" or "Identity-V" (not ID) */
char *used_chars; /* Used chars (CIDs) */
- char *used_glyphs; /* Used glyphs (GIDs) */
/*
* Type0 only
@@ -114,7 +113,6 @@ Type0Font_init_font_struct (Type0Font *font)
font->descriptor = NULL;
font->encoding = NULL;
font->used_chars = NULL;
- font->used_glyphs = NULL;
font->descendant = NULL;
font->wmode = -1;
font->cmap_id = -1;
@@ -135,8 +133,6 @@ Type0Font_clean (Type0Font *font)
ERROR("%s: FontDescriptor unexpected for Type0 font.", TYPE0FONT_DEBUG_STR);
if (!(font->flags & FLAG_USED_CHARS_SHARED) && font->used_chars)
RELEASE(font->used_chars);
- if (!(font->flags & FLAG_USED_CHARS_SHARED) && font->used_glyphs)
- RELEASE(font->used_glyphs);
if (font->encoding)
RELEASE(font->encoding);
if (font->fontname)
@@ -145,7 +141,6 @@ Type0Font_clean (Type0Font *font)
font->indirect = NULL;
font->descriptor = NULL;
font->used_chars = NULL;
- font->used_glyphs = NULL;
font->encoding = NULL;
font->fontname = NULL;
}
@@ -157,13 +152,9 @@ Type0Font_clean (Type0Font *font)
static pdf_obj *
Type0Font_create_ToUnicode_stream(Type0Font *font) {
CIDFont *cidfont = font->descendant;
- char *used = Type0Font_get_usedglyphs(font);
- if (!used)
- used = Type0Font_get_usedchars(font);
-
return otf_create_ToUnicode_stream(CIDFont_get_ident(cidfont),
CIDFont_get_opt_index(cidfont),
- used,
+ Type0Font_get_usedchars(font),
font->cmap_id);
}
@@ -331,14 +322,6 @@ Type0Font_get_usedchars (Type0Font *font)
return font->used_chars;
}
-char *
-Type0Font_get_usedglyphs (Type0Font *font)
-{
- ASSERT(font);
-
- return font->used_glyphs;
-}
-
pdf_obj *
Type0Font_get_resource (Type0Font *font)
{
@@ -517,7 +500,6 @@ Type0Font_cache_find (const char *map_name, int cmap_id, fontmap_opt *fmap_opt)
*/
font->used_chars = NULL;
- font->used_glyphs = NULL;
font->flags = FLAG_NONE;
switch (CIDFont_get_subtype(cidfont)) {
@@ -531,12 +513,9 @@ Type0Font_cache_find (const char *map_name, int cmap_id, fontmap_opt *fmap_opt)
*/
if ((parent_id = CIDFont_get_parent_id(cidfont, wmode ? 0 : 1)) < 0) {
font->used_chars = new_used_chars2();
- if (fmap_opt->cff_charsets)
- font->used_glyphs = new_used_chars2();
} else {
/* Don't allocate new one. */
font->used_chars = Type0Font_get_usedchars(Type0Font_cache_get(parent_id));
- font->used_glyphs = Type0Font_get_usedglyphs(Type0Font_cache_get(parent_id));
font->flags |= FLAG_USED_CHARS_SHARED;
}
break;
diff --git a/Build/source/texk/dvipdfm-x/type0.h b/Build/source/texk/dvipdfm-x/type0.h
index c22d41e3da0..553de1e760f 100644
--- a/Build/source/texk/dvipdfm-x/type0.h
+++ b/Build/source/texk/dvipdfm-x/type0.h
@@ -36,8 +36,6 @@ extern char *Type0Font_get_encoding (Type0Font *font);
#endif
extern char *Type0Font_get_usedchars (Type0Font *font);
-extern char *Type0Font_get_usedglyphs (Type0Font *font);
-
extern pdf_obj *Type0Font_get_resource (Type0Font *font);
extern void Type0Font_set_ToUnicode (Type0Font *font, pdf_obj *cmap_ref);