% This file is part of the TeluguTeX Software Package.
%Copyright (c) 1991 Lakshmankumar Mukkavilli
%
%The TeluguTeX Software Package is distributed in the hope that
%it will be useful,but WITHOUT ANY WARRANTY.  No author or distributor
%accepts responsibility to anyone for the consequences of using it
%or for whether it serves any particular purpose or works at all,
%unless he says so in writing.  Refer to the TeluguTeX Software Package
%General Public License for full details.
%
%Everyone is granted permission to copy, modify and redistribute
%the TeluguTeX Software Package, but only under the conditions described in the
%TeluguTeX Software Package General Public License.   A copy of this license is
%supposed to have been given to you along with TeluguTeX Software Package so you
%can know your rights and responsibilities.  It should be in a
%file named CopyrightLong.  Among other things, the copyright notice
%and this notice must be preserved on all copies.
%%%%%
% This file contains several macros. These are used for setting
%  up the environment and character generation. Before you change
%  anything in this file you should be very clear about the impact
%  of the change.
%
% when testing is false all symbols in the font are
%    generated automatically else when testing is true
%    only selected symbols will be generated.
if unknown testing:boolean testing; testing:=false; fi
showstopping := 1;  % for debugging only
let telchar=\;
let generate=input;
let sketch=draw;
let pos=penpos;
let stop=bye;
string tl_symname,tl_stra,tl_strb,tl_strc,tl_strw,tl_strx,tl_stry;
      % contains the name of the symbol being created
tl_symname:="";     % used for creating substitute commands on log file
tl_stra:="OFFSETA{"; tl_strb:="OFFSETB{"; tl_strc:="OFFSETC{";
tl_strw:="CODE{";
tl_strx:="\def\";tl_stry:="}%";


if testing:
       %To test different characters use following definitions of
       %   stest and etest.
          def stest (text s) =
            quote def s =
          enddef;
          let etest=enddef;
else:
       %To generate all the characters use following definitions of
       %  stest and etest.
        def stest (text s) =
             tl_symname := str s;% symbol name - used in various messages
        enddef;
        let etest=;;
fi;

%  We should be very careful about implications of currenttransform
%  (particularly 'slanted' transform). When a path is drawn/filled
%  currenttransform is applied. When a transform is applied to
%  currentpicture, the transform is really applied to slanted (or
%  whatever currenttransform is) path.
def font_setup =
       let adjust_fit = normal_adjust_fit;
       currenttransform := currenttransform  slanted slant;
       define_pixels(u,v,uh,asc_height,des_depth,x_height);
       define_pixels(pen_width,ul,ur,em_width);
       define_pixels(bot_depth,top_height);
       define_pixels(fig_height,tfig_height,tfig_width);
       define_pixels(ascunit,vmwidth);
       define_pixels(top_accent,bot_accent);
       define_pixels(bot_cc_ceiling,bot_cc_floor,bot_cc_width,ccwidth);
       define_pixels(c_height,w_height,j_height);
       define_pixels(asc_height1,asc_height2);
       define_pixels(dot_radius,wedge_height,wedge_depth);
       define_pixels(half_plus_width,sc_height);

       define_pixels(v_a_width,v_e_width,v_u_width);
       define_pixels(v_lo_width,v_ea_width,v_i_width);

       define_pixels(vm_a_width,vm_e_width,vm_e_height1);
       define_pixels(vm_e_height2,vm_e_height3,vm_u_width);
       define_pixels(vm_ro_width,vm_ao_width,vm_aoo_width);

       define_pixels(cb_ka_width,cb_kha_width,cb_ga_width,cb_cha_width);
       define_pixels(cb_ja_width,cb_tta_width,cb_nna_width);
       define_pixels(cb_ta_width,cb_da_width,cb_na_width);
       define_pixels(cb_ba_width,cb_ya_width,cb_ra_width);
       define_pixels(cb_la_width,cb_lla_width,cb_va_width,cb_ca_width);
       define_pixels(cb_sha_width,cb_ksha_width);
       define_pixels(cb_ksha_depth);
       define_pixels(cb_np_width,cb_vg_width);

       define_pixels(cv_pu_width,cv_pu_depth);

       define_pixels(p_comma_width);

       %define pen
       if unknown special_telpen:
        pickup pencircle scaled pen_width;
        telpen:=savepen;
       else:
        special_telpen;
        telpen:=savepen;
       fi;

       %print titles if generating font
       if unknown offsets_only:
         tracingtitles:=1;
       fi;
enddef;

newinternal l,r;                    %adjustment to spacing

def normal_adjust_fit(expr left_adjustment,right_adjustment) =
       l := -hround(left_adjustment*hppp);
       interim xoffset := -l;
       charwd := charwd + left_adjustment + right_adjustment;
       r := l+hround(charwd*hppp) ;
       w := r - hround(right_adjustment*hppp) ;
enddef;

