%-------------------------------------------------------------
% This is ETHIOPMAC.MF  as of Dec, 1995 by Jochen Metzinger
% originally distributed by Abass B. Alamnehe [February, 1993]
%-------------------------------------------------------------

%%% THUMB %%%

def t_thumb(suffix @)=
  pickup fine.nib; 
  x@a=x@s=x@-3.25u; x@b=x@a+.75u; x@c=x@a; x@d=x@a+2u; x@e=x@a+3.25u; 
  x@f=x@a+3.25u; x@g=x@a+1.75u; 
  y@a=y@-.1h+oo; y@b=y@; y@c=y@+.1h-oo; 
  y@d=y@c+oo; y@e=y@c-.025h; y@f=y@a+.05h; y@g=y@a-oo; 
  fill flex(z@a,z@b,z@c) & flex(z@c,z@d,z@e)...flex(z@f,z@g,z@a) 
     & cycle; 
  penlabels(@,@a,@b,@c,@d,@e,@f,@g); 
enddef; 

def left_up_thumb(suffix @)=
  pickup tiny.nib; 
  x@a=x@; y@a=y@; 
  x@b=x@-1.9u; x@c=x@-1.7u; x@d=x@-2.2u; x@e=x@-.5u; x@f=x@-.5u; 
  y@b=y@; y@c=y@+.07h; y@d=y@+.15h; y@e=y@+.14h; y@f=y@; 
  pickup fine.nib; 
  filldraw  flex(z@b,z@c,z@d) & flex(z@d,z@e,z@a) 
          & flex(z@a,z@f,z@b) & cycle; 
  pickup fine.nib; 
  labels(x@,@a,@b,@c,@d,@e,@f,@g,@i); 
enddef; 

%%% WING %%%

def upper_left_wing(suffix @)=
  pickup fine.nib; pos@g(vair,90); pos@i(vair,90); 
  x@g=x@; x@i=x@-1.5u; y@g=y@i=y@; 
  filldraw stroke z@g.e--z@i.e; 
  x@a=x@-1.52u; y@a=y@; 
  x@b=x@-3.9u; x@c=x@-3.7u; x@d=x@-4.2u; x@e=x@-2.5u; x@f=x@-2.5u; 
  y@b=y@-oo; y@c=y@+.07h; y@d=y@+.15h; y@e=y@+.14h; y@f=y@-oo; 
  filldraw  flex(z@b,z@c,z@d) & flex(z@d,z@e,z@a) 
          & flex(z@a,z@f,z@b) & cycle; 
  labels(x@,@a,@b,@c,@d,@e,@f,@g,@i); 
enddef; 

def upper_right_wing(suffix $)=
  pickup fine.nib; pos$a(vair,90); pos$b(vair,90); 
  x$a=x$; x$b=x$+1.5u; y$a=y$b=y$; 
  filldraw stroke z$a.e--z$b.e; 
  x$g=x$+1.52u; y$g=y$; 
  x$i=x$+3.9u; x$j=x$+3.7u; x$k=x$+4.2u; x$l=x$+2.5u; x$m=x$+2.5u; 
  y$i=y$-oo; y$j=y$+.07h; y$k=y$+.15h; y$l=y$+.14h; y$m=y$-oo; 
  filldraw flex(z$i,z$j,z$k) & flex(z$k,z$l,z$g) 
         & flex(z$g,z$m,z$i) & cycle; 
  labels(x$,$g,$i,$j,$k,$l,$m,$a,$b); 
enddef; 

def upside_down_left_wing(suffix @)=
  pickup tiny.nib; 
  pos@g(bar,90); pos@i(bar,90); 
  x@g=x@; x@i=x@-2u-eps; y@g=y@i=y@; 
  draw z@g--z@i; 
  x@a=x@-2u; y@a=y@; x@b=x@-3.9u; x@c=x@-3.7u; 
  x@d=x@-4.2u; x@e=x@-2.5u; x@f=x@-2.5u; 
  y@b=y@; y@c=y@+.07h; y@d=y@+.15h; y@e=y@+.14h; y@f=y@; 
  pickup fine.nib; 
  filldraw flex(z@b,z@c,z@d) & flex(z@d,z@e,z@a) 
         & flex(z@a,z@f,z@b) & cycle; 
  pickup fine.nib; 
  labels(x@,@a,@b,@c,@d,@e,@f,@g,@i); 
