%%% @mffile{
%%%     filename="7seg.mf",
%%%     version="",
%%%     date="",
%%%     filetype="mf fontcreator",
%%%     package="m-capbas.arj"
%%%     author="Phons Bloemen (PhB)",
%%%     address="Eindhoven U. of Technology"
%%%     email="Internet: phons@ei.ele.tue.nl",
%%%     codetable="ISO/ASCII",
%%%     checksumtype="none",
%%%     checksum="0",
%%%     keywords="",
%%%     abstract="
%%%        Input file defining the glyphs for 7 segmet display font.
%%%        The font is drawn onto a fixed 'grid' of points. By
%%%        deformation of this 'square' grid special effects can
%%%        be achieved.
%%%        Part of Capital Baseball package"
%%%     copyright="Copyleft (L) Phons Bloemen (PhB),
%%%        according to GNU public licence version 2 or later.
%%%        (1) Do not change this file (even its name)
%%%        (2) if you do make changes, first rename it to some
%%%            other name, and mark your changes clearly.",
%%%     }
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%if unknown cmbase: input cmbase fi
%def generate suffix t= enddef;
%input cmtt10; font_setup;
%% get some definitions from cmtt10 for proper setup
%% do not ask why this sequence is used, it works!
mode_setup;
if unknown gensize: gensize := 10; fi;
em# := gensize * 0.5pt#;
slant := 0.1;
tpp := 0.05;
tcr := 0.22;
font_coding_scheme:="TeX text";
font_identifier:="D7SEG";
font_size gensize * 1pt#;
body_height#:=1.6em#;  % height of tallest characters
asc_height#:=1.6em#;    % height of lowercase ascenders
cap_height#:=1.6em#;    % height of caps
fig_height#:=1.6em#;    % height of numerals
x_height#:=1.6em#;    % height of lowercase without ascenders
math_axis#:=1.6em#;    % axis of symmetry for math symbols
bar_height#:=1.6em#;    % height of crossbar in lowercase e
comma_depth#:=0.1em#;    % depth of comma below baseline
desc_depth#:=0em#;    % depth of lowercase descenders
%% monospace := false;
%% font_setup;
font_normal_space 1.5 * em#;
font_quad 6em#;
font_extra_space 1.5 * em#;

%%% definitions for the corners of the 7-segment display

def cornern (suffix $) =
  z$n = z$ + (0,tf)        + (0,-tcr *tf)  ;
  z$nl = z$ + (-1*tf,2*tf) + (-tcr * tf, 0);
  z$nr = z$ + (1*tf,2*tf)  + (tcr *tf, 0)  ;
  labels($n);
enddef;
def cornere (suffix $) =
  z$e = z$ + (1*tf,0)      + (-tcr *tf,0)  ;
  z$el = z$ + (2*tf,1*tf)  + (0,tcr * tf);
  z$er = z$ + (2*tf,-1*tf) + (0,-tcr *tf)  ;
  labels($e);
enddef;
def corners (suffix $) =
  z$s = z$ + (0,-1*tf)     + (0,tcr *tf)  ;
  z$sl = z$ + (1*tf,-2*tf) + (tcr * tf, 0);
  z$sr = z$ + (-1*tf,-2*tf)+ (-tcr *tf, 0)  ;
  labels($s);
enddef;
def cornerw (suffix $) =
  z$w = z$ + (-1*tf,0)     + (tcr *tf,0)  ;
  z$wl = z$ + (-2*tf,-1*tf)+ (0,-tcr * tf);
  z$wr = z$ + (-2*tf,1*tf) + (0,tcr *tf)  ;
  labels($w);
enddef;

def seg(expr a) =
if a = 1 :
  cornere(1); cornerw(2);
  fill(z1e -- z1el -- z2wr -- z2w -- z2wl -- z1er -- cycle);
elseif a = 2 :
  cornern(1); corners(3);
  fill(z1n -- z1nl -- z3sr -- z3s -- z3sl -- z1nr -- cycle);
elseif a = 3 :
  cornern(3); corners(5);
  fill(z3n -- z3nl -- z5sr -- z5s -- z5sl -- z3nr -- cycle);
elseif a = 4 :
  cornere(5); cornerw(6);
  fill(z5e -- z5el -- z6wr -- z6w -- z6wl -- z5er -- cycle);
elseif a = 5 :
  cornern(4); corners(6);
  fill(z4n -- z4nl -- z6sr -- z6s -- z6sl -- z4nr -- cycle);
elseif a = 6 :
  cornern(2); corners(4);
  fill(z2n -- z2nl -- z4sr -- z4s -- z4sl -- z2nr -- cycle);
elseif a = 7 :
  cornere(3); cornerw(4);
  fill(z3e -- z3el -- z4wr -- z4w -- z4wl -- z3er -- cycle);
elseif a = 8 :
  pickup pencircle scaled (3*tf);
  z2p = z2 + (2 *tf,0);
  drawdot(z2p);