def makebox(text rule) =
       for y=0,asc_height,-des_depth,x_height,-bot_depth,
               top_height,w_height,c_height,
                 j_height: rule((l,y)t_,(r,y)t_);      % horizontal rules
       endfor;
       rule((0,h),(r+pen_width,h)); rule((0,-d),(r+pen_width,-d));%height,depth markers
       for x=l,r:rule((x,-bot_depth)t_,(x,top_height)t_); % vertical
       endfor;
       for x=u*(1+floor(l/u)) step u until r-1:
               rule((x,-bot_depth)t_,(x,top_height)t_);
         endfor;                                  % vertical lines at each u
       if charic <> 0:
               rule((r+charic*pt,h.o_),(r+charic*pt,.5h.o_));
         fi                                       % italic correction
enddef;

def maketicks(text rule) =
       for y=0,h.o_,-d.o_;
               rule((l,y),(l+10,y));rule((r-10,y),(r,y)); % horizontals
         endfor
       for x=l,r:
               rule((x,10-d.o_),(x,-d.o_));
               rule((x,h.o_-10),(x,h.o_));         % verticals
          endfor
       if charic <> 0:
               rule((r+charic*pt,h.o_-10),(r+charic*pt,h.o_)); % italic corr
         fi
enddef;

rulepen := pensquare;

def begintchar(expr a,b,c,d,e,f,g) =
 beginchar(a,b,c,d);
 italcorr e;
 if known offsets_only:
     message tl_strx&tl_symname&tl_strw&decimal(a)&tl_stry;
 fi;
 numeric left_space,right_space,l_s,r_s;
         l_s:=f; r_s:=g;
         left_space:=hround(hppp*f); right_space:=hround(hppp*g);
 pickup telpen;
enddef;

extra_endchar := extra_endchar&"w:=r-l;";

def endtchar =
charwd:=w/hppp; charht:= h/vppp;  chardp:= d/vppp;
adjust_fit(l_s,r_s);
penlabels(range 1 thru 20);
message "";
% If any special effects are needed then those should be
% defined as special_effects macro.
if known special_effects: special_effects; fi;
endchar;
enddef;

% pivot_message macro is used to print offsets to certain points
% in the symbol being generated. These offsets are used by syllable
% building macros to allign vowel modifiers/consonant conjuncts.
% Unlike in english where all symbols stand alone, in Telugu
% various symbols in the font combine to form text.
% For consonant bases two/three offsets are identified. One is used to place
% vowel modifiers and the other is used to place consonant conjuncts(excluding
% those that appear on side). Third offset is used in attaching vowel modifiers
% in some special cases. Offsets have suffixes A,B and C.
% Vowel modifiers, accents and consonant
% conjuncts that appear above/below base consonant indicate one offset value.
% Same macro works in all cases.
% The messages are in the form of TeX macros.
% The log file contains TeX macros mixed with other messages. Use
% some pattern matching program like grep to eliminate all lines containing
% not begining with a \ sign. Name this file tloffsets.
%     grep '^\\' xxxxx.log>tloffsets.tex
% The offsets are in em units. So the offsets would be same for any designsize
% and pen width combination.
% Print the offsets only when offsets are being generated.
if unknown offsets_only: % do not print offsets
  def pivot_message (text t) =
  enddef;
else: %print offsets
def pivot_message (text t) =
numeric count,piv[],index;
% count indicates the number of arguments
count:=0;
for index=t: count:=count+1; piv[count]:=index; endfor;
if count=1:
 message tl_strx&tl_symname&tl_stra&decimal((piv[1]+left_space)/em_width)&tl_stry;
elseif count=2:
 message tl_strx&tl_symname&tl_stra&decimal((piv[1]+left_space)/em_width)&tl_stry;
 message tl_strx&tl_symname&tl_strb&decimal((piv[2]+left_space)/em_width)&tl_stry;
else:
 message tl_strx&tl_symname&tl_stra&decimal((piv[1]+left_space)/em_width)&tl_stry;
 message tl_strx&tl_symname&tl_strb&decimal((piv[2]+left_space)/em_width)&tl_stry;
 message tl_strx&tl_symname&tl_strc&decimal((piv[3]+left_space)/em_width)&tl_stry;

fi;
enddef;
fi;%end of if unknown offsets

def fill_dot(suffix $) =
       z$t = (x$,y$+dot_radius);
       z$l = (x$-dot_radius,y$);
       z$b = (x$,y$-dot_radius);
       z$r = (x$+dot_radius,y$);
 path fill_dot_p;
 fill_dot_p = z$t..z$l..z$b..z$r..cycle;
 fill fill_dot_p;
 penlabels($t,$l,$b,$r);
 enddef;

def lit_cir_form =
       lft z1l = (0,c_height/2); top z1t = (c_height/2,c_height);
       rt z1 = (c_height,c_height/2); bot z1b = (c_height/2,0);
       path lit_cir_p;
       lit_cir_p = z1..z1t..z1l..z1b..cycle;
       sketch lit_cir_p;
penlabels(1t,1l,1b);
enddef;

def half_plus_form(suffix $) =
z$a=(x$+1/2half_plus_width,y$); rt z$b=(x$+half_plus_width,y$);
top z$c=(x$+1/2half_plus_width,x_height);
lft z$d = z$;
  path half_plus_pa,half_plus_pb;
  half_plus_pa = z$d--z$a--z$b;
  half_plus_pb = z$a--z$c;
  sketch half_plus_pa;  sketch half_plus_pb;
