% This software is copyright (c) 2005 by Fr�d�ric Mazoit
%
% This program is free software; you can redistribute it and/or modify
% it under the terms of the GNU General Public License as published by
% the Free Software Foundation; either version 2 of the License, or
% any later version.
%
% This program is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
% GNU General Public License for more details.
def mkLabel(expr x)=
if picture x: x
else: x infont defaultfont fi
enddef;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
def exists(expr i,j)=
known typeEl.[i][j]c
enddef;
def getH(expr x)= if known x: ypart(ulcorner x-llcorner x) else: 0 fi enddef;
def getL(expr x)= if known x: xpart(urcorner x-ulcorner x) else: 0 fi enddef;
vardef getHcase(expr i,j)=
max(
max(
deltaY,
if known el.[i][j]l: getH(el.[i][j]l) else: 0 fi),
max(
if known el.[i][j]c: getH(el.[i][j]c) else: 0 fi,
if known el.[i][j]r: getH(el.[i][j]r) else: 0 fi)
)
enddef;
vardef getMcase(expr i,j)=
save type;
if exists(i,j):
type:=typeEl.[i][j]c;
if (type=Plus_) or (type=Moins_) or (type=Fleche_) or (type=NonDefRegion_):
.5deltaXsignes+.5deltaX
elseif (type=NonDefBarre_): 2pt+.5deltaX
elseif (type=Barre_) or (type=Vide_): 0
else: .5deltaX+if known el.[i][j]c:.5getL(el.[i][j]c) else: 0 fi
fi
else: 0 fi
enddef;
vardef getGcase(expr i,j)=
getMcase(i,j)+ if known el.[i][j]l:getL(el.[i][j]l) else: 0 fi
enddef;
vardef getDcase(expr i,j)=
getMcase(i,j)+ if known el.[i][j]r:getL(el.[i][j]r) else: 0 fi
enddef;
vardef getGcol(expr col)=
save res,i;
res=0;
for i=1 upto nbLgn: res:=max(res,getGcase(i,col)); endfor;
res
enddef;
vardef getDcol(expr col)=
save res,i;
res=0;
for i=1 upto nbLgn: res:=max(res,getDcase(i,col)); endfor;
res
enddef;
vardef getHelsLgn(expr line)=
save res, j;
res:=11pt;
for j=0 upto nbCol: res:=max(res,getHcase(line,j)); endfor;
res
enddef;
vardef getHLgn(expr line)=
if typeLgn[line]=Variations_:
max(getHelsLgn(line)+deltaYvariations,40pt)+deltaY
else:
getHelsLgn(line)+deltaY
fi
enddef;
def sgnSmp_(expr s)=
vd:=0;
col:=col+1;
if col>nbCol: nbCol:=col; fi;
typeEl.[nbLgn][col]c=s;
enddef;
def chkCol(expr a)=
if (col mod 2)=a:
if ndf=1: sgn_(NonDefRegion_,1);
elseif (typeLgn[nbLgn]=Variations_) and (vd=0): fleche;
else: sgnSmp_(Vide_);
fi
fi
enddef;
for i=1 upto nbCol:
x[i]:=xCol[i]+getGcol(i);
xCol[i+1]:=x[i]+getDcol(i);
endfor
yLgn[1]:=0;
for i=1 upto nbLgn:
y[i]:=yLgn[i]-.5getHLgn(i);
yLgn[i+1]:=y[i]-0.5*getHLgn(i);
endfor;
enddef;
vardef calcP(expr i,j)=
if exists(i,j):
if (typeEl.[i][j]c=Valeur_) or (typeEl.[i][j]c=VidePos_):
(x[j],y[i]+(pos.[i][j]c-.5)*(getHLgn(i)-getHelsLgn(i)))
else: (x[j],y[i]) fi
else: (x[j],y[i]) fi
enddef;
if k=Fleche_: drawarrow else: draw fi(
if known el.[i][aa]r: calcPr(i,aa) else: calcP(i,aa) fi--
if known el.[i][bb]l: calcPl(i,bb) else: calcP(i,bb) fi)
if known el.[i][aa]r: cutbefore(bbox(thelabel(el.[i][aa]r,calcPr(i,aa)))) fi
if known el.[i][aa]c: cutbefore(bbox(thelabel(el.[i][aa]c,calcP(i,aa)))) fi
if known el.[i][bb]l: cutafter(bbox(thelabel(el.[i][bb]l,calcPl(i,bb)))) fi
if known el.[i][bb]c: cutafter(bbox(thelabel(el.[i][bb]c,calcP(i,bb)))) fi;
enddef;
vardef rempli(expr xa,xb,ya,yb)=
save i;
for i=1 step 5pt until xb-xa+ya-yb-1:
draw (xa,ya-i)--(xa+i,ya) cutbefore ((xa,yb)--(xb,yb)) cutafter ((xb,ya)--(xb,yb));
endfor
enddef;
elseif t=Valeur_:
label(el.[i][j]c,calcP(i,j));
fi
if known el.[i][j]l: label(el.[i][j]l,calcPl(i,j)); fi;
if known el.[i][j]r: label(el.[i][j]r,calcPr(i,j)); fi;
fi
endfor
endfor
for i=2 upto nbLgn:
draw (xCol[1],yLgn[i])--(xCol[nbCol+1],yLgn[i]);
endfor;