vardef oldeng_serif.l(suffix $,$$,@)(expr darkness,jut,drop) =
 pickup crisp.nib; pos@2(slab,-90);
 lft x@0=tiny.lft x$l; rt x@1=tiny.rt x$r; 
 bot y@1=tiny.bot y$r; % top y@1=tiny.top y$r;
 lft x@2=lft x@0-jut; y@2l=y@1-drop; % y@2r=y@1-drop;
 y@0=min(y@2l+bracket,y$$)-eps;
 if drop>0: erase fill z@1-- top z@1
   --(x@2r,top y@1)--z@2r--cycle; fi % erase excess at bottom
 filldraw z@1--z@2r--z@2l{z@1-z@2} %  ...darkness[(x@0,y@2l),.5[z@2l,z@0] ]{z@0-z@2l}
  ...{up}z@0--(x@1,y@0)--cycle;  % sloped serif
 labels(@0,@1,@2); enddef;

def circ_coord(suffix $,$$) (expr len, ang) =
  x$ := x$$ + (len * cosd ang);
  y$ := y$$ - (len * aspect_ratio * cosd (ang + 90));
enddef;



if unknown spike: boolean spike; spike=false; fi
def spickle = .5[slab,stem] enddef;

spike:=false;

% cmchar " and abbreviation (&)";
newchar(OEamp,9u#,x_height#,desc_depth#);
italcorr x_height#*slant;
adjust_fit(0,0);
numeric arm_thickness, bot_width, top_shift, top_hair;
if hefty: arm_thickness=Vround(slab+2stem_corr); top_shift=0;
 bot_width=hround .825[stem,curve]; top_hair=.4[thin_join,bot_width]; %bot_width=hround .51[curve,cap_curve]; 
else: arm_thickness=Vround .4[stem,cap_stem]; top_shift=.5u;
 bot_width=.75[stem,curve]; top_hair=cap_hair; fi %bot_width=hround .51[curve,cap_curve]; 
if top_hair<tiny.breadth: top_hair:=tiny.breadth; fi
pickup crisp.nib; pos2(arm_thickness,90); pos1(hair,180);
top y2r=h; rt x2=hround(w-.75u+top_shift);
lft x1r=hround(.75u+.5top_shift); y1=good.y(y2l-eps);
arm(2,1,a,.3beak_darkness,-beak_jut);  % arm and beak
pos3(hair,180); y3=good.y(y2r+beak/3)+eps; z3r=whatever[z1r,z.a0]; % was beak/6
penpos2'(2epsilon,-90); z2'=z2r;
arm(2',3,b,beak_darkness,x3r-x.a0);  % upward extension of beak
pickup tiny.nib; pos4(top_hair,0); pos6(bot_width,-30);
bot y4=max(h-arm_thickness,h-slab,bot y2l); rt x4r=crisp.rt x2;
lft x6l=hround(3.5u+top_shift-.5bot_width);
%if serifs: y6-.5bot_width=-d-o; filldraw z6l{down}..{up}z6r--cycle;  % bulb
%else:
       bot y6=-d-oo;
%fi
if hefty: erase fill rt z4r--z4r...{down}z6r
  --(rt x4r,y6)--cycle;  % erase excess at top
 filldraw stroke z4e...{down}z6e;  % stroke
else: pos5(top_hair,0); y5=2/3[-d,h]; z5=whatever[z4,(.75u,y6)];
 erase fill rt z4r--z4r--z5r--(rt x4r,y5)--cycle;  % erase excess at top
 filldraw stroke z4e---z5e...{down}z6e; fi  % stroke
pairassign(tca,.5w,h);  %top center accentpoint
pairequate(lca,z6);  %low center accentpoint
pairequate(tra,tca); %top right accentpoint
pairequate(tla,tca); %top left accentpoint
pairequate(lla,lca); %low left accentpoint
pairequate(lra,lca); %low right accentpoint
penlabels(1,2,3,4,5,6); endchar;

% cmchar "eth";
newchar(eth,8u#,asc_height#,0);
italcorr .9asc_height#*slant+.5hair#-1.5u#;
adjust_fit(1u#,0); pickup fine.nib;
pos1(hair,-180); pos2(vair,-90);
numeric theta; theta=angle(11u,-h);
pos3(stem,theta+90); pos4(stem,theta+90); pos5(1/4[hair,stem],20);
pos6(vair,-90); pos7(curve,-180); pos8(vair,-270);
rt x1l=hround(w-2u+.5hair); x2=.5w; x3r=u; rt x5r=hround(w-u);
x6=.5w; x4=x8=.5w+.5u; lft x7r=hround(1u-.5curve);
top y2l=h+oo; y1=min(.9h,y2r-eps); top y8r=x_height+oo; y4=y8;
z4-z3=whatever*(11u,-h); y5=y7=.5[y6,y8]; bot y6=-oo;
filldraw circ_stroke z3e---z4e....z5e{down}...pulled_arc.e(6,7) & pulled_arc.e(7,8);  % hook and bowl
% now the crossbar
pickup fine.nib;
theta1:=angle(z3-z4)-90; % angle of crossbar
theta2:=angle(z3-z4); % angle of stem of eth
z78=.5[z3,z4]; circ_coord(77,78,3u,theta1+180); circ_coord(79,78,4u,theta1);
circ_coord(87,77,1.5u,theta2); circ_coord(89,79,1.5u,theta2+180);
pos87(hair,theta1); pos89(hair,theta1); 
pos77(slab,theta2); pos79(slab,theta2); 
lft x97l = lft x77; y97=y77; pos97(hair,theta1);
rt x99r = rt x79; y99=y79; pos99(hair,theta1);
filldraw stroke z77e--z79e; filldraw stroke z87--z97; filldraw stroke z89--z99; 
pairassign(tca,.5w,h);  %top center accentpoint
pairequate(lca,z6);  %low center accentpoint
pairequate(tra,tca); %top right accentpoint
pairequate(tla,tca); %top left accentpoint
pairequate(lla,lca); %low left accentpoint
pairequate(lra,lca); %low right accentpoint
math_fit(-.3x_height#*slant+.5curve#-u#,.7x_height#*slant-.5u#);
penlabels(1,2,3,4,5,6,7,8,77,78,79); endchar;

% cmchar "Old English g";
newchar(OEg,8u#,x_height#,1.75desc_depth#);
adjust_fit(0.5u#,u#); pickup tiny.nib;
x83=.9w; top y83r=h; pos83(slab,90); x183=w; y183=y83; pos183(slab,90);
lft x84l=hround .65u; pos84(hair,180); y84=good.y(y83l-.35beak)-eps;
arm(83,84,q,beak_darkness,.35beak_jut); filldraw stroke z83e--z183e;
rt x85r=rt x83l; y85=y83l; pos85(slab,-90);
x88=.5[x84,x10]; y88:=3/16[y10,y83]; pos88(hair,0); 
x10=3/8w; y10=.1h; pos10(.5[vair,stem],90); 
%filldraw stroke z85e{-20,-1}...z88e..{right}z10e;
pos6(stem,0); pos7(slab,-90); pos8(hair,-135);
rt x6r=hround(w-.5u); bot y7r=-d-oo; y6=.45[y10,y7]; x7=.375w; x8=hround -u; %x8=x84;
y8=.675[y10,y7]; 
filldraw stroke  z85e{-20,-1}...{down}z88e..z10e..{down}z6e
%  & pulled_super_arc.e(10,6)(.5superpull)
  & pulled_super_arc.e(6,7)(.7superpull) & z7e{left}..tension .9 and 1..z8e;
pairassign(tca,.5w,h);  %top center accentpoint
pairequate(lca,z7);  %low center accentpoint
pairequate(tra,tca); %top right accentpoint
pairequate(tla,tca); %top left accentpoint
pairequate(lla,lca); %low left accentpoint
pairequate(lra,lca); %low right accentpoint
penlabels(6,7,10,82,83,84,85,88); endchar;

% cmchar "Old English g with raised dot";
newchar(OEgdot,8u#,x_height#,1.75desc_depth#);
adjust_fit(0.5u#,u#); pickup tiny.nib;
x83=.9w; top y83r=h; pos83(slab,90); x183=w; y183=y83; pos183(slab,90);
lft x84l=hround .65u; pos84(hair,180); y84=good.y(y83l-.35beak)-eps;
arm(83,84,q,beak_darkness,.35beak_jut); filldraw stroke z83e--z183e;
rt x85r=rt x83l; y85=y83l; pos85(slab,-90);
x88=.5[x84,x10]; y88:=3/16[y10,y83]; pos88(hair,0); 
x10=3/8w; y10=.1h; pos10(.5[vair,stem],90); 
%filldraw stroke z85e{-20,-1}...z88e..{right}z10e;
pos6(stem,0); pos7(slab,-90); pos8(hair,-135);
rt x6r=hround(w-.5u); bot y7r=-d-oo; y6=.45[y10,y7]; x7=.375w; x8=hround -u; %x8=x84;
y8=.675[y10,y7]; 
filldraw stroke  z85e{-20,-1}...{down}z88e..z10e..{down}z6e
%  & pulled_super_arc.e(10,6)(.5superpull)
  & pulled_super_arc.e(6,7)(.7superpull) & z7e{left}..tension .9 and 1..z8e;
x937=.5w; y937=h; overdot(937,gq);
penlabels(6,7,10,82,83,84,85,88); endchar;

% cmchar "Old English G";
newchar(OEG,11u#,asc_height#,1.75desc_depth#);
adjust_fit(0.5u#,u#); pickup tiny.nib;
x83=.9w; top y83r=h; pos83(cap_band,90); x183=w; y183=y83; pos183(cap_band,90);
lft x84l=hround .65u; pos84(hair,180); y84=good.y(y83l-.35beak)-eps;
arm(83,84,q,beak_darkness,.35beak_jut); filldraw stroke z83e--z183e;
rt x85r=rt x83l; y85=y83l; pos85(cap_band,-90);
x88=.5[x84,x10]; y88:=3/16[y10,y83]; pos88(hair,0); 
x10=3/8w; y10=.35h; pos10(.5[vair,cap_stem],90); 
%filldraw stroke z85e{-20,-1}...z88e..{right}z10e;
pos6(cap_stem,0); pos7(cap_band,-90); pos8(hair,-135);
rt x6r=hround(w-.5u); bot y7r=-d-oo; y6=.45[y10,y7]; x7=.375w; x8=hround -u; %x8=x84;
y8=.675[y10,y7]; 
filldraw stroke  z85e{-20,-1}...{down}z88e..z10e..{down}z6e
%  & pulled_super_arc.e(10,6)(.5superpull)
  & pulled_super_arc.e(6,7)(.7superpull) & z7e{left}..tension .9 and 1..z8e;
pairassign(tca,.5w,h);  %top center accentpoint
pairequate(lca,z7);  %low center accentpoint
pairequate(tra,tca); %top right accentpoint
pairequate(tla,tca); %top left accentpoint
pairequate(lla,lca); %low left accentpoint
pairequate(lra,lca); %low right accentpoint
penlabels(6,7,10,82,83,84,85,88); endchar;

% cmchar "Old English G with raised dot";
newchar(OEGdot,11u#,asc_height#,1.75desc_depth#);
adjust_fit(0.5u#,u#); pickup tiny.nib;
x83=.9w; top y83r=h; pos83(cap_band,90); x183=w; y183=y83; pos183(cap_band,90);
lft x84l=hround .65u; pos84(hair,180); y84=good.y(y83l-.35beak)-eps;
arm(83,84,q,beak_darkness,.35beak_jut); filldraw stroke z83e--z183e;
rt x85r=rt x83l; y85=y83l; pos85(cap_band,-90);
x88=.5[x84,x10]; y88:=3/16[y10,y83]; pos88(hair,0); 
x10=3/8w; y10=.35h; pos10(.5[vair,cap_stem],90); 
%filldraw stroke z85e{-20,-1}...z88e..{right}z10e;
pos6(cap_stem,0); pos7(cap_band,-90); pos8(hair,-135);
rt x6r=hround(w-.5u); bot y7r=-d-oo; y6=.45[y10,y7]; x7=.375w; x8=hround -u; %x8=x84;
y8=.675[y10,y7]; 
filldraw stroke  z85e{-20,-1}...{down}z88e..z10e..{down}z6e
%  & pulled_super_arc.e(10,6)(.5superpull)
  & pulled_super_arc.e(6,7)(.7superpull) & z7e{left}..tension .9 and 1..z8e;
x937=.5w; y937=h; overdot(937,gq);
penlabels(6,7,10,82,83,84,85,88); endchar;

% cmchar "Old style ss";
newchar(Oldss,11.6u#,asc_height#,0);
italcorr x_height#*slant-if serifs:.55u# else:.3u# fi;
adjust_fit(if monospace: .5u#,.4u# else: 0,if serifs:0 else:-.2u# fi fi);
numeric theta; theta=90-angle(40u,x_height); slope:=-x_height/40u;  % angle at middle
numeric s_slab; s_slab=if serifs:vair else:Vround .1[vair,stem] fi;
numeric ess'; ess'=max(fine.breadth,ess);
pickup fine.nib; pos2(max(fine.breadth,s_slab-vround vair_corr),-100);
pos0(ess',theta); pos7(s_slab,-90); x2l=x0=x7=.5w+2.25u;
top y2l=x_height+vround 1.5oo; bot y7r=-oo;
y0-.5ess'=y7l+if serifs:.54 else: .52 fi\\(y2r-y7l-ess');
lft x3l=hround 5.1u; rt x6r=hround(w-.6u);
x3r-x3l=x6r-x6l=hround .5[s_slab,ess']-fine;
ellipse_set(2l,3l,4l,0l); ellipse_set(2r,3r,4r,0r); y3=y3r;
ellipse_set(7l,6l,5l,0l); ellipse_set(7r,6r,5r,0r); y6=y6r;
interim superness:=more_super;
filldraw stroke super_arc.e(2,3) & z3e{down}
 ..z4e---z5e..z6e{down} & super_arc.e(6,7);  % main stroke
if serifs: pos1(hair,180); pos8(hair,180);
 rt x1l=hround(w-1.05u); lft x8r=hround 5.1u;
 bot y1=min(bot y2r,vround 1/5[top y5r,x_height]);
 top y8=max(top y7l,vround 5/6 bot y4l);
 filldraw stroke z1e{up}....{left}z2e;  % upper arc
 filldraw stroke z7e{left}....{x8-x7,5(y8-y7)}z8e;  % lower arc
 path upper_arc, lower_arc;
 upper_arc=z1{up}....{left}z2; lower_arc=z7{left}....{x8-x7,5(y8-y7)}z8;
 pos10(.3[fine.breadth,cap_hair],0); pos9(.3[fine.breadth,cap_hair],0);
 x10r=x1l; top y10=top y2l; x9l=x8r; bot y9=bot y7r;
 x1l-x1'=x8'-x8r=1.6cap_curve-fine; y1'=y1; y8'=y8;
 numeric t; t=xpart(upper_arc intersectiontimes(z10l--z1'));
 filldraw z1l--z10r--z10l--subpath(t,0) of upper_arc--cycle;  % upper barb
 t:=xpart(lower_arc intersectiontimes(z9r--z8'));
 filldraw z8r--z9l--z9r--subpath(t,1) of lower_arc--cycle;  % lower barb
else: pos1(4/7[s_slab,flare],-100); pos8(flare,-100);
 x1l=good.x(x1l+w-u-rt x1); lft x8r=hround 5.1u;
 top y1l=vround(.93x_height+1.5oo); bot y8r=vround .1x_height-oo;
 filldraw stroke term.e(2,1,right,.9,4);  % upper arc and terminal
 filldraw stroke term.e(7,8,left,1,4); fi  % lower arc and terminal
%
pickup tiny.nib; pos31(stem',0); lft x31l=hround(2.5u-.5stem');
pickup fine.nib; numeric bulb_diam;
if serifs: bulb_diam=hround .8[stem,flare];
 pos32(bulb_diam,0); y32+.5bulb_diam=.9[x_height,h+oo];
 if monospace: rt x32r=hround(5u)+1 else: lft x32l=hround(5.25u+.5) fi;
else: pos32(5/7[vair,flare],90); top y32r=h;
 rt x32=hround(if monospace:5.5u else:5.25u fi); fi
f_stroke(31,32,q,qq,qqq,jut,jut); % stem, terminal, serif
pairassign(tca,.5w,h);  %top center accentpoint
pairassign(lca,.5w,h);  %low center accentpoint
pairequate(tra,tca); %top right accentpoint
pairequate(tla,tca); %top left accentpoint
pairequate(lla,lca); %low left accentpoint
pairequate(lra,lca); %low right accentpoint
penlabels(0,1,1',2,3,4,5,6,7,8,8',9,10,31,32); endchar;

% cmchar "variant Old style ss";
newchar(Olvss,11.6u#,asc_height#,0);
italcorr x_height#*slant-if serifs:.55u# else:.3u# fi;
adjust_fit(if monospace: .5u#,.4u# else: 0,if serifs:0 else:-.2u# fi fi);
numeric theta; theta=90-angle(40u,x_height); slope:=-x_height/40u;  % angle at middle
numeric s_slab; s_slab=if serifs:vair else:Vround .1[vair,stem] fi;
numeric ess'; ess'=max(fine.breadth,ess);
pickup fine.nib; pos2(max(fine.breadth,s_slab-vround vair_corr),-100);
pos0(ess',theta); pos7(s_slab,-90); x2l=x0=x7=.5w+2.25u;
top y2l=x_height+vround 1.5oo; bot y7r=-oo;
y0-.5ess'=y7l+if serifs:.54 else: .52 fi\\(y2r-y7l-ess');
lft x3l=hround 5.1u; rt x6r=hround(w-.6u);
x3r-x3l=x6r-x6l=hround .5[s_slab,ess']-fine;
ellipse_set(2l,3l,4l,0l); ellipse_set(2r,3r,4r,0r); y3=y3r;
ellipse_set(7l,6l,5l,0l); ellipse_set(7r,6r,5r,0r); y6=y6r;
interim superness:=more_super;
filldraw stroke super_arc.e(2,3) & z3e{down}
 ..z4e---z5e..z6e{down} & super_arc.e(6,7);  % main stroke
if serifs: pos1(hair,180); pos8(hair,180);
 rt x1l=hround(w-1.05u); lft x8r=hround 5.1u;
 bot y1=min(bot y2r,vround 1/5[top y5r,x_height]);
 top y8=max(top y7l,vround 5/6 bot y4l);
 filldraw stroke z1e{up}....{left}z2e;  % upper arc
 filldraw stroke z7e{left}....{x8-x7,5(y8-y7)}z8e;  % lower arc
 path upper_arc, lower_arc;
 upper_arc=z1{up}....{left}z2; lower_arc=z7{left}....{x8-x7,5(y8-y7)}z8;
 pos10(.3[fine.breadth,cap_hair],0); pos9(.3[fine.breadth,cap_hair],0);
 x10r=x1l; top y10=top y2l; x9l=x8r; bot y9=bot y7r;
 x1l-x1'=x8'-x8r=1.6cap_curve-fine; y1'=y1; y8'=y8;
 numeric t; t=xpart(upper_arc intersectiontimes(z10l--z1'));
 filldraw z1l--z10r--z10l--subpath(t,0) of upper_arc--cycle;  % upper barb
 t:=xpart(lower_arc intersectiontimes(z9r--z8'));
 filldraw z8r--z9l--z9r--subpath(t,1) of lower_arc--cycle;  % lower barb
else: pos1(4/7[s_slab,flare],-100); pos8(flare,-100);
 x1l=good.x(x1l+w-u-rt x1); lft x8r=hround 5.1u;
 top y1l=vround(.93x_height+1.5oo); bot y8r=vround .1x_height-oo;
 filldraw stroke term.e(2,1,right,.9,4);  % upper arc and terminal
 filldraw stroke term.e(7,8,left,1,4); fi  % lower arc and terminal
%
pickup tiny.nib; pos31(stem',0); lft x31l=hround(2.5u-.5stem');
pickup fine.nib; numeric bulb_diam;
if serifs: bulb_diam=hround .8[stem,flare];
 pos32(bulb_diam,0); y32+.5bulb_diam=.9[x_height,h+oo];
 if monospace: rt x32r=hround(5u)+1 else: lft x32l=hround(5.25u+.5) fi;
else: pos32(5/7[vair,flare],90); top y32r=h;
 rt x32=hround(if monospace:5.5u else:5.25u fi); fi
f_stroke(31,32,q,qq,qqq,jut,jut); % stem, terminal, serif
pickup crisp.nib;  x93=x31l; top y93r=x_height; pos93(slab,90); pos94(slab,90);
x94=x93-jut; y94=y93; filldraw stroke z93e--z94e;
penlabels(0,1,1',2,3,4,5,6,7,8,8',9,10,31,32,93,94); endchar;

% cmchar "Old style s";
newchar(Olds,5.5u#,asc_height#,0);
italcorr asc_height#*slant+if serifs:flare#-.25u# else: 1.25u# fi;
adjust_fit(stem_shift#,if monospace: .5u# else:-stem_shift# fi);
pickup tiny.nib; pos1(stem',0); lft x1l=hround(2.5u-.5stem');
pickup fine.nib; numeric bulb_diam;
if serifs: bulb_diam=hround .8[stem,flare];
 pos2(bulb_diam,0); y2+.5bulb_diam=.9[x_height,h+oo];
 if monospace: rt x2r=hround(w-.5u)+1 else: lft x2l=hround(w-.75u+.5) fi;
else: pos2(5/7[vair,flare],90); top y2r=h;
 rt x2=hround(if monospace:w-.5u else:w+.75u fi); fi
f_stroke(1,2,a,b,c,jut,if not monospace:1.25fi\\ jut); % stem, terminal, serif
penlabels(1,2,3,4); endchar;

% cmchar "Variant Old style s";
newchar(Olvs,5.5u#,asc_height#,0);
italcorr asc_height#*slant+if serifs:flare#-.25u# else: 1.25u# fi;
adjust_fit(stem_shift#,if monospace: .5u# else:-stem_shift# fi);
pickup tiny.nib; pos1(stem',0); lft x1l=hround(2.5u-.5stem');
pickup fine.nib; numeric bulb_diam;
if serifs: bulb_diam=hround .8[stem,flare];
 pos2(bulb_diam,0); y2+.5bulb_diam=.9[x_height,h+oo];
 if monospace: rt x2r=hround(w-.5u)+1 else: lft x2l=hround(w-.75u+.5) fi;
else: pos2(5/7[vair,flare],90); top y2r=h;
 rt x2=hround(if monospace:w-.5u else:w+.75u fi); fi
f_stroke(1,2,a,b,c,jut,if not monospace:1.25fi\\ jut); % stem, terminal, serif
pickup crisp.nib;  x93=x1l; top y93r=x_height; pos93(slab,90); pos94(slab,90);
x94=x93-jut; y94=y93; filldraw stroke z93e--z94e;
penlabels(1,2,3,4); endchar;

% cmchar "Old style sl";
newchar(Oldsl,10u#+2letter_fit#,asc_height#,0);
italcorr asc_height#*slant-serif_fit#+.5stem#-2u#;
adjust_fit(0,serif_fit#);
pickup tiny.nib; pos1(stem',0); lft x1l=hround(2.5u-.5stem');
pos11(stem',0); rt x11r=hround(w-2.5u+.5stem');
pos12(stem',0); x11=x12; bot y12=0; top y11=h;
filldraw stroke z11e--z12e;  % right stem
pickup fine.nib; numeric bulb_diam, inner_jut;
if serifs: bulb_diam=hround .4[stem,flare]; % was .8
 pos2(bulb_diam,0); x2r=x11r-stem_corr;
 y2+.5bulb_diam=.9[x_height,h+oo];
 sloped_serif.l(11,12,d,1/3,eps,max(serif_drop,oo)); % erase excess at top
 if rt x1r+jut+.5u+2<=lft x11l-jut: inner_jut=jut;
 else: rt x1r+inner_jut+.5u+2=lft x11l-inner_jut; fi
else: pos2(5/7[vair,flare],90); top y2r=h; rt x2=hround 5.3u; fi
f_stroke(1,2,a,b,c,jut,inner_jut); % left stem, arc, terminal, serif
pickup crisp.nib; top y3r=top y4r=x_height; lft x3=hround .5u-1;
if serifs: 
 dish_serif(12,11,e,1/3,inner_jut,f,1/3,jut);  % lower right serif
 fi
penlabels(1,2,11,12); endchar;

% cmchar "Old style sh";
newchar(Oldsh,15u#+2letter_fit#,asc_height#,0);
italcorr asc_height#*slant-serif_fit#+.5stem#-2u#;
adjust_fit(0,serif_fit#);
w:=w-5u; 
pickup tiny.nib; pos1(stem',0); lft x1l=hround(2.5u-.5stem');
pos11(stem',0); rt x11r=hround(w-2.5u+.5stem');
pos12(stem',0); x11=x12; bot y12=0; top y11=h;
filldraw stroke z11e--z12e;  % right stem
pickup fine.nib; numeric bulb_diam, inner_jut;
if serifs: bulb_diam=hround .4[stem,flare];
 pos2(bulb_diam,0); x2r=x11r-stem_corr;
 y2+.5bulb_diam=.9[x_height,h+oo];
 sloped_serif.l(11,12,d,1/3,eps,max(serif_drop,oo)); % erase excess at top
 if rt x1r+jut+.5u+2<=lft x11l-jut: inner_jut=jut;
 else: rt x1r+inner_jut+.5u+2=lft x11l-inner_jut; fi
else: pos2(5/7[vair,flare],90); top y2r=h; rt x2=hround 5.3u; fi
f_stroke(1,2,a,b,c,jut,inner_jut); % left stem, arc, terminal, serif
w:=w+5u; 
pos23(stem,0); x23=w-x1;
h_stroke(12,q,23,24);         % arch and right stem
if serifs: 
 dish_serif(12,11,e,1/3,inner_jut,f,1/3,inner_jut);  % lower middle serif
 dish_serif(24,23,qq,1/3,inner_jut,qqq,1/3,jut);  % lower right serif
 fi
penlabels(1,2,11,12); endchar;

% cmchar "Old style st";
newchar(Oldst,10u#+max(u#,.5stem#),asc_height#,0);
italcorr x_height#*slant if serifs: -.9u# else: -.4u# fi;
adjust_fit(0,if serifs: 0 else: -.5u# fi);
numeric shaved_stem; shaved_stem=hround(stem if hefty:-\\2stem_corr fi);
pickup fine.nib; pos2(shaved_stem,180);pos3(shaved_stem,180);
lft x2r=lft x3r=hround(2.5u-.5shaved_stem+4u);
y2=y8; y3=max(.5bar_height,2vair);
pickup crisp.nib; pos8(bar,90);
rt x8=hround(w-1.3u); top y8r=x_height; lft x7=hround 13/3u; y7l=y8l;
if hefty: pos7(bar,90);
 filldraw stroke z7e--z8e;  % crossbar
 pickup tiny.nib; pos1(hround(shaved_stem-stem_corr),0);
 rt x1r=fine.rt x2l; top y1=min(asc_height,9/7x_height);
 penpos2'(x1r-x1l,0); x2'=x1; y2'=y2;
 filldraw stroke z1e--z2'e;  % upper terminal
else: pos7(vair,90); pos1(hair,0);
 rt x1r=fine.rt x2l; top y1=min(asc_height,10/7x_height);
 filldraw z1l{down}...{left}z7r--z7l--z8l
  --z8r--(x1r,y8r)--z1r--cycle; fi  % upper terminal and crossbar
pickup fine.nib; interim superness:=more_super;
pos4(vair',-90); bot y4r=-oo; rt x5r=hround(w-u);
if serifs: pos5(hair,0); y5=y3; x4l=.5[x3l,x5l];
 (x,y4r)=whatever[z4l,z5l]; x4r:=max(x,.5[x3r,x4]);
 filldraw stroke z2e..super_arc.e(3,4)...{up}z5e;  % stem and hook
 pickup crisp.nib; pos6(hair,0); pos5'(hair,0);
 x6=x5=x5'; top y6=max(vround .75bar_height,top y5); y5=y5';
 filldraw stroke z5'e--z6e;  % terminal
else: pos5(vair,-75); top y5l=vround .2[top y4l,bar_height];
 x5l:=good.x x5l; x4l=1/3[x3l,x5l]; x4r:=1/3[x3r,x5r]; y3l:=y3l+.2vair;
 filldraw stroke z2e..super_arc.e(3,4);  % stem and hook
 path p; p=stroke z4e{right}..tension .9 and atleast 1..z5e;  % terminal
 if (xpart(z5l-precontrol 1 of p)<0) or (xpart(z5r-postcontrol 2 of p)<0):
  filldraw stroke z4e{right}...{up}z5e;
 else: filldraw p; fi fi;
pickup tiny.nib; pos31(stem',0); lft x31l=hround(2.5u-.5stem');
pickup fine.nib; numeric bulb_diam, inner_jut;
if serifs: bulb_diam=hround .4[stem,flare];
 pos32(bulb_diam,0); x32r=x1r-stem_corr;
 y32+.5bulb_diam=.9[x_height,h+oo];
 inner_jut=jut;
else: pos2(5/7[vair,flare],90); top y2r=h; rt x2=hround 4.3u; fi
f_stroke(31,32,a,b,c,jut,inner_jut); % left stem, arc, terminal, serif
penlabels(1,2,3,4,5,6,7,8,31,32); endchar;

% cmchar "Variant Old style sl";
newchar(Olvsl,10u#+2letter_fit#,asc_height#,0);
italcorr asc_height#*slant-serif_fit#+.5stem#-2u#;
adjust_fit(0,serif_fit#);
pickup tiny.nib; pos1(stem',0); lft x1l=hround(2.5u-.5stem');
pos11(stem',0); rt x11r=hround(w-2.5u+.5stem');
pos12(stem',0); x11=x12; bot y12=0; top y11=h;
filldraw stroke z11e--z12e;  % right stem
pickup fine.nib; numeric bulb_diam, inner_jut;
if serifs: bulb_diam=hround .4[stem,flare]; % was .8
 pos2(bulb_diam,0); x2r=x11r-stem_corr;
 y2+.5bulb_diam=.9[x_height,h+oo];
 sloped_serif.l(11,12,d,1/3,eps,max(serif_drop,oo)); % erase excess at top
 if rt x1r+jut+.5u+2<=lft x11l-jut: inner_jut=jut;
 else: rt x1r+inner_jut+.5u+2=lft x11l-inner_jut; fi
else: pos2(5/7[vair,flare],90); top y2r=h; rt x2=hround 5.3u; fi
f_stroke(1,2,a,b,c,jut,inner_jut); % left stem, arc, terminal, serif
pickup crisp.nib;  x93=x1l; top y93r=x_height; pos93(slab,90); pos94(slab,90);
x94=x93-jut; y94=y93; filldraw stroke z93e--z94e;
if serifs: 
 dish_serif(12,11,e,1/3,inner_jut,f,1/3,jut);  % lower right serif
 fi
penlabels(1,2,11,12); endchar;

% cmchar "Variant Old style sh";
newchar(Olvsh,15u#+2letter_fit#,asc_height#,0);
italcorr asc_height#*slant-serif_fit#+.5stem#-2u#;
adjust_fit(0,serif_fit#);
w:=w-5u; 
pickup tiny.nib; pos1(stem',0); lft x1l=hround(2.5u-.5stem');
pos11(stem',0); rt x11r=hround(w-2.5u+.5stem');
pos12(stem',0); x11=x12; bot y12=0; top y11=h;
filldraw stroke z11e--z12e;  % right stem
pickup fine.nib; numeric bulb_diam, inner_jut;
if serifs: bulb_diam=hround .4[stem,flare];
 pos2(bulb_diam,0); x2r=x11r-stem_corr;
 y2+.5bulb_diam=.9[x_height,h+oo];
 sloped_serif.l(11,12,d,1/3,eps,max(serif_drop,oo)); % erase excess at top
 if rt x1r+jut+.5u+2<=lft x11l-jut: inner_jut=jut;
 else: rt x1r+inner_jut+.5u+2=lft x11l-inner_jut; fi
else: pos2(5/7[vair,flare],90); top y2r=h; rt x2=hround 5.3u; fi
f_stroke(1,2,a,b,c,jut,inner_jut); % left stem, arc, terminal, serif
w:=w+5u; 
pos23(stem,0); x23=w-x1;
h_stroke(12,q,23,24);         % arch and right stem
pickup crisp.nib;  x93=x1l; top y93r=x_height; pos93(slab,90); pos94(slab,90);
x94=x93-jut; y94=y93; filldraw stroke z93e--z94e;
if serifs: 
 dish_serif(12,11,e,1/3,inner_jut,f,1/3,inner_jut);  % lower middle serif
 dish_serif(24,23,qq,1/3,inner_jut,qqq,1/3,jut);  % lower right serif
 fi
penlabels(1,2,11,12); endchar;

% cmchar "Variant Old style st";
newchar(Olvst,10u#+max(u#,.5stem#),asc_height#,0);
italcorr x_height#*slant if serifs: -.9u# else: -.4u# fi;
adjust_fit(0,if serifs: 0 else: -.5u# fi);
numeric shaved_stem; shaved_stem=hround(stem if hefty:-\\2stem_corr fi);
pickup fine.nib; pos2(shaved_stem,180);pos3(shaved_stem,180);
lft x2r=lft x3r=hround(2.5u-.5shaved_stem+4u);
y2=y8; y3=max(.5bar_height,2vair);
pickup crisp.nib; pos8(bar,90);
rt x8=hround(w-1.3u); top y8r=x_height; lft x7=hround 13/3u; y7l=y8l;
if hefty: pos7(bar,90);
 filldraw stroke z7e--z8e;  % crossbar
 pickup tiny.nib; pos1(hround(shaved_stem-stem_corr),0);
 rt x1r=fine.rt x2l; top y1=min(asc_height,9/7x_height);
 penpos2'(x1r-x1l,0); x2'=x1; y2'=y2;
 filldraw stroke z1e--z2'e;  % upper terminal
else: pos7(vair,90); pos1(hair,0);
 rt x1r=fine.rt x2l; top y1=min(asc_height,10/7x_height);
 filldraw z1l{down}...{left}z7r--z7l--z8l
  --z8r--(x1r,y8r)--z1r--cycle; fi  % upper terminal and crossbar
pickup fine.nib; interim superness:=more_super;
pos4(vair',-90); bot y4r=-oo; rt x5r=hround(w-u);
if serifs: pos5(hair,0); y5=y3; x4l=.5[x3l,x5l];
 (x,y4r)=whatever[z4l,z5l]; x4r:=max(x,.5[x3r,x4]);
 filldraw stroke z2e..super_arc.e(3,4)...{up}z5e;  % stem and hook
 pickup crisp.nib; pos6(hair,0); pos5'(hair,0);
 x6=x5=x5'; top y6=max(vround .75bar_height,top y5); y5=y5';
 filldraw stroke z5'e--z6e;  % terminal
else: pos5(vair,-75); top y5l=vround .2[top y4l,bar_height];
 x5l:=good.x x5l; x4l=1/3[x3l,x5l]; x4r:=1/3[x3r,x5r]; y3l:=y3l+.2vair;
 filldraw stroke z2e..super_arc.e(3,4);  % stem and hook
 path p; p=stroke z4e{right}..tension .9 and atleast 1..z5e;  % terminal
 if (xpart(z5l-precontrol 1 of p)<0) or (xpart(z5r-postcontrol 2 of p)<0):
  filldraw stroke z4e{right}...{up}z5e;
 else: filldraw p; fi fi;
pickup tiny.nib; pos31(stem',0); lft x31l=hround(2.5u-.5stem');
pickup fine.nib; numeric bulb_diam, inner_jut;
if serifs: bulb_diam=hround .4[stem,flare];
 pos32(bulb_diam,0); x32r=x1r-stem_corr;
 y32+.5bulb_diam=.9[x_height,h+oo];
 inner_jut=jut;
else: pos2(5/7[vair,flare],90); top y2r=h; rt x2=hround 4.3u; fi
f_stroke(31,32,a,b,c,jut,inner_jut); % left stem, arc, terminal, serif
pickup crisp.nib;  x93=x31l; top y93r=x_height; pos93(slab,90); pos94(slab,90);
x94=x93-jut; y94=y93; filldraw stroke z93e--z94e;
penlabels(1,2,3,4,5,6,7,8,31,32); endchar;

% cmchar "Square Old English G";
newchar(sOEG,12u#-width_adj#,cap_height#,0);
italcorr cap_height#*slant-beak_jut#-.5u#;
adjust_fit(cap_serif_fit#,0);
h:=vround(h-stem_corr);
pickup tiny.nib; pos1(cap_stem,0); pos2(cap_stem,0);
lft x1l=lft x2l=hround max(2u,3u-.5cap_stem); top y1=h; bot y2=0;
filldraw stroke z1e--z2e; % stem
pickup crisp.nib; pos3(slab,90); pos4(hair,0);
top y3r=h; x3=x1; rt x4r=hround(w-u); y4=good.y(y3l-.625beak)-eps;
arm(3,4,e,beak_darkness,beak_jut);  % upper arm and beak
pickup tiny.nib; 
pos8(slab if not serifs:+2stem_corr fi,-90); pos9(stem,0);
bot y8r=0; x8=x2; y9=vround(.48h if serifs: + .5slab fi); x9r=x4r;
arm(8,9,h,.725beak_darkness,0);  % lower arm and right stem
if serifs: nodish_serif(1,2,a,1/3,cap_jut,b,1/3,.5cap_jut);  % upper serif
 nodish_serif(2,1,c,1/3,cap_jut,d,1/3,.5cap_jut);   % lower serif
 pos10(stem,0); x10=x9; y10=0;
 nodish_serif(9,10,q,1/3,jut,qq,1/3,jut); fi % right stem serif  
pairassign(tca,.5w,h);  %top center accentpoint
pairassign(lca,.5w,0);  %low center accentpoint
pairequate(tra,tca); %top right accentpoint
pairequate(tla,tca); %top left accentpoint
pairequate(lla,lca); %low left accentpoint
pairequate(lra,lca); %low right accentpoint
math_fit(0,.5ic#); penlabels(0,1,2,3,4,8,9); endchar;



% cmchar "Old English t";
newchar(OEt,8u#,x_height#,0);
adjust_fit(.5u#,.5u#);
% bar at top
pickup tiny.nib;
x0=hround(.5w); top y0r=h; pos0(slab,90);
x1=w-x2=hround(1/12w);  y1=y2=vround(y0l-beak/4);
pos1(hair,180); pos2(hair,0);
arm(0,1,a,.25beak_darkness,-.125beak_jut); arm(0,2,b,.25beak_darkness,.25beak_jut);
% curve
pickup fine.nib;
x3=.65[x1,x2]; x4=.15[x1,x2]; x5=.65[x1,x2]; x6=.95w; 
y3=y0; y4=.4h; bot y5l=-oo; y6=.15h;
pos3(hair,-45); pos4(stem,0); pos5(slab,90); pos6(hair,135);
%filldraw stroke z3e...{down}z4e...{right}z5e...{2,1}z6e;
filldraw stroke pulled_super_arc.e(3,4)(.5superpull)
  & pulled_super_arc.e(4,5)(.7superpull) & z5e{right}..tension .9 and 1..z6e;
penlabels(1,2,3,4,5,6);
endchar;

% cmchar "Old English r";
newchar(OEr,if serifs: 9u#+stem# else:9.5u# fi,x_height#,1.75desc_depth#);
italcorr x_height#*slant if not serifs: +.25u# fi;
adjust_fit(serif_fit#,0);
w:=w-2u;
pickup tiny.nib; pos0(stem',0); pos2(stem',0);
pos1(hround(stem-3stem_corr),0); top y1=h+min(oo,serif_drop);
pos0'(hround(stem-3stem_corr),0); y0=y0'=bar_height; x1l=x0l=x0'l=x2l;
lft x1l=hround(2.5u-.5stem'); 
% convert the bottom to a spike
bot y2l=-d;
if spike: y2r:=y2l+1.5stem'; x2:=.5[x2l,x2r]; y2:=.5[y2l,y2r]; fi
filldraw stroke z1e--z0'e--z0e--z2e;  % stem
% draw the arch
x20=w-u; pos20(stem,0);
oeh_stroke(2,q,20,21);
% put a rightward facing spike at the baseline;
% pickup crisp.nib;
w:=w+2u;
x30=x21; bot y30l=bot y31l=0; pos30(spickle,90); x31=w-.25u; pos31(spickle,90);
x31l:=x31r-1.5slab; x31:=.5[x31l,x31r]; y31:=.5[y31l,y31r];
filldraw stroke z30e--z31e;
if serifs:
  if not spike: oldeng_serif.l(2,0,b,1/3,jut,3serif_drop); fi
  sloped_serif.l(1,0',a,1/3,jut,serif_drop); fi  % upper serif
penlabels(1,2,3,4,5,6,30,31); endchar;

% cmchar "Old English f";
numeric r_flare#; r_flare#=.75[if serifs: stem# else: vair# fi,flare#];
define_whole_blacker_pixels(r_flare);
newchar(OEf,if serifs:max(8u#,6.5u#+r_flare#) else:7.5u# fi,x_height#,1.75desc_depth#);
italcorr x_height#*slant if not serifs: +.25u# fi;
adjust_fit(serif_fit#,0);
pickup fine.nib; top y4r=h+oo;
if serifs: pos4(vair,90); pos5(hair,0);
 x4=w-max(1.75u,.25u+r_flare);
 rt x5r=hround(w-.5u+.5); y5+.5r_flare=.9[bar_height,h]+oo;
 pos6(r_flare,0); bulb(4,5,6);  % bulb
else: pos4(r_flare,90); rt x4=hround(w-.25u); fi
pos3(thin_join,180); rt x3l=hround(2.5u-.5stem')+stem'; top y3=bar_height;
filldraw stroke z3e{up}...{right}z4e;  % arc
pickup tiny.nib; pos0(stem',0); pos2(stem',0);
pos1(hround(stem-3stem_corr),0); top y1=h+min(oo,serif_drop);
pos0'(hround(stem-3stem_corr),0); y0=y0'=y3; x1l=x0l=x0'l=x2l;
lft x1l=hround(2.5u-.5stem'); 
% convert the bottom to a spike
bot y2l=-d;
if spike: y2r:=y2l+1.5stem'; x2:=.5[x2l,x2r]; y2:=.5[y2l,y2r]; fi
filldraw stroke z1e--z0'e--z0e--z2e;  % stem
% put a rightward facing spike at the baseline;
pickup crisp.nib;
x30=x1; bot y30l=bot y31l=0; pos30(spickle,90); x31=w-u; pos31(spickle,90);
x31l:=x31r-1.5slab; x31:=.5[x31l,x31r]; y31:=.5[y31l,y31r];
filldraw stroke z30e--z31e;
if serifs: 
   if not spike: oldeng_serif.l(2,0,b,1/3,jut,3serif_drop); fi
   sloped_serif.l(1,0',a,1/3,jut,serif_drop);  % upper serif
fi
penlabels(1,2,3,4,5,6,30,31); endchar;

% cmchar "variant Old English s";
numeric r_flare#; r_flare#=.75[if serifs: stem# else: vair# fi,flare#];
define_whole_blacker_pixels(r_flare);
newchar(vOEs,if serifs:max(8u#,6.5u#+r_flare#) else:7.5u# fi,x_height#,1.75desc_depth#);
italcorr x_height#*slant if not serifs: +.25u# fi;
adjust_fit(serif_fit#,0);
pickup fine.nib; top y4r=h+oo;
if serifs: pos4(vair,90); pos5(hair,0);
 x4=w-max(1.75u,.25u+r_flare);
 rt x5r=hround(w-.5u+.5); y5+.5r_flare=.9[bar_height,h]+oo;
 pos6(r_flare,0); bulb(4,5,6);  % bulb
else: pos4(r_flare,90); rt x4=hround(w-.25u); fi
pos3(thin_join,180); rt x3l=hround(2.5u-.5stem')+stem'; top y3=bar_height;
filldraw stroke z3e{up}...{right}z4e;  % arc
pickup tiny.nib; pos0(stem',0); pos2(stem',0);
pos1(hround(stem-3stem_corr),0); top y1=h+min(oo,serif_drop);
pos0'(hround(stem-3stem_corr),0); y0=y0'=y3; x1l=x0l=x0'l=x2l;
lft x1l=hround(2.5u-.5stem'); 
% convert the bottom to a spike
bot y2l=-d;
if spike: y2r:=y2l+1.5stem'; x2:=.5[x2l,x2r]; y2:=.5[y2l,y2r]; fi
filldraw stroke z1e--z0'e--z0e--z2e;  % stem
if serifs: 
   if not spike: oldeng_serif.l(2,0,b,1/3,jut,3serif_drop); fi
   sloped_serif.l(1,0',a,1/3,jut,serif_drop);  % upper serif
fi
penlabels(1,2,3,4,5,6); endchar;

% cmchar "Old English s";
newchar(OEs,7u#,asc_height#,1.75desc_depth#);
italcorr asc_height#*slant+if serifs:flare#-.25u# else: 1.25u# fi;
adjust_fit(stem_shift#,if monospace: .5u# else:-stem_shift# fi);
pickup tiny.nib; pos1(stem,180); lft x1r=hround(2.5u-.5stem);
numeric bulb_diam;
if serifs: bulb_diam=hround .8[stem,flare];
 pos2(bulb_diam,0); pos6(hair,0); y6+.5bulb_diam=.9[x_height,h+oo];
 if monospace: rt x6r=hround(w-.5u)+1 else: lft x6l=hround(w-.75u+.5) fi;
else: pos2(5/7[vair,flare],90); top y2r=h; rt x2=hround(if monospace:w-.5u else: w+.75u fi);
fi
x3=x1; y3=.5[x_height,h]; pos3(stem,180);
if serifs: x4=.625[x3,x6-.5bulb_diam]; else: x4=.625[x3,x2]; fi
top y4r=h+o; pos4(hair,90); y1=-d;
if spike: y1r:=y1l+1.5stem; y1:=.5[y1l,y1r]; fi
filldraw stroke z1e--z3e & pulled_super_arc.e(3,4)(.5superpull);
if serifs: bulb(4,6,2); 
  if not spike: z1'=z1; z3'=z3; pos1'(stem,0); pos3'(stem,0);
     oldeng_serif.l(1',3',q,1/3,jut,3serif_drop); 
  fi
else: x2r=hround(w-.5u); top y2r=vround(h-o); filldraw stroke z4e{right}...z2e;
fi
penlabels(1,2,3,4,6); endchar;

% cmchar "turned semicolon";
numeric dot_diam#; dot_diam#=if monospace: 5/4 fi\\ dot_size#;
define_whole_blacker_pixels(dot_diam);
newchar(tsemi,5u#+comma_depth#,x_height#,0);
adjust_fit(0,0); slantswitch;
x1-.5dot_diam=hround(.5w-.5dot_diam); y1-.5dot_diam=0;
comma(1,a,dot_diam,.2u,comma_depth);  % dot and tail
mirror(x1);
currentpicture:=currentpicture rotatedaround(z1,90) shifted(0,x_height-dot_diam);
pos11(dot_diam,0); pos12(dot_diam,90);
x12=x11; bot y12l=0; z11=z1; dot(11,12);  % dot
endchar;

% cmchar "Wynn";
newchar(Wynn,9u#+serif_fit#,cap_height#,0);
italcorr .5x_height#*slant+min(.5curve#-.85u#,-.1u#);
adjust_fit(serif_fit#,0);
pickup tiny.nib; pos1(stem',0); pos2(stem,0);
pos0'(stem',0); pos0(stem,0); z0l=z0'l; x0'=x1; x0=x2;
lft x1l=hround(2.5u-.5stem'); top y1=h;
numeric edge; edge=rt x2r;
pickup fine.nib; pos3(if hefty:thin_join else: hair fi,90);
pos4(vair',90); pos5(curve,0); pos6(vair,-90);
%rt x3l=1/3[rt x2,edge]; 
x3l=x1r;
y3=3/4[x_height,h];
x4l=max(w-.5(w-serif_fit)+.5u,x3l+stem); top y4r=h+oo;
rt x5r=hround min(w-1.35u+.5curve,w-.6u); y5=.75asc_height;
x6=x3; bot y6r=.4bar_height-oo;
%(x,y4r)=whatever[z3l,z4l]; x4r:=min(x,.5[x5r,x4]);
filldraw stroke z3e{up}...{right}z4e&super_arc.e(4,5)
 &z5e{down}...{down}z6e;  % bowl
% &z5e{down}...{5(x6-x5),y6-y5}z6e;  % bowl
y0=ypart(((edge,h)--(edge,0))intersectionpoint(z3l{up}...{right}z4l));
pickup tiny.nib; bot y2=-d;
filldraw stroke z1e--z0'e--z0e--z2e;  % stem
pickup crisp.nib; pos8(hair,0); pos7'(stem,0);
z7'=z2; x8l=x7'l; bot y8=0;
filldraw stroke z7'e--z8e;  % point
if serifs:  sloped_serif.l(1,2,a,1/3,jut,serif_drop);  % upper serif
 dish_serif(2,0,b,1/3,cap_jut,c,1/3,cap_jut); fi  % lower serif
% oldeng_serif.l(2,0,b,1/3,jut,3serif_drop); fi  % lower serif
penlabels(0,1,2,3,4,5,6,8); endchar;

% cmchar "flat Wynn";
newchar(fWynn,9u#+serif_fit#,cap_height#,0);
italcorr .5x_height#*slant+min(.5curve#-.85u#,-.1u#);
adjust_fit(serif_fit#,0);
pickup tiny.nib; pos1(stem',0); pos2(stem,0);
pos0'(stem',0); pos0(stem,0); z0l=z0'l; x0'=x1; x0=x2;
lft x1l=hround(2.5u-.5stem'); top y1=h;
numeric edge; edge=rt x2r;
pickup fine.nib; pos3(if hefty:thin_join else: hair fi,90);
pos4(cap_band,90); pos5(curve,0); pos6(vair,-90);
%rt x3l=1/3[rt x2,edge]; 
x3l=x1r;
y3=3/4[x_height,h];
x11=x1; pos11(cap_band,90); top y11r=h;
x4l=max(w-.5(w-serif_fit)+.5u,x3l+stem); top y4r=h;
rt x5r=hround min(w-1.35u+.5curve,w-.6u); y5=.75asc_height;
x6=x3; bot y6r=.4bar_height-oo;
%(x,y4r)=whatever[z3l,z4l]; x4r:=min(x,.5[x5r,x4]);
filldraw stroke z11e--z4e&super_arc.e(4,5)
 &z5e{down}...{down}z6e;  % bowl
% &z5e{down}...{5(x6-x5),y6-y5}z6e;  % bowl
y0=ypart(((edge,h)--(edge,0))intersectionpoint(z3l{up}...{right}z4l));
pickup tiny.nib; bot y2=-d;
filldraw stroke z1e--z0'e--z0e--z2e;  % stem
pickup crisp.nib; pos8(hair,0); pos7'(stem,0);
z7'=z2; x8l=x7'l; bot y8=0;
filldraw stroke z7'e--z8e;  % point
if serifs:  nodish_serif(1,2,a,1/3,cap_jut,d,1/3,.5cap_jut);  % upper serif
 dish_serif(2,0,b,1/3,cap_jut,c,1/3,cap_jut); fi  % lower serif
% oldeng_serif.l(2,0,b,1/3,jut,3serif_drop); fi  % lower serif
penlabels(0,1,2,4,5,6,8,11); endchar;

% cmchar "The letter insular g";
newchar(ginsu,8u#,x_height#,desc_depth#);
italcorr x_height#*slant+.25u#;
adjust_fit(0,0);
numeric light_vair,light_curve,loop_top,loop_side;
light_vair=Vround(.5[thin_join,vair]+vair_corr);
light_curve=max(fine.breadth,hround(curve-3stem_corr));
loop_top=Vround .77[vair,fudged.stem];
loop_side=hround .64[vair,fudged.stem];
pickup fine.nib; pos1(light_vair,90);
pos2(light_curve,180); pos3(light_vair,270);
pos4(light_curve,360); pos11(loop_top,90);
y11r=good.y(y11r+.215bar_height-y11); x1=x3=.5[x2,x4]; y2=y4=.5[y1,y3];
lft x2r=hround(1.75u-.5light_curve); rt x4r=hround(w-2.75u+.5light_curve);
top y1r=h+oo; y3r=good.y(y3r+.27[top y11r,bot y1l]-y3);
x0=superness[x1r,x4r]; y0=superness[y4r,y1r];  % NE point on the super bowl
x8'=superness[x3r,x2r]; y8'=superness[y2r,y3r];  % SW point on the super bowl
x8''=superness[x3,x2]; y8''=superness[y2,y3];
pos0(thin_join,angle(z0-z8')+90);
pos8(thin_join,angle(z0-z8')-90); z8=.618[z8',z8''];
if serifs: pos5(vair,90);
 pos6(hair,0); pos7(.5[hair,flare],0); x5=.75[x0,x6]; top y5r=h+o;
 rt x6r=hround(w-.25u); y6+(.5[hair,flare])/2=.95[bar_height,h]+oo;
% filldraw stroke z0e..{right}z5e; bulb(5,6,7);  % ear
else: pos5(vair',100); top y5r=h+oo;
 rt x5l=hround(w-.25u); y5l:=good.y y5l;
% filldraw z0l{z5-z0}..z5l--z5r{left}..{curl 1}z0r--cycle;   % ear
fi
pos10(loop_top,90); x10=x8+.75u; y10=y11;
pos12(loop_side,0); pos13(light_vair,-90);
pos14(loop_side,-180); pos10'(.5[thin_join,vair],-270);
rt x12r=hround max(w-1.25u+.5loop_side,w-.5u); y12=y14=.5[y11,y13];
x11=x13=max(.5w,x10+eps); bot y13r=-d-oo-1; x14=w-x12; z10'l=z10l;
x83=.9w; top y83r=h; pos83(slab,90); x43r:=x43r+slab;
lft x84l=.65u; pos84(hair,180); y84=good.y(y83l-.35beak)-eps;
arm(83,84,q,beak_darkness,.35beak_jut);
rt x85r=rt x83l; y85=y83l; pos85(.5[slab,curve],0);
z88=z8; y88:=y88-.75u; pos88(hair,0); 
filldraw stroke z85e{-20,-1}...z88e..z10e---z11e;  % link
filldraw stroke {{interim superness:=hein_super; super_arc.e(11,12)}}
 & super_arc.e(12,13) & super_arc.e(13,14) & super_arc.e(14,10');  % loop
pickup penpixel; cullit;
draw z85{-20,-1}...z88..z10---z11;  % extra trace on this tenuous curve
pickup fine.nib;
pairassign(tca,.5w,h);  %top center accentpoint
pairassign(lca,.5w,-d);  %low center accentpoint
pairequate(tra,tca); %top right accentpoint
pairequate(tla,tca); %top left accentpoint
pairequate(lla,lca); %low left accentpoint
pairequate(lra,lca); %low right accentpoint
penlabels(83,84,88,10,11,12,13,14); 
endchar;

% cmchar "The letter insular G";
newchar(Ginsu,10u#,cap_height#,0);
italcorr x_height#*slant+.25u#;
adjust_fit(0,0);
numeric light_vair,light_curve,loop_top,loop_side;
light_vair=Vround(.5[thin_join,vair]+vair_corr);
light_curve=max(fine.breadth,hround(curve-3stem_corr));
loop_top=Vround .77[vair,fudged.stem];
loop_side=hround .64[vair,fudged.stem];
pickup fine.nib; pos1(light_vair,90);
pos2(light_curve,180); pos3(light_vair,270);
pos4(light_curve,360); pos11(loop_top,90);
y11r=good.y(y11r+.15bar_height+cap_height-x_height-y11); x1=x3=.5[x2,x4]; y2=y4=.5[y1,y3];
lft x2r=hround(1.75u-.5light_curve); rt x4r=hround(w-2.75u+.5light_curve);
top y1r=h+oo; y3r=good.y(y3r+.27[top y11r,bot y1l]-y3);
%filldraw stroke pulled_arc.e(1,2) & pulled_arc.e(2,3);  % left half of bowl
%filldraw stroke pulled_arc.e(3,4) & pulled_arc.e(4,1);  % right half of bowl
x0=superness[x1r,x4r]; y0=superness[y4r,y1r];  % NE point on the super bowl
x8'=superness[x3r,x2r]; y8'=superness[y2r,y3r];  % SW point on the super bowl
x8''=superness[x3,x2]; y8''=superness[y2,y3];
pos0(thin_join,angle(z0-z8')+90);
pos8(thin_join,angle(z0-z8')-90); z8=.618[z8',z8''];
if serifs: pos5(vair,90);
 pos6(hair,0); pos7(.5[hair,flare],0); x5=.75[x0,x6]; top y5r=h+o;
 rt x6r=hround(w-.25u); y6+(.5[hair,flare])/2=.95[bar_height,h]+oo;
% filldraw stroke z0e..{right}z5e; bulb(5,6,7);  % ear
else: pos5(vair',100); top y5r=h+oo;
 rt x5l=hround(w-.25u); y5l:=good.y y5l;
% filldraw z0l{z5-z0}..z5l--z5r{left}..{curl 1}z0r--cycle;   % ear
fi
pos10(loop_top,90); x10=x8+.75u; y10=y11;
pos12(loop_side,0); pos13(light_vair,-90);
pos14(loop_side,-180); pos10'(.5[thin_join,vair],-270);
rt x12r=hround max(w-1.25u+.5loop_side,w-.5u); y12=y14=.5[y11,y13];
x11=x13=max(.5w,x10+eps); bot y13r=-d-oo-1; x14=w-x12; z10'l=z10l;
x83=.9w; top y83r=h; pos83(slab,90); x43r:=x43r+slab;
lft x84l=.65u; pos84(hair,180); y84=good.y(y83l-.5beak)-eps;
arm(83,84,q,beak_darkness,.5beak_jut);
rt x85r=rt x83l; y85=y83l; pos85(.5[slab,curve],0);
z88=z8; y88:=y88-.75u; pos88(hair,0); 
filldraw stroke z85e{-4,-1}...z88e..z10e---z11e;  % link
filldraw stroke {{interim superness:=hein_super; super_arc.e(11,12)}}
 & super_arc.e(12,13) & super_arc.e(13,14) & super_arc.e(14,10');  % loop
pickup penpixel; cullit;
draw z85{-4,-1}...z88..z10---z11;  % extra trace on this tenuous curve
pickup fine.nib;
pairassign(tca,.5w,h);  %top center accentpoint
pairequate(lca,z6);  %low center accentpoint
pairequate(tra,tca); %top right accentpoint
pairequate(tla,tca); %top left accentpoint
pairequate(lla,lca); %low left accentpoint
pairequate(lra,lca); %low right accentpoint
penlabels(0,1,2,3,4,5,6,7,8,10,11,12,13,14); labels(8',8''); endchar;
% this is actually now made with odot.ginsu
% cmchar "The letter insular g dot";
newchar(gidot,8u#,asc_height#,desc_depth#);
italcorr x_height#*slant+.25u#;
adjust_fit(0,0); h:=x_height;
numeric light_vair,light_curve,loop_top,loop_side;
light_vair=Vround(.5[thin_join,vair]+vair_corr);
light_curve=max(fine.breadth,hround(curve-3stem_corr));
loop_top=Vround .77[vair,fudged.stem];
loop_side=hround .64[vair,fudged.stem];
pickup fine.nib; pos1(light_vair,90);
pos2(light_curve,180); pos3(light_vair,270);
pos4(light_curve,360); pos11(loop_top,90);
%y11r=good.y(y11r+.15bar_height-y11); x1=x3=.5[x2,x4]; y2=y4=.5[y1,y3];
y11r=good.y(y11r+.215bar_height-y11); x1=x3=.5[x2,x4]; y2=y4=.5[y1,y3];
lft x2r=hround(1.75u-.5light_curve); rt x4r=hround(w-2.75u+.5light_curve);
top y1r=h+oo; y3r=good.y(y3r+.27[top y11r,bot y1l]-y3);
%filldraw stroke pulled_arc.e(1,2) & pulled_arc.e(2,3);  % left half of bowl
%filldraw stroke pulled_arc.e(3,4) & pulled_arc.e(4,1);  % right half of bowl
x0=superness[x1r,x4r]; y0=superness[y4r,y1r];  % NE point on the super bowl
x8'=superness[x3r,x2r]; y8'=superness[y2r,y3r];  % SW point on the super bowl
x8''=superness[x3,x2]; y8''=superness[y2,y3];
pos0(thin_join,angle(z0-z8')+90);
pos8(thin_join,angle(z0-z8')-90); z8=.618[z8',z8''];
if serifs: pos5(vair,90);
 pos6(hair,0); pos7(.5[hair,flare],0); x5=.75[x0,x6]; top y5r=h+o;
 rt x6r=hround(w-.25u); y6+(.5[hair,flare])/2=.95[bar_height,h]+oo;
% filldraw stroke z0e..{right}z5e; bulb(5,6,7);  % ear
else: pos5(vair',100); top y5r=h+oo;
 rt x5l=hround(w-.25u); y5l:=good.y y5l;
% filldraw z0l{z5-z0}..z5l--z5r{left}..{curl 1}z0r--cycle;   % ear
fi
pos10(loop_top,90); x10=x8+.75u; y10=y11;
pos12(loop_side,0); pos13(light_vair,-90);
pos14(loop_side,-180); pos10'(.5[thin_join,vair],-270);
rt x12r=hround max(w-1.25u+.5loop_side,w-.5u); y12=y14=.5[y11,y13];
x11=x13=max(.5w,x10+eps); bot y13r=-d-oo-1; x14=w-x12; z10'l=z10l;
x83=.9w; top y83r=h; pos83(slab,90); x43r:=x43r+slab;
lft x84l=.65u; pos84(hair,180); y84=good.y(y83l-.35beak)-eps;
arm(83,84,q,beak_darkness,.35beak_jut);
rt x85r=rt x83l; y85=y83l; pos85(.5[slab,curve],0);
z88=z8; y88:=y88-.75u; pos88(hair,0); 
filldraw stroke z85e{-20,-1}...z88e..z10e---z11e;  % link
filldraw stroke {{interim superness:=hein_super; super_arc.e(11,12)}}
 & super_arc.e(12,13) & super_arc.e(13,14) & super_arc.e(14,10');  % loop
x138=.5w; y138=x_height; 
overdot(138,cq);
penlabels(0,1,2,3,4,5,6,7,8,10,11,12,13,14); labels(8',8''); endchar;


% cmchar "The letter insular G dot";
newchar(Gidot,10u#,cap_height#,0);
italcorr x_height#*slant+.25u#;
adjust_fit(0,0); h:=cap_height;
numeric light_vair,light_curve,loop_top,loop_side;
light_vair=Vround(.5[thin_join,vair]+vair_corr);
light_curve=max(fine.breadth,hround(curve-3stem_corr));
loop_top=Vround .77[vair,fudged.stem];
loop_side=hround .64[vair,fudged.stem];
pickup fine.nib; pos1(light_vair,90);
pos2(light_curve,180); pos3(light_vair,270);
pos4(light_curve,360); pos11(loop_top,90);
y11r=good.y(y11r+.15bar_height+cap_height-x_height-y11); x1=x3=.5[x2,x4]; y2=y4=.5[y1,y3];
lft x2r=hround(1.75u-.5light_curve); rt x4r=hround(w-2.75u+.5light_curve);
top y1r=h+oo; y3r=good.y(y3r+.27[top y11r,bot y1l]-y3);
%filldraw stroke pulled_arc.e(1,2) & pulled_arc.e(2,3);  % left half of bowl
%filldraw stroke pulled_arc.e(3,4) & pulled_arc.e(4,1);  % right half of bowl
x0=superness[x1r,x4r]; y0=superness[y4r,y1r];  % NE point on the super bowl
x8'=superness[x3r,x2r]; y8'=superness[y2r,y3r];  % SW point on the super bowl
x8''=superness[x3,x2]; y8''=superness[y2,y3];
pos0(thin_join,angle(z0-z8')+90);
pos8(thin_join,angle(z0-z8')-90); z8=.618[z8',z8''];
if serifs: pos5(vair,90);
 pos6(hair,0); pos7(.5[hair,flare],0); x5=.75[x0,x6]; top y5r=h+o;
 rt x6r=hround(w-.25u); y6+(.5[hair,flare])/2=.95[bar_height,h]+oo;
% filldraw stroke z0e..{right}z5e; bulb(5,6,7);  % ear
else: pos5(vair',100); top y5r=h+oo;
 rt x5l=hround(w-.25u); y5l:=good.y y5l;
% filldraw z0l{z5-z0}..z5l--z5r{left}..{curl 1}z0r--cycle;   % ear
fi
pos10(loop_top,90); x10=x8+.75u; y10=y11;
pos12(loop_side,0); pos13(light_vair,-90);
pos14(loop_side,-180); pos10'(.5[thin_join,vair],-270);
rt x12r=hround max(w-1.25u+.5loop_side,w-.5u); y12=y14=.5[y11,y13];
x11=x13=max(.5w,x10+eps); bot y13r=-d-oo-1; x14=w-x12; z10'l=z10l;
x83=.9w; top y83r=h; pos83(slab,90); x43r:=x43r+slab;
lft x84l=.65u; pos84(hair,180); y84=good.y(y83l-.5beak)-eps;
arm(83,84,q,beak_darkness,.5beak_jut);
rt x85r=rt x83l; y85=y83l; pos85(.5[slab,curve],0);
z88=z8; y88:=y88-.75u; pos88(hair,0); 
filldraw stroke z85e{-4,-1}...z88e..z10e---z11e;  % link
filldraw stroke {{interim superness:=hein_super; super_arc.e(11,12)}}
 & super_arc.e(12,13) & super_arc.e(13,14) & super_arc.e(14,10');  % loop
x102=.5[x83,x84]; y102=cap_height; 
overdot(102,cq);
sethtto(h+2dot_diam);
penlabels(0,1,2,3,4,5,6,7,8,10,11,12,13,14); labels(8',8''); endchar;

% cmchar "Scandinavian letter o/slash";
newchar(oslsh,9u#,x_height#+.5desc_depth#,.5desc_depth#);
italcorr h#*slant-u#-max(.5fudge*stem#,.75u#)+.5vair#;
adjust_fit(0,0);
penpos1(vair,90); penpos3(vair,-90);
penpos2(fudged.stem,180); penpos4(fudged.stem,0);
x2r=hround max(.5u,1.25u-.5fudged.stem);
x4r=w-x2r; x1=x3=.5w;
y1r=x_height+vround 1.5oo; y2=y4=.5x_height-vair_corr; y3r=-oo;
penstroke pulled_arc.e(1,2) & pulled_arc.e(2,3)
 & pulled_arc.e(3,4) & pulled_arc.e(4,1) & cycle;  % bowl
x5=x4; x6=x2; y5=h; y6=-d;
numeric theta; theta=angle(z5-z6)-90;
pickup crisp.nib; pos5(vair,theta); pos6(vair,theta);
filldraw stroke z5e--z6e;  % diagonal
penlabels(1,2,3,4,5,6); endchar;

% cmchar "Lowercase thorn";
newchar(thorn,10u#+serif_fit#,asc_height#,1.75desc_depth#);
italcorr .5x_height#*slant+min(.5curve#-.85u#,-.1u#);
adjust_fit(serif_fit#,0);
pickup tiny.nib; pos1(stem',0); pos2(stem,0);
pos0'(stem',0); pos0(stem,0); z0l=z0'l; x0'=x1; x0=x2;
lft x1l=hround(2.5u-.5stem'); top y1=h;
numeric edge; edge=rt x2r;
pickup fine.nib; pos3(if hefty:thin_join else: hair fi,180);
pos4(vair',90); pos5(curve,0); pos6(vair,-90);
rt x3l=1/3[rt x2,edge]; y3=1/8[bar_height,x_height];
x4l=w-.5(w-serif_fit)+.5u; top y4r=x_height+oo;
rt x5r=hround min(w-1.35u+.5curve,w-.6u); y5=.5x_height;
x6=x3; bot y6r=-oo;
(x,y4r)=whatever[z3l,z4l]; x4r:=min(x,.5[x5r,x4]);
filldraw stroke z3e{up}...{right}z4e&super_arc.e(4,5)
 &z5e{down}...{5(x6-x5),y6-y5}z6e;  % bowl
y0=ypart(((edge,h)--(edge,0))intersectionpoint(z3l{up}...{right}z4l));
pickup tiny.nib; bot y2=-d;
filldraw stroke z1e--z0'e--z0e--z2e;  % stem
pickup crisp.nib; pos8(hair,0); pos7'(stem,0);
z7'=z2; x8l=x7'l; bot y8=0;
filldraw stroke z7'e--z8e;  % point
if serifs: sloped_serif.l(1,0',a,1/3,jut,serif_drop);  % upper serif
 oldeng_serif.l(2,0,b,1/3,jut,3serif_drop); fi  % lower serif
penlabels(0,1,2,3,4,5,6,8); endchar;


% cmchar "Uppercase thorn";
newchar(Thorn,11u#+serif_fit#,body_height#,1.75desc_depth#);
italcorr .5x_height#*slant+min(.5curve#-.85u#,-.1u#);
adjust_fit(serif_fit#,0);
pickup tiny.nib; pos1(stem',0); pos2(stem,0);
pos0'(stem',0); pos0(stem,0); z0l=z0'l; x0'=x1; x0=x2;
lft x1l=hround(2.5u-.5stem'); top y1=h;
numeric edge; edge=rt x2r;
pickup fine.nib; pos3(if hefty:thin_join else: hair fi,180);
pos4(vair',90); pos5(curve,0); pos6(vair,-90);
rt x3l=1/3[rt x2,edge]; y3=.15[x_height,asc_height]; % was y3=.5[x_height,asc_height]
x4l=w-.5(w-serif_fit)+.5u; top y4r=.675[x_height,asc_height];
rt x5r=hround min(w-1.35u+.5curve,w-.6u); y5=.575asc_height;
x6=x3; bot y6r=-oo; % =.4bar_height-oo;
(x,y4r)=whatever[z3l,z4l]; x4r:=min(x,.5[x5r,x4]);
filldraw stroke z3e{up}...{right}z4e&super_arc.e(4,5)
 &z5e{down}...{5(x6-x5),y6-y5}z6e;  % bowl
% &z5e{down}...{down}z6e;  % bowl
y0=ypart(((edge,h)--(edge,0))intersectionpoint(z3l{up}...{right}z4l));
pickup tiny.nib; bot y2=-d;
filldraw stroke z1e--z0'e--z0e--z2e;  % stem
pickup crisp.nib; pos8(hair,0); pos7'(stem,0);
z7'=z2; x8l=x7'l; bot y8=-d;
filldraw stroke z7'e--z8e;  % point
if serifs: sloped_serif.l(1,0',a,1/3,jut,serif_drop);  % upper serif
 oldeng_serif.l(2,0,b,1/3,jut,3serif_drop); fi  % lower serif
penlabels(0,1,2,3,4,5,6,8); endchar;

% cmchar "wynn";
newchar(wynn,9u#+serif_fit#,x_height#,1.75desc_depth#);
italcorr .5x_height#*slant+min(.5curve#-.85u#,-.1u#);
adjust_fit(serif_fit#,0);
pickup tiny.nib; pos1(stem',0); pos2(stem,0);
pos0'(stem',0); pos0(stem,0); z0l=z0'l; x0'=x1; x0=x2;
lft x1l=hround(2.5u-.5stem'); top y1=h;
numeric edge; edge=rt x2r;
pickup fine.nib; pos3(if hefty:thin_join else: hair fi,180);
pos4(vair',90); pos5(curve,0); pos6(if hefty:thin_join else: vair fi,-90);
rt x3l=1/3[rt x2,edge]; y3=5/8[bar_height,x_height];
x4l=w-.5(w-serif_fit)+.5u; top y4r=x_height+oo;
rt x5r=hround min(w-1.35u+.5curve,w-.6u); y5=.5x_height;
x6=x3; bot y6r=-curve-oo;
(x,y4r)=whatever[z3l,z4l]; x4r:=min(x,.5[x5r,x4]);
filldraw stroke z3e{up}...{right}z4e&super_arc.e(4,5)
 &z5e{down}...{5(x6-x5),y6-y5}z6e;  % bowl
y0=ypart(((edge,h)--(edge,0))intersectionpoint(z3l{up}...{right}z4l));
pickup tiny.nib; bot y2=-d;
filldraw stroke z1e--z0'e--z0e--z2e;  % stem
pickup crisp.nib; pos8(hair,0); pos7'(stem,0);
z7'=z2; x8l=x7'l; bot y8=0;
filldraw stroke z7'e--z8e;  % point
if serifs: sloped_serif.l(1,2,a,1/3,jut,serif_drop);  % upper serif
 oldeng_serif.l(2,0,b,1/3,jut,3serif_drop); fi  % lower serif
penlabels(0,1,2,3,4,5,6,8); endchar;


% cmchar "flat wynn";
newchar(fwynn,9u#+serif_fit#,x_height#,1.75desc_depth#);
italcorr .5x_height#*slant+min(.5curve#-.85u#,-.1u#);
adjust_fit(serif_fit#,0);
pickup tiny.nib; pos1(stem',0); pos2(stem,0);
pos0'(stem',0); pos0(stem,0); z0l=z0'l; x0'=x1; x0=x2;
lft x1l=hround(2.5u-.5stem'); top y1=h;
numeric edge; edge=rt x2r;
pickup tiny.nib; pos3(slab,90);
pos4(slab,90); pos5(curve,0); pos6(if hefty:thin_join else: vair fi,-90);
 x3=x1r; top y3r=h;
x4l=w-.5(w-serif_fit)+.5u; 
top y4r=h;
rt x5r=hround min(w-1.35u+.5curve,w-.6u); y5=.5x_height;
x6=x3; bot y6r=-curve-oo;
%x4:=.6[x3,x5]; % (x,y4r)=whatever[z3l,z4l]; x4r:=min(x,.5[x5r,x4]);
filldraw stroke z3e--z4e&super_arc.e(4,5)
 &z5e{down}...{5(x6-x5),y6-y5}z6e;  % bowl
y0=ypart(((edge,h)--(edge,0))intersectionpoint(z3l{up}...{right}z4l));
pickup tiny.nib; bot y2=-d;
filldraw stroke z1e--z0'e--z0e--z2e;  % stem
pickup crisp.nib; pos8(hair,0); pos7'(stem,0);
z7'=z2; x8l=x7'l; bot y8=0;
filldraw stroke z7'e--z8e;  % point
if serifs: nodish_serif(1,2,a,1/3,jut,aa,1/3,jut);  % upper serif
 oldeng_serif.l(2,0,b,1/3,jut,3serif_drop); fi  % lower serif
penlabels(0,1,2,3,4,5,6,8); endchar;


% cmchar "The letter DBAR";
newchar(Dcros,13.5u#,cap_height#,0);
italcorr .7cap_height#*slant-.5u#;
adjust_fit(cap_serif_fit#,0);
pickup tiny.nib; pos1(cap_stem',0); pos2(cap_stem',0);
lft x1l=lft x2l=hround max(2u,3u-.5cap_stem'); top y1=h; bot y2=0;
filldraw stroke z1e--z2e; % stem
penpos3(cap_band,90); penpos4(cap_band,90);
penpos5(cap_curve-stem_corr,0);
penpos6(cap_band,-90); penpos7(cap_band,-90);
z3r=top z1; y4=y3; y5=.51[y4,y6]; y6=y7;
z7r=bot z2; x4=x6=.5w+.25u; x5r=hround(w-u);
x4l:=x6l:=x4-.25cap_curve;
fill stroke z3e..pulled_arc.e(4,5) & pulled_arc.e(5,6)..z7e;  % lobe
% bar the D
x77=x3-2.5u; x78=x3+2.5u; y77=y78=.62[y2,y3];
pos77(bar,90); pos78(bar,90);
filldraw stroke z77e--z78e;
if serifs: nodish_serif(1,2,a,1/3,cap_jut,b,1/3,.5cap_jut);  % upper serif
 nodish_serif(2,1,c,1/3,cap_jut,d,1/3,.5cap_jut); fi  % lower serif
math_fit(0,ic#-.5u#); penlabels(1,2,3,4,5,6,7); endchar;

% cmchar "The letter Yogh";
newchar(Yogh,12u#,cap_height#,desc_depth#);
italcorr cap_height#*slant-.5u#;
adjust_fit(0,0);
numeric arm_thickness[],z_stem;
if hefty: arm_thickness1=Vround(slab-vair_corr); arm_thickness2=slab;
 z_stem=.8[vair,cap_stem];
else: arm_thickness1=slab; arm_thickness2=vround(slab+vair_corr);
 z_stem=.8[vair,cap_stem]; fi
pickup tiny.nib; x3l=w-x1r=w-x2r; lft x3l=hround u; x4=x3+4u;
top y1=h; y2=min(y1,h-2/3arm_thickness1);
bot y4=1.2bar_height; y3=max(y4,y4+2/3arm_thickness2);
numeric alpha; alpha=diag_ratio(1,z_stem-tiny,y2-y3,x2r-x3l);
penpos1(alpha*(z_stem-tiny),0); penpos2(alpha*(z_stem-tiny),0);
penpos3(alpha*(z_stem-tiny),0); penpos4(alpha*(z_stem-tiny),0);
pair delta; delta=penoffset z3-z2 of currentpen;
%fill top lft z1l--z2l+delta---z3l+delta..lft z3l---lft z4l..bot z4l
% ---bot rt z4r--z3r-delta---z2r-delta..rt z2r---rt z1r..top z1r
% ---cycle;  % diagonal
fill top lft z1l--z2l+delta---lft z4l..bot z4l
 ---bot rt z4r---z2r-delta..rt z2r---rt z1r..top z1r
 ---cycle;  % diagonal
pickup crisp.nib; pos5(arm_thickness1,90); pos6(hair,180);
top y5r=h; x5=x1; lft x6r=hround 2.25u; y6=good.y(y5l-beak)-eps;
arm(5,6,a,beak_darkness**.8,-.4beak_jut);  % upper arm and beak
pos7(arm_thickness2,-90); pos8(hair,0);
bot y7r=0; x7=x4; rt x8r=hround(w-.9u); y8=good.y(y7l+1.2beak)+eps;
%arm(7,8,b,beak_darkness**.9,.6beak_jut);  % lower arm and beak
% HACC from here
bot_thickness:=max(fine.breadth,vround (slab-vair_corr));
mid_thickness:=max(fine.breadth,vround 2/3vair);
bot y28=-desc_depth; x28=.45w;
y27=.5[y4,y28]; rt x27r=rt x1r; 
pickup fine.nib;
pos22(mid_thickness,90); lft x22l=lft x4l; y22=y4;
pos27(cap_curve,0); pos28(bot_thickness,-90);
% show mid_thickness,bot_thickness;
% show z21,z21r,z21l,z22,z22r,z22l,z27,z27r,z27l,z28,z28r,z28l;
if serifs: numeric bulb_diam[];
% bulb_diam1=flare+.5(cap_stem-stem); 
if monospace: bulb_diam2:=flare+cap_stem-stem else: bulb_diam2:=.85flare+cap_stem-stem fi;
% pos0(bulb_diam1,180); pos1(hair,180);
% lft x0r=hround 1.25u; y0=min(.9h-.5bulb_diam1,.75h+.5bulb_diam1);
% bulb(2,1,0);  % upper bulb
 pos30(bulb_diam2,-180-.5angle(x1-x4,y1-y4)); pos29(cap_hair,-180);
 lft x30r=hround .75u; y30=0; %y30=-.5bulb_diam2; 
% bulb(28,29,30);  % lower bulb
else:  pos29(bot_thickness,angle(-2u,-h));
 lft x29r=hround .75u; top y29l= -o;
 y29r:=good.y y29r-eps; x29l:=good.x x29l;
z30=z29; pos30(bot_thickness,angle(-2u,-h));
%  filldraw stroke term.e(2,1,left,1,4);  % upper terminal
% filldraw stroke term.e(28,29,left,1,4); 
fi  % lower terminal
filldraw stroke pulled_super_arc.e(22,27)(.5superpull)
 & pulled_super_arc.e(27,28)(.5superpull) & pulled_super_arc.e(28,30)(.5superpull);
math_fit(0,.5ic#); penlabels(1,2,3,4,5,6,7,8); endchar;

% cmchar "The letter yogh";
newchar(yogh,9u#,x_height#,0);
italcorr x_height#*slant-.5serif_fit#-.3u#;
adjust_fit(0,.5serif_fit#);
numeric arm_thickness[],z_stem,mid_thickness,bot_thickness;
if hefty: arm_thickness1=Vround(vair-vair_corr); arm_thickness2=vair;
 z_stem=.6[vair,stem];
else: arm_thickness1=vair; arm_thickness2=vair'; z_stem=.9[vair,stem]; fi
pickup tiny.nib; rt x1r=rt x2r=hround(w-.8u); lft x3l=lft x4l=hround .5u;
top y1=h; y2=min(y1,h-2/3arm_thickness1);
bot y4=0; y3=max(y4,2/3arm_thickness2);
numeric alpha; alpha=diag_ratio(1,z_stem-tiny,y2-y3,x2r-x3l-slant*(y2-y3));
penpos1(alpha*(z_stem-tiny),0); penpos2(alpha*(z_stem-tiny),0);
penpos3(alpha*(z_stem-tiny),0); penpos4(alpha*(z_stem-tiny),0);
z21=.6[z1,z3]; penpos21(alpha*(z_stem-tiny),0);  %UW_HACC
pair delta; delta=penoffset z3-z2 of currentpen;
fill top lft z1l--z2l+delta---z21l+delta..lft z21l---z21r..rt z21r-delta
---z2r-delta..rt z2r---rt z1r..top z1r---cycle; % short diag
pickup crisp.nib; pos5(arm_thickness1,90); pos6(hair,180);
top y5r=h; x5=x1; lft x6r=hround 1.75u; y6=good.y(y5l-beak/1.4)-eps;
arm(5,6,a,beak_darkness,-.4beak_jut);  % upper arm and beak
%% from here on all is UW_HACC
bot_thickness:=max(fine.breadth,vround (slab-vair_corr));
mid_thickness:=max(fine.breadth,vround 2/3vair);
bot y28=-desc_depth; x28=.45w;
y27=0; rt x27r=rt x1r; 
pickup fine.nib;
pos22(mid_thickness,90); lft x22l=lft x21l; y22=y21;
pos27(cap_curve,0); pos28(bot_thickness,-90);
if serifs: numeric bulb_diam[];
if monospace: bulb_diam2:=flare+cap_stem-stem else: bulb_diam2:=.5flare+cap_stem-stem fi;
 pos30(bulb_diam2,-180-angle(x1-x4,y1-y4)); pos29(cap_hair,-180);
 lft x30r=hround .75u; y30=-.5bulb_diam2; 
else:  pos29(bot_thickness,angle(-2u,-h));
 lft x29r=hround .75u; top y29l= -o;
 y29r:=good.y y29r-eps; x29l:=good.x x29l;
z30=z29; pos30(bot_thickness,angle(-2u,-h));
fi  
filldraw stroke pulled_super_arc.e(22,27)(.5superpull)
 & pulled_super_arc.e(27,28)(.5superpull) & pulled_super_arc.e(28,30)(.5superpull);
penlabels(1,2,3,4,5,6,21,27,28,29); endchar;

% cmchar "that abbreviation";
newchar(cthrn,10u#+serif_fit#,asc_height#,1.75desc_depth#);
italcorr .5x_height#*slant+min(.5curve#-.85u#,-.1u#);
adjust_fit(serif_fit#,0);
pickup tiny.nib; pos1(stem',0); pos2(stem,0);
pos0'(stem',0); pos0(stem,0); z0l=z0'l; x0'=x1; x0=x2;
lft x1l=hround(2.5u-.5stem'); top y1=h;
numeric edge; edge=rt x2r;
pickup fine.nib; pos3(if hefty:thin_join else: hair fi,180);
pos4(vair',90); pos5(curve,0); pos6(vair,-90);
rt x3l=1/3[rt x2,edge]; y3=1/8[bar_height,x_height];
x4l=w-.5(w-serif_fit)+.5u; top y4r=x_height+oo;
rt x5r=hround min(w-1.35u+.5curve,w-.6u); y5=.5x_height;
x6=x3; bot y6r=-oo;
(x,y4r)=whatever[z3l,z4l]; x4r:=min(x,.5[x5r,x4]);
filldraw stroke z3e{up}...{right}z4e&super_arc.e(4,5)
 &z5e{down}...{5(x6-x5),y6-y5}z6e;  % bowl
y0=ypart(((edge,h)--(edge,0))intersectionpoint(z3l{up}...{right}z4l));
pickup tiny.nib; bot y2=-d;
filldraw stroke z1e--z0'e--z0e--z2e;  % stem
pickup crisp.nib; pos8(hair,0); pos7'(stem,0);
z7'=z2; x8l=x7'l; bot y8=0;
filldraw stroke z7'e--z8e;  % point
if serifs: sloped_serif.l(1,0',a,1/3,jut,serif_drop);  % upper serif
 oldeng_serif.l(2,0,b,1/3,jut,3serif_drop); fi  % lower serif
x99=x1-2.25u; x100=x1+2.25u; y99=.05[x_height,asc_height]; y100=.65[x_height,asc_height];
pos99(bar,135); pos100(bar,135);
filldraw stroke z99e--z100e;
penlabels(0,1,2,3,4,5,6,8); endchar;


% cmchar "mid-line period";
numeric dot_diam#; dot_diam#=if monospace: 5/4 fi\\ dot_size#;
define_whole_blacker_pixels(dot_diam);
newchar(cdot,5u#,bar_height#,0);
adjust_fit(0,0); pickup fine.nib;
pos1(dot_diam,0); pos2(dot_diam,90);
lft x1l=hround(.5w-.5dot_diam); bot y2l=0; z1=z2; dot(1,2);  % dot
currentpicture:=currentpicture shifted(0,bar_height-.5dot_diam);
endchar;


endinput;

% cmchar "alternate eth";
newchar(254,8u#,asc_height#,0);
italcorr .9asc_height#*slant+.5hair#-1.5u#;
adjust_fit(1u#,0); pickup fine.nib;
pos1(hair,-180); pos2(vair,-90);
numeric theta; theta=angle(11u,-h);
pos3(.7stem,theta+90); pos4(stem,theta+90); pos5(1/4[hair,stem],20);
pos6(vair,-90); pos7(curve,-180); pos8(vair,-270);
rt x1l=hround(w-2u+.5hair); x2=.5w; x3r=u; rt x5r=hround(w-u);
x6=.5w; x4=x8=.5w+.5u; lft x7r=hround(1u-.5curve);
top y2l=h+oo; y1=min(.9h,y2r-eps); top y8r=x_height+oo; y4=y8;
z4-z3=whatever*(11u,-h); y5=y7=.5[y6,y8]; bot y6=-oo;
filldraw circ_stroke z3e---z4e....z5e{down}...pulled_arc.e(6,7) & pulled_arc.e(7,8);  % hook and bowl
z78=.5[z3,z4]; y79=y78+.1h; x79=x78+.15(11u);  y77=y78-.1h; x77=x78-.15(11u);
y87=y77+.05(11u); x87=x77-.05h; x89=x79+.05(11u); y89=y79-.05h;
pos87(vair,-theta); pos89(vair,-theta);
pos77(1.6vair,theta); pos79(1.6vair,theta); filldraw circ_stroke z87...z77e--z79e...z89;
math_fit(-.3x_height#*slant+.5curve#-u#,.7x_height#*slant-.5u#);
penlabels(1,2,3,4,5,6,7,8); endchar;

% cmchar "another version of eth";
newchar("eth",8u#,asc_height#,0);
italcorr .9asc_height#*slant+.5hair#-1.5u#;
adjust_fit(1u#,0); pickup fine.nib;
pos1(hair,-180); pos2(vair,-90);
numeric theta; theta=angle(11u,-h);
pos3(stem,theta+90); pos4(stem,theta+90); pos5(1/4[hair,stem],20);
pos6(vair,-90); pos7(curve,-180); pos8(vair,-270);
rt x1l=hround(w-2u+.5hair); x2=.5w; x3r=u; rt x5r=hround(w-u);
x6=.5w; x4=x8=.5w+.5u; lft x7r=hround(1u-.5curve);
top y2l=h+oo; y1=min(.9h,y2r-eps); top y8r=x_height+oo; y4=y8;
z4-z3=whatever*(11u,-h); y5=y7=.5[y6,y8]; bot y6=-oo;
filldraw circ_stroke z3e---z4e....z5e{down}...pulled_arc.e(6,7) & pulled_arc.e(7,8);  % hook and bowl
z78=.35[z3,z4]; y79=y78+.1h; x79=x78+.15(11u);  y77=y78-.1h; x77=x78-.15(11u);
y87=y77+min(.05h,1.75vair); x87=x77-min(.55u,1.75hair); x89=x79+min(.55u,1.75hair); y89=y79-min(.05h,1.75vair);
pos87(slab,90); pos89(slab,90); 
pos77(slab,90); pos79(slab,90); 
filldraw stroke z87e..z77e--z79e..z89e;
math_fit(-.3x_height#*slant+.5curve#-u#,.7x_height#*slant-.5u#);
penlabels(1,2,3,4,5,6,7,8); endchar;

% cmchar "Old English g";
newchar("OEg",8u#,x_height#,desc_depth#);
adjust_fit(.5u#,.5u#);
% bar at top
pickup tiny.nib;
x0=hround(.5w); top y0r=h; pos0(slab,90);
x1=w-x2=hround(1/12w);  y1=y2=vround(y0l-beak/4);
pos1(hair,180); pos2(hair,0);
arm(0,1,a,.25beak_darkness,-.125beak_jut); arm(0,2,b,.25beak_darkness,.25beak_jut);
% diagonal
x3=.65[x1,x2]; y3=y0; pos3(slab,0); x4=.325[x1,x2]; y4=.5h; pos4(stem,0);
filldraw stroke z3e--z4e;
z5l=z4l; pos5(slab,30); pos6(stem,0); pos7(slab,-90); pos8(hair,-135);
rt x6r=hround(w-.5u); bot y7r=-d-oo; y6=.45[y5,y7]; x7=.45w; x8=.175w;
y8=.875[y5,y7]; 
filldraw stroke  pulled_super_arc.e(5,6)(.5superpull)
  & pulled_super_arc.e(6,7)(.7superpull) & z7e{left}..tension .9 and 1..z8e;
penlabels(1,2,3,4,5,6,7,8);
endchar;

% cmchar "Old English r";
newchar("testchar",if serifs: 9u#+stem# else:9.5u# fi,x_height#,1.75desc_depth#);
italcorr x_height#*slant if not serifs: +.25u# fi;
adjust_fit(serif_fit#,0);
w:=w-2u;
pickup tiny.nib; pos0(stem',0); pos2(stem',0);
pos1(hround(stem-3stem_corr),0); top y1=h+min(oo,serif_drop);
pos0'(hround(stem-3stem_corr),0); y0=y0'=bar_height; x1l=x0l=x0'l=x2l;
lft x1l=hround(2.5u-.5stem'); 
% convert the bottom to a spike
bot y2l=-d;
if spike: y2r:=y2l+1.5stem'; x2:=.5[x2l,x2r]; y2:=.5[y2l,y2r]; fi
filldraw stroke z1e--z0'e--z0e--z2e;  % stem
% draw the arch
x20=w-u; pos20(stem,0);
oeh_stroke(2,q,20,21);
% put a rightward facing spike at the baseline;
% pickup crisp.nib;
w:=w+2u;
x30=x21; bot y30l=bot y31l=0; pos30(spickle,90); x31=w-.25u; pos31(spickle,90);
x31l:=x31r-1.5slab; x31:=.5[x31l,x31r]; y31:=.5[y31l,y31r];
filldraw stroke z30e--z31e;
if serifs:
  if not spike: oldeng_serif.l(2,0,b,1/3,jut,3serif_drop); fi
  sloped_serif.l(1,0',a,1/3,jut,serif_drop); fi  % upper serif
penlabels(1,2,3,4,5,6,30,31); endchar;

% cmchar "Old English f";
numeric r_flare#; r_flare#=.75[if serifs: stem# else: vair# fi,flare#];
define_whole_blacker_pixels(r_flare);
newchar("testchar",if serifs:max(8u#,6.5u#+r_flare#) else:7.5u# fi,x_height#,1.75desc_depth#);
italcorr x_height#*slant if not serifs: +.25u# fi;
adjust_fit(serif_fit#,0);
pickup fine.nib; top y4r=h+oo;
if serifs: pos4(vair,90); pos5(hair,0);
 x4=w-max(1.75u,.25u+r_flare);
 rt x5r=hround(w-.5u+.5); y5+.5r_flare=.9[bar_height,h]+oo;
 pos6(r_flare,0); bulb(4,5,6);  % bulb
else: pos4(r_flare,90); rt x4=hround(w-.25u); fi
pos3(thin_join,180); rt x3l=hround(2.5u-.5stem')+stem'; top y3=bar_height;
filldraw stroke z3e{up}...{right}z4e;  % arc
pickup tiny.nib; pos0(stem',0); pos2(stem',0);
pos1(hround(stem-3stem_corr),0); top y1=h+min(oo,serif_drop);
pos0'(hround(stem-3stem_corr),0); y0=y0'=y3; x1l=x0l=x0'l=x2l;
lft x1l=hround(2.5u-.5stem'); 
% convert the bottom to a spike
bot y2l=-d;
if spike: y2r:=y2l+1.5stem'; x2:=.5[x2l,x2r]; y2:=.5[y2l,y2r]; fi
filldraw stroke z1e--z0'e--z0e--z2e;  % stem
% put a rightward facing spike at the baseline;
pickup crisp.nib;
x30=x1; bot y30l=bot y31l=0; pos30(spickle,90); x31=w-u; pos31(spickle,90);
x31l:=x31r-1.5slab; x31:=.5[x31l,x31r]; y31:=.5[y31l,y31r];
filldraw stroke z30e--z31e;
if serifs: 
   if not spike: oldeng_serif.l(2,0,b,1/3,jut,3serif_drop); fi
   sloped_serif.l(1,0',a,1/3,jut,serif_drop);  % upper serif
fi
penlabels(1,2,3,4,5,6,30,31); endchar;

% cmchar "eth";
newchar("eth",9u#,asc_height#,0);
italcorr .9asc_height#*slant+.5hair#-1.5u#;
adjust_fit(1u#,0); pickup fine.nib;
pos1(hair,-180); pos2(vair,-90);
numeric theta; theta=angle(11u,-h);
pos3(stem,theta+90); pos4(stem,theta+90); pos5(1/4[hair,stem],20);
pos6(vair,-90); pos7(curve,-180); pos8(vair,-270);
rt x1l=hround(w-2u+.5hair); x2=.5w; x3r=u; rt x5r=hround(w-u);
x6=.5w; x4=x8=.5w+.5u; lft x7r=hround(1u-.5curve);
top y2l=h+oo; y1=min(.9h,y2r-eps); top y8r=x_height+oo; y4=y8;
z4-z3=whatever*(11u,-h); y5=y7=.5[y6,y8]; bot y6=-oo;
filldraw circ_stroke z3e---z4e....z5e{down}...pulled_arc.e(6,7) & pulled_arc.e(7,8);  % hook and bowl
% now the crossbar
pickup fine.nib;
theta1:=angle(z3-z4)-90; % angle of crossbar
theta2:=angle(z3-z4); % angle of stem of eth
z78=.5[z3,z4]; circ_coord(77,78,3u,theta1+180); circ_coord(79,78,4u,theta1);
circ_coord(87,77,1.5u,theta2); circ_coord(89,79,1.5u,theta2+180);
pos87(hair,theta1); pos89(hair,theta1); 
pos77(slab,theta2); pos79(slab,theta2); 
lft x97l = lft x77; y97=y77; pos97(hair,theta1);
rt x99r = rt x79; y99=y79; pos99(hair,theta1);
filldraw stroke z77e--z79e; filldraw stroke z87--z97; filldraw stroke z89--z99; 
math_fit(-.3x_height#*slant+.5curve#-u#,.7x_height#*slant-.5u#);
penlabels(1,2,3,4,5,6,7,8,77,78,79); endchar;

endinput;

vardef oldeng_serif.l(suffix $,$$,@)(expr darkness,jut,drop) =
 pickup crisp.nib; pos@2(slab,-90);
 lft x@0=tiny.lft x$l; rt x@1=tiny.rt x$r; bot y@1=tiny.bot y$r;
 lft x@2=lft x@0-jut; y@2r=y@1-drop;
 y@0=min(y@2l+bracket,y$$)-eps;
 if drop>0: erase fill z@1--bot z@1
   --(x@2r,bot y@1)--z@2r--cycle; fi % erase excess at bottom
 filldraw z@1--z@2r--z@2l{right}
  ...darkness[(x@0,y@2l),.5[z@2l,z@0] ]{z@0-z@2l}
  ...{up}z@0--(x@1,y@0)--cycle;  % sloped serif
 labels(@0,@1,@2); enddef;