def fix_width= if odd (rside-lside): w:=w+1 fi enddef;
def fix_height= if odd (h+d): h:=h+1 fi enddef;
% set string rl to "r" or "l" for gap on left or right.
def rtorlft=if rl="r": rt else: lft fi enddef;
def lftorrt=if rl="r": lft else: rt fi enddef;
def zorw=if rl="r": lside else: rside fi enddef;
def worz=if rl="r": rside else: lside fi enddef;
def vmorp=if rl="r": - else: + fi enddef;
def vlooppoints =
fix_height;
h-y1=y5;
y1-y5=vert_gap;
pickup thinpen;
rtorlft x1=worz;
rtorlft x5=worz;
x2=x4=wide_spot[zorw,worz];
top y2=h+curve_overshoot;
bot y4=-curve_overshoot;
pickup curvepen;
lftorrt x3=zorw vmorp curve_overshoot;
y3=.5h;
p:=z1..z2..z3{down}..z4..z5;
penpos1(thin,(angle direction 0 of p) vmorp 90);
penpos2(thin,90);
penpos3(curve,90 - vmorp 90);
penpos4(thin,270);
penpos5(thin,(angle direction 4 of p) vmorp 90);
enddef;
def simplevloop =
vlooppoints;
pickup thinpen;
draw z1..controls postcontrol 0 of p and precontrol 1 of p..z2;
draw z4..controls postcontrol 3 of p and precontrol 4 of p..z5;
cutoff (z1,180+angle direction 0 of p);
cutoff (z5,angle direction 4 of p);
penstroke z2e..z3e{down}..z4e;
labels(1,2,3,4,5);
enddef;
% set string tb to "t" or "b" for gap on top or bottom.
def toporbot=if tb="t": top else: bot fi enddef;
def botortop=if tb="t": bot else: top fi enddef;
def zorh=if tb="t": 0 else: h fi enddef;
def horz=if tb="t": h else: 0 fi enddef;
def hmorp=if tb="t": - else: + fi enddef;
def simplehloop =
hlooppoints;
pickup thinpen;
draw z1..controls postcontrol 0 of p and precontrol 1 of p..z2;
draw z4..controls postcontrol 3 of p and precontrol 4 of p..z5;
cutoff (z1,180+angle direction 0 of p);
cutoff (z5,angle direction 4 of p);
penstroke z2e..z3e{left}..z4e;
labels(1,2,3,4,5);
enddef;
def widecurl(expr pt,ud,rl) =
% ud and rl are 1 or -1 for up and right or down and left, resp.
begingroup save x; save y;
z1=pt;
% allow for top or bot...
z2=pt+(curl_top*rl,if ud>0: vowel_asc - else: -vowel_d + fi 1/2thin);
% allow for lft or rt...
z3=pt+(curl_w*rl-1/2thin*rl,0);
% penpos1(thick,90-ud*90);
% penpos2(thin,-90*rl);
% penstroke z1e{up*ud}..z2e{right*rl};
pickup pencircle xscaled thick yscaled thin;
draw z1{up*ud}..z2{right*rl};
pickup thinpen;
draw z2{right*rl}..{down*ud}z3;
cullit;
cutoff(z3,270*ud);
endgroup;
enddef;
def closebulb(expr pt,ud,rl) =
begingroup save x; save y;
% pickup pencircle scaled 1u;
z1=pt-(rl*1/2thick,0);
% z2=pt+(curl_top*rl,if ud>0: vowel_asc else: -vowel_d fi);
% z3=pt+(curl_w*rl,fine*ud);
% z4=z2+(-rl*1/4fine,-ud*fine);
% z5=z1+(rl*thick,0);
% draw z1{up*ud}..{rl*right}z2..{ud*down}z3..{ud*up}z4&
% z4..{ud*down}z5;
% labels(1,2,3,4,5);
p1:=fullcircle scaled curve shifted
(pt + (rl*(curl_w-1/2curve),
(if ud>0: vowel_asc - else: -vowel_d + fi 1/2curve)));
fill p1;
z2=point if ud>0: 2 else: 6 fi of p1;
z3=z1+(rl*thick,0);
z4=point if rl>0: 4 else: 0 fi of p1;
fill z1{ud*up}..{rl*right}z2--z4..z3{ud*down}--cycle;
endgroup;
enddef;
vardef llside=(3/4lmodside) enddef; % modifiers and breath glide
% are shifted left.
vardef rrside=(w-rmodside) enddef;