summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Build/source/texk/web2c/pdftexdir/ChangeLog13
-rw-r--r--Build/source/texk/web2c/pdftexdir/NEWS1
-rw-r--r--Build/source/texk/web2c/pdftexdir/mapfile.c6
-rw-r--r--Build/source/texk/web2c/pdftexdir/ptexlib.h2
-rw-r--r--Build/source/texk/web2c/pdftexdir/writefont.c2
-rw-r--r--Build/source/texk/web2c/pdftexdir/writet3.c59
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 <pali.rohar@gmail.com>
+
+ 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 <heiko.oberdiek@googlemail.com>
* 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(">");