Index: tfmofm.c
===================================================================
--- tfmofm.c	(revision 1278)
+++ tfmofm.c	(working copy)
@@ -542,7 +542,8 @@
     integer i;                  /* counter */
     integer font_level, header_length;
     integer nco, ncw, npc, nlw, neew;
-    tfmcharacterinfo ci;
+    integer nki, nwi, nkf, nwf, nkm, nwm, nkr, nwr, nkg, nwg, nkp, nwp;
+    tfmcharacterinfo ci, *cis;
     charinfo *co;
     four_quarters qw;
     four_quarters *lig_kerns, *extens;
@@ -595,6 +596,7 @@
     nco = 0;
     ncw = 0;
     npc = 0;
+    nki = nwi = nkf = nwf = nkm = nwm = nkr = nwr = nkg = nwg = nkp = nwp = 0;
     read_sixteen(first_two);
     if (first_two != 0) {
         font_level = -1;
@@ -634,7 +636,7 @@
     } else {
         fget;
         read_sixteen(font_level);
-        if (font_level != 0)
+        if (font_level < 0 || font_level > 1)
             tfm_abort;
         read_thirtytwo(lf);
         read_thirtytwo(lh);
@@ -657,11 +659,31 @@
         read_thirtytwo(font_dir);       /* junk */
         nlw = 2 * nl;
         neew = 2 * ne;
-        header_length = 14;
-        ncw = 2 * (ec - bc + 1);
-    };
+        if (font_level == 0) {
+            header_length = 14;
+            ncw = 2 * (ec - bc + 1);
+        } else {
+            header_length = 29;
+            read_thirtytwo(nco);
+            read_thirtytwo(ncw);
+            read_thirtytwo(npc);
+            read_thirtytwo(nki);
+            read_thirtytwo(nwi);
+            read_thirtytwo(nkf);
+            read_thirtytwo(nwf);
+            read_thirtytwo(nkm);
+            read_thirtytwo(nwm);
+            read_thirtytwo(nkr);
+            read_thirtytwo(nwr);
+            read_thirtytwo(nkg);
+            read_thirtytwo(nwg);
+            read_thirtytwo(nkp);
+            read_thirtytwo(nwp);
+        }
+    }
     if (lf !=
-        (header_length + lh + ncw + nw + nh + nd + ni + nlw + nk + neew + np))
+        (header_length + lh + ncw + nw + nh + nd + ni + nlw + nk + neew + np
+            + nki + nwi + nkf + nwf + nkm + nwm + nkr + nwr + nkg + nwg + nkp + nwp))
         tfm_abort;
 
     /* @<Use size fields to allocate font information@>; */
@@ -714,7 +736,36 @@
         set_font_params(f, np);
 
     saved_tfm_byte = tfm_byte;
-    tfm_byte = (header_length + slh + ncw) * 4 - 1;
+    if (font_level != 1)
+        tfm_byte = (header_length + slh + ncw) * 4 - 1;
+    else {
+        halfword num_char_infos = ncw / (3 + (npc / 2));
+        halfword num_chars = ec - bc + 1;
+        if (num_chars != 0) {
+            halfword char_infos_read = 0;
+            cis = xcalloc(num_chars, sizeof(tfmcharacterinfo));
+            for (i = 0; i < num_chars && char_infos_read < num_char_infos; i++) {
+                integer repeats, j;
+                memset(&cis[i], 0, sizeof(tfmcharacterinfo));
+                fget; read_sixteen_unsigned(a); cis[i]._width_index = a;
+                fget; read_sixteen_unsigned(b); cis[i]._height_index = b>>8;
+                                                cis[i]._depth_index = b%256;
+                fget; read_sixteen_unsigned(c); cis[i]._italic_index = c>>8;
+                                                cis[i]._tag = c%4;
+                fget; read_sixteen_unsigned(d); cis[i]._remainder = d;
+                fget; read_sixteen_unsigned(repeats);
+                tfm_byte += (npc * 2); /* skip char_params */
+                if ((npc / 2) * 2 == npc) /* remove word padding */
+                    tfm_byte += 2;
+                char_infos_read++;
+                if (i + repeats > num_chars)
+                    tfm_abort;
+                for (j = 0; j < repeats; j++)
+                    memcpy(&cis[i+j+1], &cis[i], sizeof(tfmcharacterinfo));
+                i += repeats;
+            }
+        }
+    }
 
     /* @<Replace |z| by $|z|^\prime$ and compute $\alpha,\beta$@>; */
 
@@ -904,7 +955,10 @@
 
     /* @<Read character data@>; */
     for (k = bc; k <= ec; k++) {
-        store_char_info(k);
+        if (font_level != 1) {
+            store_char_info(k);
+        } else
+            memcpy(&ci, &cis[k-bc], sizeof(tfmcharacterinfo));
         if (ci._width_index == 0)
             continue;
         if (ci._width_index >= nw || ci._height_index >= nh ||
@@ -955,6 +1009,8 @@
         set_charinfo_depth(co, depths[ci._depth_index]);
         set_charinfo_italic(co, italics[ci._italic_index]);
     };
+    if (font_level == 1)
+        xfree(cis);
 
     /* first pass: count ligs and kerns */
 