elseif a = 9 :
  pickup pencircle scaled (3*tf);
  z2p = z2 + (3 *tf, 0);
  z2p1 = z2 + (1 *tf, 0);
  z2p2 = z2 + (3 *tf, -2 * tf);
  z2p3 = z2 + (0, -5 * tf);
  fill(z2p1 -- z2p2 -- z2p3 -- cycle);
  drawdot(z2p);
fi;
enddef;

def segchar(expr c)(text t) =
beginchar((char c), (1+2*slant)*em#, 1.6 * em#,0)
  clearit;
  tf := tpp * w;
  z1 = (tf,tf);
  z6 = (w-2*slant*w-tf-tf,h-tf);
  z5 = (slant*w+tf,h-tf);
  z2-z1 = z6-z5;
  z3 = 0.5[z1,z5];
  z4 = 0.5[z2,z6];
  for a = t:
    seg(a);
  endfor;
endchar;
enddef;

def segpoint(expr c)(text t) =
beginchar((char c), 3 * tpp * em#, 2 * tpp * em#, 2 * tpp * em#)
  clearit;
  tf := 0.3 * w;
  z2 = (-2*w,0);
  for a = t:
    seg(a);
  endfor;
endchar;
enddef;

%%% The space character is special

beginchar(32,1*em#,2*em#,0);
endchar;

%%% The 'flychar' characters follow (upper and lower case!)

segchar(33)(5,8);
segchar(34)(3,5);
segchar(35)(1,4,7);
segchar(36)(1,3,7,4,6);
segchar(37)(1,3,4,6);
segchar(38)(1,3,4);
segchar(39)(5);
segchar(40)(3,4,1);
segchar(41)(4,5,1);
segchar(42)(1,3,7,5);
segchar(43)(2,7,3);
segpoint(44)(9);
segchar(45)(7);
segpoint(46)(8);
segchar(47)(2,7,5);
segchar(48)(1,2,3,4,5,6);
segchar(49)(5,6);
segchar(50)(4,5,7,2,1);
segchar(51)(4,5,7,6,1);
segchar(52)(3,7,5,6);
segchar(53)(4,3,7,6,1);
segchar(54)(4,3,7,6,1,2);
segchar(55)(4,5,6);
segchar(56)(1,2,3,4,5,6,7);
segchar(57)(1,6,5,4,3,7);
segchar(58)(1,8);
segchar(59)(1,9);
segchar(60)(4,3,7);
segchar(61)(4,7);
segchar(62)(4,5,7);
segchar(63)(4,5,8);
segchar(64)(3,4,5,7,1,2);
segchar(65)(2,3,4,5,6,7);
segchar(66)(3,2,1,6,7);
segchar(67)(1,2,7);
segchar(68)(1,2,5,6,7);
segchar(69)(1,2,3,4,7);
segchar(70)(2,3,4,7);
segchar(71)(1,2,3,4,6);
segchar(72)(2,3,5,6,7);
segchar(73)(2,3);
segchar(74)(1,5,6);
segchar(75)(1,2,3,5,7);
segchar(76)(1,2,3);
segchar(77)(2,3,4,6,7);
segchar(78)(2,3,4,5,6);
segchar(79)(1,2,7,6);
segchar(80)(2,3,4,5,7);
segchar(81)(3,4,5,6,7);
segchar(82)(2,7);
segchar(83)(4,3,7,6,1);
segchar(84)(1,2,3,7);
segchar(85)(1,2,3,5,6);
segchar(86)(2,3,7,5);
segchar(87)(1,2,3,5,6,7);
segchar(88)(4,2,7,6);
segchar(89)(3,5,6,1);
segchar(90)(4,5,7,2,1);
segchar(91)(4,3,2,1);
segchar(92)(3,7,6);
segchar(93)(4,5,6,1);
segchar(94)(3,4,5);
segchar(95)(1,8);
segchar(96)(3);
segchar(97)(2,3,4,5,6,7);
segchar(98)(3,2,1,6,7);
segchar(99)(1,2,7);
segchar(100)(1,2,5,6,7);
segchar(101)(1,2,3,4,7);
segchar(102)(2,3,4,7);
segchar(103)(1,2,3,4,6);
segchar(104)(2,3,5,6,7);
segchar(105)(2,3);
segchar(106)(1,5,6);
segchar(107)(1,2,3,5,7);
segchar(108)(1,2,3);
segchar(109)(2,3,4,6,7);
segchar(110)(2,3,4,5,6);
segchar(111)(1,2,7,6);
segchar(112)(2,3,4,5,7);
segchar(113)(3,4,5,6,7);
segchar(114)(2,7);
segchar(115)(4,3,7,6,1);
segchar(116)(1,2,3,7);
segchar(117)(1,2,3,5,6);
segchar(118)(2,3,7,5);
segchar(119)(1,2,3,5,6,7);
segchar(120)(4,2,7,6);
segchar(121)(3,5,6,1);
segchar(122)(4,5,7,2,1);
segchar(123)(4,3,2,1);
segchar(124)(3,2);
segchar(125)(4,5,6,1);
segchar(126)(3,5);
bye.