%mode=ascii;

designsize:=10;
mode_setup;
%openit;

font_family "ASCII SPECIAL";
coding_scheme "SPECIAL GRAPHIC FONT";

def clear =
  clearx;
  currentpicture:=nullpicture;
enddef;
def clearx =
  numeric x[],y[],x[]l,y[]l,x[]r,y[]r,dx[],dy[],pw;
enddef;

def drawpix expr p =
 addto pix doublepath p.t_ withpen currentpen enddef;
def curve(suffix $,$$,$$$) =
  fill z$l
   if known dz$: {dz$} fi
  .. z$$l{if known dz$$: dz$$ else: z$$$l-z$l fi}
  .. z$$$l
   if known dz$$$: {dz$$$} fi
  & z$$$l..z$$$r
  & z$$$r
   if known dz$$$: {-dz$$$} fi
  .. z$$r{if known dz$$: -dz$$ else: z$r-z$$$r fi}
  .. z$r
   if known dz$: {-dz$} fi
  & z$r..z$l & cycle;
enddef;

vardef setpos@#(expr a,b) =
  z@#=.5[z@#l,z@#r] enddef;

def setwidth (expr x) =
  chardx:=x;
  numeric w; w=chardx;
  if proofing>1:
  for n:=0 step 2bs until chardx-1:
  proofrule((n,-ydepth),(n,hheight)); endfor
  proofrule((chardx,-ydepth),(chardx,hheight));
  proofrule((0,-ydepth),(chardx,-ydepth));
  proofrule((0,0),(chardx,0));
  proofrule((0,xheight),(chardx,xheight));
  proofrule((0,capheight),(chardx,capheight));
  proofrule((0,hheight),(chardx,hheight));
  fi
enddef;

%def labelpos(text t) =
%  if proofing>1:
%  forsuffixes $$=l,,r: forsuffixes $=t:
%    makelabel(str $.$$, z$.$$); endfor endfor fi enddef;

def mask(expr mx,my) =
  cullit;
  pix:=nullpicture;
  unfill (0,0)..(round(mx+1)*pt,round(my+1)*pt)..cycle;
  for r=1 step 1 until mx*pt/2: addto pix also PIX shifted (2*r*sqsize,0);
    endfor
  cull pix including (1,9);
  for i:=0 step pxsize until my*pt:
    addto currentpicture also pix shifted(0,i);
  endfor
  picture pix;
enddef;

  show designsize; 
  numeric s,pw,char_w,hheight,ydepth,bss,bs,f,us,uus,usx,uusx,dd;
  180f = designsize; 
  hheight=140f ; ydepth=40f; 
  bss = 140f/17.3;
  bs = bss*pt;
  10us = designsize;
  uus = us*pt;
  10usx = .7227designsize;
  uusx = usx*pt;
  dd:=pixels_per_inch/120;
  s = .5uusx;

%
% special
%

lw:=3.6*designsize/10*.3pt;
vardef char.b(expr char_w, hheight) =
  pickup pencircle scaled(lw + blacker);
  y1=y2=-lw/2;
  x1=0bs; x2:=5bs*3.6;
  draw z1--z2;
  penlabels(1,2);
enddef;

vardef char.a(expr char_w, hheight) =
  pickup pencircle scaled(lw + blacker);
  y1=y2=y5=y6=-lw/2;
  y7:=-10bs*3.6;
  x1:=0bs; x2:=3bs*3.6; x3:=4bs*3.6; x6:=10bs*3.6;
  y3=y4;
  (y1+y7)*2/5=y3; 
  (x1+x6)/2=(x2+x5)/2=(x3+x4)/2=x7;
  draw z1--z2--z3..z7..z4--z5--z6;
  penlabels(1,2,3,4,5,6,7);
enddef;

def drawsq(expr dx, dy)=
  draw z1 shifted (dx, dy)--z2 shifted (dx, dy);
  draw z3 shifted (dx, dy)--z4 shifted (dx, dy); 
  draw z5 shifted (dx, dy)--z6 shifted (dx, dy);
  draw z7 shifted (dx, dy)--z8 shifted (dx, dy); 
