Fichier ml_3.jps — Modifié le 18 Juin 2006 à 22 h 41
%% 3 lignes de jps a eliminer pour avoir du pur postscript
-12 12 setxrange
-2 8 setyrange
20 setxunit
%% fin du jps a eliminer
%% definition de la modulation par un chemin, exemple de Manuel Luque
%% 2 definitions preliminaires : "defppathtable" et "interpolfunct"
%% syntaxe : defppathtable --> array, tableau de points definis
%% par le chemin courant (ds le repere postscript)
/defppathtable {
gsave
flattenpath
[
{} {} {} {} pathforall
]
grestore
} def
%% syntaxe : x array interpolfunct --> f(x) interpole a partir du
%% tableau de points array
/interpolfunct {
11 dict begin
/table_f exch def
/x exch def
%% n = le + grand indice
/n table_f length 2 idiv 1 sub def
/x0 table_f 0 get def
/xn table_f 2 n mul get def
/xi+1 0 def
xn x0 gt {
%% table_f trie par x croissant
/y_xmin table_f 1 get def
/y_xmax table_f n 2 mul 1 add get def
/i 0 def
/increment 1 def
/xi x0 def
} {
%% table_f trie par x decroissant
/y_xmax table_f 1 get def
/y_xmin table_f n 2 mul 1 add get def
/i n def
/increment -1 def
/xi xn def
} ifelse
x x0 lt x xn lt and {
%% x < x0 et x < xn
y_xmin
%% (x0) x0
%% (xn) xn
%% (x) x blim
} {
x xn gt x x0 gt and {
%% x > x0 et x > xn
y_xmax
} {
%% x dans [xi ; xn] ou dans [xi ; x0]
{
/i i increment add store
i 0 lt i n gt or {
%% impossible en principe
(PROBLEME DANS F) boum
} if
/xi+1 table_f 2 i mul get store
x xi+1 le {
%% alors xi < x < xi+1
/yi+1 table_f 2 i mul 1 add get def
/yi table_f 2 i increment sub mul 1 add get def
yi+1 yi sub xi+1 xi sub div
x xi sub mul
yi add
%% (xi) xi
%% (xi+1) xi+1
%% (yi) yi
%% (yi+1) yi+1
exit
} {
%% alors x dans [xi+1 ; xn] (ou [xi+1 ; x0])
/xi xi+1 store
% (i) i
} ifelse
} loop
} ifelse
} ifelse
end
} def
%% definition d'une fonction numerique a partir de son graphe (défini
%% par un chemin)
%% on utilisera ensuite cette fonction numerique pour deformer le texte
%% a decommenter pour du postscript sans jps
%% 297 600 translate
newpath
-210 20 moveto
-80 20 lineto
20 20 80 180 0 arcn
100 20 lineto
210 20 lineto
defppathtable
/table exch def
/f {table interpolfunct} def
%% juste pour visualiser le chemin
0 0 1 setrgbcolor
3 setlinewidth
stroke
1 setlinewidth
0 setgray
%% variations a partir d'un fichier original de :
% (c) P. Kleiweg 1997
%% modifie par jpv, dim jun 18 13:18:13 CEST 2006
%% les parametres du fichier :
%% le decalage (en picas) du texte par rapport a sa ligne de base
/decalage_vertical 0 def
%% la police et sa taille
%% Caractères accentués
/ReEncode { exch findfont
dup length dict begin { 1 index /FID eq {pop pop} {def} ifelse
}forall /Encoding ISOLatin1Encoding def currentdict end definefont
pop }bind def
/Font /Times-Roman /ISOfont ReEncode /ISOfont def
Font findfont 40 scalefont setfont
%% le texte a deformer (les x sont dans [-warphalf ; warphalf])
/warptxt (au milieu une bulle gonfle) def
%% la procedure de base pour la transformation des points du chemin
%% (x, y) --> (X, Y)
%% cette fonction peut utiliser les variables warpwidth et warphalf
/warp {
3 dict begin
/y exch def
/x exch def
x y
%% on multiplie y par f (x)/20 (on divise par 20 car les f(x)
%% oscillent autour de 20)
x f 20 div mul
end
} bind def
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% tout ce qui suit n'a pas a etre modifie %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
/warpwidth warptxt stringwidth pop def %% largeur horizontale du texte
/warphalf warpwidth 2 div def %% demi-largeur horizontale
%% pour remplacer 'move'
/warpmove{
%% on teste le booleen place 2 tokens plus en avant sur la pile
%% si c'est 'true', alors on en est au 1er appel => on initialise
%% le chemin
2 index {
newpath
} if
%% puis on applique warp a notre point
warp moveto
%% on enleve le 'true' pour mettre un 'false' a la place
pop false
} bind def
%% pour remplacer 'lineto
/warpline {
warp lineto
} bind def
%% pour remplacer 'curveto'
/warpcurve {
6 2 roll warp
6 2 roll warp
6 2 roll warp
curveto
} bind def
%% 'warpit' declenche la transformation du chemin courant
/warpit {
true
{ warpmove } { warpline } { warpcurve } { closepath } pathforall
pop
} bind def
newpath
%% on se deplace (init chemin) de facon a
%% centrer la ligne de base du texte en (0 , - decalage_vertical)
warphalf neg decalage_vertical neg moveto
warptxt true charpath %% on cree le chemin
%% maintenant on y va
warpit %% on applique le pathforall
stroke %% puis on encre