enddef; 

def rt_wing(suffix $)(expr x_bar, slope)=
  pickup fine.nib; 
  x$g=x$; x$:=x$+x_bar; 
  x$a=x$; x$b=x$+2u; x$c=x$+2u; x$d=x$+2u; x$e=x$+2.5u; 
  x$f=x$+.75u; x$h=x$a; 
  y$a=y$+slope; y$b=y$+o+slope; y$c=y$b-.025h; y$d=y$b-.075h; 
  y$e=y$b-.135h-o; y$f=y$b-.15h-o; y$g=y$; y$h=y$a; 
  if x_bar > 0:
    pos$g(vair,90); pos$h(vair,90); 
    filldraw stroke z$g--z$h; 
  fi
  filldraw flex(z$a,z$b,z$c) & flex(z$c,z$d,z$e)
         & flex(z$e,z$f,z$a) & cycle; 
  labels(x$,$a,$b,$c,$d,$e,$f,$g); 
enddef; 

def lft_wing(suffix $)(expr x_bar, slope)=
  pickup fine.nib; 
  x$g=x$; x$:=x$-x_bar; 
  x$a=x$; x$b=x$-2u; x$c=x$-2u; x$d=x$-2u; x$e=x$-2.5u; 
  x$f=x$-.75u; x$h=x$a; 
  y$a=y$-slope; y$b=y$-2slope; y$c=y$b-.025h; y$d=y$b-.075h; 
  y$e=y$b-.135h-o; y$f=y$b-.15h-o; y$g=y$; y$h=y$a; 
  if x_bar > 0:
    pos$g(vair,90); pos$h(vair,90); 
    filldraw stroke z$g--z$h;
  fi
  filldraw flex(z$a,z$b,z$c) & flex(z$c,z$d,z$e)
         & flex(z$e,z$f,z$a) & cycle; 
  labels(x$,$a,$b,$c,$d,$e,$f,$g); 
enddef; 

def right_wing_no_bar(suffix @)=
  x@a=x@; y@a=y@; 
  x@b=x@-1.9u; x@c=x@-1.7u; x@d=x@-2.2u; x@e=x@-.5u; x@f=x@-.5u; 
  y@b=y@; y@c=y@-.07h; y@d=y@-.15h; y@e=y@-.14h; y@f=y@; 
  pickup fine.nib; 
  filldraw  flex(z@b,z@c,z@d) & flex(z@d,z@e,z@a) & flex(z@a,z@f,z@b) 
  & cycle; 
  pickup fine.nib; 
  labels(x@,@a,@b,@c,@d,@e,@f,@g,@i); 
enddef; 

def r_wing(suffix $)=
  pickup fine.nib; x$g=x$; y$g=y$; 
  x$i=x$+2u; x$j=x$+1.75u; x$k=x$+2.5u; x$l=x$+.5u; x$m=x$+.5u; 
  y$i=y$; y$j=y$-.07h; y$k=y$-.15h; y$l=y$-.14h; y$m=y$; 
  filldraw flex(z$i,z$j,z$k) & flex(z$k,z$l,z$g)
         & flex(z$g,z$m,z$i) & cycle; 
  labels(x$,$g,$i,$j,$k,$l,$m,$a,$b); 
enddef; 

def p_wing(suffix $)=
  pickup fine.nib; x$g=x$; y$g=y$;
  x$i=x$-1.9u; x$j=x$-1.7u; x$k=x$-2.2u; x$l=x$-.5u; x$m=x$-.5u;
  y$i=y$; y$j=y$-.07h; y$k=y$-.15h; y$l=y$-.14h;  y$m=y$;
  filldraw flex(z$i,z$j,z$k) & flex(z$k,z$l,z$g) 
         & flex(z$g,z$m,z$i) & cycle;
  pickup fine.nib;
  labels(x$,$g,$i,$j,$k,$l,$m,$a,$b);
enddef;

def t_wing(suffix $)=
  pickup fine.nib; 
  x$a=x$; x$b=x$c=x$d=x$-2u; x$e=x$-2.5u; x$f=x$-.75u; 
  y$a=y$c=y$; y$b=y$+.025h; y$d=y$-.05h; y$e=y$-.11h-o;
  y$f=y$-.125h-o;
  filldraw flex(z$a,z$b,z$c) & flex(z$c,z$d,z$e)
         & flex(z$e,z$f,z$a) & cycle; 
  labels($,$a,$b,$c,$d,$e,$f); 