enddef;
vardef char.A(expr char_w, hheight) =
  pickup pencircle scaled(.15uus + blacker);
  uux:=char_w/8; uuy:=hheight/8;
  x1:=.5uux; x2:=1.5uux; x8:=2.5uux; x7:=3.5uux;
  y1:=3.5uuy; y2:=2.5uuy; y4:=1.5uuy; y3:=.5uuy;
  x1=x3; x2=x4; x8=x6; x7=x5;
  y1=y7; y2=y8; y4=y6; y3=y5;
  drawsq(0, 0);
  drawsq(0,4uuy);
  drawsq(4uux,0);
  drawsq(4uux,4uuy);
enddef;

vardef char.B(expr char_w, hheight) =
  pickup pencircle scaled(.15uus + blacker);
  uux:=char_w/4; uuy:=hheight/4;
  x1:=.5uux; x2:=1.5uux; x8:=2.5uux; x7:=3.5uux;
  y1:=3.5uuy; y2:=2.5uuy; y4:=1.5uuy; y3:=.5uuy;
  x1=x3; x2=x4; x8=x6; x7=x5;
  y1=y7; y2=y8; y4=y6; y3=y5;
  drawsq(0, 0);
enddef;

vardef char.C(expr char_w, hheight) =
  numeric d,s;
  d:=3; s:=1; if pixels_per_inch>=300:d:=d*dd; s:=s*dd; fi;
  for y=0 step 2d until hheight-d: 
    for x=0 step 2d until char_w-d:
      fill (x,y)--(x,y+s)--(x+s,y+s)--(x+s,y)--cycle;   
      endfor;
  endfor;
  for y=d step 2d until hheight-d: 
    for x=d step 2d until char_w-d:
      fill (x,y)--(x,y+s)--(x+s,y+s)--(x+s,y)--cycle;   
      endfor;
  endfor;
enddef;

vardef char.D(expr char_w, hheight) =
  char.C(char_w, hheight);
enddef;

vardef char.E(expr char_w, hheight) =
  numeric d;
  d:=2; s:=1; if pixels_per_inch>300:d:=d*dd; s:=s*dd; fi;
  for y=0 step 2d until hheight-d: 
    for x=0 step 2d until char_w-d:
      fill (x,y)--(x,y+s)--(x+s,y+s)--(x+s,y)--cycle;   
      endfor;
  endfor;
  for y=d step 2d until hheight-d: 
    for x=d step 2d until char_w-d:
      fill (x,y)--(x,y+s)--(x+s,y+s)--(x+s,y)--cycle;   
      endfor;
  endfor;
enddef;

vardef char.F(expr char_w, hheight) =
  char.E(char_w, hheight);
enddef;

def drawweb(expr dx, dy) =
  draw z1 shifted (dx, dy)--z11 shifted (dx, dy);
  draw z2 shifted (dx, dy)--z12 shifted (dx, dy);
  draw z3 shifted (dx, dy)--z4 shifted (dx, dy);
  draw z7 shifted (dx, dy)--z8 shifted (dx, dy);
  draw z5 shifted (dx, dy)--z6 shifted (dx, dy);
  draw z9 shifted (dx, dy)--z10 shifted (dx, dy);
enddef;
def drawwebx(expr dx, dy) =
  draw z1 shifted (dx, dy)--z4 shifted (dx, dy);
  draw z2 shifted (dx, dy)--z5 shifted (dx, dy);
  draw z8 shifted (dx, dy)--z11 shifted (dx, dy);
  draw z9 shifted (dx, dy)--z12 shifted (dx, dy);
  draw z3 shifted (dx, dy)--z6 shifted (dx, dy);
  draw z7 shifted (dx, dy)--z10 shifted (dx, dy);
enddef;

