From de882e95ec1fea84935459b68bbee1a79fe8dd84 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Thu, 16 Mar 2017 23:03:12 +0000 Subject: .enc files for bitmap fonts, pdftex r772 git-svn-id: svn://tug.org/texlive/trunk@43519 c570f23f-e606-0410-a88d-b1316a301751 --- Build/source/texk/web2c/pdftexdir/ChangeLog | 13 ++++++ Build/source/texk/web2c/pdftexdir/NEWS | 1 + Build/source/texk/web2c/pdftexdir/mapfile.c | 6 +-- Build/source/texk/web2c/pdftexdir/ptexlib.h | 2 +- Build/source/texk/web2c/pdftexdir/writefont.c | 2 +- Build/source/texk/web2c/pdftexdir/writet3.c | 59 +++++++++++++++++++++++++-- 6 files changed, 74 insertions(+), 9 deletions(-) diff --git a/Build/source/texk/web2c/pdftexdir/ChangeLog b/Build/source/texk/web2c/pdftexdir/ChangeLog index 940e1871e1c..116541e80d7 100644 --- a/Build/source/texk/web2c/pdftexdir/ChangeLog +++ b/Build/source/texk/web2c/pdftexdir/ChangeLog @@ -1,3 +1,16 @@ +2017-03-16 Pali Roh\'ar + + Allow .enc files for bitmap fonts, following thread at + http://tug.org/pipermail/pdftex/2016-July/009064.html + http://tug.org/pipermail/pdftex/2016-August/009065.html: + * writet3.c (remove_duplicate_glyph_names): new fn. + (writet3): change fn to take fm_entry object, and use it to write + glyph names from an enc file, if specified in the map file. + (write_fontdictionary): + * ptexlib.h (writet3): change declaration. + * writefont.c (dopdffont): change call to writet3. + * mapfile.c (check_fm_entry): also report missing enc file. + 2017-02-18 Heiko Oberdiek * pdftex.web (substr_of_str): move earlier. diff --git a/Build/source/texk/web2c/pdftexdir/NEWS b/Build/source/texk/web2c/pdftexdir/NEWS index 3a66ff8dd50..b7c30ab861f 100644 --- a/Build/source/texk/web2c/pdftexdir/NEWS +++ b/Build/source/texk/web2c/pdftexdir/NEWS @@ -1,5 +1,6 @@ pdfTeX 3.14159265-2.6-1.40.18 (TeX Live 2017) - changes: + - encoding files can be specified for PK bitmap fonts on font map lines. - rename envvar SOURCE_DATE_EPOCH_TEX_PRIMITIVES to FORCE_SOURCE_DATE; no changes in functionality. - if the \pdfpageattr token list contains the string "/MediaBox", diff --git a/Build/source/texk/web2c/pdftexdir/mapfile.c b/Build/source/texk/web2c/pdftexdir/mapfile.c index c0e91bf839b..457fedb4df7 100644 --- a/Build/source/texk/web2c/pdftexdir/mapfile.c +++ b/Build/source/texk/web2c/pdftexdir/mapfile.c @@ -288,11 +288,11 @@ static int check_fm_entry(fm_entry * fm, boolean warn) /* do not set variable |a| as this entry will be still accepted */ } - /* if both ps_name and font file are missing, drop this entry */ - if (fm->ps_name == NULL && !is_fontfile(fm)) { + /* if ps_name, font file and enc file are missing, drop this entry */ + if (fm->ps_name == NULL && !is_fontfile(fm) && !is_reencoded(fm)) { if (warn) pdftex_warn - ("invalid entry for `%s': both ps_name and font file missing", + ("invalid entry for `%s': ps_name, font file, enc file all missing", fm->tfm_name); a += 1; } diff --git a/Build/source/texk/web2c/pdftexdir/ptexlib.h b/Build/source/texk/web2c/pdftexdir/ptexlib.h index 70ab7d9911e..5db7f5a74b8 100644 --- a/Build/source/texk/web2c/pdftexdir/ptexlib.h +++ b/Build/source/texk/web2c/pdftexdir/ptexlib.h @@ -307,7 +307,7 @@ extern void writet1(fd_entry *); extern void t1_free(void); /* writet3.c */ -extern void writet3(int, internalfontnumber); +extern void writet3(fm_entry *, int, internalfontnumber); extern scaled getpkcharwidth(internalfontnumber, scaled); /* writettf.c */ diff --git a/Build/source/texk/web2c/pdftexdir/writefont.c b/Build/source/texk/web2c/pdftexdir/writefont.c index 974b630c5b9..13d40decb97 100644 --- a/Build/source/texk/web2c/pdftexdir/writefont.c +++ b/Build/source/texk/web2c/pdftexdir/writefont.c @@ -667,7 +667,7 @@ void dopdffont(integer font_objnum, internalfontnumber f) fm_entry *fm; fm = hasfmentry(f) ? (fm_entry *) pdffontmap[f] : NULL; if (fm == NULL || (fm->ps_name == NULL && fm->ff_name == NULL)) - writet3(font_objnum, f); + writet3(fm, font_objnum, f); else create_fontdictionary(fm, font_objnum, f); } diff --git a/Build/source/texk/web2c/pdftexdir/writet3.c b/Build/source/texk/web2c/pdftexdir/writet3.c index 6b0a5d3c4eb..a7f7a18c3d7 100644 --- a/Build/source/texk/web2c/pdftexdir/writet3.c +++ b/Build/source/texk/web2c/pdftexdir/writet3.c @@ -254,7 +254,31 @@ static boolean writepk(internalfontnumber f) return true; } -void writet3(int objnum, internalfontnumber f) +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 `%s' at position %d", + encname, g[i], 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 +286,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 ? 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 +329,11 @@ void writet3(int objnum, internalfontnumber f) if (pdfcharmarked(f, i)) break; last_char = i; + /* write ToUnicode entry if needed */ + 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); @@ -344,7 +380,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,15 +399,25 @@ 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"); + if (tounicode_objnum != 0) + pdf_printf("/ToUnicode %i 0 R\n", (int) tounicode_objnum); pdfenddict(); 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(">"); -- cgit v1.2.3