summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/pdftexdir/writet3.c
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2018-01-02 00:17:17 +0000
committerKarl Berry <karl@freefriends.org>2018-01-02 00:17:17 +0000
commit35ff4f6a7d6f4f21e02bb3d494b182fd8b54bc7e (patch)
tree51486980b96c05a2f9de112e681d3c2f075d7b22 /Build/source/texk/web2c/pdftexdir/writet3.c
parent3992bdafaa741b02f032e705d0aab10224c5c052 (diff)
encoding vectors for bitmap font map lines (sync from pdftex r790)
git-svn-id: svn://tug.org/texlive/trunk@46189 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/web2c/pdftexdir/writet3.c')
-rw-r--r--Build/source/texk/web2c/pdftexdir/writet3.c66
1 files changed, 60 insertions, 6 deletions
diff --git a/Build/source/texk/web2c/pdftexdir/writet3.c b/Build/source/texk/web2c/pdftexdir/writet3.c
index 3348dff5cff..f72ab32f944 100644
--- a/Build/source/texk/web2c/pdftexdir/writet3.c
+++ b/Build/source/texk/web2c/pdftexdir/writet3.c
@@ -1,5 +1,5 @@
-/*
-Copyright 1996-2017 Han The Thanh, <thanh@pdftex.org>
+/* writet3.c: write a Type 3 (bitmap PK) font.
+Copyright 1996-2018 Han The Thanh, <thanh@pdftex.org>
This file is part of pdfTeX.
@@ -254,7 +254,34 @@ static boolean writepk(internalfontnumber f)
return true;
}
-void writet3(int objnum, internalfontnumber f)
+/* We must remove duplicate glyph names since the duplicates render the
+ output invalid. We give a warning, since this should only happen with
+ ill-defined .enc files that should get fixed. */
+static void remove_duplicate_glyph_names(char **g, const char *encname)
+{
+ struct avl_table *gl_tree;
+ char *aa;
+ int i;
+ gl_tree = avl_create(comp_string_entry, NULL, &avl_xallocator);
+ assert(gl_tree != NULL);
+ for (i = 0; i < 256; i++) {
+ if (g[i] == notdef)
+ continue;
+ aa = (char *) avl_find(gl_tree, g[i]);
+ if (aa == NULL) {
+ aa = (char *) avl_probe(gl_tree, g[i]);
+ assert(aa != NULL);
+ } else {
+ pdftex_warn("%s: duplicate glyph name at position %d: %s",
+ encname, i, g[i]);
+ xfree(g[i]);
+ g[i] = (char *) notdef;
+ }
+ }
+ avl_destroy(gl_tree, NULL);
+}
+
+void writet3(fm_entry * fm, int objnum, internalfontnumber f)
{
static char t3_font_scale_str[] = "\\pdffontscale";
int i;
@@ -262,12 +289,19 @@ void writet3(int objnum, internalfontnumber f)
int first_char, last_char;
integer pk_font_scale;
boolean is_notdef;
+ fe_entry *fe;
+ char **glyph_names;
+ integer tounicode_objnum;
t3_glyph_num = 0;
t3_image_used = false;
for (i = 0; i < 256; i++) {
t3_char_procs[i] = 0;
t3_char_widths[i] = 0;
}
+ fe = fm && fm->encname ? get_fe_entry(fm->encname) : NULL;
+ glyph_names = fe ? fe->glyph_names : NULL;
+ if (glyph_names)
+ remove_duplicate_glyph_names(glyph_names, fm->encname);
packfilename(fontname[f], getnullstr(), maketexstring(".pgc"));
cur_file_name = makecstring(makenamestring());
is_pk_font = false;
@@ -298,6 +332,11 @@ void writet3(int objnum, internalfontnumber f)
if (pdfcharmarked(f, i))
break;
last_char = i;
+ /* write ToUnicode entry if we can */
+ if (fixedgentounicode > 0 && !pdffontnobuiltintounicode[f] && fe != NULL)
+ tounicode_objnum = write_tounicode(glyph_names, fm->tfm_name, fe->name);
+ else
+ tounicode_objnum = 0;
pdfbegindict(objnum, 1); /* Type 3 font dictionary */
pdf_puts("/Type /Font\n/Subtype /Type3\n");
pdf_printf("/Name /F%i\n", (int) f);
@@ -326,6 +365,8 @@ void writet3(int objnum, internalfontnumber f)
cptr = pdfnewobjnum();
pdf_printf("/Widths %i 0 R\n/Encoding %i 0 R\n/CharProcs %i 0 R\n",
(int) wptr, (int) eptr, (int) cptr);
+ if (tounicode_objnum != 0)
+ pdf_printf("/ToUnicode %i 0 R\n", (int) tounicode_objnum);
pdfenddict();
pdfbeginobj(wptr, 1); /* chars width array */
pdf_puts("[");
@@ -344,7 +385,12 @@ void writet3(int objnum, internalfontnumber f)
pdf_printf("/%s", notdef);
is_notdef = true;
} else {
- pdf_printf("/a%i", first_char);
+ if (glyph_names
+ && glyph_names[first_char]
+ && glyph_names[first_char] != notdef)
+ pdf_printf("/%s", glyph_names[first_char]);
+ else
+ pdf_printf("/a%i", first_char);
is_notdef = false;
}
for (i = first_char + 1; i <= last_char; i++) {
@@ -358,7 +404,10 @@ void writet3(int objnum, internalfontnumber f)
pdf_printf(" %i", i);
is_notdef = false;
}
- pdf_printf("/a%i", i);
+ if (glyph_names && glyph_names[i] && glyph_names[i] != notdef)
+ pdf_printf("/%s", glyph_names[i]);
+ else
+ pdf_printf("/a%i", i);
}
}
pdf_puts("]\n");
@@ -366,7 +415,12 @@ void writet3(int objnum, internalfontnumber f)
pdfbegindict(cptr, 1); /* CharProcs dictionary */
for (i = first_char; i <= last_char; i++)
if (t3_char_procs[i] != 0)
- pdf_printf("/a%i %i 0 R\n", (int) i, (int) t3_char_procs[i]);
+ if (glyph_names && glyph_names[i] && glyph_names[i] != notdef)
+ pdf_printf("/%s %i 0 R\n", glyph_names[i],
+ (int) t3_char_procs[i]);
+ else
+ pdf_printf("/a%i %i 0 R\n", (int) i,
+ (int) t3_char_procs[i]);
pdfenddict();
t3_close();
tex_printf(">");