% this default is for Debian with ‘hershey-fonts-data’ installed.
newinternal string hersheyFonts;
hersheyFonts := "/usr/share/hershey-fonts/";
vardef loadHershey @# =
if known hershey.loaded.@# :
message("Hershey font "&str(@#)&" already known: skipping rereading.");
else:
hershey.loaded.font := 1;
doLoadHershey.@# ;
fi
enddef;
vardef doLoadHershey suffix font =
% create the variable hershey.<fontname>
save var; string var; var := "hershey." & str font & ".";
scantokens ("path "&var)[][];
% variables used for reading the file
save file, line;
string file, line;
file := hersheyFonts & str font & ".jhf";
save pnum, lnum, wd, i, x, y, first;
boolean first; lnum := 0;
% read the font line by line
forever :
line := readfrom file;
exitif line = EOF;
lnum := lnum + 1; pnum := 1; first := true;
% the line starts with a width, followed by min/max x coordinates,
% followed by the data describing the glyph, in pairs of coordinates,
% every coördinate encoded as a single character.
wd := scantokens (substring(5,8) of line) - 1;
if wd > 0 :
line := substring (8, infinity) of line;
x := ASCII(line) - 82; line := substring(1, infinity) of line;
y := ASCII(line) - 82; line := substring(1, infinity) of line;
scantokens(var)[lnum].lft := x;
scantokens(var)[lnum].rt := y;
%message char(lnum+31) & " (" & decimal(lnum) & "): (" & decimal x & ", " & decimal y & ")";
scantokens(var)[lnum][pnum] := fi
for i = 1 upto wd :
hide( % 82 is ASCII("R")
x := ASCII(line) - 82; line := substring(1, infinity) of line;
y := 82 - ASCII(line); line := substring(1, infinity) of line;)
if (x,y) = (-50,0) :
% the special string " R" separates paths
; pnum := pnum+1; first := true;
scantokens(var)[lnum][pnum] :=
else :
if first : hide(first := false)
else : -- fi (x,y)
fi
endfor;
endfor
closefrom file;
enddef;
vardef drawHershey @# (expr s) text t =
if numeric s: drawHersheyChar @# (s) t;
else : drawHersheyString @# (s) t; fi
enddef;
vardef drawHersheyChar @# (expr c) text t =
save i; i := 1; forever :
exitif unknown hershey.@#[c][i];
draw hershey.@#[c][i] t;
i := i + 1;
endfor
enddef;
vardef drawHersheyString @# (expr s) text t =
save c, ss, sh; string ss; ss := s; sh := 0;
forever :
c := ASCII(ss) - 31;
sh := sh + hershey.@#[c].rt;
% NB. -9 is the baseline of the hershey fonts;
% we put the baseline on x=0 instead.
drawHersheyChar @# (c) shifted (sh, 9) t;
sh := sh - hershey.@#[c].lft;
ss := substring(1, infinity) of ss;
exitif length(ss) = 0;
endfor
enddef;