penlabels($a,$b,$c,$d);
enddef;

def barandhook_form (suffix $)(expr bar_width,t) =
z$a=(x$+bar_width-u,y$); rt z$b=(x$a+u,y$-uh);
bot z$c =(x$b-u,y$-2uh); lft z$d=(x$b-2u,y$b);
top z$e=(x$a-u,y$); rt z$f=(x$b,y$+1.5uh);
top z$g=(x$a,y$f+uh); z$h=(x$d,y$f);
path barandhook_p;
barandhook_p= subpath(0,t) of (rt z$--z$a..z$b..z$c..z$d..z$e..z$f..z$g..z$h);
sketch  barandhook_p;
penlabels($a,$b,$c,$d);
enddef;

def barandhook_forma (suffix $)(expr bar_width,t) =
barandhook_form($,bar_width,t);
erase sketch barandhook_p;
barandhook_p:= subpath(0,t) of (z$--z$a..z$b..z$c..z$d..z$e..z$f..z$g..z$h);
sketch  barandhook_p;
enddef;

def wedge(suffix $) =
bot z$w=(x$,-wedge_depth);
 path wedge_p;
wedge_p = z$--z$w;
sketch wedge_p;
penlabels($u,$v,$w,$x,$y);
 enddef;

def vwedge(suffix $) =
         z$a=(x$,y$+wedge_height);
path vwedge_p;
vwedge_p =z$--z$a;
sketch vwedge_p;
penlabels($a);
 enddef;


def vm_hook_form (suffix $)(expr t) =
        z$a = (x$,y$+1.5ascunit);
        z$b = (x$+u,y$+3ascunit);
        z$c = (x$+2u,y$+1.5ascunit);
 sketch subpath (0,t) of (z$..z$a..z$b..z$c);
 penlabels ($a,$b,$c);
 h:=top y$b;
enddef;

def v_a_form =
top z1=(1/4v_a_width,x_height);
z10=(x1-u,y1-uh); z11=(x1,y1-2(y1-y10));
lft z3=(0,2/3x_height); bot z4=(1/2v_a_width,0);
rt z5=(v_a_width,2/3x_height); top z6=(v_a_width-1.5u,x_height);
z7=(3.5/5x5,1/2x_height); z8=(1/4w,1/2x_height);
z12=(.65v_a_width,5/6x_height); rt z2=(v_a_width,1/2x_height);
enddef;

def v_e_form =
lft z1=(0,j_height); top z2=(1/5v_e_width,x_height);
z3=(2/5v_e_width,j_height); top z4=(3/5v_e_width,x_height);
rt z5=(v_e_width,1/2x_height); z6=(4/5v_e_width,1/5x_height);
bot z7=(1/2v_e_width,0); z8=(1/5v_e_width,1/4x_height);
z9=(1/2v_e_width,1/2x_height); rt z10=(v_e_width,-1/5des_depth);
path v_e_p;
v_e_p =  z1..z2..tension 1.2..z3&z3..tension 1.2..z4..z5..z6..z7..z8..z9..z10;
sketch v_e_p;
enddef;

def v_u_form =
z1=(v_u_width-1/2w_height,1/2w_height); z2=(v_u_width-u,w_height);
rt z3=(v_u_width,1/6x_height); bot z4=(3/4v_u_width,0);
z5=(1/2v_u_width,w_height); bot z6=(1/3v_u_width,0);
lft z7=(0,1/2x_height); top z8=(1/2v_u_width,x_height);
top z9=(v_u_width-w_height,x_height);
path v_u_p;
v_u_p=z1..z2..z3..z4..tension 1.2..z5&z5..tension 1.2..z6..z7..z8..z9;
sketch v_u_p;
enddef;

def v_lo_form =
lft z1=(0,j_height); top z2=(v_lo_width/5,x_height);
z3=(2/5v_lo_width,j_height); top z4=(3/5v_lo_width,x_height);
z5=(4/5v_lo_width,j_height); z6=(3/5v_lo_width,w_height);
bot z7=(4/5v_lo_width,0); rt z8=(v_lo_width,1/2x_height);
top z9=(9/10v_lo_width,x_height);
path v_lo_p;
v_lo_p= z1..z2..z3&z3..z4..z5..z6..z7..z8..z9;
sketch v_lo_p;
enddef;

def v_ea_form =
 lit_cir_form;
bot z2=(2/3v_ea_width,0); rt z3=(v_ea_width,1/3x_height);
z4=(2/3v_ea_width,4/5x_height);top z5=(1/3v_ea_width,x_height);
sketch z1..z2..z3..z4..z5;
enddef;

def vm_a_form (suffix $) =
 top lft z$a=(x$-2/5vm_a_width,asc_height1);
 top rt z$b=(x$+3/5vm_a_width,asc_height);
 z$c = z$;
 sketch z$a..tension 6..z$c..tension 16..z$b;
 penlabels($a,$b,$c);
 enddef;

