Re: pdftex - Encoding for metafont PK fonts
Pali Rohár <[email protected]>
| Newsgroups | gmane.comp.tex.pdftex |
|---|---|
| Message-ID | <201606262311.57553@pali> |
On Sunday 26 June 2016 22:56:40 Pali Rohár wrote: > On Sunday 26 June 2016 13:35:22 Pali Rohár wrote: > > On Sunday 26 June 2016 07:54:19 Reinhard Kotucha wrote: > > > On 2016-06-25 at 22:56:48 +0000, Ross Moore wrote: > > > > But it is pity that it is not possible to specify that enc > > > > file also for PK fonts generated by MetaFont. Or it is > > > > somehow possible? > > > > > > > > I see no reason why not, but could easily be wrong. > > > > But I must admit that I’ve not tried it with a PK font. > > > > > > Dear Ross, > > > I assume that the main problem is that Metafont is using > > > numerical glyph indices but in order to re-encode a font, it's > > > required that each glyph has a name. > > > > Yes! And that glyph name for each numberical value (index) is > > available in encode file (csr.enc). This is reason why I'm tryint > > to tell pdftex: > > > > "hey pdftex, please use csr.enc for my csb12 PK font, it contains > > mapping index --> glyph name which you need to building cmap file" > > Ok, it is really not possible with pdftex. I looked into pdftex > source code and code for writing PK & Type 3 fonts in PDFtex does > not use encoding vectors... > > Also code for loading mapfile cannot be used for PK fonts (checker > refuse it). > > I looked deeply how pdftex working with Type 3 and PK fonts and > created small patch which adds support for generating /ToUnicode > object (from \pdfglyphtounicode table) and which allows to load enc > file also PK fonts. > > Patch was created against pdftex in TeXLive 2012 (which is on my > system), but is really small and should be very easy to rewrite/apply > it on new versions. > > Patch pdftex-pkfonts-encfile-tounicode.patch is attached. > > Let me know what do you think about it and if it can be added to > pdftex project. Ops, in patch from previous email is small problem with indexes and notdef. Fixed in new attached pdftex-pkfonts-encfile-tounicode-v2.patch -- Pali Rohár [email protected]
pdftex-pkfonts-encfile-tounicode-v2.patch
(text/x-patch, 5.2 KB)
Index: texlive-bin-2012.20120628/texk/web2c/pdftexdir/mapfile.c
===================================================================
--- texlive-bin-2012.20120628.orig/texk/web2c/pdftexdir/mapfile.c 2012-04-12 18:48:24.000000000 +0200
+++ texlive-bin-2012.20120628/texk/web2c/pdftexdir/mapfile.c 2016-06-26 22:39:36.102270848 +0200
@@ -288,11 +288,11 @@
/* 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 and enc file missing",
fm->tfm_name);
a += 1;
}
Index: texlive-bin-2012.20120628/texk/web2c/pdftexdir/writefont.c
===================================================================
--- texlive-bin-2012.20120628.orig/texk/web2c/pdftexdir/writefont.c 2011-04-29 02:06:36.000000000 +0200
+++ texlive-bin-2012.20120628/texk/web2c/pdftexdir/writefont.c 2016-06-26 22:38:17.129390428 +0200
@@ -664,7 +664,7 @@
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);
}
Index: texlive-bin-2012.20120628/texk/web2c/pdftexdir/ptexlib.h
===================================================================
--- texlive-bin-2012.20120628.orig/texk/web2c/pdftexdir/ptexlib.h 2012-05-20 01:57:09.000000000 +0200
+++ texlive-bin-2012.20120628/texk/web2c/pdftexdir/ptexlib.h 2016-06-26 22:32:28.261532200 +0200
@@ -315,7 +315,7 @@
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 */
Index: texlive-bin-2012.20120628/texk/web2c/pdftexdir/writet3.c
===================================================================
--- texlive-bin-2012.20120628.orig/texk/web2c/pdftexdir/writet3.c 2011-04-29 02:06:36.000000000 +0200
+++ texlive-bin-2012.20120628/texk/web2c/pdftexdir/writet3.c 2016-06-26 23:07:29.133488525 +0200
@@ -254,7 +254,7 @@
return true;
}
-void writet3(int objnum, internalfontnumber f)
+void writet3(fm_entry * fm, int objnum, internalfontnumber f)
{
static char t3_font_scale_str[] = "\\pdffontscale";
int i;
@@ -262,12 +262,17 @@
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;
packfilename(fontname[f], getnullstr(), maketexstring(".pgc"));
cur_file_name = makecstring(makenamestring());
is_pk_font = false;
@@ -298,6 +303,11 @@
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 +354,10 @@
pdf_printf("/%s", notdef);
is_notdef = true;
} else {
- pdf_printf("/a%i", first_char);
+ if (glyph_names && glyph_names[first_char] && strcmp(glyph_names[first_char], ".notdef") != 0)
+ 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 +371,23 @@
pdf_printf(" %i", i);
is_notdef = false;
}
- pdf_printf("/a%i", i);
+ if (glyph_names && glyph_names[i] && strcmp(glyph_names[i], ".notdef") != 0)
+ 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] && strcmp(glyph_names[i], ".notdef") != 0)
+ 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(">");
signature.asc
(application/pgp-signature, 198 B)
-----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) iEYEABECAAYFAldwRR0ACgkQi/DJPQPkQ1IbrwCfRufqxiKQVpnPBCrrxT8eNuVO 9CwAnRIehyrcev2W8sql3UMfSPG98n/u =UWZV -----END PGP SIGNATURE-----