vardef char.G(expr char_w, hheight) =
  pickup pencircle scaled(.15uus + blacker);
  uux:=char_w/16; uuy:=hheight/16;
  x1=x4=x8=x11=1uux;
  x2=x5=x9=x12=3uux;
  x3=x7=0uux; x6=x10=4uux;
  y1=y2=4uuy; y11=y12=0uuy;
  y3=y4=y5=y6=3uuy;
  y7=y8=y9=y10=1uuy;
  drawweb (0uux,12uuy); drawweb (8uux,12uuy);
  drawweb (0uux,4uuy); drawweb (8uux,4uuy);
  drawweb (4uux,8uuy); drawweb (12uux,8uuy);
  drawweb (4uux,0uuy); drawweb (12uux,0uuy);
  drawwebx(4uux,12uuy); drawwebx(12uux,12uuy);
  drawwebx(4uux,4uuy); drawwebx(12uux,4uuy);
  drawwebx(0uux,8uuy); drawwebx(8uux,8uuy);
  drawwebx(0uux,0uuy); drawwebx(8uux,0uuy);
enddef;
 
vardef char.H(expr char_w, hheight) =
  pickup pencircle scaled(.15uus + blacker);
  uux:=char_w/8; uuy:=hheight/8;
  x1=x4=x8=x11=1uux;
  x2=x5=x9=x12=3uux;
  x3=x7=0uux; x6=x10=4uux;
  y1=y2=4uuy; y11=y12=0uuy;
  y3=y4=y5=y6=3uuy;
  y7=y8=y9=y10=1uuy;
  drawweb(0uux,4uuy);
  drawweb(4uux,0uuy);
  drawwebx(4uux,4uuy);
  drawwebx(0uux,0uuy);
enddef;
 
def drawwebs(expr dx, dy) =
  draw z1 shifted (dx, dy)--z2 shifted (dx, dy);
  draw z3 shifted (dx, dy)--z4 shifted (dx, dy);
  draw z5 shifted (dx, dy)--z6 shifted (dx, dy);
  draw z7 shifted (dx, dy)--z8 shifted (dx, dy);
  draw z1 shifted (dx, dy)--z9 shifted (dx, dy);
  draw z7 shifted (dx, dy)--z12 shifted (dx, dy);
  draw z3 shifted (dx, dy)--z10 shifted (dx, dy);
  draw z5 shifted (dx, dy)--z11 shifted (dx, dy);
enddef;

vardef char.I(expr char_w, hheight) =
  pickup pencircle scaled(.15uus + blacker);
  uux:=char_w/8; uuy:=hheight/8;
  x2:=3uux; x4:=2uux; x6:=1uux; x8:=x4;
  y2:=2uuy; y4:=3uuy; y6:=y2; y8:=1uuy;
  y1:=4uuy; x3:=0uux; y5:=0uuy; x7:=4uux;
  (y2-y1)=-(x2-x1); (y5-y6)=-(x5-x6);
  (y7-y8)=(x7-x8); (y4-y3)=(x4-x3);
  x9=x3; y10=y5; x11=x7; y12=y1;
  (y7-y12)=-(x7-x12); (y10-y3)=-(x10-x3);
  (y1-y9)=(x1-x9); (y11-y5)=(x11-x5);
  drawwebs(0uux, 0uuy);
  drawwebs(4uux,0uuy);
  drawwebs(0uux,4uuy);
  drawwebs(4uux,4uuy);
  labels(1,2,3,4,5,6,7,8,9,10,11,12);
enddef;
  
vardef char.J(expr char_w, hheight) =
  pickup pencircle scaled(.15uus + blacker);
  uux:=char_w/4; uuy:=hheight/4;
  x2:=3uux; x4:=2uux; x6:=1uux; x8:=x4;
  y2:=2uuy; y4:=3uuy; y6:=y2; y8:=1uuy;
  y1:=4uuy; x3:=0uux; y5:=0uuy; x7:=4uux;
  (y2-y1)=-(x2-x1); (y5-y6)=-(x5-x6);
  (y7-y8)=(x7-x8); (y4-y3)=(x4-x3);
  x9=x3; y10=y5; x11=x7; y12=y1;
  (y7-y12)=-(x7-x12); (y10-y3)=-(x10-x3);
  (y1-y9)=(x1-x9); (y11-y5)=(x11-x5);
  drawwebs(0uux, 0uuy);
enddef;
  