def vm_e_form =
        lft z1 = (0,x_height+1.2ascunit);
           top z2 = (1/2vm_e_width,x_height);
        rt z3 = (vm_e_width,x_height+2ascunit);
        lft z5 = (0,x_height+3ascunit);
        z6 = (1/2vm_e_width,y5);
        top z7=(1/2vm_e_width,vm_e_height1+ascunit);
sketch subpath (0.4,1) of  z1{down}..{right}z2..z3..z7..z5..z6;
                 % hook can be attached at z7
enddef;

def vm_e_form_a (expr xcoord) =
%    used for vowel modifier e for some consonants (eg. khe, che, ne etc)
%    999 was chosen arbitrarily. we needed something not used elsewhere!
%    same suffix should be used by vm_ee_form_a.
    top z999=(xcoord,vm_e_height1); rt z999i=((lft x999)-1.8u,(y999+y999j)/2);
    top z999j=(x999,asc_height1);
     path vm_e_pa;
     vm_e_pa=z999..z999i..z999j..cycle; h:= (top y999)+pen_width;
     penlabels(z999,z999i,z999j);
enddef;

def vm_ee_form_a (expr xcoord) =
%    used for vowel modifier ee for some consonants (eg. khee, chee, nee etc)
%    999 was chosen arbitrarily. we needed something not used elsewhere!
%    same suffix should be used by vm_e_form_a.
     vm_e_form_a(xcoord); vm_hook_form(999,3);
enddef;

def vm_u_form (suffix $) =
       bot z$a = (x$+vm_u_width/2,0);
       rt z$b = (x$+vm_u_width,y$);
       z$c = (x$+3/4vm_u_width,3/4x_height);
       top z$d = (x$+vm_u_width/2,x_height);
path vm_u_p;
vm_u_p=z$..z$a..z$b..z$c..z$d;
sketch vm_u_p;
penlabels($a,$b,$c,$d);
enddef;

def vm_ro_form =
    z1 = (1/3vm_ro_width,-1/2des_depth);
    z2 = (1/2vm_ro_width,-1/2des_depth);
    z3 = (1/3vm_ro_width,0);
    lft z4 = (0,-1/2des_depth);
    bot z5 = (1/2vm_ro_width,-des_depth);
    rt z6 = (vm_ro_width,(y5+y7)/2);
    top z7 = (1/2vm_ro_width,x_height);
sketch z1..z2..z3..z4..z5..z6..z7;
enddef;

def vm_ea_form(suffix $) (expr bar_width) =
    z$a=(5/7bar_width,y$);
    z$b=(x$a,asc_height2);
    lft z$c=(0,y$b);
    rt z$d=(bar_width,(y$+y$b)/2);
penlabels ($a,$b,$c,$d);
sketch z$c--z$b..z$d..z$a--z$;
enddef;

def vm_ao_form(suffix $)(expr x_offset) =
           z$a = (1/6vm_ao_width+x_offset,x_height);
     lft z$b = (0+x_offset,asc_height1);
     z$c = (1/6vm_ao_width+x_offset,asc_height2);
     z$d = (2/6vm_ao_width+x_offset,asc_height1);
     z$e = (3/6vm_ao_width+x_offset,asc_height2);
     z$f = (5/6vm_ao_width+x_offset,asc_height2);
     rt z$g = (vm_ao_width+x_offset,1/2(asc_height1+asc_height2));
     top z$h = (5/6vm_ao_width+x_offset,asc_height1);
     z$i = (4/6vm_ao_width+x_offset,asc_height2);
     top z$j = (5/6vm_ao_width+x_offset,asc_height);
     top z$k = (vm_aoo_width+x_offset-1.5u,asc_height);
     rt z$l = (vm_aoo_width+x_offset,asc_height2);
     %rt z$l = (vm_aoo_width+x_offset,1/2(asc_height+asc_height2));
     %rt z$k = (vm_ao_width+x_offset,1/2(asc_height+asc_height2));
     path vm_ao_pa,vm_ao_pb;
     vm_ao_pa =  z$a..z$b..z$c..tension1.2..z$d;
  vm_ao_pb= z$d..tension1.2..z$e..tension 1.8..z$f..z$g..z$h..z$i..z$j..tension 1.8..z$k..z$l;
     w:= rt x$g; h:= top y$c;
     penlabels ($a,$b,$c,$d,$e,$f,$g,$h,$i,$j,$k,$l);
enddef;

%        b---------c--------------d
%                  |            |_|
%           $------a
def vm_au_form (suffix $)(expr bar_width) =  % see the above diagram
   numeric na;
         top  z$e=z$;
   z$a = (x$e+2/10(bar_width-u),y$e);
   z1000 = (x$-u,asc_height2);
               % 1000 was chosen arbitrarily
               % we needed some suffix not used by any user of
               % this macro
   barandhook_form(1000,bar_width,5);
   z$d=z1000a;
   %next two statements solve for c
   x$c = x$a;
   z$c = whatever[z1000,z$d];
   na:=x$c+(x1000a-x$c)/3; % used for alligning pa,pha,sha..
   sketch  z$e--z$a{right}..{left}z$c;
   penlabels($a,$b,$c,$d,$e,1000);
