%PDF- %PDF-
| Direktori : /proc/self/root/data/old/usr/share/texlive/texmf-dist/fonts/source/public/cbfonts/ |
| Current File : //proc/self/root/data/old/usr/share/texlive/texmf-dist/fonts/source/public/cbfonts/cbspline.mf |
% Copyright (C) 1997, 1999 Claudio Beccari
% The copyright holds only for the file that enucleates the spline macros,
% not for the macros themselves that are copyright of J"orge Knappen.
%
% This file includes the spline macros for computing font paramenters
% from a table. It includes all the macros written by J"orge Knappen for the
% ec fonts. Thanks to J"orge for the good things these macros do, blame to me
% for their misuse.
vardef simple_gendef@#(text aa)(text t)=
string s[];
s1:="";
s2:=str @#;
index:=1;
forsuffixes $=t: ydata[index]:=$ if s1<>s2: *@# fi;
index:=index+1;
endfor;
if numpoints>(index-1): errmessage "Missing parameter"; message str aa; fi;
if numpoints<(index-1): errmessage "Too many parameters"; message str aa; fi;
aa:=ydata[merke];
if gencheck: message str aa fi;
enddef;
vardef extended_gendef@#(text aa)(text t)=
string s[];
s1:="";
s2:=str @#;
index:=1;
forsuffixes $=t: ydata[index]:=$ if s1<>s2: *@# fi;
index:=index+1;
endfor;
if numpoints>(index-1): errmessage "Missing parameter"; message str aa; fi;
if numpoints<(index-1): errmessage "Too many parameters"; message str aa; fi;
if gensize>basedata[numpoints]:
numeric hilf [];
hilf[1]:=(ydata[numpoints]-ydata[numpoints-1])/(basedata[numpoints]-basedata[numpoints-1]);
hilf[2]:=(ydata[numpoints]-ydata[numpoints-2])/(basedata[numpoints]-basedata[numpoints-2]);
hilf[3]:=ydata[numpoints]-hilf1*basedata[numpoints];
hilf[4]:=ydata[numpoints]-hilf2*basedata[numpoints];
spy:=(hilf[1]*gensize+hilf[3])/2+(hilf[2]*gensize+hilf[4])/2;
aa:=spy;
else:
for index = 1 upto numpoints-1:
interval[index]:=basedata[index+1]-basedata[index];
endfor;
for index=1 upto numpoints:
spline[1][index]:=ydata[index];
endfor;
for index=2 upto numpoints-1:
alpha[index]:=3*((spline[1][index+1]*interval[index-1])%
-(spline[1][index]*(basedata[index+1]-basedata[index-1]))%
+(spline[1][index-1]*interval[index]))%
/(interval[index-1]*interval[index]);
endfor;
spl[1]:=0;
spmu[1]:=0;
spz[1]:=0;
for index=2 upto numpoints-1:
spl[index]:=2*(basedata[index+1]-basedata[index-1])%
-interval[index-1]*spmu[index-1];
spmu[index]:=interval[index]/spl[index];
spz[index]:=(alpha[index]-interval[index-1]*spz[index-1])/spl[index];
endfor;
spline[3][numpoints]:=0;
for index=numpoints-1 downto 1:
spline[3][index]:=spz[index]-spmu[index]*spline[3][index+1];
endfor;
for index=numpoints -1 downto 1:
spline[2][index]:=(spline[1][index+1]-spline[1][index])/interval[index]%
-interval[index]*(spline[3][index+1]*spline[3][index])/3;
spline[4][index]:=(spline[3][index+1]-spline[3][index])/(3*interval[index]);
endfor;
location:=1;
for term=1 upto numpoints-1:
if gensize > basedata[term]: location:=term; fi
endfor;
spx:=gensize-basedata[location];
spy:=((spline[4][location]*spx+spline[3][location])*spx+spline[2][location])*spx+spline[1][location];
aa:=spy; fi;
if gencheck: message str aa fi;
enddef;
vardef basedef(text t)=
boolean basevalue; boolean gencheck;
numeric index; numeric ergbnis; numeric location; numeric term;
numeric numpoints; numeric spx; numeric spy;
numeric basedata[]; numeric interval[]; numeric alpha[];
numeric spl[]; numeric spmu[]; numeric spz[];
numeric ydata[]; numeric spline[][];
basevalue:=false; gencheck:=false;
index:=1;
forsuffixes $=t: basedata[index]:=$;
if $=gensize: basevalue:=true; merke:=index; fi;
index:=index+1;
endfor;
numpoints:=index-1;
if numpoints<3: errmessage "Not enough reference points"; fi
if basevalue: def gendef=simple_gendef enddef; else:
def gendef=extended_gendef enddef; fi
enddef;
def clear_extra_memory= % Release ressources hold by the extrapolation routine
numeric index; numeric ergbnis; numeric location; numeric term;
numeric numpoints; numeric spx; numeric spy;
numeric basedata[]; numeric interval[]; numeric alpha[];
numeric spl[]; numeric spmu[]; numeric spz[];
numeric ydata[]; numeric spline[][];
numeric hilf []; string s[];
enddef;
endinput;