vardef char.K(expr char_w, hheight) =
  pickup pencircle scaled(.15uus + blacker);
  uux:=char_w/8; uuy:=hheight/8;
  x1=x4=x8=x11=1uux;
  x2=x5=x9=x12=3uux;
  x3=x7=0uux; x6=x10=4uux;
  y1=y2=4uuy; y11=y12=0uuy;
  y3=y4=y5=y6=3uuy;
  y7=y8=y9=y10=1uuy;
  drawweb(0uux,4uuy);
  drawweb(4uux,0uuy);
  drawwebx(4uux,4uuy);
  drawwebx(0uux,0uuy);
enddef;

vardef char.rtriangle(expr char_w, hheight) =
  x1 = x2 = char_w - x3 = s;
  y3 = .5hheight;
  z1 - z2 = (z3 - z2) rotated 60;
  fill z1--z2--z3--cycle;
  labels(1,2,3);
enddef;

vardef char.ltriangle(expr char_w, hheight) =
  char_w - x1 = char_w - x2 = x3 = s;
  y3 = .5hheight;
  z1 - z2 = (z3 - z2) rotated -60;
  fill z1--z2--z3--cycle;
  labels(1,2,3);
enddef;
 
vardef char.ttriangle(expr char_w, hheight) =
  y1 = y2 = hheight - y3 = s;
  x3 = .5char_w;
  z1 - z2 = (z3 - z2) rotated 60;
  fill z1--z2--z3--cycle;
  labels(1,2,3);
enddef;
 
vardef char.btriangle(expr char_w, hheight) =
  hheight - y1 = hheight - y2 = y3 = s;
  x3 = .5char_w;
  z1 - z2 = (z3 - z2) rotated -60;
  fill z1--z2--z3--cycle;
  labels(1,2,3);
enddef;
 
vardef char.cr(expr char_w, hheight) =
  x1 = s; x2 = x3 = .4char_w;
  y2 = -.2(y3-y2);
  z1 - z2 = (z1 - z3) rotated -90;
  fill z1--z2--z3--cycle;
  pw := .4(y3-y2);
  y4 = hheight - s; x4 = x5 = char_w - .5pw - s;
  y5 = y6 = y1; x6 = x3;
  z7 = (x4, y5+.7pw); z8 = (x5-.7pw, y6);
  penpos4(pw, 0); penpos6(pw, -90);
  penpos7(pw, 0); penpos8(pw, -90);
  %penstroke z4--z7..z8--z6;
  fill z4l--z7l{z5-z7}..{z8-z5}z8l--z6l--z6r--z8r{z5-z8}..{z7-z5}z7r--z4r--cycle;
  labels(1,2,3,4,5,6,7,8,4l,4r,7l,7r,8l,8r,6l,6r);
enddef;
 
vardef char.CR(expr char_w, hheight) =
  char.cr(char_w, hheight);
enddef;

vardef make@#(expr char_w,hheight,ydepth)=
 begingroup beginchar(str@#,char_w,hheight,ydepth);
 "the character "&str @#; char@#(char_w*pt,hheight*pt);
% if (fontsize#*mag>30) and (proofing=0): mask(char_w,hheight); fi
 endchar;
endgroup enddef;

vardef Make@#(expr code, char_w,hheight,ydepth)=
 begingroup beginchar(code,char_w,hheight,ydepth);
 "the character "&code ; char@#(char_w*pt,hheight*pt);
 endchar;
endgroup enddef;


smoothing:=10;
Make.rtriangle("0", 9usx, 10usx, 0us);
Make.ltriangle("1", 9usx, 10usx, 0us);
Make.ttriangle("2", 10usx, 9usx, 0us);
Make.btriangle("3", 10usx, 9usx, 0us);
Make.cr(" ", 12usx, 9usx, 2usx);
Make.CR("@", 24usx, 18usx, 4usx);
make.A(10usx,10usx,0us);
make.B(5usx,5usx,0us);
make.C(10usx,10usx,0us);
make.D(5usx,5usx,0us);
make.E(10usx,10usx,0us);
make.F(5usx,5usx,0us);
make.G(10us,10us,0us);
make.H(5us,5us,0us);
make.I(10us,10us,0us);
make.J(5us,5us,0us);
make.K(10us,10us,0us);
make.a(36bss,0bss,36bss);
make.b(18bss,0bss,36bss);

end;