enddef;

def cb_ka_form =
rt x1=rt x5=cb_ka_width; y1=8/10x_height; y5=1/4x_height;
x2=x4=x6=1/2cb_ka_width; top y2=x_height; y4=1/2x_height; bot y6=0;
lft x3=lft x7=0; y3=3/4x_height; y7=x_height-y1;
path cb_ka_p;
cb_ka_p=z7..z6..z5..z4..z3..z2..z1;
enddef;

def cb_kha_form =
z1=(4/15cb_kha_width,5/6x_height);z2=(2/15cb_kha_width,y1-uh);
lft z3=(0,y1); top z4=(x6,x_height);
z5=(5/12cb_kha_width,1/8x_height); bot z6=(1/4cb_kha_width,0);
lft z7=(0,1/4x_height); z8=(1/4cb_kha_width,1/3x_height);
bot z9=(3/4cb_kha_width,0); rt z10=(cb_kha_width,1/3x_height);
top z11=(x9,x_height);
path cb_kha_p;
cb_kha_p=z1..z2..z3..z4..z5..z6..z7..z8..z9..z10..z11;
sketch cb_kha_p;
numeric a,b;
(a,b)=(subpath (3,5) of cb_kha_p) intersectiontimes
         subpath (6,9) of cb_kha_p;
z15 = point a of (subpath (3,5) of cb_kha_p); wedge(15);
enddef;

def cb_ga_form =
bot z1=(u,0); x5=cb_ga_width-x1; bot y5=0;
y2=y4=1/3x_height; lft x2=0; rt x4=cb_ga_width;
top z3=(1/2cb_ga_width,x_height);
path cb_ga_p,cv_ge_p;
cb_ga_p=z1..z2..z3..z4..z5;
sketch cb_ga_p;
       numeric na,nb,nc,nd;
      (na,nb)= cb_ga_p intersectiontimes
                 ((0,vm_e_height2)--(1/2cb_ga_width,vm_e_height2));
       z30= point na of cb_ga_p;
      (nc,nd)= cb_ga_p intersectiontimes
                 ((1/2cb_ga_width,vm_e_height2)--(cb_ga_width,vm_e_height2));
       z32= point nc of cb_ga_p;
       top z31=(1/2cb_ga_width,vm_e_height3);
      cv_ge_p=z30..z31..z32;
enddef;

def cb_cha_form =
lft z1=(0,x_height/2); z2=(cb_cha_width/3,x_height/2);
z3=(cb_cha_width/6,w_height); bot z4=(cb_cha_width/4,0);
z5=(cb_cha_width/2,w_height); bot z6=(3/4cb_cha_width,0);
rt z7=(cb_cha_width,w_height); top z8=(cb_cha_width/2,x_height);
path cb_cha_p;
cb_cha_p=z1--z2..z3..z4..tension1.2..z5&z5..tension1.2..z6..z7..z8;
sketch cb_cha_p;
enddef;

def cb_ja_form =
  lft z1 = (0,j_height); top z2 = (cb_ja_width/4,x_height);
  z3 = (cb_ja_width/2,j_height); z4 = (cb_ja_width/4,x_height/2);
  lft z5 = (0,w_height); bot z6 = (cb_ja_width/4,0);
  z7 = (cb_ja_width/2,w_height); bot z8 = (3/4cb_ja_width,0);
  rt z9 = (cb_ja_width,w_height);
  %following are useful for defining a bowl at the top
  bot lft  z3w=top z3; z3x=(x8,y1); rt z3y=(w,5/6x_height);
  top z3z=(4/5w,x_height);
  path cb_ja_pa,cb_ja_pb;
  cb_ja_pa=z1..z2..z3..z4..z5..z6..tension1.2..z7&z7..tension1.2..z8..z9;
  cb_ja_pb=z3w..z3x..z3y..z3z;
  sketch cb_ja_pa;
  penlabels(3w,3x,3y,3z);
enddef;

def cb_tta_form =
top z1=(1/4cb_tta_width,x_height);
y2=y6=1/2x_height;
lft x2=0; rt x6=cb_tta_width;
x3=x1; x5=cb_tta_width-x3;
bot y3=bot y5=0;
top z4=(1/2cb_tta_width,w_height);
top z7=(cb_tta_width-x1,x_height);
z11=(x1+1.5u,y1-1.45uh);
path cb_tta_p,cb_tta_pa,cb_tta_pb;
cb_tta_pb=z1..z2..z3..tension1.2..z4&z4..tension1.2..z5..z6..z7;
       numeric na,nb,nc,nd;
      (na,nb)= cb_tta_pb intersectiontimes
                 ((0,5/6x_height)--(1/2cb_tta_width,5/6x_height));
 z8=point na of cb_tta_pb;
      (nc,nd)= cb_tta_pb intersectiontimes
                 ((0.6cb_tta_width,w_height)--(cb_tta_width,w_height));
 z20=point nc of cb_tta_pb;
 z19=rt z20;
