def newstyle = if unknown slant: slant := 0; currenttransform := identity; else: currenttransform := identity slanted slant yscaled aspect_ratio; fi; define_pixels(thin, thick, overshoot, skinnywd); define_pixels(normwd, normht, dia, jutout); define_pixels(curveht, cupht, hatht, leftgap, rightgap); define_pixels(lvgap, lvht, uvgap, uvht, tonegap, toneht, dotsize); define_blacker_pixels(px, py); def_curlywd; pickup pencircle xscaled px yscaled py; pickup pencircle; thaipen := savepen; enddef; % redefinition of beginchar and endchar in case I want to add anything def beginthaichar(expr str, code, lig, wd, ht, dp) = if wd = 0: wid := 0; else: wid := leftgap# + wd + rightgap#; fi; if proofing > 0: beginchar(hex code, wid, ht, dp); else: beginchar(hex code, wid, normht# + uvgap# + uvht# + toneht# + tonegap#, lvgap# + lvht#); fi; pickup thaipen; str & " (" & code & ": " & lig & ") "; makelabel.lft("h", (0,h)); makelabel.lft("d", (0, -d)); leftmost := leftgap; rightmost := w - rightgap; enddef; def endthaichar = endchar; enddef; def dd_def(suffix $) = penpos$(thick, 0); x$a = x$d = x$c = x$f; x$e + thin = x$b; x$a = 1/2[x$b, x$l]; x$b + dia = x$l; y$b = y$e; y$ = y$f; y$d + thin = y$a; y$c + thin = y$f; y$a + dia = y$c; y$e = 1/2[y$a, y$c]; x$lft = x$e; x$rt = x$r; y$top = y$f; bot y$bot = bot y$d = 0; enddef; def dd_path_i(suffix $) = (z$l{down} .. {left}z$a .. {up}z$b .. {right}z$c) enddef; def dd_path_o(suffix $) = (z$r{down} .. {left}z$d .. {up}z$e .. {right}z$f) enddef; def topcap_def(suffix $) = x$l + thick = x$r; y$l if known anglecut: + thick fi = y$r; y$top = y$r; z$ = 1/2[z$l, z$r]; x$lft = x$l; x$rt = x$r; enddef; def botcap_def(suffix $) = x$l + thick = x$r; y$l if known anglecut: + thick fi = y$r; y$l = y$bot; z$ = 1/2[z$l, z$r]; x$lft = x$l; x$rt = x$r; enddef; def gor_def(suffix $) = if gorstyle = 1: x$a + thick = x$e; x$b + thick = x$h; x$b = x$a - jutout; x$j + thick = x$d; x$c = x$i = 1/2[x$h, x$j]; x$f = x$g = 1/3[x$h, x$j]; y$a = y$b = y$e = y$f; y$h = y$g = y$a + thin = y$j = y$d; y$c = y$i + thin = normht + overshoot; y$h + curveht = y$i; x$lft = x$a; x$rt = x$d; y$top = y$c; y$bot = y$a; elseif gorstyle = 2: x$a + thick = x$f; x$b + thick = x$g; x$c + thick = x$h; x$d = x$i; x$j + thick = x$e; x$c = x$a - jutout; x$g = 1/2[x$h, x$i]; x$i = 1/2[x$h, x$j]; y$a = y$f; y$b = y$g; y$c = y$h = y$j = y$e; y$d = y$i + thin = normht + overshoot; y$c + curveht = y$i; y$f + curveht = y$h; y$g = 1/2[y$f, y$h]; x$lft = x$a; x$rt = x$e; y$top = y$d; y$bot = y$a; else: x$lft = x$a; x$rt = x$f; y$top = y$e; y$bot = y$a; x$a + thick = x$g; x$c = x$d = x$a - jutout; x$e = x$k = 1/2[x$g, x$l]; x$l + thick = x$f; x$h = x$i = 1/3[x$g, x$l]; (x$h - x$g) = (y$h - y$g); y$i = y$h + thin; y$a = y$g; % y$c = 1/5(x$i - x$c) + y$i; y$c = y$i; y$d = y$c + thin; y$e = y$k + thin = normht + overshoot; y$d = y$l = y$f = y$k - curveht; % z$b = (z$a{up}..{right}z$i) intersectionpoint (z$h..z$c); % z$j = (z$c..{right}z$k) intersectionpoint (z$d..z$i); z$b = (x$i - thick, 1/2[y$i, y$h]); z$j = (x$c + thin, 1/2[y$c, y$d]); fi; enddef; def gor_path_i(suffix $) = if gorstyle = 1: (z$e -- z$f -- z$g -- z$h{up} .. z$i{right} .. z$j{down}) elseif gorstyle = 2: (z$f{up}..{right}z$g & z$g{left}..z$h{up}..z$i{right}..{down}z$j) else: (z$g{up}..{right}z$h--z$i--z$j{dir 45}..{right}z$k..{down}z$l) fi enddef; def gor_path_o(suffix $) = if gorstyle = 1: (z$a -- z$b{up} .. {right}z$c .. z$d{down}) elseif gorstyle = 2: (z$a{up}..{right}z$b{left}..{up}z$c..{right}z$d..{down}z$e) else: (z$a{up}..{right}z$b--z$c--z$d{dir 45}..{right}z$e..{down}z$f) fi enddef; def base_def(suffix $) = x$a = x$e + thick = x$b; x$d + thick = x$j; x$i = x$c = 1/2[x$a, x$d]; x$e = x$f; x$g = x$h = x$f - jutout; y$a = y$e = y$d = y$j = y$c + cupht; y$g = y$f = y$b = y$c = y$i + thin; y$h = y$i; x$lft = x$e; x$rt = x$j; y$top = y$e; y$bot = y$i; enddef; def base_path_i(suffix $) = (z$b -- z$c{right} .. {up}z$d) % (z$a -- z$b -- z$c{right} .. {up}z$d) enddef; def base_path_o(suffix $) = (z$f -- z$g -- z$h -- z$i{right} .. {up}z$j) % (z$e -- z$f -- z$g -- z$h -- z$i{right} .. {up}z$j) enddef; def cup_def(suffix $) = x$d + thick = x$a; x$c + thick = x$f; x$b = x$e = 1/2[x$a, x$c]; y$e + thin = y$b; y$b + cupht = y$d = y$a = y$c = y$f; bot y$e = -overshoot; x$d = x$lft; x$f = x$rt; y$top = y$a; y$bot = y$e; enddef; def cup_path_i(suffix $) = (z$a{down} .. z$b{right} .. {up}z$c) enddef; def cup_path_o(suffix $) = (z$d{down} .. z$e{right} .. {up}z$f) enddef; def def_curlywd = if curlystyle = 1: curlywd# := 2dia# + thin#; kinkedcurlywd# := 3dia# + thin#; else: curlywd# := dia#; kinkedcurlywd# := 2dia#; fi; define_pixels(curlywd, kinkedcurlywd); enddef; def curly_def(suffix $) = if curlystyle = 1: penpos$(thick, 0); x$a = x$j = 1/2[x$b, x$l]; x$b = x$i + thin = x$l - 2dia; x$c = x$h = x$e = x$f = 1/2[x$b, x$d]; x$d = x$b + dia; x$g = x$d + thin; top y$j = normht + overshoot; y$a + thin = y$j; y$b = y$i = y$d = y$g = 1/2[y$e, y$c] = y$; y$c = y$e - dia; y$e + dia = y$a; y$f = y$e + thin; y$h = y$c - thin; x$lft = x$i; x$rt = x$r; y$top = y$j; y$bot = y$h; else: penpos$(thick, 0); x$a = x$j = 1/2[x$i, x$n]; x$b = x$i + thin = x$l - dia; x$c = x$h = x$e = x$f = 1/2[x$b, x$d]; x$d = x$b + dia; x$g = x$d + thin; x$n = x$r; x$m + thin = x$n; top y$j = normht + overshoot; y$a + thin = y$j; y$b = y$i = y$d = y$g = 1/2[y$e, y$c] = y$m = y$n; y$c = y$e - dia; y$e + dia = y$a; y$f = y$e + thin; y$h = y$c - thin; y$ + dia = y$n; x$lft = x$i; x$rt = x$r; y$top = y$j; y$bot = y$h; fi; enddef; def curly_path(suffix $) = if curlystyle = 1: (z$l{up} .. z$a{left} .. z$b{down} .. z$c{right} .. z$d{up} .. z$e{left} .. {down}z$b -- z$i{up} .. z$f{right} .. z$g{down} .. z$h{left} .. z$i{up} .. z$j{right} .. {down}z$r) else: (z$l .. z$m{up} .. z$a{left} .. z$b{down} .. z$c{right} .. z$d{up} .. z$e{left} .. {down}z$b -- z$i{up} .. z$f{right} .. z$g{down} .. z$h{left} .. z$i{up} .. z$j{right} .. z$n{down} .. {down}z$r) fi enddef; def kinkedcurly_def(suffix $) = if curlystyle = 1: penpos$(thick, 0); x$a = x$j = 1/2[x$b, x$l]; x$b = x$i + thin = x$l - 3dia; x$c = x$h = x$e = x$f = 1/2[x$b, x$d]; x$d = x$b + dia; x$g = x$d + thin; x$s = x$t = 1/2[x$i, x$j]; x$u = x$v = 1/2[x$j, x$l]; top y$s = top y$u = normht; y$j = y$s - (x$u - x$j); y$s - thin = y$t; y$u - thin = y$v; y$a + thin = y$j; y$b = y$i = y$d = y$g = 1/2[y$e, y$c] = y$; y$c = y$e - dia; y$e + dia = y$a; y$f = y$e + thin; y$h = y$c - thin; x$lft = x$i; x$rt = x$r; y$top = y$j; y$bot = y$h; else: penpos$(thick, 0); x$a = x$j = 1/2[x$i, x$n]; x$b = x$i + thin = x$l - 2dia; x$c = x$h = x$e = x$f = 1/2[x$b, x$d]; x$d = x$b + dia; x$g = x$d + thin; x$n = x$r; x$m + thin = x$n; x$s = x$t = 1/2[x$i, x$j]; x$u = x$v = 1/2[x$j, x$m]; top y$s = top y$u = normht; y$j = y$s - (x$u - x$j); y$s - thin = y$t; y$u - thin = y$v; y$a + thin = y$j; y$b = y$i = y$d = y$g = 1/2[y$e, y$c] = y$m = y$n; y$c = y$e - dia; y$e + dia = y$a; y$f = y$e + thin; y$h = y$c - thin; y$ + dia = y$n; x$lft = x$i; x$rt = x$r; y$top = y$j; y$bot = y$h; fi; enddef; def kinkedcurly_path(suffix $) = if curlystyle = 1: (z$l{up} .. z$v{left} .. z$a{left} .. z$t{left} .. z$b{down} .. z$c{right} .. z$d{up} .. z$e{left} .. {down}z$b -- z$i{up} .. z$f{right} .. z$g{down} .. z$h{left} .. z$i{up} .. z$s{right} .. z$j{right} .. z$u{right} .. {down}z$r) else: (z$l{up} .. z$m{up} .. z$v{left} .. z$a{left} .. z$t{left} .. z$b{down} .. z$c{right} .. z$d{up} .. z$e{left} .. {down}z$b -- z$i{up} .. z$f{right} .. z$g{down} .. z$h{left} .. z$i{up} .. z$s{right} .. z$j{right} .. z$u{right} .. z$n{down} .. {down}z$r) fi enddef; def hat_def(suffix $)(expr linewd) = penpos$(linewd, 0); x$d = x$a = 1/2[x$b, x$l]; z$c = z$b + (-thin/2, thin/2); y$b = y$l = y$bot; y$a = y$c + hatht; y$d = y$a + thin; y$top = y$d; x$lft = x$c; x$rt = x$r; enddef; def hat_path(suffix $) = (z$l{up} .. z$a{left} .. z$b{(-1,-3)} .. {(1,3)}z$c .. z$d{right} .. {down}z$r) enddef; def b_def(suffix $)(expr linewd, embed) = if embed > thick - thin: emb := thick - thin else: emb := embed; fi; penpos$(linewd, 0); x$a = x$l; x$f = x$r - emb; x$h = x$f + dia; x$b = x$i = x$g = x$d = 1/2[x$f, x$h]; x$c = x$h + thin; x$e = x$f - thin; y$a = y$e = y$f = y$h = y$c = 1/2[y$i, y$g]; y$b = y$i - thin; y$d = y$g + thin; y$g = y$i + dia; y$top = y$d; y$bot = y$b; x$lft = x$a; x$rt = x$c; y$r = y$e + ( (dia/2) +-+ (dia/2-emb) ); enddef; def b_path(suffix $) = (z$l .. z$a{down} .. z$b{right} .. z$c{up} .. z$d{left} .. {down}z$e -- z$f{up} .. z$g{right} .. z$h{down} .. z$i{left} .. z$f{up} .. z$r) enddef; def d_def(suffix $)(expr linewd, embed) = if embed > thick - thin: emb := thick - thin else: emb := embed; fi; penpos$(linewd, 0); x$a = x$r; x$f = x$l + emb; x$h = x$f - dia; x$b = x$i = x$g = x$d = 1/2[x$f, x$h]; x$c = x$h - thin; x$e = x$f + thin; y$a = y$e = y$f = y$h = y$c = 1/2[y$i, y$g]; y$b = y$i - thin; y$d = y$g + thin; y$g = y$i + dia; y$top = y$d; y$bot = y$b; x$lft = x$c; x$rt = x$a; y$l = y$e + ( (dia/2) +-+ (dia/2-emb) ); enddef; def d_path(suffix $) = (z$l .. z$f{down} .. z$i{left} .. z$h{up} .. z$g{right} .. {down}z$f -- z$e{up} .. z$d{left} .. z$c{down} .. z$b{right} .. z$a{up} .. z$r) enddef; def p_def(suffix $)(expr linewd, embed) = if embed > thick - thin: emb := thick - thin else: emb := embed; fi; penpos$(linewd, 0); x$a = x$l; x$f = x$r - emb; x$h = x$f + dia; x$b = x$i = x$g = x$d = 1/2[x$f, x$h]; x$c = x$h + thin; x$e = x$f - thin; y$a = y$e = y$f = y$h = y$c = 1/2[y$i, y$g]; y$b = y$i + thin; y$d = y$g - thin; y$g = y$i - dia; y$top = y$b; y$bot = y$d; x$lft = x$a; x$rt = x$c; y$r = y$e - ( (dia/2) +-+ (dia/2-emb) ); enddef; def p_path(suffix $) = (z$l .. z$a{up} .. z$b{right} .. z$c{down} .. z$d{left} .. {up}z$e -- z$f{down} .. z$g{right} .. z$h{up} .. z$i{left} .. z$f{down} .. z$r) enddef; def q_def(suffix $)(expr linewd, embed) = if embed > thick - thin: emb := thick - thin else: emb := embed; fi; penpos$(linewd, 0); x$a = x$r; x$f = x$l + emb; x$h = x$f - dia; x$b = x$i = x$g = x$d = 1/2[x$f, x$h]; x$c = x$h - thin; x$e = x$f + thin; y$a = y$e = y$f = y$h = y$c = 1/2[y$i, y$g]; y$b = y$i + thin; y$d = y$g - thin; y$g = y$i - dia; y$top = y$b; y$bot = y$d; x$lft = x$c; x$rt = x$a; y$l = y$e - ( (dia/2) +-+ (dia/2-emb) ); enddef; def q_path(suffix $) = (z$l .. z$f{up} .. z$i{left} .. z$h{down} .. z$g{right} .. {up}z$f -- z$e{down} .. z$d{left} .. z$c{up} .. z$b{right} .. z$a{down} .. z$r) enddef; % must define left edge(x), right edge(x) and stem(x) as well as top(y) def rhat_def(suffix $) = penpos$(thick, 0); x$b = x$e = 1/3[x$a, x$c]; x$d = x$c - thick; x$f = x$a + thin; y$a = y$f - thin; y$c = y$b - thick/3; y$d = y$c - thick; y$e = y$b - thick; y$f = y$b - 1/4normht; y$ = y$a - thick; x$lft = x$a; x$rt = x$c; y$top = y$b; y$bot = y$; % needed for taw toh!ng x$taw = x$a + dia; y$taw = y$a; enddef; def rhat_path(suffix $) = (z$l{up} ... {left}z$a & z$a .. tension 2 .. z$b .. tension 2 .. z$c -- z$d .. tension 2 .. z$e .. tension 2 .. z$f & z$f{right} ... {down}z$r) enddef;