enddef; 

%%% RING %%%

def half_ring(suffix @) =
  pickup fine.nib; 
  pos@1(vair,270); penpos@2(stem,360); pos@3(vair,90); 
  pos@4(vair,90); pos@5(vair,270); 
  x@5=x@4=x@+fine; x@1=x@3=x@5+1u; x@2=x@1+2u; 
  y@5=y@1=y@+.5o; y@3=y@4=y@5+.225h; y@2=.5[y@5,y@3]; 
  filldraw stroke z@5e..pulled_super_arc.e(@1,@2)(superpull)
        .. pulled_super_arc.e(@2,@3)(superpull)..z@4e; 
  penlabels(@,@1,@2,@3); 
enddef; 

def jj_ring(suffix @) =
  pickup fine.nib; 
  pos@1(vair,270); pos@2(stem,0); pos@3(vair,90); 
  pos@4(vair,90); pos@5(vair,270);  
  x@5=x@4=x@+fine; x@1=x@3=x@5+.75u; x@2=x@1+1.72u; 
  y@5=y@1=y@+o; y@3=y@4=y@5+.225h; y@2=.5[y@5,y@3]; 
  filldraw stroke z@5e...pulled_arc.e(@1,@2)
        .. pulled_arc.e(@2,@3)...z@4e; 
  penlabels(@,@1,@2,@3); 
enddef; 

def large_ring(suffix $)(expr theta) =
  pickup tiny.nib; 
  transform t; t=identity rotatedaround((.5w,.5h),theta); 
  x$a=x$c=x$+1.75u; x$b=x$b'=x$; x$d=x$d'=x$a+2u; x$e=x$f=x$+1.75u; 
  y$a=y$b=y$d'=y$+.25h; y$b'=y$d=y$c=y$-.05h; y$e=y$+.2h; y$f=y$; 
  path p, q; 
  p=z$a..z$b..z$b'..z$c..z$d..z$d'..cycle; 
  q=z$e..z$f..cycle; 
  fill p transformed t; 
  unfill q transformed t; 
  penlabels($,$a,$b,$b',$c,$d,$d',$e,$f); 
enddef; 

def rfive_ring(suffix $)(expr theta)=
  pickup tiny.nib; 
  transform t; t=identity rotatedaround((.5w,.5h),theta); 
  x$a=x$c=x$+1.75u; x$b=x$b'=x$; x$d=x$d'=x$a+2u; x$e=x$f=x$+1.75u; 
  y$a=y$b=y$d'=y$+.25h; y$b'=y$d=y$c=y$-.05h; y$e=y$+.2h; y$f=y$; 
  path p, q; 
  p=z$a..z$b..z$b'..z$c..z$d..z$d'..cycle; 
  q=z$e..z$f..cycle; 
  fill p transformed t; 
  unfill q transformed t; 
  penlabels(z$a,z$b,z$b',z$c,z$d,z$d',z$e,z$f); 
enddef; 

def rseven_ring(suffix $)=
  pickup  fine.nib; 
  pos$a(vair,90); penpos$b(stem,180); pos$b'(stem,205); 
  pos$c(vair,270); penpos$d(stem,0); pos$d'(stem,0); 
  x$a=x$+3u; x$b.l=x$+2.25u; x$b'.l=x$+2.5u; x$c=x$+3u; x$d.l=x$+4u; 
  x$d'.l=x$+4u; 
  y$a=y$+.05h; y$b=y$-.05h; y$b'=y$-.25h; y$c=y$-.225h; y$d=y$-.1h; 
  y$d'=y$; 
  filldraw stroke z$a.e{left}...z$b.e..z$b'.e{right}...z$c.e{right}
        .. z$d.e..z$d'.e..{left}z$a.e; 
  labels(z$a,z$b,z$b',z$c,z$d,z$d'); 
enddef; 