cb_tta_pa=bot z8..z11..z1;
cb_tta_p=cb_tta_pa..cb_tta_pb;
bot lft z18= z1;% used for placing a vertical line
enddef;

def cb_nna_form =
z1a=(1/3cb_nna_width,1/2sc_height);
bot z1=(1/4cb_nna_width,0); lft z2=(0,1/4x_height);
z3=(1/6cb_nna_width,1/2x_height); lft z4=(0,3/4x_height);
top z5=(1/4cb_nna_width,x_height); z6=(1/2cb_nna_width,j_height);
top z7=(5/8cb_nna_width,x_height); rt z8=(cb_nna_width,1/2x_height);
bot z9=(2/3cb_nna_width,0); z10=(x9-1/2sc_height,sc_height);
z11=(x9,3/2sc_height); z12=(x9+1/2sc_height,sc_height);
path cb_nna_p;
cb_nna_p= z1a..z1..z2..z3&z3..z4..z5..z6&z6..z7..z8..z9..z10..z11..z12;
sketch cb_nna_p;
penlabels(1a);
enddef;

def cb_ta_form =
lft z1=(0,1/2x_height);
z2=(x1+u,y1-uh); z3=(x1+2u,y1); z4=(x2,y1+uh);
bot z5=(1/2cb_ta_width,0); rt z6=(cb_ta_width,1/2x_height);
z7=(x6-u,y6+uh); z8=(x6-2u,y6); z9=(x7,y6-uh);
top z10=(1/2cb_ta_width,x_height);
path cb_ta_p;
cb_ta_p = z1..z2..z3..z4..z1..z5..z6..z7..z8..z9..z6..{left}z10;
enddef;

def cb_da_form =
top z1=(1/2cb_da_width,x_height); lft z2=(0,w_height);
bot z3=(1/3cb_da_width,0);z4=(1/2cb_da_width,w_height);
bot z5=(2/3cb_da_width,0);rt z6=(cb_da_width,1/2x_height);
path cb_da_p,cv_de_p;
cb_da_p= z4..tension 1.2..z5..z6..z1..z2..z3..tension 1.2..z4;
sketch cb_da_p;
       numeric na,nb,nc,nd;
      (na,nb)= cb_da_p intersectiontimes
                 ((0,vm_e_height2)--(1/2cb_da_width,vm_e_height2));
       z30= point na of cb_da_p;
      (nc,nd)= cb_da_p intersectiontimes
                 ((1/2cb_da_width,vm_e_height2)--(cb_da_width,vm_e_height2));
       z32= point nc of cb_da_p;
       top z31=(1/2cb_da_width,vm_e_height3);
      cv_de_p=z30..z31..z32;
enddef;

def cb_na_form =
bot lft z1=(0,0); lft z2=(0,1/2w_height);
z3=(1/3cb_na_width,w_height); bot z4=(2/3cb_na_width,0);
rt z5=(cb_na_width,1/3x_height); top z6=(1/2cb_na_width,x_height);
path cb_na_p;
cb_na_p=z1..z2..z3..z4..z5..z6;
enddef;

def cb_ba_form =
       lft z1 = (u/2,j_height); top z2 = (cb_ba_width/5,x_height);
       z3 = (cb_ba_width/3,j_height); lft z4 = (0,w_height);
       bot z5 = (cb_ba_width/4,0); bot z6 = (cb_ba_width/2,w_height);
       bot z7 = (3/4cb_ba_width,0);
       rt z8 = (cb_ba_width,w_height); %z8  contact point
       top z9 = (2/3cb_ba_width,x_height); % z9 another contact point
       path cb_ba_p;
       cb_ba_p = z1..z2..z3..z4..z5..tension 1.2..z6&z6..tension 1.2..z7..z8..z9;
       sketch cb_ba_p;
enddef;

def cb_ya_form =
    lft z1 = (0,2/5x_height);
    top z2 = (3/10cb_ya_width,8/10x_height);
    rt z3 = (3/5cb_ya_width,y1);
    bot z4 = (x2,0);
    bot z5 = (4/5cb_ya_width,0);
    rt z6 = (cb_ya_width,w_height);
    z7 = ((x5+x6)/2,7.3/10x_height);
    top z8 = (9/20cb_ya_width,x_height);
enddef;

def cb_ra_form =
       top z1=(cb_ra_width/2,x_height);
       lft z2 = (0,w_height);
       bot z3 = (cb_ra_width/2,0);
       rt z4 = (cb_ra_width,y2);
       path cb_ra_p,cv_re_p;
  cb_ra_p =  z1..z2..z3..z4..cycle;
  sketch  cb_ra_p;
       numeric na,nb,nc,nd;
      (na,nb)= cb_ra_p intersectiontimes
                 ((0,vm_e_height2)--(1/2cb_ra_width,vm_e_height2));
       z30= point na of cb_ra_p;
      (nc,nd)= cb_ra_p intersectiontimes
                 ((1/2cb_ra_width,vm_e_height2)--(cb_ra_width,vm_e_height2));
       z32= point nc of cb_ra_p;
       top z31=(1/2cb_ra_width,vm_e_height3);
      cv_re_p=z30..z31..z32;
 enddef;

