autorounding := 1 ; mode_setup; define_pixels(em,asc,desc,ex); define_blacker_pixels(penwidth,penthickness) ; define_blacker_pixels(tehta_penwidth) ; define_corrected_pixels(o); define_whole_pixels(straight_sidebar,curve_sidebar) ; define_pixels(fudge, tinco_width, parma_width, romen_width) ; define_pixels(luva_width) ; pickup pencircle xscaled penwidth yscaled penthickness rotated penangle; main_nib := savepen ; pickup pencircle xscaled tehta_penwidth yscaled penthickness rotated penangle; tehta_nib := savepen ; def draw_luva(suffix i,j,k,l) (expr luva_type,bow_stem_y,bow_arch_x, bow_side_y,bow_end_x) = y.i = bow_stem_y * ex ; x.j - x.i = bow_arch_x * (x.k - x.i) ; y.k = (if (luva_type = "calma") or (luva_type = "quesse"): 1 - fi bow_side_y) * ex ; x.l - x.i = bow_end_x * (x.k - x.i) ; numeric x.luva_serif,y.luva_serif ; z.luva_serif = z.l + 0.03em * if luva_type = "tinco": dir 135 else: dir 315 fi ; path luva_path ; luva_path = z.i{dir( if (luva_type = "tinco") or (luva_type = "parma"): penangle else: penangle+180 fi)} .. z.j{if (luva_type = "tinco") or (luva_type = "parma"): right else: left fi} .. z.k .. if (luva_type = "parma") or (luva_type = "quesse"): {curl 0.3}z.l else: z.l .. {curl 2}z.luva_serif fi ; draw luva_path ; labels(i,j,k,l) enddef ; def draw_tinco_luva(suffix i,j,k,l) = % this draws a complete tinco luva, using the four given suffices % for the control points. ALL the information about the control % points is determined within the macro; they are provided only for % information and later use. lft x.i = straight_sidebar ; % intersection with stem top y.j = round(ex + o + tinco_fudge) ; % top rt x.k = round (x.i + luva_width) ; % right bot y.l = 0; % round (- o) ; % bottom, with fudge factor draw_luva(i,j,k,l)("tinco",tp_bow_stem_y, tc_bow_arch_x, tc_bow_side_y, tc_bow_end_x ) enddef ; def draw_ando_luva(suffix i,j,k,l,ii,jj,kk,ll) = % this draws a complete ando luva % first bow lft x.i = straight_sidebar ; % intersection with stem top y.j = round(ex + o + tinco_fudge) ; % top rt x.k = round (x.i + luva_width) ; % right bot y.l = round (- o) ; % bottom, with fudge factor draw_luva(i,j,k,l)("tinco",tp_bow_stem_y, tc_bow_arch_x, tc_bow_side_y, tc_bow_end_x ) ; % now the second luva z.second = ( (x.i+pt,y.i) .. (infinity,y.i) ) intersectionpoint luva_path ; x.ii = good.x (xpart z.second) ; y.jj = y.j ; rt x.kk = round (x.ii + luva_width) ; % right y.ll = y.l ; draw_luva(ii,jj,kk,ll)("tinco",tp_bow_stem_y, tc_bow_arch_x, tc_bow_side_y, tc_bow_end_x ) enddef ; def draw_parma_luva(suffix i,j,k,l) = % this draws a complete parma luva lft x.i = straight_sidebar ; % intersection with stem top y.j = round(ex + o) ; % top rt x.k = round (x.i + luva_width) ; % right bot y.l = 0 ;% bottom draw_luva(i,j,k,l)("parma",tp_bow_stem_y, pq_bow_arch_x, pq_bow_side_y, pq_bow_end_x ) enddef ; def draw_umbar_luva(suffix i,j,k,l,ii,jj,kk,ll) = % this draws a complete umbar luva % first bow lft x.i = straight_sidebar ; % intersection with stem top y.j = round(ex + o) ; % top rt x.k = round (x.i + luva_width) ; % right bot y.l = 0 ;% bottom draw_luva(i,j,k,l)("parma",tp_bow_stem_y, pq_bow_arch_x, pq_bow_side_y, pq_bow_end_x ) ; %second bow z.second = ( (x.i+pt,y.i) .. (infinity,y.i) ) intersectionpoint luva_path ; x.ii = good.x (xpart z.second) ; y.jj = y.j ; rt x.kk = round (x.ii + luva_width) ; % right y.ll = y.l ; draw_luva(ii,jj,kk,ll)("parma",tp_bow_stem_y, pq_bow_arch_x, pq_bow_side_y, pq_bow_end_x ) enddef ; def draw_calma_luva(suffix i,j,k,l) = % this draws a complete calma luva rt x.i = w - straight_sidebar ; % intersection with stem y.j = good.y 0 ; % bottom lft x.k = round (x.i - luva_width) ; % left top y.l = round(ex - fudge) ; % top draw_luva(i,j,k,l)("calma",cq_bow_stem_y, tc_bow_arch_x, tc_bow_side_y, tc_bow_end_x ) enddef ; def draw_anga_luva(suffix i,j,k,l,ii,jj,kk,ll) = % this draws a complete anga luva % first bow rt x.i = w - straight_sidebar ; % intersection with stem y.j = good.y 0 ; % bottom lft x.k = round (x.i - luva_width) ; % left top y.l = round(ex - fudge) ; % top draw_luva(i,j,k,l)("calma",cq_bow_stem_y, tc_bow_arch_x, tc_bow_side_y, tc_bow_end_x ) ; % now the second luva z.second = ( (x.i-pt,y.i) .. (-infinity,y.i) ) intersectionpoint luva_path ; x.ii = good.x (xpart z.second) ; y.jj = y.j ; lft x.kk = round (x.ii - luva_width) ; % left y.ll = y.l ; draw_luva(ii,jj,kk,ll)("calma",cq_bow_stem_y, tc_bow_arch_x, tc_bow_side_y, tc_bow_end_x ) enddef ; def draw_quesse_luva(suffix i,j,k,l) = % this draws a complete quesse luva rt x.i = w - straight_sidebar ; % intersection with stem y.j = good.y 0 ; % bottom lft x.k = round (x.i - luva_width) ; % left top y.l = round(ex) ; % top draw_luva(i,j,k,l)("quesse",cq_bow_stem_y, pq_bow_arch_x, pq_bow_side_y, pq_bow_end_x ) enddef ; def draw_ungwe_luva(suffix i,j,k,l,ii,jj,kk,ll) = % this draws a complete ungwe luva % first bow rt x.i = w - straight_sidebar ; % intersection with stem y.j = good.y 0 ; % bottom lft x.k = round (x.i - luva_width) ; % left top y.l = round(ex) ; % top draw_luva(i,j,k,l)("quesse",cq_bow_stem_y, pq_bow_arch_x, pq_bow_side_y, pq_bow_end_x ) ; % second bow z.second = ( (x.i-pt,y.i) .. (-infinity,y.i) ) intersectionpoint luva_path ; x.ii = good.x (xpart z.second) ; y.jj = y.j ; lft x.kk = round (x.ii - luva_width) ; % left y.ll = y.l ; draw_luva(ii,jj,kk,ll)("quesse",cq_bow_stem_y, pq_bow_arch_x, pq_bow_side_y, pq_bow_end_x ) enddef ; def draw_telco(suffix i,j)(expr serifs) = % serifs = t,b,tb for Top & Bottom z.i.$ = z.i + 0.05em * dir(penangle+180) ; z.i.$$ = z.i + 0.1em * down ; z.j.$ = z.j + 0.05em * dir(penangle) ; z.j.$$ = z.j + 0.1em * up ; draw z.i .. z.j ; if (serifs = "t") or (serifs = "tb"): filldraw z.i -- z.i.${dir(penangle-90)} .. {down}z.i.$$ & z.i.$$ .. z.i & cycle ; fi if (serifs = "b") or (serifs = "tb"): filldraw z.j -- z.j.${dir(penangle+90)} .. {up}z.j.$$ & z.j.$$ .. z.j & cycle ; fi labels(i,j) enddef ; def draw_bar(suffix i,j)(expr serifs) = % serifs = r,l,rl for Right/Left z.right_serif1 = z.j + 0.04em * left ; z.right_serif2 = z.j + 0.04em * dir penangle ; z.left_serif1 = z.i + 0.04em * right ; z.left_serif2 = z.i + 0.04em * dir(penangle+180) ; draw if (serifs = "l") or (serifs = "rl"): z.left_serif2{dir penangle} .. z.left_serif1 else: z.i fi --- if (serifs = "r") or (serifs = "rl"): z.right_serif1 .. {dir penangle}z.right_serif2 else: z.j fi ; labels(i,j) enddef ; def draw_dot(suffix i) = % calculate width of pen numeric penwdth ; 1.1penwdth = (pen_rt - pen_lft) ++ (pen_top - pen_bot) ; z.i.$ = z.i + 1/2penwdth*dir(penangle+90) ; z.i.$$ = z.i + 1/2penwidth*dir(penangle-90) ; draw z.i.$$ -- z.i.$ ; drawdot z.i.$$ ; drawdot z.i.$ ; enddef ;