def dfive_ring(suffix $)(expr theta)=
  pickup fine.nib; 
  transform t; t=identity rotatedaround((.5w,.5h),theta); 
  x$:=x$+.4u; y$:=y$-.125h; 
  x$a=x$c=x$+1.5u; x$b=x$b'=x$; x$d=x$d'=x$a+1.75u; x$e=x$f=x$+1.5u; 
  y$b=y$d'=y$+.175h; y$a=y$b+o; y$b'=y$d=y$c=y$-.075h; y$e=y$+.15h; 
  y$f=y$-.025h; 
  path p, q; 
  p=z$a..z$b..z$b'..z$c..z$d..z$d'..cycle; 
  q=z$e...z$f...cycle; 
  fill p transformed t; 
  unfill q transformed t; 
  penlabels(z$a,z$b,z$b',z$c,z$d,z$d',z$e,z$f); 
enddef; 

def gfive_ring(suffix $)(expr theta,s)=
  pickup fine.nib; 
  transform t; t=identity slanted (s) rotatedaround((.5w,.5h),theta); 
  x$:=x$+.4u; y$:=y$-.125h; 
  x$a=x$c=x$+1.5u; x$b=x$b'=x$; x$d=x$d'=x$a+1.75u; x$e=x$f=x$+1.5u; 
  y$b=y$d'=y$+.195h; y$a=y$b+o; y$b'=y$d=y$c=y$-.095h; y$e=y$+.15h; 
  y$f=y$-.025h; 
  path p, q; 
  p=z$a..z$b..z$b'..z$c..z$d..z$d'..cycle; 
  q=z$e...z$f...cycle; 
  fill p transformed t; 
  unfill q transformed t; 
  penlabels(z$a,z$b,z$b',z$c,z$d,z$d',z$e,z$f); 
enddef; 
  
def nfour_ring(suffix $)(expr theta,s)=
  pickup fine.nib; 
  transform t; t=identity slanted (s) rotatedaround((.5w,.5h),theta); 
  x$:=x$+.4u; y$:=y$-.125h; 
  x$a=x$c=x$+1.75u; x$b=x$b'=x$; x$d=x$d'=x$a+2u; x$e=x$f=x$+1.75u; 
  y$b=y$+.175h; y$a=y$b+.025h; y$b'=y$c=y$-.075h; y$e=y$+.15h; y$f=y$-.035h; 
  y$d'=y$+.175h; y$d=y$-.075h; 
  path p, q; 
  p=z$a...z$b..z$b'..z$c..z$d..z$d'...cycle; 
  q=z$e...z$f...cycle; 
  fill p transformed t; 
  unfill q transformed t; 
  penlabels(z$a,z$b,z$b',z$c,z$d,z$d',z$e,z$f); 
enddef; 

def lsix_ring(suffix $)(expr theta) =
  pickup tiny.nib; 
  transform t; t=identity rotatedaround((.5w,.5h),theta); 
  x$a=x$c=x$+1.75u; x$b=x$b'=x$; x$d=x$d'=x$a+2u; x$e=x$f=x$+1.75u; 
  y$a=y$b=y$d'=y$+.25h; y$b'=y$d=y$c=y$-.05h; y$e=y$+.2h; y$f=y$; 
  path p, q; 
  p=z$a..z$b..z$b'..z$c..z$d..z$d'..cycle; 
  q=z$e..z$f..cycle; 
  fill p transformed t; 
  unfill q transformed t; 
  penlabels(z$a,z$b,z$b',z$c,z$d,z$d',z$e,z$f); 
enddef; 

def ynseven_ring(suffix $)(expr theta,s)=
  pickup fine.nib; 
  transform t; t=identity slanted (s) rotatedaround((.5w,.5h),theta); 
  x$:=x$+.4u; y$:=y$-.125h; 
  x$a=x$c=x$+1.75u; x$b=x$b'=x$; x$d=x$d'=x$a+2u; x$e=x$f=x$+1.75u; 
  y$b=y$d'=y$a=y$+.195h; y$b'=y$d=y$c=y$-.05h; y$e=y$+.15h; y$f=y$-.025h; 
  path p, q; 
  p=z$a...z$b..z$b'..z$c..z$d..z$d'...cycle; 
  q=z$e...z$f...cycle; 
  fill p transformed t; 
  unfill q transformed t; 
  penlabels(z$a,z$b,z$b',z$c,z$d,z$d',z$e,z$f); 
enddef; 
  