def cb_rra_form =
cb_tta_form;
z14=(cb_tta_width-1.5x1,x_height-sc_height);
z15=(x7,1/2x_height);z16=(x1,y15);
path cb_rra_p;
cb_rra_p= cb_tta_p..z14..z15--z16;
sketch cb_rra_p;
enddef;

def cb_la_form =
top z1=(1/4cb_la_width,x_height);
lft z2=(0,x_height/2); bot z3=(1/2cb_la_width,0);
rt z4=(cb_la_width,y2); top z5=(cb_la_width-x1,x_height);
z7=(x1+1.5u,2/3x_height);
path cb_la_pa,cb_la_pb,cb_la_p;
cb_la_pb=z1..z2..z3..z4..z5;
z6=point 0.35 of cb_la_pb;
cb_la_pa= bot rt z6..z7..z1;
cb_la_p=cb_la_pa..cb_la_pb;
% z8 is useful for la+u and la+uu
numeric na,nb;
(na,nb)=cb_la_pb intersectiontimes
      ((cb_la_width/2,w_height)..(cb_la_width,w_height));
z9=point na of cb_la_pb;
z8=rt z9;
enddef;

def cb_lla_form =
top z1=(cb_lla_width/2,w_height);
bot z2 =(x1,0);
z6=(1/3cb_lla_width,x_height-2uh); z3=(x6+u/2,y6-uh);
z4=(x6,.6x_height); z5=(x6+u/2,y3); lft z7=(0,2/3x_height);
bot z8=top z1; rt z9=(cb_lla_width,y7); top z10=(1/2cb_lla_width,x_height);
path cb_lla_pa,cb_lla_pb;
cb_lla_pa=z3..z4..z5..z6..z7..z8..z9..z10;
cb_lla_pb=z1..z2..cycle;
sketch cb_lla_pa;
sketch cb_lla_pb;
% z12 is useful for lla+u and lla+uu
numeric na,nb;
(na,nb)=cb_lla_pa intersectiontimes
      ((cb_lla_width/2,x_height/2)..(cb_lla_width,x_height/2));
z13=point na of cb_lla_pa;
z12=rt z13;
enddef;

def cb_va_form  =
   lit_cir_form;
       bot z2 = (3/5cb_va_width,0); rt z3 = (cb_va_width,w_height);
       z4 = (7/8cb_va_width,j_height); top lft z5 = (x1,x_height);
path cb_va_p,cv_paa_p;
cb_va_p=z1..z2..z3..z4..z5;
top z20=(cb_va_width/2,h);
cv_paa_p=subpath(0,2) of cb_va_p{up}..z20;
% z22 is useful for alligning au modifier
numeric na,nb;
(na,nb)=cv_paa_p intersectiontimes
      ((cb_va_width/2,asc_height2)..(cb_va_width,asc_height2));
z22=point na of cv_paa_p;
enddef;

def cb_ca_form =
lft z1=(0,1/2x_height); z2=(1/3cb_ca_width,6/8x_height);
bot z3=(1/3cb_ca_width,0); z4=(3/4cb_ca_width,1/3x_height);
rt z5=(cb_ca_width,2/3x_height); top z6=(1/2cb_ca_width,x_height);
lft z7=(0,1/6x_height);
path cb_ca_p,cb_ca_pa;
cb_ca_p=z1..z2{right}..z4..z3..z7..z4..z5..z6;
sketch cb_ca_p;
% z10 is useful for ca+u and ca+uu
cb_ca_pa=subpath(1,3) of cb_ca_p;
numeric na,nb;
(na,nb)=cb_ca_pa intersectiontimes
      ((0,w_height)..(cb_ca_width,w_height));
z11=point na of cb_ca_pa;
z10=rt z11;
enddef;

def cb_ksha_form =
cb_ka_form;
top z11 = (1/5cb_ka_width,0);
lft z12 = (0,-1/2cb_ksha_depth);
bot z13 = (x11,-cb_ksha_depth);
z14 = (2/5cb_ka_width,-2/3cb_ksha_depth);
bot z15 = (3/5cb_ka_width,-cb_ksha_depth);
z16 = (4/5cb_ka_width,-1/2cb_ksha_depth);
top z17 = (x15,0);
bot rt z18 = (cb_ka_width,-cb_ksha_depth);
sketch z11..z12..z13..z14; sketch z14..z15..z16..z17;
sketch z16..z18;
enddef;


def cc_clear =
%erase all that is drawn so far.
   clearit;
   lft z99=(0,100);
   left_spill := xpart(lft (z99 scaled cc_scale)) - xpart(lft z99);
   bot z98=(100,0);
   bot_spill := ypart(bot (z98 scaled cc_scale)) - ypart(bot  z98);
   top((z97 scaled cc_scale)
   shifted (0,-bot_accent-(x_height*cc_scale))
   shifted (-left_spill,-bot_spill))=
                   (w*cc_scale/2,x_height);
enddef;

