Re: pdftex - Encoding for metafont PK fonts

Pali Rohár <[email protected]>
Newsgroups gmane.comp.tex.pdftex
Message-ID <201606262256.40162@pali>
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.

-- 
Pali Rohár
[email protected]
pdftex-pkfonts-encfile-tounicode.patch (text/x-patch, 5.1 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 22:43:18.996787419 +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])
+            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[first_char])
+                pdf_printf("/%s", glyph_names[first_char]);
+            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[first_char])
+                pdf_printf("/%s %i 0 R\n", glyph_names[first_char], (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)

iEYEABECAAYFAldwQYgACgkQi/DJPQPkQ1IgSQCghcgEF8j59Q/fuVm5AZCcVp3E
+rUAoMY5AKGYRRnkynLnaeXCCxA1PN0V
=ENd5
-----END PGP SIGNATURE-----
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.