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;