def cc_transform(text t) =
% used to obtain consonant conjuncts for some consonants and vowels lo&loo
path cc_transformed_path;
cc_transformed_path =  t  scaled cc_scale
         shifted (0,-bot_accent-(x_height*cc_scale));
sketch cc_transformed_path;
enddef;

def cc_f_transform(text t) =
% used to obtain consonant conjuncts for some consonants and vowels lo&loo
fill t  scaled cc_scale
         shifted (0,-bot_accent-(x_height*cc_scale));
enddef;

def cc_whd (expr hh,dd) =
%this macro sets w, h and d for accents that appear below baseline.
% for some consonant conjuncts that result from transforming
% consonant bases the height is not zero (eg. cha, ba ,pa etc)
% for such symbols hh should be 1 and for others hh should be 0.
% Some consonant bases have wedges that hang below base line (eg. bha, pha
% ddha etc. ). For these dd should be 1 and for others dd should be 0.
%
%When a picture is scaled, what really happens is the componant paths
% are scaled and the picture is redrawn. Hence we need to adjust w,h and d.
% Still consonant conjunct for nya needs special care( for d).
w:=w*cc_scale-pen_width*cc_scale+pen_width;;
h:=hh*x_height;
d:=bot_accent+((x_height+(dd*wedge_depth))*cc_scale)+dd*bot_spill;
% (x,y) slanted s shifted (a,b) is (x+sy+a,y+b)   whereas
% (x,y) shifted (a,b) slanted s is (x+sy+a+ bs,y+b). Hence we
% need to add the correction 'bs'. 'bs' is -bot_spill*slant
currentpicture:=currentpicture shifted
               (-left_spill+((-bot_spill)*slant),-bot_spill);
enddef;

def cv_ngu_form =
 z1=(0,j_height); z2=(cb_ja_width/4,j_height-uh#);
 rt z3=(cb_ja_width/2,5/6x_height); top z4=(4/10cb_ja_width,x_height);
 sketch z1..z2..z3..z4;
enddef;

def cv_ju_form =
 z1=(0,5/6x_height); z2=(cb_ja_width/4,j_height);
 rt z3=(cb_ja_width/2,y1); top z4=(4/10cb_ja_width,x_height);
 sketch z1..z2..z3..z4;
enddef;

def cv_pu_form =
  top lft z1=(0,c_height/2); bot z2=(cv_pu_width/2,-cv_pu_depth);
  rt z3=(cv_pu_width,h/2); top z4=(cv_pu_width-2u,x_height);
  sketch z1..z2..z3..z4;
enddef;

def dr_sixnine_form =
   path dr_sixnine_p;
   top rt z1 = (w,fig_height);
   z2 = (w/2+u,y1-uh);
   bot z4 = (w/2,0);
   rt z5 = (w,x4);
   z6 = (x4,x5-x7);
   lft z7 = (0,y5);
dr_sixnine_p =  z1..z2..z7..z4..z5..z6..z7;
enddef;

def dt_six_form=
path dt_six_pa,dt_six_pb;
    top z1=(w/5,h);  lft z2=(0,3h/4);  z3=(x1,h/2);
    z4=(w/3,h/2); lft z5=(0,h/4);  bot z6=(x1,0);
    bot rt z7=(w,0);
dt_six_pa= flex(z1,z2,z3)& z3--z4;
dt_six_pb=flex(z3,z5,z6)& z6--z7;
enddef;


def p_comma_form =
path p_comma_p;
   z1 = (dot_radius,dot_radius);
   rt z2 = (p_comma_width,0);
   bot lft  z3 = (x1-1/2dot_radius,-des_depth);
fill_dot(1); p_comma_p= flex(z1,z2,z3);
sketch p_comma_p;
enddef;

def p_bar_form =
path p_bar_p;
   bot lft z1 = (0,0);
   top lft z2 = (0,x_height);
p_bar_p= z1--z2;
enddef;

def p_slash_form =
path p_slash_p;
   bot lft z1 = (0,-des_depth);
   top rt z2 = (6u,asc_height);
p_slash_p= z1--z2;
enddef;

def p_lbracket_form =   % square bracket
path p_lbracket_p;
   top lft z1 = (0,top_height);
   bot lft z2 = (0,-bot_depth);
   rt z3 =  (w,y1);
   rt z4 =  (w,y2);
p_lbracket_p=z3--z1--z2--z4;
enddef;


def p_rparen_form =
path p_rparen_p;
   top lft z1 = (0,top_height);  bot lft z2 = (0,-bot_depth);
   rt z3 = (w,(-d+h)/2);
p_rparen_p= flex(z1,z3,z2);
enddef;


def p_lbrace_form =
path p_lbrace_p;
   top rt z1 = (w,h);  lft z4 = (0,(h-d)/2);
       z2 = (w/2,-d+7/8(h+d));
       z3 = (x2,-d+5/8(h+d));
p_lbrace_p= z1..z2..z3..z4;
p_lbrace_p:=(p_lbrace_p  reflectedabout (z4,z4+(w,0))  )..reverse(p_lbrace_p);
enddef;