/*************************************************************************************************************************************/
/* */
/* C O N V O L U T I O N D E L ' I M A G E A R G U M E N T : */
/* */
/* */
/* Author of '$xci/convol.01$I' : */
/* */
/* Jean-Francois Colonna (LACTAMME, 1993??????????). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* M A C R O S U T I L E S : */
/* */
/*************************************************************************************************************************************/
#define SELECTION_DES_NIVEAUX(nom_palette,niveaux_a_traiter,niveaux_cumulables) \
Bblock \
BoIn(niveau,NOIR,BLANC,PAS_COULEURS) \
Bblock \
EGAL(ITb1(niveaux_a_traiter,INDX(niveau,NOIR)),VRAI); \
EGAL(ITb1(niveaux_cumulables,INDX(niveau,NOIR)),VRAI); \
/* Initialisation telle que tous les niveaux soient a la fois "traitables" et "cumulables". */ \
Eblock \
EBoI \
\
Test(IL_FAUT(exclure_un_niveau_de_la_convolution)) \
Bblock \
EGAL(ITb1(niveaux_a_traiter,INDX(niveau_a_exclure_de_la_convolution,NOIR)),FAUX); \
/* Possibilite introduite le 20060302163815 dans 'v $xci/convol.01$K' (et dans les autres */ \
/* programmes '$xci/convol.0?$K') puis generalisee ici le 20060304181214. Ceci est destine */ \
/* a ameliorer les images obtenues par 'v $xci/detourage.11$Z' et 'v $xci/detourage.13$Z' */ \
/* en convoluant le resultat, sauf le NOIR... */ \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
\
Test(IFNE_chaine(nom_palette,NOM_PIPE)) \
Bblock \
Test(PAS_D_ERREUR(CODE_ERROR(Iload_liste_de_substitution(L_SUBSTITUTION_VARIABLE,nom_palette)))) \
Bblock \
BoIn(niveau,NOIR,BLANC,PAS_COULEURS) \
Bblock \
EGAL(ITb1(niveaux_a_traiter,INDX(niveau,NOIR)) \
,COND(IFLE(ACCES_listes_de_substitution(L_SUBSTITUTION_VARIABLE,niveau) \
,seuil_de_FAUX_VRAI_pour_les_niveaux_a_traiter \
) \
,FAUX \
,VRAI \
) \
); \
/* La liste 'L_SUBSTITUTION_VARIABLE' est convertie en valeurs logiques {FAUX,VRAI} */ \
/* suivant le seuil 'seuil_de_FAUX_VRAI_pour_les_niveaux_a_traiter'... */ \
Eblock \
EBoI \
Eblock \
ATes \
Bblock \
/* En cas d'erreur, les listes {niveaux_a_traiter,niveaux_cumulables} ont ete initialisees */ \
/* ci-dessus... */ \
Eblock \
ETes \
Eblock \
ATes \
Bblock \
Eblock \
ETes \
Eblock \
/* Definition des listes de niveaux a traiter (introduit le 20060304181214)... */
#define NOYAU(numero,valeur) \
Bblock \
EGAL(ITb1(noyau,INDX(numero,PREMIER_POINT)),valeur); \
\
Test(EST_VRAI(le_noyau_de_convolution_est_carre)) \
Bblock \
EGAL(ITb1(inhibition_du_noyau,INDX(numero,PREMIER_POINT)),ACTIF); \
/* Lorsque le noyau de convolution est carre, on prend tous les points de la spirale. */ \
Eblock \
ATes \
Bblock \
DEFV(Int,INIT(X,UNDEF)); \
DEFV(Int,INIT(Y,UNDEF)); \
\
EGAL(X,iSPIRALE_X(numero,Pconvolution_____nombre_de_points_sautes)); \
EGAL(Y,iSPIRALE_Y(numero,Pconvolution_____nombre_de_points_sautes)); \
/* Definition des coordonnees {X,Y} du point courant relativement au centre de la spirale, */ \
/* qui s'appelle (Xcentre_SPIRALE,Ycentre_SPIRALE). Le passage par les fonctions */ \
/* 'iSPIRALE_X(...)' et 'iSPIRALE_Y(...)' est destine a alleger le travail de certains */ \
/* compilateurs, et par exemple de 'SYSTEME_SGPCM801_IRIX_CC'. */ \
\
Test(IFLT(RdisI2D(X,Y,Xcentre_SPIRALE,Ycentre_SPIRALE) \
,MOIT(RACX(nombre_de_points)) \
) \
) \
/* Le nombre de points du noyau (soit 'N') donne la surface du carre representant le noyau */ \
/* de convolution. La moitie de sa racine carre est donc le rayon du cercle inscrit dans le */ \
/* noyau carre, qui definit donc le noyau circulaire. */ \
Bblock \
EGAL(ITb1(inhibition_du_noyau,INDX(numero,PREMIER_POINT)),ACTIF); \
/* Lorsque le noyau de convolution est circulaire, on ne prend que les points qui sont */ \
/* situes dans le cercle inscrit a l'interieur du noyau carre... */ \
Eblock \
ATes \
Bblock \
EGAL(ITb1(inhibition_du_noyau,INDX(numero,PREMIER_POINT)),INACTIF); \
/* Lorsque le noyau de convolution est circulaire, on exclue les points qui sont situes a */ \
/* l'exterieur du cercle inscrit a l'interieur du noyau carre... */ \
Eblock \
ETes \
Eblock \
ETes \
Eblock \
/* Definition de la liste d'inhibition suivant que le noyau est carre ou circulaire... */