% 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;