% language=us runpath=texruns:manuals/ontarget \startcomponent ontarget-nostalgic \environment ontarget-style \startchapter[title={Getting nostalgic}] When Mikael and I were playing with \POTRACE\ we eventually ended up by turning some old rune font defined in \METAFONT\ into a quite useable outline font. In the process we went from a \TYPETHREE\ to a proper \OPENTYPE\ (\CFF) instance. When doing this I remembered that in the times of active \PDFTEX\ development, Thanh, Taco and I played with what we called \PDF\ glyph containers. I had done experiments with using xforms (small images) as replacement for bitmap characters but that is not what we want with fonts, so after discussing it with Thanh \TYPETHREE\ support was extended with a user driven variant. Due to the way \METAFONT s are defined the results were mixed. Filled shapes could be made to work but outlines often looked bad and much had to do with the fact that these fonts were never defined with odd-even rules in mind. So, Taco made a bitmap to outline program that we could hook in and in the end we had a reasonable workflow. We're talking of the period 1997 to 1998, some 25 years ago! So, when in 2023 we came back to bitmap fonts in the perspective of \LUAMETATEX, some memories returned but I couldn't find the files or code at that time, which might relate to the fact that I always start from specifications. However, when in January 2024 I had to fix some issue with embedding an old \TYPEONE\ font and after succeeding in that I decided again to search for that old code. This time I just grep'd the \PDFTEX\ code base (as I had the \TEXLIVE\ git checkout) and I found back this feature. In the end I had been looking at the wrong \quote {strings} because it looked like the interface evolved a little. The basics are as follows. When we have a file (in \PDFTEX) the \TFM\ blob is what matters for the frontend. The backend that does the inclusion links that to a suitable font resource, most likely in \TYPEONE\ format. This is specified in a map file that also permits specifying an encoding vector. For some reason it is not possible to map to other font formats other than \TYPEONE\ and \TRUETYPE. No mapping means that a \PK\ file is used and then we end up in some complicated semi automatic bitmap generation. When I tested how these containers worked out nowadays, once \PDFTEX \footnote {Version 3.141592653-2.6-1.40.25 and older.} is happy to include a font it will bark about a missing font resource: it always wants a bitmap. Now, you can complain about this but I bet no one ever used this 25 year old feature so no one ever requested a check for a \type {pgc} file. Basically, when such a file is found instead of a \type{600pk} file, all should be fine, even if that is a zero length file. Given that the backend actually checks for it and not considers a container file useable, one can consider it an oversight, or maybe it just got lost in the \KPSE\ library that manages \PK\ fonts and its generation. Anyway, so how does it work? When the backend checks for a glyph container it expects this: \starttyping \pdffontscale factor \pdfglyph slot width height depth llx lly urx ury = % pdf operators \endglyph \stoptyping One can add a \type {\pdffont} and \type{\endfont} wrapper because \PDFTEX\ only searches for the mandate scale and one or more glyphs. A simple test then becomes: \startitemize[packed] \startitem Copy a \TFM\ file to a new name, say \type {cmr10mine.tfm}. \stopitem \startitem Create a bogus \PK\ file, for instance a zero byte \type {cmr10mine.600pk}. \stopitem \startitem Make sure it can be found, I had to set \type {set MISCFONTS=.}. \stopitem \startitem Create a glyph container with suffix \type {pgc} with some valid \PDF\ code. \stopitem \stopitemize And then use a safe character for testing present in most fonts at the same position in the used encoding: \starttyping \starttext \font\test=cmr10mine \test \char 65 % A \stoptext \stoptyping This should produce something, assuming an entry like: \starttyping \pdffontscale 0.01 \pdfglyph 65 200 0 0 0 0 200 200 = 10 M 1 j 1 J 5 w % outlines h S \endglyph \stoptyping Just for completeness, I could find a \PERL\ program on my disk that I wrote at that time and that has the banner: \starttyping mptopgc 1.01 - pdfTeX / HH 1998 \stoptyping It produces help like: \starttyping --silent use logfile instead of screen (no) --autorun run MetaPost first (no) --optimize convert gray into eofill (no) --ignore ignore gray path (no) --gray permit the gray operator (no) --merge substitute gray using glyphs (no) --magnification set MetaPost mag factor (1) --rounding alternative rounding offset (0) --pgcpath pgc path --tfmpath tfm file path --tfmtopl ftmtopl binary name (tfmtopl) --metapost metapost binary name (mpost) \stoptyping But it is a long time since I installed \PERL\ on my laptop so I didn't check it. I also found a manual that could be updated but I don't see much use for it now. There is even a \MKII\ \TEX\ file that one can run with \type {pdftex &plain \input supp-pgc.mkii \MPtoPGC} that produces container files but I didn't test that either. However, what I did test was if it still works. For that I used the following test file: \starttyping % engine=pdftex \startTEXpage[offset=10pt] \pdfmapline{texnansi-lmr10 < texnansi.enc} \font\test=texnansi-lmr10 \test \input tufte \stopTEXpage \stoptyping Here I use a normal \TFM\ file because after all we need the metrics. Then I made an empty \typ {texnansi-lmr10.600pk} so that we can fool the \PK\ generator. Using Latin Modern files is more convenient. The glyph container file was made by abusing some features of \LMTX: % \disabledirectives[fonts.streams.pack] \startitemize \startitem With the module \type {s-fonts-outlines} I made a font sample that as byproduct generates a file with outline definitions. Basically any attempt to use an outline in \METAFUN\ will populate the cache. We load the font \type {lmr10.afm} and it will get the outlines from \type {lmr10.pfb}. Of course there are more that 256 characters in there but that doesn't matter. \stopitem \startitem I also generated a \type {texnansi} vector file which can be done from a normal \TEX\ run using the \LUA\ call \typ {fonts.encodings.load ("texnansi.enc"))}. It locates and converts a regular \type{enc} into a \LUA\ representation. I picked up the file from the cache. \stopitem \startitem From these files I generated a glyph container file \typ {texnansi-lmr10.pgc} that can be used instead of the \PK\ file. The file \typ {mtx-pgc.lua} is shown below. \stopitem \startitem I made sure to set \type {MISCFONTS} to a sensible value because otherwise the container file is not found (who knows what location strategy is used). \stopitem \stopitemize This is the \quote {quick and dirty} conversion file: \starttyping local round = math.round local concat = table.concat local result = { "\\pdffontscale 0.001\n" } local r = 1 local f_pdfglyph = string.formatters["\\pdfglyph %i %i %i %i %i %i %i %i"] local s_endglyph = "\\endglyph\n" local f_comment = string.formatters["%% name %s index %i slot %i \n"] local shapes = table.load("lmr10-pfb.tma") local encoding = table.load("texnansi.tma") local glyphs = shapes.glyphs local hash = encoding.hash for index=0,#glyphs do local glyph = glyphs[index] local segments = glyph.segments or { } local bounds = glyph.boundingbox or { 0, 0, 0, 0 } local width = round(glyph.width or 0) local name = glyph.name local slotused = hash[name] if slotused then local llx, lly = bounds[1], bounds[2] local urx, ury = bounds[3], bounds[4] r = r + 1 ; result[r] = f_comment(name,index,slotused) r = r + 1 ; result[r] = f_pdfglyph(slotused,width,0,0,llx,lly,urx,ury) if #segments > 0 then r = r + 1 ; result[r] = "10 M 1 j 1 J 0 w" for i=1,#segments do local s = segments[i] if s[1] ~= "close" then r = r + 1 ; result[r] = concat(s," ") end end r = r + 1 ; result[r] = "h f*" end r = r + 1 ; result[r] = s_endglyph end end io.savedata("texnansi-lmr10.pgc",concat(result,"\n")) \stoptyping Of course for a proper workflow we need to make this into a real helper script but here I just want to show the idea. The result is shown in \in {figure} [fig:pgcresult]. There is however one drawback: because \PDFTEX\ goes via the \PK\ route using the same font with a different scale will result in an extra copy while actually we have a scalable \TYPETHREE\ font. It is for that reason that I will not waste any more time on this. I could provide a patch to deal with it but changing a long time ago frozen \TEX\ program is tricky because bug(let)s have become features. \startplacefigure[title={This is what we get with glyph containers.},reference=fig:pgcresult] \externalfigure [ontarget-nostalgic-pgc.pdf] [width=\textwidth, background=color, backgroundcolor=gray] \stopplacefigure So where does this bring us? Because \MKII\ is frozen and \PDFTEX\ only works with that version it makes no sense to add some kind of \TYPETHREE\ support. In \MKIV\ and \MKXL\ we have several mechanisms for creating these fonts anyway. I cannot comment on use outside \CONTEXT\ but because of the strong connection with \PK\ fonts being required in order for glyph containers to kick in at all, I suspect that it's a mostly unknown feature, but one that actually can be made to work. It could even work better (with respect to file lookup and font scaling) when it is decoupled from the \PK\ requirements and listen to na map file line that also signals if the font can be reused. But what worries me a bit more is that after 25 years I hardly recognize the (reasonable) \PERL\ code and little manual although it slowly came back. At that I time I could not have predicted where we are now with respect to \TYPETHREE\ support, which in \LMTX\ is very much kicking and alive. \footnote {At that time \TYPETHREE\ in the perspective of \TEX\ always had a bad ring, probably because the many files that were around with too low resolution bitmap fonts. The \PDF\ readers were not particularly good in rendering them either. But with outlines this format can be fun!} \stopchapter \stopcomponent