def yfive_ring(suffix $)(expr theta)=
  pickup tiny.nib; 
  transform t; t=identity rotatedaround((.5w,.5h),theta); 
  x$:=x$+.4u; y$:=y$-.125h; 
  x$a=x$c=x$+1.75u; x$b=x$b'=x$; x$d=x$d'=x$a+2u; x$e=x$f=x$+1.75u; 
  y$a=y$b=y$d'=y$+.15h; y$b'=y$d=y$c=y$-.05h; y$e=y$+.125h; y$f=y$-.025h; 
  path p, q; 
  p=z$a..z$b..z$b'..z$c..z$d..z$d'..cycle; 
  q=z$e..z$f..cycle; 
  fill p transformed t; 
  unfill q transformed t; 
  penlabels(z$a,z$b,z$b',z$c,z$d,z$d',z$e,z$f); 
enddef; 

%%% ELLIPSE %%%

def rt_half_ellipse(suffix @)(expr x_bar)=
  pickup fine.nib; 
  x@g=x@; y@:=y@+.015h; 
  x@:=x@+x_bar; x@h=x@; x@a=x@+3.25u; x@b=x@a-u; 
  x@c=x@a-.5u; x@d=x@a-2.5u; x@e=x@; x@f=x@a-2.25u; 
  y@a=y@-.065h; y@b=y@+.05h; y@c=y@+.125h; y@d=y@+.1h; y@e=y@; 
  y@f=y@-.1h; y@g=y@-.015h; y@h=y@; 
  pos@g(vair,90); pos@h(vair,90); 
  if x_bar>0 :
    filldraw stroke z@g.e--z@h.e;
  fi
  fill flex(z@a,z@b,z@c) & flex(z@c,z@d,z@e)...flex(z@e,z@f,z@a) & cycle; 
  penlabels(@,@a,@b,@c,@d,@e,@f,z@g,z@h); 
enddef; 

def lft_half_ellipse(suffix @)(expr x_bar)=
  pickup fine.nib; 
  x@g=x@; y@:=y@-.03h; 
  x@:=x@-x_bar; x@h=x@; x@a=x@-3.25u; x@b=x@a+u; x@c=x@a+.5u; x@d=x@a+2.5u;
  x@e=x@; x@f=x@a+2.25u; 
  y@a=y@-.125h; y@b=y@-.05h; y@c=y@+.065h; y@d=y@+.1h; y@e=y@; y@f=y@-.1h;
  y@g=y@+.015h; y@h=y@; 
  pos@g(vair,90); pos@h(vair,90); 
  if x_bar>0 :
    filldraw stroke z@g.e--z@h.e; 
  fi
  fill flex(z@a,z@b,z@c) & flex(z@c,z@d,z@e)...flex(z@e,z@f,z@a) & cycle; 
  penlabels(@,@a,@b,@c,@d,@e,@f,z@g,z@h); 
enddef; 

%%% DIAGONALS %%%

def top_diagonals(suffix @)=
  penpos@a(vair,45); penpos@b(vair,-45);
  penpos@c(vair,45); penpos@d(vair,-45);
  penpos@e(2stem,45); penpos@f(2stem,-45);
  z@a.l=z@.l; z@b.r=z@.r;
  x@c=x@a-1u; y@c=y@a+1u; x@d=x@b+1u; y@d=y@b+1u;
  x@e=x@c-1.2stem; y@e=y@c+1.2stem; x@f=x@d+1.2stem; y@f=y@d+1.2stem;
  z@g=.5[z@c,z@e]; z@h=.5[z@d,z@f];
  z@i=whatever[z@a.r,z@c.r]=whatever[z@b.r,z@d.r];
  filldraw z@a.l--z@c.l--z@c.r--z@i--z@b.l--
    z@d.l--z@d.r--z@b.r--z@a.l & cycle;
  fill z@e.l..controls z@g..z@e.r &
    z@e.r..{down}z@c.r--z@c.l{left}..z@e.l & cycle;
  fill z@f.l..controls z@h..z@f.r &
    z@f.r..{left}z@d.r--z@d.l{up}..z@f.l & cycle;
enddef;

%%% NO_CHAR %%%

def no_char(expr code) =
  "undefined character"; 
  beginchar(code,9u#,body_height#,paren_depth#); 
  italcorr fig_height#*slant-.5u#; % same as for digits
  adjust_fit(0,0); 
  fill (0,h)--(w,h)--(w,-d)--(0,-d)--cycle; 
  endchar; 
enddef; 
