/*************************************************************************************************************************************/ /* */ /* 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... */