/*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S I M A G E S E N M E M O I R E : */ /* */ /* */ /* Definitions des termes utilises : */ /* */ /* On utilisera en general trois images, appelees */ /* "imageA1", "imageA2" et "imageR" (le "A" signifiant */ /* 'Argument' et le "R", 'Resultat') ; en effet, les */ /* operations effectuees seront du type : */ /* */ /* imageR <-- (imageA1).OP.(imageA2) */ /* */ /* ou '.OP.' designe un operateur. */ /* */ /* On appelera image "standard", une image dont */ /* les pixels sont generes par "genere_p" via "image", */ /* et image "CHAR"/"Int"/"Float"/"Double"/"complexe"/"hyper_complexe" une image dont les */ /* pixels sont generes par "CHAR"/"Int"/"Positive"/"Float"/"Double"/"complexe"/"hyper_complexe" */ /* via "imageC"/"imageI"/"imageU"/"imageF"/"imageD"/"imageJ"/"imageHJ"/"imageHHJ". */ /* */ /* */ /* Rangement en memoire : */ /* */ /* Les images image(X,Y) sont rangees sequentiellement */ /* dans la memoire de la facon suivante : c'est la */ /* coordonnee "X" qui varie la plus vite ; on trouve donc */ /* ainsi dans l'ordre les points {X,Y} : */ /* */ /* (0,0),(1,0),(2,0),... */ /* (0,1),(1,1),(2,1),... */ /* (0,2),(1,2),(2,2),... */ /* . */ /* . */ /* . */ /* */ /* ce qui correspond a : */ /* */ /* image[Y][X] */ /* */ /* en langage C et donc a une imdexation lineaire du */ /* type : */ /* */ /* image[(X*dimY)+Y] */ /* */ /* D'une part, on regardera avec interet les deux tests */ /* 'v $xtc/t_cache.01$c' et 'v $xtc/t_cache.02$c' qui montrent */ /* que cet ordre de rangement, associe aux procedures */ /* '{begin_image,end_image}', garantissent le meilleur */ /* usage du cache du processeur. */ /* */ /* D'autre part, lors de la sortie sur bande d'images, */ /* elles sont pretes a sortir sur un support raster */ /* ligne a ligne... */ /* */ /* On regardera quand meme avec interet les differences */ /* entre 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_01' et */ /* 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_02'... */ /* */ /* */ /* */ /* "PIPE-LINE" de traitement des images : il transporte des tuples (X,Y[,Z],niveau_a_marquer), */ /* ------------------------------------ ---- */ /* ou | | designe une "image" de type "standard" (sauf pour le 'Z_Buffer'). */ /* ---- */ /* */ /* */ /* Acces tri-dimensionnels */ /* ----------------------------> TEST_Z_Buffer_() */ /* | | */ /* |--> store_point_3D() */ /* |--> store_point_3D_RVB() */ /* |--> store_point_ND() */ /* --> store_point_ND_RVB() */ /* | */ /* | */ /* | */ /* | */ /* | */ /* + */ /* ---------------------------------------------------------------- loadF_point(Z_Buffer,...) */ /* | | storeF_point(Z_Buffer,...) */ /* | Z_Buffer (flottant) |<------------------------------------> */ /* | | Acces-SGF */ /* ---------------------------------------------------------------- */ /* | */ /* | */ /* | */ /* | */ /* ---> store_point() */ /* |---> store_point_2D() */ /* |---> store_point_2D_RVB() */ /* | | */ /* |---> storeC_point() */ /* Acces bi-dimensionnels |---> storeI_point() */ /* -------------------------|---> storeF_point() */ /* | | */ /* |---> store_voint() */ /* | | */ /* ---> storeF_voint() */ /* | */ /* | */ /* | */ /* + */ /* ---------------------------------------------------------------- */ /* | | si Masque_____etat=ACTIF, et */ /* | Masque (seuil) |-------------------------------------> */ /* | | niveau_a_marquer<seuil, et */ /* ---------------------------------------------------------------- ("load", "store" ou "parcours") masquee */ /* si Masque_____etat=INACTIF, ou */ /* niveau_a_marquer>=seuil, ou */ /* fonction ("load", "store" ou "parcours") non masquee */ /* | */ /* | */ /* | */ /* | */ /* | storeC_point(), storeI_point(), storeF_point() */ /* |------------------------------------------------------- */ /* | et store_point() si etat_Filtrage_niveaux=INACTIF | */ /* | | */ /* | | */ /* store_point() | */ /* si etat_Filtrage_niveaux=ACTIF | */ /* | | */ /* | | */ /* + | */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * | */ /* * * si niveau_anterieur | */ /* * Ecrasement : liste_d_ecrasement[COULEURS]=INTERDIT/AUTORISE * -------------------- | --------------> */ /* * * =INTERDIT | */ /* * (ATTENTION : cette action n'est pas effectuee si * | */ /* * ne_faire_que_les_substitutions=VRAI) * | */ /* * * | */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * | */ /* si niveau_anterieur=AUTORISE | */ /* | | */ /* | | */ /* + | */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * | */ /* * * | */ /* * Substitution : L_SUBSTITUTION_XX * | */ /* * dont les substitutions (ROUGE,VERTE,BLEUE) * | */ /* * * | */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * | */ /* | | */ /* | | */ /* | | */ /* + | */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * | */ /* * * | */ /* * Calibrage : modulo [origine,extremite] * | */ /* * * | */ /* * (ATTENTION : cette action n'est pas effectuee si * | */ /* * ne_faire_que_les_substitutions=VRAI) * | */ /* * * | */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * | */ /* | | */ /* | | */ /* | | */ /* + | */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * | */ /* * * | */ /* * Calibrage : seuillage[bas,haut] * | */ /* * * | */ /* * (ATTENTION : cette action n'est pas effectuee si * | */ /* * ne_faire_que_les_substitutions=VRAI) * | */ /* * * | */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * | */ /* | | */ /* | | */ /* | | */ /* + | */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * | */ /* * * | */ /* * Fonctions Vf : Vf(niveau_a_marquer,niveau_anterieur) * | */ /* * dont les fonctions FADD(), FMAX(), FMIN(), FOR(), FAND(),... * | */ /* * * | */ /* * (ATTENTION : cette action n'est pas effectuee si * | */ /* * ne_faire_que_les_substitutions=VRAI) * | */ /* * * | */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * | */ /* | | */ /* | | */ /* | | */ /* |<------------------------------------------------------ */ /* | */ /* | */ /* | */ /* + */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* * * */ /* * Sous-Echantillonnage : ((pasX,pasY),(translationX,translationY)) * */ /* * * */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* | */ /* | */ /* | */ /* + */ /* ----------------------------------------------------------------- */ /* | | | | | */ /* | | | | | */ /* + + + + + */ /* ----------- --------------- ---------- ------------ ---------------- */ /* | ImageA | | Image_ROUGE | | ImageG | | Marqueur | | Histogramme | */ /* | ImageA1 | | Image_VERTE | ---------- ------------ | et | */ /* | ImageA2 | | Image_BLEUE | | | | Statistiques | */ /* | ImageR | --------------- | | ---------------- */ /* ----------- | | | | */ /* | | | | | */ /* | | | | + */ /* + + + + */ /* ----------------------------------------------------------------- */ /* | */ /* | */ /* | load_point(), loadC_point(), loadI_point(), loadF_point() */ /* |------------------------------------------------------- */ /* | et acces_SGF | */ /* | | */ /* loadS_point() | */ /* | | */ /* | | */ /* + | */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * | */ /* * * | */ /* * Substitution inverse : L_SUBSTITUTION_INVERSE_XX * | */ /* * * | */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * | */ /* | | */ /* | | */ /* | | */ /* | | */ /* + + */ /* */ /* */ /* Author of '$xiii/Images$DEF' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 19870000000000). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* G E S T I O N D U F O R M A T D E S I M A G E S : */ /* */ /*************************************************************************************************************************************/ /* ATTENTION : 'INITIALISATION_DU_FORMAT_DES_IMAGES_DANS_GET_ARGUMENTSi_VERSION_0?' ne */ /* peuvent etre definis ici. Ils doivent l'etre dans 'v $xig/fonct$vv$DEF', ou leur */ /* existence est testee car '$xig/fonct$vv$DEF' est inclus avant '$xiii/Images$DEF'... */ #define VALIDER_LES_AXES_OX_OY_OZ \ VRAI #define NE_PAS_VALIDER_LES_AXES_OX_OY_OZ \ NOTL(VALIDER_LES_AXES_OX_OY_OZ) /* Pour positionner 'valider_les_axes_OX_OY_OZ'. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E G R A N D E U R S " H O M O T H E T I Q U E S " : */ /* */ /*************************************************************************************************************************************/ #define GRANDEURS_HOMOTHETIQUES_1D(grandeur,faire,XYZ_min__courante,XYZ_max__courante,XYZ_min_reference,XYZ_max_reference,cast) \ COND(IL_FAUT(faire) \ ,cast(SCAL(FLOT(grandeur) \ ,FLOT(NEUT(DIMENSION(XYZ_min_reference,XYZ_max_reference))) \ ,FLOT(NEUT(DIMENSION(XYZ_min__courante,XYZ_max__courante))) \ ) \ ) \ ,grandeur \ ) #define GRANDEURS_HOMOTHETIQUES_OX(grandeur,faire,cast) \ GRANDEURS_HOMOTHETIQUES_1D(grandeur \ ,faire \ ,Xmin,Xmax,Xmin_reference,Xmax_reference \ ,cast \ ) #define GRANDEURS_HOMOTHETIQUES_OY(grandeur,faire,cast) \ GRANDEURS_HOMOTHETIQUES_1D(grandeur \ ,faire \ ,Ymin,Ymax,Ymin_reference,Ymax_reference \ ,cast \ ) #define GRANDEURS_HOMOTHETIQUES_OZ(grandeur,faire,cast) \ GRANDEURS_HOMOTHETIQUES_1D(grandeur \ ,faire \ ,Zmin,Zmax,Zmin_reference,Zmax_reference \ ,cast \ ) /* Procedures introduites le 20170322091950 afin de pouvoir definir des grandeurs */ /* "homothetiques" (par exemple des tailles de paves...). */ /* */ /* On notera le passage par des 'FLOT(...)'s afin de garantir la meilleure precision */ /* possible, en notant bien que la procedure 'v $xil/defi_K2$vv$DEF define...SCAL' */ /* calcule de la facon suivante : */ /* */ /* SCAL(x,a,n) = (x/a).n */ /* */ /* c'est-a-dire que la division est faite AVANT la multiplication, ce qui justifie */ /* donc l'usage des 'FLOT(...)'s... */ #define GRANDEURS_HOMOTHETIQUES_2D(grandeur,faire,C1m_C,C1M_C,C1m_R,C1M_R,C2m_C,C2M_C,C2m_R,C2M_R,cast) \ /* Notations : */ \ /* */ \ /* {C1,C2} = coordonnees bidimensionnelles, */ \ /* m = minimum, */ \ /* M = maximum, */ \ /* _C = valeur courante, */ \ /* _R = valeur de reference. */ \ /* */ \ COND(IL_FAUT(faire) \ ,cast(SCAL(FLOT(grandeur) \ ,FLOT(MUL2(DIMENSION(C1m_R,C1M_R),DIMENSION(C2m_R,C2M_R))) \ ,FLOT(MUL2(DIMENSION(C1m_C,C1M_C),DIMENSION(C2m_C,C2M_C))) \ ) \ ) \ ,grandeur \ ) #define GRANDEURS_HOMOTHETIQUES_OXY(grandeur,faire,cast) \ GRANDEURS_HOMOTHETIQUES_2D(grandeur \ ,faire \ ,Xmin,Xmax,Xmin_reference,Xmax_reference \ ,Ymin,Ymax,Ymin_reference,Ymax_reference \ ,cast \ ) #define GRANDEURS_HOMOTHETIQUES_OYZ(grandeur,faire,cast) \ GRANDEURS_HOMOTHETIQUES_2D(grandeur \ ,faire \ ,Ymin,Ymax,Ymin_reference,Ymax_reference \ ,Zmin,Zmax,Zmin_reference,Zmax_reference \ ,cast \ ) #define GRANDEURS_HOMOTHETIQUES_OZX(grandeur,faire,cast) \ GRANDEURS_HOMOTHETIQUES_2D(grandeur \ ,faire \ ,Zmin,Zmax,Zmin_reference,Zmax_reference \ ,Xmin,Xmax,Xmin_reference,Xmax_reference \ ,cast \ ) /* Introduit le 20170323131528 par "symetrie" avec 'GRANDEURS_HOMOTHETIQUES_1D(...)'. */ /* */ /* On notera que contrairement a 'v $ximcf/conformes$FON DIVI.RACX.FLOT.MUL2.', il n'y a */ /* pas de 'RACX(...)' ce qui semble en fait plus logique, mais a cette date, pour des */ /* raisons de compatibilite, je ne supprime pas ces 'RACX(...)'s... */ #define GRANDEURS_HOMOTHETIQUES_3D(grandeur,faire,C1m_C,C1M_C,C1m_R,C1M_R,C2m_C,C2M_C,C2m_R,C2M_R,C3m_C,C3M_C,C3m_R,C3M_R,cast) \ /* Notations : */ \ /* */ \ /* {C1,C2,C3} = coordonnees tridimensionnelles, */ \ /* m = minimum, */ \ /* M = maximum, */ \ /* _C = valeur courante, */ \ /* _R = valeur de reference. */ \ /* */ \ COND(IL_FAUT(faire) \ ,cast(SCAL(FLOT(grandeur) \ ,FLOT(MUL3(DIMENSION(C1m_R,C1M_R),DIMENSION(C2m_R,C2M_R),DIMENSION(C3m_R,C3M_R))) \ ,FLOT(MUL3(DIMENSION(C1m_C,C1M_C),DIMENSION(C2m_C,C2M_C),DIMENSION(C3m_C,C3M_C))) \ ) \ ) \ ,grandeur \ ) #define GRANDEURS_HOMOTHETIQUES_OXYZ(grandeur,faire,cast) \ GRANDEURS_HOMOTHETIQUES_2D(grandeur \ ,faire \ ,Xmin,Xmax,Xmin_reference,Xmax_reference \ ,Ymin,Ymax,Ymin_reference,Ymax_reference \ ,Zmin,Zmax,Zmin_reference,Zmax_reference \ ,cast \ ) /* Introduit le 20170323131528 par "symetrie" avec 'GRANDEURS_HOMOTHETIQUES_1D(...)'. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F O R M A T D E S P I X E L S : */ /* */ /*************************************************************************************************************************************/ #if (Format_p==Format_char) TypedefS(genere_p,genere_CHAR) #Aif (Format_p==Format_char) #Eif (Format_p==Format_char) #if (Format_p==Format_int) TypedefS(genere_p,genere_Int) #Aif (Format_p==Format_int) #Eif (Format_p==Format_int) #if (Format_p==Format_float) TypedefS(genere_p,genere_Float) #Aif (Format_p==Format_float) #Eif (Format_p==Format_float) #if (Format_p==Format_double) TypedefS(genere_p,genere_Double) #Aif (Format_p==Format_double) #Eif (Format_p==Format_double) #if (Format_p==Format_complexe) TypedefS(genere_p,genere_complexe) #Aif (Format_p==Format_complexe) #Eif (Format_p==Format_complexe) #if (Format_p==Format_hyper_complexe) TypedefS(genere_p,genere_hyper_complexe) #Aif (Format_p==Format_hyper_complexe) #Eif (Format_p==Format_hyper_complexe) #if (Format_p==Format_hyper_hyper_complexe) TypedefS(genere_p,genere_hyper_hyper_complexe) #Aif (Format_p==Format_hyper_hyper_complexe) #Eif (Format_p==Format_hyper_hyper_complexe) TypedefS(A___genere_p,genere_p) TypedefS(E___genere_p,genere_p) #ifdef Register_VERSION_01 TypedefS(Rgenere_p,CONC(Register,genere_p)) #Aifdef Register_VERSION_01 #Eifdef Register_VERSION_01 #ifdef Register_VERSION_02 #Aifdef Register_VERSION_02 #Eifdef Register_VERSION_02 /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C A S T S T A N D A R D : */ /* */ /*************************************************************************************************************************************/ #define GENP(x) \ CAST(genere_p,x) \ /* Cast "point d'image". */ #define CAST_CHAR(x) \ CAST(genere_CHAR,x) \ /* Cast "caractere d'image" (introduit le 20090331101149, bien tardivement...). */ #define CASP_vrai_Int_de_base(x) \ CASP(genere_vrai_Int_de_base,x) #define CASP_Int(x) \ CASP(genere_Int,x) #define CASP_Float(x) \ CASP(genere_Float,x) #define CASP_vrai_Positive_de_base(x) \ CASP(genere_vrai_Positive_de_base,x) #define CASP_LPositive(x) \ CASP(genere_LPositive,x) #define CASP_Double(x) \ CASP(genere_Double,x) /* Divers 'CASP(...)'s utiles introduits le 20090331102436... */ /* ATTENTION, etant donne que 'Conversion_generale_genp(...)' et 'GENP(...)' n'appartiennent */ /* pas a la meme '$PASSE_?', la definition de 'Conversion_generale_genp(...)' ne peut avoir */ /* lieu qu'apres celle de 'GENP(...)' et non pas dans 'v $xil/defi_c2$vv$DEF GENP'). */ %define Conversion_generale_genp(chaine_numerique,chaine_residuelle) \ GENP(Conversion_generale_int(chaine_numerique,chaine_residuelle)) /* Acces a la fonction de conversion alpha-NUMERIQUE --> valeur 'GENP'. */ /* */ /* Le 20071121135423 a cause de 'SYSTEME_APC_LinuxUbuntu_GCC' sur '$LACT18' et pour eviter */ /* le message : */ /* */ /* warning: passing argument 2 of 'strtol' from incompatible pointer type */ /* */ /* je note que 'chaine_residuelle' doit etre definie par : */ /* */ /* DEFV(Char,INIT(POINTERc(chaine_residuelle),CHAINE_UNDEF)); */ /* */ /* avec donc un 'Char' et non pas un 'CHAR'... */ /* */ /* Au passage, a cette date la procedure 'Conversion_generale_genp(...)' semble inutilisee. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A L L O C A T I O N / R E L E A S E E V E N T U E L L E S D ' I N F O R M A T I O N S : */ /* */ /*************************************************************************************************************************************/ #if ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01)) \ || (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \ ) # define BDEFV(type,variable) \ DEFV(type,variable) \ /* Permet de definir une variable qui dans 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_02' sera */ \ /* dynamique ; ici elle sera allouee... */ # define EDEFV(type,variable) \ VIDE \ /* Permet de definir une variable qui dans 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_02' sera */ \ /* dynamique ; ici elle sera releasee... */ #Aif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01)) \ || (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \ ) #Eif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01)) \ || (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \ ) #if ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \ ) # define BDEFV(type,variable) \ BblockV \ DEFV(type,variable) \ /* Permet de definir une variable dynamique : ici elle est allouee... */ # define EDEFV(type,variable) \ CALZ_FreSS(variable); \ /* Restitution de l'espace alloue a 'variable'... */ \ EblockV \ /* Permet de definir une variable dynamique : ici elle est releasee ; le couple */ \ /* {'BblockV','EblockV'} est destine a valider la presence du couple {'BDEFV','EDEFV'}... */ # define TypedefIn(tableau,dimension,type) \ = define tableau(var) type(DdTb1(POINTEUR,var,dimension,AllocIn(dimension,type))) /* Definition d'un tableau variable a 'n' dimensions... */ # define TypedefAIn(tableau,dimension,type) \ = define tableau(var) type(POINTEUR(var)) /* Definition d'un tableau Argument a 'n' dimensions variables. */ # define TypedefEIn(tableau,dimension,type) \ = define tableau(var) type(POINTEUR(var)) /* Definition d'un tableau Externe a 'n' dimensions variables. */ # ifdef GESTION_DES_IMAGES_STATIQUES_VERSION_01 # define TypedefSIn(tableau,dimension,type) \ TypedefD1(tableau,dimension,type) /* Definition d'un tableau Statique ou Externe-Statique a 'n' dimension variables. */ # Aifdef GESTION_DES_IMAGES_STATIQUES_VERSION_01 # Eifdef GESTION_DES_IMAGES_STATIQUES_VERSION_01 # ifdef GESTION_DES_IMAGES_STATIQUES_VERSION_02 /* On notera que le code particulier 'D_STATIK(...)' est extrait par '$xcc/cpp$Z' afin de */ /* generer automatiquement le code pour l'allocation dynamique en fonction du type 'type', */ /* et ce, lorsque les dimensions reelles sont connues... */ # define STATIQUE_UNDEF \ ADRESSE_NON_ENCORE_DEFINIE \ /* Definition de la valeur du pointeur vers une image Statique non encore definie... */ # define TypedefSIn(tableau,dim,type) \ = define tableau(var) type(DdTb1(POINTEUR,var,dim,STATIQUE_UNDEF));D_STATIK(MdTb1(var,dim,type,STATIQUE_UNDEF)); /* Definition d'un tableau Statique ou Externe-Statique a 'n' dimension variables. */ /* ATTENTION, il ne faut pas ecrire : */ /* */ /* = define tableau(var) type(...,type));); */ /* */ /* a cause du processus de recuperation des sequences 'D_STATIK(...)' qui utilise en fait le */ /* premier point-virgule rencontre comme limiteur. De plus, on ne peut ecrire : */ /* */ /* = define tableau(var) type(...,ADRESSE_UNDEF));... */ /* */ /* pour des questions de typage ('ADRESSE_UNDEF' a le type 'Int'...). Enfin, on notera que */ /* la procedure 'D_STATIK(...)', tout comme 'G_STATIK()', n'est definie nulle part et n'est */ /* qu'un code tout a fait arbitraire utilise par 'v $xcc/cpp$Z D_STATIK' pour identifier */ /* l'integralite des "objets" Statiques dont il faudra faire l'allocation memoire, mais */ /* evidemment uniquement pour ceux qui seront utiles dans un contexte donne. Cette */ /* allocation memoire se fera la ou est reference 'v $xig/fonct$vv$DEF G_STATIK'. */ /* */ /* ATTENTION, on notera que l'on ne peut implanter un : */ /* */ /* FdTb1(var,dim,type,libre) */ /* */ /* parce que cela serait trop complique... */ # Aifdef GESTION_DES_IMAGES_STATIQUES_VERSION_02 # Eifdef GESTION_DES_IMAGES_STATIQUES_VERSION_02 #Aif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \ ) #Eif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \ ) /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* T Y P E S D E " V E C T E U R S " D ' I N F O R M A T I O N S : */ /* */ /* */ /* Notations : */ /* */ /* Les types <type> que l'on definit */ /* s'ecrivent de la facon suivante : */ /* */ /* <type> pour les utilisations "normales", */ /* A___<type> pour les Arguments des fonctions, */ /* E___<type> pour les references Externes, */ /* S___<type> pour les objets Statiques, */ /* E___S___<type> pour les objets Externes et Statiques, */ /* F___<type> pour les objets dont la taille est Fixe (et ne peut donc varier). */ /* */ /* */ /*************************************************************************************************************************************/ #if ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01)) \ ) TypedefD1(ligne,dimX,genere_p) TypedefS(A___ligne,ligne) TypedefS(E___ligne,ligne) TypedefS(S___ligne,ligne) TypedefS(E___S___ligne,ligne) TypedefS(F___ligne,ligne) /* Definition du type "ligne" en tant que vecteur de dimension 'dimX'. */ TypedefD1(ligneC,dimX,genere_CHAR) TypedefS(A___ligneC,ligneC) TypedefS(E___ligneC,ligneC) TypedefS(S___ligneC,ligneC) TypedefS(E___S___ligneC,ligneC) TypedefS(F___ligneC,ligneC) /* Definition du type "ligne_CHAR" en tant que vecteur de dimension 'dimX'. */ TypedefD1(ligneIB,dimX,genere_vrai_Int_de_base) TypedefS(A___ligneIB,ligneIB) TypedefS(E___ligneIB,ligneIB) TypedefS(S___ligneIB,ligneIB) TypedefS(E___S___ligneIB,ligneIB) TypedefS(F___ligneIB,ligneIB) /* Definition du type "ligne_vrai_Int_de_base" en tant que vecteur de dimension 'dimX'. */ TypedefD1(ligneI,dimX,genere_Int) TypedefS(A___ligneI,ligneI) TypedefS(E___ligneI,ligneI) TypedefS(S___ligneI,ligneI) TypedefS(E___S___ligneI,ligneI) TypedefS(F___ligneI,ligneI) /* Definition du type "ligne_Int" en tant que vecteur de dimension 'dimX'. */ TypedefD1(ligneUB,dimX,genere_vrai_Positive_de_base) TypedefS(A___ligneUB,ligneUB) TypedefS(E___ligneUB,ligneUB) TypedefS(S___ligneUB,ligneUB) TypedefS(E___S___ligneUB,ligneUB) TypedefS(F___ligneUB,ligneUB) /* Definition du type "ligne_vrai_Positive_de_base" en tant que vecteur de dimension 'dimX'. */ TypedefD1(ligneU,dimX,genere_LPositive) TypedefS(A___ligneU,ligneU) TypedefS(E___ligneU,ligneU) TypedefS(S___ligneU,ligneU) TypedefS(E___S___ligneU,ligneU) TypedefS(F___ligneU,ligneU) /* Definition du type "ligne_positive" en tant que vecteur de dimension 'dimX'. */ TypedefD1(ligneF,dimX,genere_Float) TypedefS(A___ligneF,ligneF) TypedefS(E___ligneF,ligneF) TypedefS(S___ligneF,ligneF) TypedefS(E___S___ligneF,ligneF) TypedefS(F___ligneF,ligneF) /* Definition du type "ligne_Float" en tant que vecteur de dimension 'dimX'. */ TypedefD1(ligneD,dimX,genere_Double) TypedefS(A___ligneD,ligneD) TypedefS(E___ligneD,ligneD) TypedefS(S___ligneD,ligneD) TypedefS(E___S___ligneD,ligneD) TypedefS(F___ligneD,ligneD) /* Definition du type "ligne_Double" en tant que vecteur de dimension 'dimX'. */ TypedefD1(ligneJ,dimX,genere_complexe) TypedefS(A___ligneJ,ligneJ) TypedefS(E___ligneJ,ligneJ) TypedefS(S___ligneJ,ligneJ) TypedefS(E___S___ligneJ,ligneJ) TypedefS(F___ligneJ,ligneJ) /* Definition du type "ligne_complexe" en tant que vecteur de dimension 'dimX'. */ TypedefD1(ligneHJ,dimX,genere_hyper_complexe) TypedefS(A___ligneHJ,ligneHJ) TypedefS(E___ligneHJ,ligneHJ) TypedefS(S___ligneHJ,ligneHJ) TypedefS(E___S___ligneHJ,ligneHJ) TypedefS(F___ligneHJ,ligneHJ) /* Definition du type "ligne_hyper_complexe" en tant que vecteur de dimension 'dimX'. */ TypedefD1(ligneHHJ,dimX,genere_hyper_hyper_complexe) TypedefS(A___ligneHHJ,ligneHHJ) TypedefS(E___ligneHHJ,ligneHHJ) TypedefS(S___ligneHHJ,ligneHHJ) TypedefS(E___S___ligneHHJ,ligneHHJ) TypedefS(F___ligneHHJ,ligneHHJ) /* Definition du type "ligne_hyper_hyper_complexe" en tant que vecteur de dimension 'dimX' */ /* (introduit le 20150227094226). */ TypedefD1(colonne,dimY,genere_p) TypedefS(A___colonne,colonne) TypedefS(E___colonne,colonne) TypedefS(S___colonne,colonne) TypedefS(E___S___colonne,colonne) TypedefS(F___colonne,colonne) /* Definition du type "colonne" en tant que vecteur de dimension 'dimY'. */ TypedefD1(colonneC,dimY,genere_CHAR) TypedefS(A___colonneC,colonneC) TypedefS(E___colonneC,colonneC) TypedefS(S___colonneC,colonneC) TypedefS(E___S___colonneC,colonneC) TypedefS(F___colonneC,colonneC) /* Definition du type "colonne_CHAR" en tant que vecteur de dimension 'dimY'. */ TypedefD1(colonneIB,dimY,genere_vrai_Int_de_base) TypedefS(A___colonneIB,colonneIB) TypedefS(E___colonneIB,colonneIB) TypedefS(S___colonneIB,colonneIB) TypedefS(E___S___colonneIB,colonneIB) TypedefS(F___colonneIB,colonneIB) /* Definition du type "colonne_vrai_Int_de_base" en tant que vecteur de dimension 'dimY'. */ TypedefD1(colonneI,dimY,genere_Int) TypedefS(A___colonneI,colonneI) TypedefS(E___colonneI,colonneI) TypedefS(S___colonneI,colonneI) TypedefS(E___S___colonneI,colonneI) TypedefS(F___colonneI,colonneI) /* Definition du type "colonne_Int" en tant que vecteur de dimension 'dimY'. */ TypedefD1(colonneUB,dimY,genere_vrai_Positive_de_base) TypedefS(A___colonneUB,colonneUB) TypedefS(E___colonneUB,colonneUB) TypedefS(S___colonneUB,colonneUB) TypedefS(E___S___colonneUB,colonneUB) TypedefS(F___colonneUB,colonneUB) /* Definition du type "colonne_vrai_Positive_de_base" comme vecteur de dimension 'dimY'. */ TypedefD1(colonneU,dimY,genere_LPositive) TypedefS(A___colonneU,colonneU) TypedefS(E___colonneU,colonneU) TypedefS(S___colonneU,colonneU) TypedefS(E___S___colonneU,colonneU) TypedefS(F___colonneU,colonneU) /* Definition du type "colonne_positive" en tant que vecteur de dimension 'dimY'. */ TypedefD1(colonneF,dimY,genere_Float) TypedefS(A___colonneF,colonneF) TypedefS(E___colonneF,colonneF) TypedefS(S___colonneF,colonneF) TypedefS(E___S___colonneF,colonneF) TypedefS(F___colonneF,colonneF) /* Definition du type "colonne_Float" en tant que vecteur de dimension 'dimY'. */ TypedefD1(colonneD,dimY,genere_Double) TypedefS(A___colonneD,colonneD) TypedefS(E___colonneD,colonneD) TypedefS(S___colonneD,colonneD) TypedefS(E___S___colonneD,colonneD) TypedefS(F___colonneD,colonneD) /* Definition du type "colonne_Double" en tant que vecteur de dimension 'dimY'. */ TypedefD1(colonneJ,dimY,genere_complexe) TypedefS(A___colonneJ,colonneJ) TypedefS(E___colonneJ,colonneJ) TypedefS(S___colonneJ,colonneJ) TypedefS(E___S___colonneJ,colonneJ) TypedefS(F___colonneJ,colonneJ) /* Definition du type "colonne_complexe" en tant que vecteur de dimension 'dimY'. */ TypedefD1(colonneHJ,dimY,genere_hyper_complexe) TypedefS(A___colonneHJ,colonneHJ) TypedefS(E___colonneHJ,colonneHJ) TypedefS(S___colonneHJ,colonneHJ) TypedefS(E___S___colonneHJ,colonneHJ) TypedefS(F___colonneHJ,colonneHJ) /* Definition du type "colonne_hyper_complexe" en tant que vecteur de dimension 'dimY'. */ TypedefD1(colonneHHJ,dimY,genere_hyper_hyper_complexe) TypedefS(A___colonneHHJ,colonneHHJ) TypedefS(E___colonneHHJ,colonneHHJ) TypedefS(S___colonneHHJ,colonneHHJ) TypedefS(E___S___colonneHHJ,colonneHHJ) TypedefS(F___colonneHHJ,colonneHHJ) /* Definition du type "colonne_hyper_hyper_complexe" en tant que vecteur de dimension 'dimY' */ /* (introduit le 20150227094226). */ TypedefD1(vecteurJ,MdimXY,genere_complexe) TypedefS(A___vecteurJ,vecteurJ) TypedefS(E___vecteurJ,vecteurJ) TypedefS(S___vecteurJ,vecteurJ) TypedefS(E___S___vecteurJ,vecteurJ) TypedefS(F___vecteurJ,vecteurJ) /* Definition du type "vecteur_complexe" en tant que vecteur de dimension 'dimX=dimY' ; */ /* on notera donc la necessite d'avoir alors une image carree ; ce type est utilise par */ /* la transformee de Fourier optimisee... */ TypedefD1(vecteurHJ,MdimXY,genere_hyper_complexe) TypedefS(A___vecteurHJ,vecteurHJ) TypedefS(E___vecteurHJ,vecteurHJ) TypedefS(S___vecteurHJ,vecteurHJ) TypedefS(E___S___vecteurHJ,vecteurHJ) TypedefS(F___vecteurHJ,vecteurHJ) /* Definition du type "vecteur_hyper_complexe" en tant que vecteur de dimension 'dimX=dimY'. */ /* On notera donc la necessite d'avoir alors une image carree. */ TypedefD1(vecteurHHJ,MdimXY,genere_hyper_hyper_complexe) TypedefS(A___vecteurHHJ,vecteurHHJ) TypedefS(E___vecteurHHJ,vecteurHHJ) TypedefS(S___vecteurHHJ,vecteurHHJ) TypedefS(E___S___vecteurHHJ,vecteurHHJ) TypedefS(F___vecteurHHJ,vecteurHHJ) /* Definition du type "vecteur_hyper_hyper_complexe" en tant que vecteur de dimension */ /* 'dimX=dimY'. On notera donc la necessite d'avoir alors une image carree (introduit */ /* le 20150227094226). */ #Aif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01)) \ ) #Eif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01)) \ ) #if ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \ ) # define TypedefI1(vecteur,dimension,type) \ TypedefIn(vecteur,dimension,type) \ /* Definition d'un tableau a une dimension variable (ou vecteur). */ # define TypedefAI1(vecteur,dimension,type) \ TypedefAIn(vecteur,dimension,type) \ /* Definition d'un tableau Argument a une dimension variable (ou vecteur). */ # define TypedefEI1(vecteur,dimension,type) \ TypedefEIn(vecteur,dimension,type) \ /* Definition d'un tableau Externe a une dimension variable (ou vecteur). */ # define TypedefSI1(vecteur,dimension,type) \ TypedefSIn(vecteur,dimension,type) \ /* Definition d'un tableau Statique ou Externe-Statique a une dimension variable (ou */ \ /* vecteur). */ TypedefI1(ligne,dimX,genere_p) TypedefAI1(A___ligne,dimX,genere_p) TypedefEI1(E___ligne,dimX,genere_p) TypedefSI1(S___ligne,K___dimX,genere_p) TypedefSI1(E___S___ligne,K___dimX,genere_p) TypedefD1(F___ligne,KK___dimX,genere_p) /* Definition du type "ligne" en tant que vecteur de dimension 'dimX'. */ TypedefI1(ligneC,dimX,genere_CHAR) TypedefAI1(A___ligneC,dimX,genere_CHAR) TypedefEI1(E___ligneC,dimX,genere_CHAR) TypedefSI1(S___ligneC,K___dimX,genere_CHAR) TypedefSI1(E___S___ligneC,K___dimX,genere_CHAR) TypedefD1(F___ligneC,KK___dimX,genere_CHAR) /* Definition du type "ligne_CHAR" en tant que vecteur de dimension 'dimX'. */ TypedefI1(ligneIB,dimX,genere_vrai_Int_de_base) TypedefAI1(A___ligneIB,dimX,genere_vrai_Int_de_base) TypedefEI1(E___ligneIB,dimX,genere_vrai_Int_de_base) TypedefSI1(S___ligneIB,K___dimX,genere_vrai_Int_de_base) TypedefSI1(E___S___ligneIB,K___dimX,genere_vrai_Int_de_base) TypedefD1(F___ligneIB,KK___dimX,genere_vrai_Int_de_base) /* Definition du type "ligne_vrai_Int_de_base" en tant que vecteur de dimension 'dimX'. */ TypedefI1(ligneI,dimX,genere_Int) TypedefAI1(A___ligneI,dimX,genere_Int) TypedefEI1(E___ligneI,dimX,genere_Int) TypedefSI1(S___ligneI,K___dimX,genere_Int) TypedefSI1(E___S___ligneI,K___dimX,genere_Int) TypedefD1(F___ligneI,KK___dimX,genere_Int) /* Definition du type "ligne_Int" en tant que vecteur de dimension 'dimX'. */ TypedefI1(ligneUB,dimX,genere_vrai_Positive_de_base) TypedefAI1(A___ligneUB,dimX,genere_vrai_Positive_de_base) TypedefEI1(E___ligneUB,dimX,genere_vrai_Positive_de_base) TypedefSI1(S___ligneUB,K___dimX,genere_vrai_Positive_de_base) TypedefSI1(E___S___ligneUB,K___dimX,genere_vrai_Positive_de_base) TypedefD1(F___ligneUB,KK___dimX,genere_vrai_Positive_de_base) /* Definition du type "ligne_vrai_Positive_de_base" comme vecteur de dimension 'dimX'. */ TypedefI1(ligneU,dimX,genere_LPositive) TypedefAI1(A___ligneU,dimX,genere_LPositive) TypedefEI1(E___ligneU,dimX,genere_LPositive) TypedefSI1(S___ligneU,K___dimX,genere_LPositive) TypedefSI1(E___S___ligneU,K___dimX,genere_LPositive) TypedefD1(F___ligneU,KK___dimX,genere_LPositive) /* Definition du type "ligne_positive" en tant que vecteur de dimension 'dimX'. */ TypedefI1(ligneF,dimX,genere_Float) TypedefAI1(A___ligneF,dimX,genere_Float) TypedefEI1(E___ligneF,dimX,genere_Float) TypedefSI1(S___ligneF,K___dimX,genere_Float) TypedefSI1(E___S___ligneF,K___dimX,genere_Float) TypedefD1(F___ligneF,KK___dimX,genere_Float) /* Definition du type "ligne_Float" en tant que vecteur de dimension 'dimX'. */ TypedefI1(ligneD,dimX,genere_Double) TypedefAI1(A___ligneD,dimX,genere_Double) TypedefEI1(E___ligneD,dimX,genere_Double) TypedefSI1(S___ligneD,K___dimX,genere_Double) TypedefSI1(E___S___ligneD,K___dimX,genere_Double) TypedefD1(F___ligneD,KK___dimX,genere_Double) /* Definition du type "ligne_Double" en tant que vecteur de dimension 'dimX'. */ TypedefI1(ligneJ,dimX,genere_complexe) TypedefAI1(A___ligneJ,dimX,genere_complexe) TypedefEI1(E___ligneJ,dimX,genere_complexe) TypedefSI1(S___ligneJ,K___dimX,genere_complexe) TypedefSI1(E___S___ligneJ,K___dimX,genere_complexe) TypedefD1(F___ligneJ,KK___dimX,genere_complexe) /* Definition du type "ligne_complexe" en tant que vecteur de dimension 'dimX'. */ TypedefI1(ligneHJ,dimX,genere_hyper_complexe) TypedefAI1(A___ligneHJ,dimX,genere_hyper_complexe) TypedefEI1(E___ligneHJ,dimX,genere_hyper_complexe) TypedefSI1(S___ligneHJ,K___dimX,genere_hyper_complexe) TypedefSI1(E___S___ligneHJ,K___dimX,genere_hyper_complexe) TypedefD1(F___ligneHJ,KK___dimX,genere_hyper_complexe) /* Definition du type "ligne_hyper_complexe" en tant que vecteur de dimension 'dimX'. */ TypedefI1(ligneHHJ,dimX,genere_hyper_hyper_complexe) TypedefAI1(A___ligneHHJ,dimX,genere_hyper_hyper_complexe) TypedefEI1(E___ligneHHJ,dimX,genere_hyper_hyper_complexe) TypedefSI1(S___ligneHHJ,K___dimX,genere_hyper_hyper_complexe) TypedefSI1(E___S___ligneHHJ,K___dimX,genere_hyper_hyper_complexe) TypedefD1(F___ligneHHJ,KK___dimX,genere_hyper_hyper_complexe) /* Definition du type "ligne_hyper_hyper_complexe" en tant que vecteur de dimension 'dimX' */ /* (introduit le 20150227094226). */ TypedefI1(colonne,dimY,genere_p) TypedefAI1(A___colonne,dimY,genere_p) TypedefEI1(E___colonne,dimY,genere_p) TypedefSI1(S___colonne,K___dimY,genere_p) TypedefSI1(E___S___colonne,K___dimY,genere_p) TypedefD1(F___colonne,KK___dimY,genere_p) /* Definition du type "colonne" en tant que vecteur de dimension 'dimY'. */ TypedefI1(colonneC,dimY,genere_CHAR) TypedefAI1(A___colonneC,dimY,genere_CHAR) TypedefEI1(E___colonneC,dimY,genere_CHAR) TypedefSI1(S___colonneC,K___dimY,genere_CHAR) TypedefSI1(E___S___colonneC,K___dimY,genere_CHAR) TypedefD1(F___colonneC,KK___dimY,genere_CHAR) /* Definition du type "colonne_CHAR" en tant que vecteur de dimension 'dimY'. */ TypedefI1(colonneIB,dimY,genere_vrai_Int_de_base) TypedefAI1(A___colonneIB,dimY,genere_vrai_Int_de_base) TypedefEI1(E___colonneIB,dimY,genere_vrai_Int_de_base) TypedefSI1(S___colonneIB,K___dimY,genere_vrai_Int_de_base) TypedefSI1(E___S___colonneIB,K___dimY,genere_vrai_Int_de_base) TypedefD1(F___colonneIB,KK___dimY,genere_vrai_Int_de_base) /* Definition du type "colonne_vrai_Int_de_base" en tant que vecteur de dimension 'dimY'. */ TypedefI1(colonneI,dimY,genere_Int) TypedefAI1(A___colonneI,dimY,genere_Int) TypedefEI1(E___colonneI,dimY,genere_Int) TypedefSI1(S___colonneI,K___dimY,genere_Int) TypedefSI1(E___S___colonneI,K___dimY,genere_Int) TypedefD1(F___colonneI,KK___dimY,genere_Int) /* Definition du type "colonne_Int" en tant que vecteur de dimension 'dimY'. */ TypedefI1(colonneUB,dimY,genere_vrai_Positive_de_base) TypedefAI1(A___colonneUB,dimY,genere_vrai_Positive_de_base) TypedefEI1(E___colonneUB,dimY,genere_vrai_Positive_de_base) TypedefSI1(S___colonneUB,K___dimY,genere_vrai_Positive_de_base) TypedefSI1(E___S___colonneUB,K___dimY,genere_vrai_Positive_de_base) TypedefD1(F___colonneUB,KK___dimY,genere_vrai_Positive_de_base) /* Definition du type "colonne_vrai_Positive_de_base" comme vecteur de dimension 'dimY'. */ TypedefI1(colonneU,dimY,genere_LPositive) TypedefAI1(A___colonneU,dimY,genere_LPositive) TypedefEI1(E___colonneU,dimY,genere_LPositive) TypedefSI1(S___colonneU,K___dimY,genere_LPositive) TypedefSI1(E___S___colonneU,K___dimY,genere_LPositive) TypedefD1(F___colonneU,KK___dimY,genere_LPositive) /* Definition du type "colonne_positive" en tant que vecteur de dimension 'dimY'. */ TypedefI1(colonneF,dimY,genere_Float) TypedefAI1(A___colonneF,dimY,genere_Float) TypedefEI1(E___colonneF,dimY,genere_Float) TypedefSI1(S___colonneF,K___dimY,genere_Float) TypedefSI1(E___S___colonneF,K___dimY,genere_Float) TypedefD1(F___colonneF,KK___dimY,genere_Float) /* Definition du type "colonne_Float" en tant que vecteur de dimension 'dimY'. */ TypedefI1(colonneD,dimY,genere_Double) TypedefAI1(A___colonneD,dimY,genere_Double) TypedefEI1(E___colonneD,dimY,genere_Double) TypedefSI1(S___colonneD,K___dimY,genere_Double) TypedefSI1(E___S___colonneD,K___dimY,genere_Double) TypedefD1(F___colonneD,KK___dimY,genere_Double) /* Definition du type "colonne_Double" en tant que vecteur de dimension 'dimY'. */ TypedefI1(colonneJ,dimY,genere_complexe) TypedefAI1(A___colonneJ,dimY,genere_complexe) TypedefEI1(E___colonneJ,dimY,genere_complexe) TypedefSI1(S___colonneJ,K___dimY,genere_complexe) TypedefSI1(E___S___colonneJ,K___dimY,genere_complexe) TypedefD1(F___colonneJ,KK___dimY,genere_complexe) /* Definition du type "colonne_complexe" en tant que vecteur de dimension 'dimY'. */ TypedefI1(colonneHJ,dimY,genere_hyper_complexe) TypedefAI1(A___colonneHJ,dimY,genere_hyper_complexe) TypedefEI1(E___colonneHJ,dimY,genere_hyper_complexe) TypedefSI1(S___colonneHJ,K___dimY,genere_hyper_complexe) TypedefSI1(E___S___colonneHJ,K___dimY,genere_hyper_complexe) TypedefD1(F___colonneHJ,KK___dimY,genere_hyper_complexe) /* Definition du type "colonne_hyper_complexe" en tant que vecteur de dimension 'dimY'. */ TypedefI1(colonneHHJ,dimY,genere_hyper_hyper_complexe) TypedefAI1(A___colonneHHJ,dimY,genere_hyper_hyper_complexe) TypedefEI1(E___colonneHHJ,dimY,genere_hyper_hyper_complexe) TypedefSI1(S___colonneHHJ,K___dimY,genere_hyper_hyper_complexe) TypedefSI1(E___S___colonneHHJ,K___dimY,genere_hyper_hyper_complexe) TypedefD1(F___colonneHHJ,KK___dimY,genere_hyper_hyper_complexe) /* Definition du type "colonne_hyper_hyper_complexe" en tant que vecteur de dimension 'dimY' */ /* (introduit le 20150227094226). */ TypedefI1(vecteurJ,MdimXY,genere_complexe) TypedefAI1(A___vecteurJ,MdimXY,genere_complexe) TypedefEI1(E___vecteurJ,MdimXY,genere_complexe) TypedefSI1(S___vecteurJ,MAX2(K___dimX,K___dimY),genere_complexe) TypedefSI1(E___S___vecteurJ,MAX2(K___dimX,K___dimY),genere_complexe) TypedefD1(F___vecteurJ,MAX2(KK___dimX,KK___dimY),genere_complexe) /* Definition du type "vecteur_complexe" en tant que vecteur de dimension 'dimX=dimY' ; */ /* on notera donc la necessite d'avoir alors une image carree ; ce type est utilise par */ /* la transformee de Fourier optimisee... */ TypedefI1(vecteurHJ,MdimXY,genere_hyper_complexe) TypedefAI1(A___vecteurHJ,MdimXY,genere_hyper_complexe) TypedefEI1(E___vecteurHJ,MdimXY,genere_hyper_complexe) TypedefSI1(S___vecteurHJ,MAX2(K___dimX,K___dimY),genere_hyper_complexe) TypedefSI1(E___S___vecteurHJ,MAX2(K___dimX,K___dimY),genere_hyper_complexe) TypedefD1(F___vecteurHJ,MAX2(KK___dimX,KK___dimY),genere_hyper_complexe) /* Definition du type "vecteur_hyper_complexe" en tant que vecteur de dimension 'dimX=dimY'. */ /* On notera donc la necessite d'avoir alors une image carree. */ TypedefI1(vecteurHHJ,MdimXY,genere_hyper_hyper_complexe) TypedefAI1(A___vecteurHHJ,MdimXY,genere_hyper_hyper_complexe) TypedefEI1(E___vecteurHHJ,MdimXY,genere_hyper_hyper_complexe) TypedefSI1(S___vecteurHHJ,MAX2(K___dimX,K___dimY),genere_hyper_hyper_complexe) TypedefSI1(E___S___vecteurHHJ,MAX2(K___dimX,K___dimY),genere_hyper_hyper_complexe) TypedefD1(F___vecteurHHJ,MAX2(KK___dimX,KK___dimY),genere_hyper_hyper_complexe) /* Definition du type "vecteur_hyper_hyper_complexe" en tant que vecteur de dimension */ /* 'dimX=dimY'. On notera donc la necessite d'avoir alors une image carree (introduit */ /* le 20150227094226). */ #Aif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \ ) #Eif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \ ) #if ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \ ) TypedefD1(ligne,KK___dimX,genere_p) TypedefS(A___ligne,ligne) TypedefS(E___ligne,ligne) TypedefS(S___ligne,ligne) TypedefS(E___S___ligne,ligne) TypedefS(F___ligne,ligne) /* Definition du type "ligne" en tant que vecteur de dimension 'dimX'. */ TypedefD1(ligneC,KK___dimX,genere_CHAR) TypedefS(A___ligneC,ligneC) TypedefS(E___ligneC,ligneC) TypedefS(S___ligneC,ligneC) TypedefS(E___S___ligneC,ligneC) TypedefS(F___ligneC,ligneC) /* Definition du type "ligne_CHAR" en tant que vecteur de dimension 'dimX'. */ TypedefD1(ligneIB,KK___dimX,genere_vrai_Int_de_base) TypedefS(A___ligneIB,ligneIB) TypedefS(E___ligneIB,ligneIB) TypedefS(S___ligneIB,ligneIB) TypedefS(E___S___ligneIB,ligneIB) TypedefS(F___ligneIB,ligneIB) /* Definition du type "ligne_vrai_Int_de_base" en tant que vecteur de dimension 'dimX'. */ TypedefD1(ligneI,KK___dimX,genere_Int) TypedefS(A___ligneI,ligneI) TypedefS(E___ligneI,ligneI) TypedefS(S___ligneI,ligneI) TypedefS(E___S___ligneI,ligneI) TypedefS(F___ligneI,ligneI) /* Definition du type "ligne_Int" en tant que vecteur de dimension 'dimX'. */ TypedefD1(ligneUB,KK___dimX,genere_vrai_Positive_de_base) TypedefS(A___ligneUB,ligneUB) TypedefS(E___ligneUB,ligneUB) TypedefS(S___ligneUB,ligneUB) TypedefS(E___S___ligneUB,ligneUB) TypedefS(F___ligneUB,ligneUB) /* Definition du type "ligne_vrai_Positive_de_base" comme vecteur de dimension 'dimX'. */ TypedefD1(ligneU,KK___dimX,genere_LPositive) TypedefS(A___ligneU,ligneU) TypedefS(E___ligneU,ligneU) TypedefS(S___ligneU,ligneU) TypedefS(E___S___ligneU,ligneU) TypedefS(F___ligneU,ligneU) /* Definition du type "ligne_positive" en tant que vecteur de dimension 'dimX'. */ TypedefD1(ligneF,KK___dimX,genere_Float) TypedefS(A___ligneF,ligneF) TypedefS(E___ligneF,ligneF) TypedefS(S___ligneF,ligneF) TypedefS(E___S___ligneF,ligneF) TypedefS(F___ligneF,ligneF) /* Definition du type "ligne_Float" en tant que vecteur de dimension 'dimX'. */ TypedefD1(ligneD,KK___dimX,genere_Double) TypedefS(A___ligneD,ligneD) TypedefS(E___ligneD,ligneD) TypedefS(S___ligneD,ligneD) TypedefS(E___S___ligneD,ligneD) TypedefS(F___ligneD,ligneD) /* Definition du type "ligne_Double" en tant que vecteur de dimension 'dimX'. */ TypedefD1(ligneJ,KK___dimX,genere_complexe) TypedefS(A___ligneJ,ligneJ) TypedefS(E___ligneJ,ligneJ) TypedefS(S___ligneJ,ligneJ) TypedefS(E___S___ligneJ,ligneJ) TypedefS(F___ligneJ,ligneJ) /* Definition du type "ligne_complexe" en tant que vecteur de dimension 'dimX'. */ TypedefD1(ligneHJ,KK___dimX,genere_hyper_complexe) TypedefS(A___ligneHJ,ligneHJ) TypedefS(E___ligneHJ,ligneHJ) TypedefS(S___ligneHJ,ligneHJ) TypedefS(E___S___ligneHJ,ligneHJ) TypedefS(F___ligneHJ,ligneHJ) /* Definition du type "ligne_hyper_complexe" en tant que vecteur de dimension 'dimX'. */ TypedefD1(ligneHHJ,KK___dimX,genere_hyper_hyper_complexe) TypedefS(A___ligneHHJ,ligneHHJ) TypedefS(E___ligneHHJ,ligneHHJ) TypedefS(S___ligneHHJ,ligneHHJ) TypedefS(E___S___ligneHHJ,ligneHHJ) TypedefS(F___ligneHHJ,ligneHHJ) /* Definition du type "ligne_hyper_hyper_complexe" en tant que vecteur de dimension 'dimX' */ /* (introduit le 20150227094226). */ TypedefD1(colonne,KK___dimY,genere_p) TypedefS(A___colonne,colonne) TypedefS(E___colonne,colonne) TypedefS(S___colonne,colonne) TypedefS(E___S___colonne,colonne) TypedefS(F___colonne,colonne) /* Definition du type "colonne" en tant que vecteur de dimension 'dimY'. */ TypedefD1(colonneC,KK___dimY,genere_CHAR) TypedefS(A___colonneC,colonneC) TypedefS(E___colonneC,colonneC) TypedefS(S___colonneC,colonneC) TypedefS(E___S___colonneC,colonneC) TypedefS(F___colonneC,colonneC) /* Definition du type "colonne_CHAR" en tant que vecteur de dimension 'dimY'. */ TypedefD1(colonneIB,KK___dimY,genere_vrai_Int_de_base) TypedefS(A___colonneIB,colonneIB) TypedefS(E___colonneIB,colonneIB) TypedefS(S___colonneIB,colonneIB) TypedefS(E___S___colonneIB,colonneIB) TypedefS(F___colonneIB,colonneIB) /* Definition du type "colonne_vrai_Int_de_base" en tant que vecteur de dimension 'dimY'. */ TypedefD1(colonneI,KK___dimY,genere_Int) TypedefS(A___colonneI,colonneI) TypedefS(E___colonneI,colonneI) TypedefS(S___colonneI,colonneI) TypedefS(E___S___colonneI,colonneI) TypedefS(F___colonneI,colonneI) /* Definition du type "colonne_Int" en tant que vecteur de dimension 'dimY'. */ TypedefD1(colonneUB,KK___dimY,genere_vrai_Positive_de_base) TypedefS(A___colonneUB,colonneUB) TypedefS(E___colonneUB,colonneUB) TypedefS(S___colonneUB,colonneUB) TypedefS(E___S___colonneUB,colonneUB) TypedefS(F___colonneUB,colonneUB) /* Definition du type "colonne_vrai_Positive_de_base" comme vecteur de dimension 'dimY'. */ TypedefD1(colonneU,KK___dimY,genere_LPositive) TypedefS(A___colonneU,colonneU) TypedefS(E___colonneU,colonneU) TypedefS(S___colonneU,colonneU) TypedefS(E___S___colonneU,colonneU) TypedefS(F___colonneU,colonneU) /* Definition du type "colonne_positive" en tant que vecteur de dimension 'dimY'. */ TypedefD1(colonneF,KK___dimY,genere_Float) TypedefS(A___colonneF,colonneF) TypedefS(E___colonneF,colonneF) TypedefS(S___colonneF,colonneF) TypedefS(E___S___colonneF,colonneF) TypedefS(F___colonneF,colonneF) /* Definition du type "colonne_Float" en tant que vecteur de dimension 'dimY'. */ TypedefD1(colonneD,KK___dimY,genere_Double) TypedefS(A___colonneD,colonneD) TypedefS(E___colonneD,colonneD) TypedefS(S___colonneD,colonneD) TypedefS(E___S___colonneD,colonneD) TypedefS(F___colonneD,colonneD) /* Definition du type "colonne_Double" en tant que vecteur de dimension 'dimY'. */ TypedefD1(colonneJ,KK___dimY,genere_complexe) TypedefS(A___colonneJ,colonneJ) TypedefS(E___colonneJ,colonneJ) TypedefS(S___colonneJ,colonneJ) TypedefS(E___S___colonneJ,colonneJ) TypedefS(F___colonneJ,colonneJ) /* Definition du type "colonne_complexe" en tant que vecteur de dimension 'dimY'. */ TypedefD1(colonneHJ,KK___dimY,genere_hyper_complexe) TypedefS(A___colonneHJ,colonneHJ) TypedefS(E___colonneHJ,colonneHJ) TypedefS(S___colonneHJ,colonneHJ) TypedefS(E___S___colonneHJ,colonneHJ) TypedefS(F___colonneHJ,colonneHJ) /* Definition du type "colonne_hyper_complexe" en tant que vecteur de dimension 'dimY'. */ TypedefD1(colonneHHJ,KK___dimY,genere_hyper_hyper_complexe) TypedefS(A___colonneHHJ,colonneHHJ) TypedefS(E___colonneHHJ,colonneHHJ) TypedefS(S___colonneHHJ,colonneHHJ) TypedefS(E___S___colonneHHJ,colonneHHJ) TypedefS(F___colonneHHJ,colonneHHJ) /* Definition du type "colonne_hyper_hyper_complexe" en tant que vecteur de dimension 'dimY' */ /* (introduit le 20150227094226). */ TypedefD1(vecteurJ,KK___MdimXY,genere_complexe) TypedefS(A___vecteurJ,vecteurJ) TypedefS(E___vecteurJ,vecteurJ) TypedefS(S___vecteurJ,vecteurJ) TypedefS(E___S___vecteurJ,vecteurJ) TypedefS(F___vecteurJ,vecteurJ) /* Definition du type "vecteur_complexe" en tant que vecteur de dimension 'dimX=dimY' ; */ /* on notera donc la necessite d'avoir alors une image carree ; ce type est utilise par */ /* la transformee de Fourier optimisee... */ TypedefD1(vecteurHJ,KK___MdimXY,genere_hyper_complexe) TypedefS(A___vecteurHJ,vecteurHJ) TypedefS(E___vecteurHJ,vecteurHJ) TypedefS(S___vecteurHJ,vecteurHJ) TypedefS(E___S___vecteurHJ,vecteurHJ) TypedefS(F___vecteurHJ,vecteurHJ) /* Definition du type "vecteur_hyper_complexe" en tant que vecteur de dimension 'dimX=dimY'. */ /* On notera donc la necessite d'avoir alors une image carree. */ TypedefD1(vecteurHHJ,KK___MdimXY,genere_hyper_hyper_complexe) TypedefS(A___vecteurHHJ,vecteurHHJ) TypedefS(E___vecteurHHJ,vecteurHHJ) TypedefS(S___vecteurHHJ,vecteurHHJ) TypedefS(E___S___vecteurHHJ,vecteurHHJ) TypedefS(F___vecteurHHJ,vecteurHHJ) /* Definition du type "vecteur_hyper_hyper_complexe" en tant que vecteur de dimension */ /* 'dimX=dimY'. On notera donc la necessite d'avoir alors une image carree (introduit */ /* le 20150227094226). */ #Aif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \ ) #Eif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \ ) /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* T Y P E S D ' I M A G E S : */ /* */ /* */ /* Definition : */ /* */ /* Une image est une structure */ /* bidimensionnelle du type IMAGE(x,y) : */ /* */ /* */ /* --------------------------------------- */ /* | | */ /* | | */ /* | | */ /* | | */ /* | Y | */ /* | | */ /* | ^ | */ /* | | | */ /* | | | */ /* | | | */ /* | | | */ /* | ---------> X | */ /* --------------------------------------- */ /* */ /* */ /* ou la coordonnee 'x' est celle qui */ /* varie le plus vite. */ /* */ /* */ /* Notations : */ /* */ /* Les types <type> que l'on definit */ /* s'ecrivent de la facon suivante : */ /* */ /* <type> pour les utilisations "normales", */ /* A___<type> pour les Arguments des fonctions, */ /* E___<type> pour les references Externes, */ /* S___<type> pour les objets Statiques, */ /* E___S___<type> pour les objets Externes et Statiques, */ /* F___<type> pour les objets dont la taille est Fixe (et ne peut donc varier). */ /* */ /* */ /* Nota important : */ /* */ /* Il n'est pas possible de manipuler */ /* simultanement des images de tailles */ /* differentes, mais il est possible de */ /* passer, par exemple, du format 'Sdu' */ /* au format 'Std' en utilisant la commande */ /* 'v $xcg/extract$K' de la facon suivante : */ /* */ /* $CA IMAGE_Sdu | $xcg/extract$X eliminer=0 conserver=524288 debut=512 fin=512 > IMAGE_Std */ /* */ /* /\ */ /* || */ /* || */ /* \/ */ /* */ /* 2*262144 */ /* */ /* en supposant l'implantation suivante */ /* obtenue par exemple a l'aide de la */ /* commande 'v $xci/reduction_04$X' qui */ /* permet de faire passer une image au */ /* format 'Sdu' a une image au format */ /* 'Std' incluse dans une image au */ /* format 'Sdu' : */ /* */ /* --------------------------------------- */ /* 1023 | | | */ /* | | | */ /* | | | */ /* | | | */ /* | | | */ /* | | | */ /* | | | */ /* | | | */ /* | | | */ /* 512 | | | */ /* |---------------IMAGE_Sdu---------------| . */ /* 511 |///////////////////| | /|\ */ /* |///////////////////| | | */ /* |///////////////////| | | */ /* |//// ////| | | */ /* |//// IMAGE_Std ////| | | 524288 octets a conserver "fictivement" */ /* |//// ////| | | */ /* |///////////////////| | | */ /* |///////////////////| | | */ /* |///////////////////| | \|/ */ /* 0 |///////////////////| | . */ /* --------------------------------------- */ /* 0 511 512 1023 */ /* */ /* <----- debut -----> <------ fin ------> */ /* */ /* */ /* Autre exemple : */ /* */ /* soit une image <IMAGE> dont le format est */ /* defini par : */ /* */ /* XYmax 759 551 */ /* */ /* (par exemple '$xiit/JFC.11.?') dont on */ /* souhaite extraire une image 'Std' donnant */ /* un "auto-portrait" centre. On fera donc : */ /* */ /* $CA IMAGE | $xcg/extract$X eliminer=150 conserver=389120 debut=512 fin=248 > IMAGE_Std */ /* */ /* /\ | | */ /* || | | */ /* || \ / */ /* || \ / */ /* || \ / */ /* || + */ /* \/ 760 */ /* */ /* 760 * 512 */ /* */ /* soit : */ /* */ /* --------------------------------------- */ /* 551 | | | | */ /* | | | | */ /* | | | | */ /* 512 | | | | */ /* |-----------------IMAGE-----------------| . */ /* 511 | |///////////////////| | /|\ */ /* | |///////////////////| | | */ /* | |///////////////////| | | */ /* | |//// ////| | | */ /* | |//// IMAGE_Std ////| | | 389120 octets a conserver "fictivement" */ /* | |//// ////| | | */ /* | |///////////////////| | | */ /* | |///////////////////| | | */ /* | |///////////////////| | \|/ */ /* 0 | |///////////////////| | . */ /* --------------------------------------- */ /* 0 149 150 661 662 759 */ /* */ /* <----- debut -----> <--- fin ---> */ /* */ /* */ /* ou on notera qu'eliminer 150 octets en tete du fichier */ /* revient a creer une bande de 150 octets de large eliminee */ /* a gauche de l'image... */ /* */ /* */ /*************************************************************************************************************************************/ #if ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01)) \ ) TypedefD2(image,dimY,dimX,genere_p) TypedefS(A___image,image) TypedefS(E___image,image) TypedefS(S___image,image) TypedefS(E___S___image,image) TypedefS(F___image,image) /* Definition du type "image" en tant que tableau rectangulaire, dont */ /* les dimensions sont dimX*dimY donnees elles-memes par un */ /* fichier d'includes reference avant celui-ci de meme que le format */ /* de chaque pixel ("Format_p")... */ TypedefD2(imageC,dimY,dimX,genere_CHAR) TypedefS(A___imageC,imageC) TypedefS(E___imageC,imageC) TypedefS(S___imageC,imageC) TypedefS(E___S___imageC,imageC) TypedefS(F___imageC,imageC) /* Definition du type "image_CHAR" pour lequel la dimension est donnee par un */ /* fichier d'include, et le format de chaque pixel est fige (octet)... */ TypedefD2(imageIB,dimY,dimX,genere_vrai_Int_de_base) TypedefS(A___imageIB,imageIB) TypedefS(E___imageIB,imageIB) TypedefS(S___imageIB,imageIB) TypedefS(E___S___imageIB,imageIB) TypedefS(F___imageIB,imageIB) /* Definition du type "image_vrai_Int_de_base" pour lequel la dimension est donnee par un */ /* fichier d'include, et le format de chaque pixel est fige (mot entier). */ TypedefD2(imageI,dimY,dimX,genere_Int) TypedefS(A___imageI,imageI) TypedefS(E___imageI,imageI) TypedefS(S___imageI,imageI) TypedefS(E___S___imageI,imageI) TypedefS(F___imageI,imageI) /* Definition du type "image_Int" pour lequel la dimension est donnee par un */ /* fichier d'include, et le format de chaque pixel est fige (mot entier). */ TypedefD2(imageUB,dimY,dimX,genere_vrai_Positive_de_base) TypedefS(A___imageUB,imageUB) TypedefS(E___imageUB,imageUB) TypedefS(S___imageUB,imageUB) TypedefS(E___S___imageUB,imageUB) TypedefS(F___imageUB,imageUB) /* Definition du type "image_vrai_Positive_de_base" pour lequel la dimension est donnee par */ /* un fichier d'include, et le format de chaque pixel est fige (mot entier non signe). */ TypedefD2(imageU,dimY,dimX,genere_LPositive) TypedefS(A___imageU,imageU) TypedefS(E___imageU,imageU) TypedefS(S___imageU,imageU) TypedefS(E___S___imageU,imageU) TypedefS(F___imageU,imageU) /* Definition du type "image_positive_Int" pour lequel la dimension est donnee par un */ /* fichier d'include, et le format de chaque pixel est fige (mot entier non signe). */ TypedefD2(image_vrai_float_de_base,dimY,dimX,genere_vrai_float_de_base) TypedefS(A___image_vrai_float_de_base,image_vrai_float_de_base) TypedefS(E___image_vrai_float_de_base,image_vrai_float_de_base) TypedefS(S___image_vrai_float_de_base,image_vrai_float_de_base) TypedefS(E___S___image_vrai_float_de_base,image_vrai_float_de_base) TypedefS(F___image_vrai_float_de_base,image_vrai_float_de_base) /* Definition du type "image_vrai_float_de_base" (introduit le 20170406094834...). */ TypedefD2(imageF,dimY,dimX,genere_Float) TypedefS(A___imageF,imageF) TypedefS(E___imageF,imageF) TypedefS(S___imageF,imageF) TypedefS(E___S___imageF,imageF) TypedefS(F___imageF,imageF) /* Definition du type "image_Float" pour lequel la dimension est donnee par un */ /* fichier d'include, et le format de chaque pixel est fige (mot flottant simple)... */ TypedefD2(imageD,dimY,dimX,genere_Double) TypedefS(A___imageD,imageD) TypedefS(E___imageD,imageD) TypedefS(S___imageD,imageD) TypedefS(E___S___imageD,imageD) TypedefS(F___imageD,imageD) /* Definition du type "image_Double" pour lequel la dimension est donnee par un */ /* fichier d'include, et le format de chaque pixel est fige (mot flottant double)... */ TypedefD2(imageJ,dimY,dimX,genere_complexe) TypedefS(A___imageJ,imageJ) TypedefS(E___imageJ,imageJ) TypedefS(S___imageJ,imageJ) TypedefS(E___S___imageJ,imageJ) TypedefS(F___imageJ,imageJ) /* Definition du type "image_complexe" pour lequel la dimension est donnee par un */ /* fichier d'include, et le format de chaque pixel est fige (mot complexe) ; on */ /* notera que ce type d'image est utilise par la transformee de Fourier. */ TypedefD2(imageHJ,dimY,dimX,genere_hyper_complexe) TypedefS(A___imageHJ,imageHJ) TypedefS(E___imageHJ,imageHJ) TypedefS(S___imageHJ,imageHJ) TypedefS(E___S___imageHJ,imageHJ) TypedefS(F___imageHJ,imageHJ) /* Definition du type "image_hyper_complexe" pour lequel la dimension est donnee par un */ /* fichier d'include, et le format de chaque pixel est fige (mot hyper_complexe). */ TypedefD2(imageHHJ,dimY,dimX,genere_hyper_hyper_complexe) TypedefS(A___imageHHJ,imageHHJ) TypedefS(E___imageHHJ,imageHHJ) TypedefS(S___imageHHJ,imageHHJ) TypedefS(E___S___imageHHJ,imageHHJ) TypedefS(F___imageHHJ,imageHHJ) /* Definition du type "image_hyper_hyper_complexe" pour lequel la dimension est donnee par */ /* un fichier d'include, et le format de chaque pixel est fige (mot hyper_hyper_complexe). */ /* Ceci fut introduit le 20150227094226. */ #Aif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01)) \ ) #Eif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01)) \ ) #if ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \ ) # define TypedefI2(matrice,dimension_verticale,dimension_horizontale,type) \ TypedefIn(matrice,MUL2(dimension_verticale,dimension_horizontale),type) \ /* Definition d'un tableau a deux dimensions variables (ou matrice). */ # define TypedefAI2(matrice,dimension_verticale,dimension_horizontale,type) \ TypedefAIn(matrice,MUL2(dimension_verticale,dimension_horizontale),type) \ /* Definition d'un tableau Argument a deux dimensions variables (ou matrice). */ # define TypedefEI2(matrice,dimension_verticale,dimension_horizontale,type) \ TypedefEIn(matrice,MUL2(dimension_verticale,dimension_horizontale),type) \ /* Definition d'un tableau Externe a deux dimensions variables (ou matrice). */ # define TypedefSI2(matrice,dimension_verticale,dimension_horizontale,type) \ TypedefSIn(matrice,MUL2(dimension_verticale,dimension_horizontale),type) \ /* Definition d'un tableau Statique ou Externe-Statique a deux dimensions variables (ou */ \ /* matrice). */ TypedefI2(image,dimY,dimX,genere_p) TypedefAI2(A___image,dimY,dimX,genere_p) TypedefEI2(E___image,dimY,dimX,genere_p) TypedefSI2(S___image,K___dimY,K___dimX,genere_p) TypedefSI2(E___S___image,K___dimY,K___dimX,genere_p) TypedefD2(F___image,KK___dimY,KK___dimX,genere_p) /* Definition du type "image" en tant que tableau rectangulaire, dont les dimensions sont */ /* dimX*dimY et chaque pixel etant de "Format_p". */ TypedefI2(imageC,dimY,dimX,genere_CHAR) TypedefAI2(A___imageC,dimY,dimX,genere_CHAR) TypedefEI2(E___imageC,dimY,dimX,genere_CHAR) TypedefSI2(S___imageC,K___dimY,K___dimX,genere_CHAR) TypedefSI2(E___S___imageC,K___dimY,K___dimX,genere_CHAR) TypedefD2(F___imageC,KK___dimY,KK___dimX,genere_CHAR) /* Definition du type "image_CHAR". */ TypedefI2(imageIB,dimY,dimX,genere_vrai_Int_de_base) TypedefAI2(A___imageIB,dimY,dimX,genere_vrai_Int_de_base) TypedefEI2(E___imageIB,dimY,dimX,genere_vrai_Int_de_base) TypedefSI2(S___imageIB,K___dimY,K___dimX,genere_vrai_Int_de_base) TypedefSI2(E___S___imageIB,K___dimY,K___dimX,genere_vrai_Int_de_base) TypedefD2(F___imageIB,KK___dimY,KK___dimX,genere_vrai_Int_de_base) /* Definition du type "image_vrai_Int_de_base". */ TypedefI2(imageI,dimY,dimX,genere_Int) TypedefAI2(A___imageI,dimY,dimX,genere_Int) TypedefEI2(E___imageI,dimY,dimX,genere_Int) TypedefSI2(S___imageI,K___dimY,K___dimX,genere_Int) TypedefSI2(E___S___imageI,K___dimY,K___dimX,genere_Int) TypedefD2(F___imageI,KK___dimY,KK___dimX,genere_Int) /* Definition du type "image_Int". */ TypedefI2(imageUB,dimY,dimX,genere_vrai_Positive_de_base) TypedefAI2(A___imageUB,dimY,dimX,genere_vrai_Positive_de_base) TypedefEI2(E___imageUB,dimY,dimX,genere_vrai_Positive_de_base) TypedefSI2(S___imageUB,K___dimY,K___dimX,genere_vrai_Positive_de_base) TypedefSI2(E___S___imageUB,K___dimY,K___dimX,genere_vrai_Positive_de_base) TypedefD2(F___imageUB,KK___dimY,KK___dimX,genere_vrai_Positive_de_base) /* Definition du type "image_vrai_Positive_de_base". */ TypedefI2(imageU,dimY,dimX,genere_LPositive) TypedefAI2(A___imageU,dimY,dimX,genere_LPositive) TypedefEI2(E___imageU,dimY,dimX,genere_LPositive) TypedefSI2(S___imageU,K___dimY,K___dimX,genere_LPositive) TypedefSI2(E___S___imageU,K___dimY,K___dimX,genere_LPositive) TypedefD2(F___imageU,KK___dimY,KK___dimX,genere_LPositive) /* Definition du type "image_Positive". */ TypedefI2(image_vrai_float_de_base,dimY,dimX,genere_vrai_float_de_base) TypedefAI2(A___image_vrai_float_de_base,dimY,dimX,genere_vrai_float_de_base) TypedefEI2(E___image_vrai_float_de_base,dimY,dimX,genere_vrai_float_de_base) TypedefSI2(S___image_vrai_float_de_base,K___dimY,K___dimX,genere_vrai_float_de_base) TypedefSI2(E___S___image_vrai_float_de_base,K___dimY,K___dimX,genere_vrai_float_de_base) TypedefD2(F___image_vrai_float_de_base,KK___dimY,KK___dimX,genere_vrai_float_de_base) /* Definition du type "image_vrai_float_de_base" (introduit le 20170406100453...). */ TypedefI2(imageF,dimY,dimX,genere_Float) TypedefAI2(A___imageF,dimY,dimX,genere_Float) TypedefEI2(E___imageF,dimY,dimX,genere_Float) TypedefSI2(S___imageF,K___dimY,K___dimX,genere_Float) TypedefSI2(E___S___imageF,K___dimY,K___dimX,genere_Float) TypedefD2(F___imageF,KK___dimY,KK___dimX,genere_Float) /* Definition du type "image_Float". */ TypedefI2(imageD,dimY,dimX,genere_Double) TypedefAI2(A___imageD,dimY,dimX,genere_Double) TypedefEI2(E___imageD,dimY,dimX,genere_Double) TypedefSI2(S___imageD,K___dimY,K___dimX,genere_Double) TypedefSI2(E___S___imageD,K___dimY,K___dimX,genere_Double) TypedefD2(F___imageD,KK___dimY,KK___dimX,genere_Double) /* Definition du type "image_Double". */ TypedefI2(imageJ,dimY,dimX,genere_complexe) TypedefAI2(A___imageJ,dimY,dimX,genere_complexe) TypedefEI2(E___imageJ,dimY,dimX,genere_complexe) TypedefSI2(S___imageJ,K___dimY,K___dimX,genere_complexe) TypedefSI2(E___S___imageJ,K___dimY,K___dimX,genere_complexe) TypedefD2(F___imageJ,KK___dimY,KK___dimX,genere_complexe) /* Definition du type "image_complexe". On notera que ce type d'image est utilise par la */ /* transformee de Fourier. */ TypedefI2(imageHJ,dimY,dimX,genere_hyper_complexe) TypedefAI2(A___imageHJ,dimY,dimX,genere_hyper_complexe) TypedefEI2(E___imageHJ,dimY,dimX,genere_hyper_complexe) TypedefSI2(S___imageHJ,K___dimY,K___dimX,genere_hyper_complexe) TypedefSI2(E___S___imageHJ,K___dimY,K___dimX,genere_hyper_complexe) TypedefD2(F___imageHJ,KK___dimY,KK___dimX,genere_hyper_complexe) /* Definition du type "image_hyper_complexe". */ TypedefI2(imageHHJ,dimY,dimX,genere_hyper_hyper_complexe) TypedefAI2(A___imageHHJ,dimY,dimX,genere_hyper_hyper_complexe) TypedefEI2(E___imageHHJ,dimY,dimX,genere_hyper_hyper_complexe) TypedefSI2(S___imageHHJ,K___dimY,K___dimX,genere_hyper_hyper_complexe) TypedefSI2(E___S___imageHHJ,K___dimY,K___dimX,genere_hyper_hyper_complexe) TypedefD2(F___imageHHJ,KK___dimY,KK___dimX,genere_hyper_hyper_complexe) /* Definition du type "image_hyper_hyper_complexe" (introduit le 20150227094226). */ #Aif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \ ) #Eif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \ ) #if ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \ ) TypedefD1(image,KK___dimXY,genere_p) TypedefS(A___image,image) TypedefS(E___image,image) TypedefS(S___image,image) TypedefS(E___S___image,image) TypedefS(F___image,image) /* Definition du type "image" en tant que tableau rectangulaire, dont */ /* les dimensions sont dimX*dimY donnees elles-memes par un */ /* fichier d'includes reference avant celui-ci de meme que le format */ /* de chaque pixel ("Format_p")... */ TypedefD1(imageC,KK___dimXY,genere_CHAR) TypedefS(A___imageC,imageC) TypedefS(E___imageC,imageC) TypedefS(S___imageC,imageC) TypedefS(E___S___imageC,imageC) TypedefS(F___imageC,imageC) /* Definition du type "image_CHAR" pour lequel la dimension est donnee par un */ /* fichier d'include, et le format de chaque pixel est fige (octet)... */ TypedefD1(imageIB,KK___dimXY,genere_vrai_Int_de_base) TypedefS(A___imageIB,imageIB) TypedefS(E___imageIB,imageIB) TypedefS(S___imageIB,imageIB) TypedefS(E___S___imageIB,imageIB) TypedefS(F___imageIB,imageIB) /* Definition du type "image_vrai_Int_de_base" pour lequel la dimension est donnee par un */ /* fichier d'include, et le format de chaque pixel est fige (mot entier). */ TypedefD1(imageI,KK___dimXY,genere_Int) TypedefS(A___imageI,imageI) TypedefS(E___imageI,imageI) TypedefS(S___imageI,imageI) TypedefS(E___S___imageI,imageI) TypedefS(F___imageI,imageI) /* Definition du type "image_Int" pour lequel la dimension est donnee par un */ /* fichier d'include, et le format de chaque pixel est fige (mot entier). */ TypedefD1(imageUB,KK___dimXY,genere_vrai_Positive_de_base) TypedefS(A___imageUB,imageUB) TypedefS(E___imageUB,imageUB) TypedefS(S___imageUB,imageUB) TypedefS(E___S___imageUB,imageUB) TypedefS(F___imageUB,imageUB) /* Definition du type "image_vrai_Positive_de_base" pour lequel la dimension est donnee par */ /* un fichier d'include, et le format de chaque pixel est fige (mot entier non signe). */ TypedefD1(imageU,KK___dimXY,genere_LPositive) TypedefS(A___imageU,imageU) TypedefS(E___imageU,imageU) TypedefS(S___imageU,imageU) TypedefS(E___S___imageU,imageU) TypedefS(F___imageU,imageU) /* Definition du type "image_positive_Int" pour lequel la dimension est donnee par un */ /* fichier d'include, et le format de chaque pixel est fige (mot entier non signe). */ TypedefD1(image_vrai_float_de_base,KK___dimXY,genere_vrai_float_de_base) TypedefS(A___image_vrai_float_de_base,image_vrai_float_de_base) TypedefS(E___image_vrai_float_de_base,image_vrai_float_de_base) TypedefS(S___image_vrai_float_de_base,image_vrai_float_de_base) TypedefS(E___S___image_vrai_float_de_base,image_vrai_float_de_base) TypedefS(F___image_vrai_float_de_base,image_vrai_float_de_base) /* Definition du type "image_vrai_float_de_base" (introduit le 20170406100453...). */ TypedefD1(imageF,KK___dimXY,genere_Float) TypedefS(A___imageF,imageF) TypedefS(E___imageF,imageF) TypedefS(S___imageF,imageF) TypedefS(E___S___imageF,imageF) TypedefS(F___imageF,imageF) /* Definition du type "image_Float" pour lequel la dimension est donnee par un */ /* fichier d'include, et le format de chaque pixel est fige (mot flottant simple)... */ TypedefD1(imageD,KK___dimXY,genere_Double) TypedefS(A___imageD,imageD) TypedefS(E___imageD,imageD) TypedefS(S___imageD,imageD) TypedefS(E___S___imageD,imageD) TypedefS(F___imageD,imageD) /* Definition du type "image_Double" pour lequel la dimension est donnee par un */ /* fichier d'include, et le format de chaque pixel est fige (mot flottant double)... */ TypedefD1(imageJ,KK___dimXY,genere_complexe) TypedefS(A___imageJ,imageJ) TypedefS(E___imageJ,imageJ) TypedefS(S___imageJ,imageJ) TypedefS(E___S___imageJ,imageJ) TypedefS(F___imageJ,imageJ) /* Definition du type "image_complexe" pour lequel la dimension est donnee par un */ /* fichier d'include, et le format de chaque pixel est fige (mot complexe) ; on */ /* notera que ce type d'image est utilise par la transformee de Fourier. */ TypedefD1(imageHJ,KK___dimXY,genere_hyper_complexe) TypedefS(A___imageHJ,imageHJ) TypedefS(E___imageHJ,imageHJ) TypedefS(S___imageHJ,imageHJ) TypedefS(E___S___imageHJ,imageHJ) TypedefS(F___imageHJ,imageHJ) /* Definition du type "image_hyper_complexe" pour lequel la dimension est donnee par un */ /* fichier d'include, et le format de chaque pixel est fige (mot hyper_complexe). */ TypedefD1(imageHHJ,KK___dimXY,genere_hyper_hyper_complexe) TypedefS(A___imageHHJ,imageHHJ) TypedefS(E___imageHHJ,imageHHJ) TypedefS(S___imageHHJ,imageHHJ) TypedefS(E___S___imageHHJ,imageHHJ) TypedefS(F___imageHHJ,imageHHJ) /* Definition du type "image_hyper_hyper_complexe" pour lequel la dimension est donnee par */ /* un fichier d'include, et le format de chaque pixel est fige (mot hyper_hyper_complexe). */ /* Ceci fut introduit le 20150227094226. */ #Aif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \ ) #Eif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \ ) /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* T Y P E S D ' A L B U M S : */ /* */ /* */ /* Definition : */ /* */ /* Un album est une structure */ /* tridimensionnelle du type ALBUM(x,y,z) : */ /* */ /* */ /* Z */ /* . */ /* . */ /* . */ /* . --------------------------------------- */ /* . | | */ /* . | | */ /* . | | */ /* . | | */ /* . --------------------------------------- | */ /* . | | | */ /* . | | | */ /* . | | | */ /* . | | | */ /* --------------------------------------- | | */ /* | | | | */ /* | | | | */ /* | | | | */ /* | | | | */ /* | Y | | | */ /* | | |---- */ /* | ^ | | */ /* | | . |---- */ /* | | . | */ /* | | . | */ /* | |. | */ /* | O---------> X | */ /* --------------------------------------- */ /* / */ /* / */ /* / */ /* */ /* Z */ /* */ /* */ /* ou la coordonnee 'x' est celle qui */ /* varie le plus vite (puis 'y' et */ /* enfin 'z' qui varie le plus lentement). */ /* */ /* Voir 'v $xci/accumule.42$K 20180507135411' */ /* pour plus de precisions quant au lien entre */ /* la coordonnee 'Z' et le numero d'image (ils */ /* sont proportionnels...). */ /* */ /* */ /* Notations : */ /* */ /* Les types <type> que l'on definit */ /* s'ecrivent de la facon suivante : */ /* */ /* <type> pour les utilisations "normales", */ /* A___<type> pour les Arguments des fonctions, */ /* E___<type> pour les references Externes, */ /* S___<type> pour les objets Statiques, */ /* E___S___<type> pour les objets Externes et Statiques, */ /* F___<type> pour les objets dont la taille est Fixe (et ne peut donc varier). */ /* */ /* */ /*************************************************************************************************************************************/ #if ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01)) \ ) TypedefD3(album,dimZ,dimY,dimX,genere_p) TypedefS(A___album,album) TypedefS(E___album,album) TypedefS(S___album,album) TypedefS(E___S___album,album) TypedefS(F___album,album) /* Definition du type "album" en tant que tableau rectangulaire, dont */ /* les dimensions sont dimX*dimY*dimZ donnees elles-memes par un */ /* fichier d'includes reference avant celui-ci de meme que le format */ /* de chaque pixel ("Format_p")... */ TypedefD3(albumC,dimZ,dimY,dimX,genere_CHAR) TypedefS(A___albumC,albumC) TypedefS(E___albumC,albumC) TypedefS(S___albumC,albumC) TypedefS(E___S___albumC,albumC) TypedefS(F___albumC,albumC) /* Definition du type "album_CHAR" pour lequel la dimension est donnee par un */ /* fichier d'include, et le format de chaque pixel est fige (octet)... */ TypedefD3(albumIB,dimZ,dimY,dimX,genere_vrai_Int_de_base) TypedefS(A___albumIB,albumIB) TypedefS(E___albumIB,albumIB) TypedefS(S___albumIB,albumIB) TypedefS(E___S___albumIB,albumIB) TypedefS(F___albumIB,albumIB) /* Definition du type "album_vrai_Int_de_base" pour lequel la dimension est donnee par un */ /* fichier d'include, et le format de chaque pixel est fige (mot entier). */ TypedefD3(albumI,dimZ,dimY,dimX,genere_Int) TypedefS(A___albumI,albumI) TypedefS(E___albumI,albumI) TypedefS(S___albumI,albumI) TypedefS(E___S___albumI,albumI) TypedefS(F___albumI,albumI) /* Definition du type "album_Int" pour lequel la dimension est donnee par un */ /* fichier d'include, et le format de chaque pixel est fige (mot entier). */ TypedefD3(albumUB,dimZ,dimY,dimX,genere_vrai_Positive_de_base) TypedefS(A___albumUB,albumUB) TypedefS(E___albumUB,albumUB) TypedefS(S___albumUB,albumUB) TypedefS(E___S___albumUB,albumUB) TypedefS(F___albumUB,albumUB) /* Definition du type "album_vrai_Positive_de_base" pour lequel la dimension est donnee par */ /* un fichier d'include, et le format de chaque pixel est fige (mot entier non signe). */ TypedefD3(albumU,dimZ,dimY,dimX,genere_LPositive) TypedefS(A___albumU,albumU) TypedefS(E___albumU,albumU) TypedefS(S___albumU,albumU) TypedefS(E___S___albumU,albumU) TypedefS(F___albumU,albumU) /* Definition du type "album_positive_Int" pour lequel la dimension est donnee par un */ /* fichier d'include, et le format de chaque pixel est fige (mot entier non signe). */ TypedefD3(albumF,dimZ,dimY,dimX,genere_Float) TypedefS(A___albumF,albumF) TypedefS(E___albumF,albumF) TypedefS(S___albumF,albumF) TypedefS(E___S___albumF,albumF) TypedefS(F___albumF,albumF) /* Definition du type "album_Float" pour lequel la dimension est donnee par un */ /* fichier d'include, et le format de chaque pixel est fige (mot flottant simple)... */ TypedefD3(albumD,dimZ,dimY,dimX,genere_Double) TypedefS(A___albumD,albumD) TypedefS(E___albumD,albumD) TypedefS(S___albumD,albumD) TypedefS(E___S___albumD,albumD) TypedefS(F___albumD,albumD) /* Definition du type "album_Double" pour lequel la dimension est donnee par un */ /* fichier d'include, et le format de chaque pixel est fige (mot flottant double)... */ TypedefD3(albumJ,dimZ,dimY,dimX,genere_complexe) TypedefS(A___albumJ,albumJ) TypedefS(E___albumJ,albumJ) TypedefS(S___albumJ,albumJ) TypedefS(E___S___albumJ,albumJ) TypedefS(F___albumJ,albumJ) /* Definition du type "album_complexe" pour lequel la dimension est donnee par un */ /* fichier d'include, et le format de chaque pixel est fige (mot complexe) ; on */ /* notera que ce type d'album est utilise par la transformee de Fourier. */ TypedefD3(albumHJ,dimZ,dimY,dimX,genere_hyper_complexe) TypedefS(A___albumHJ,albumHJ) TypedefS(E___albumHJ,albumHJ) TypedefS(S___albumHJ,albumHJ) TypedefS(E___S___albumHJ,albumHJ) TypedefS(F___albumHJ,albumHJ) /* Definition du type "album_hyper_complexe" pour lequel la dimension est donnee par un */ /* fichier d'include, et le format de chaque pixel est fige (mot hyper_complexe). */ TypedefD3(albumHHJ,dimZ,dimY,dimX,genere_hyper_hyper_complexe) TypedefS(A___albumHHJ,albumHHJ) TypedefS(E___albumHHJ,albumHHJ) TypedefS(S___albumHHJ,albumHHJ) TypedefS(E___S___albumHHJ,albumHHJ) TypedefS(F___albumHHJ,albumHHJ) /* Definition du type "album_hyper_hyper_complexe" pour lequel la dimension est donnee par */ /* fichier d'include, et le format de chaque pixel est fige (mot hyper_hyper_complexe). */ /* Ceci fut introduit le 20150227094226. */ #Aif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01)) \ ) #Eif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01)) \ ) #if ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \ ) # define TypedefI3(matrice,dimension_profondeur,dimension_verticale,dimension_horizontale,type) \ TypedefIn(matrice,MUL3(dimension_profondeur,dimension_verticale,dimension_horizontale),type) \ /* Definition d'un tableau a deux dimensions variables (ou matrice). */ # define TypedefAI3(matrice,dimension_profondeur,dimension_verticale,dimension_horizontale,type) \ TypedefAIn(matrice,MUL3(dimension_profondeur,dimension_verticale,dimension_horizontale),type) \ /* Definition d'un tableau Argument a deux dimensions variables (ou matrice). */ # define TypedefEI3(matrice,dimension_profondeur,dimension_verticale,dimension_horizontale,type) \ TypedefEIn(matrice,MUL3(dimension_profondeur,dimension_verticale,dimension_horizontale),type) \ /* Definition d'un tableau Externe a deux dimensions variables (ou matrice). */ # define TypedefSI3(matrice,dimension_profondeur,dimension_verticale,dimension_horizontale,type) \ TypedefSIn(matrice,MUL3(dimension_profondeur,dimension_verticale,dimension_horizontale),type) \ /* Definition d'un tableau Statique ou Externe-Statique a deux dimensions variables (ou */ \ /* matrice). */ TypedefI3(album,dimZ,dimY,dimX,genere_p) TypedefAI3(A___album,dimZ,dimY,dimX,genere_p) TypedefEI3(E___album,dimZ,dimY,dimX,genere_p) TypedefSI3(S___album,K___dimZ,K___dimY,K___dimX,genere_p) TypedefSI3(E___S___album,K___dimZ,K___dimY,K___dimX,genere_p) TypedefD3(F___album,KK___dimZ,KK___dimY,KK___dimX,genere_p) /* Definition du type "album" en tant que tableau rectangulaire, dont les dimensions sont */ /* dimX*dimY*dimZ et chaque pixel etant de "Format_p". */ TypedefI3(albumC,dimZ,dimY,dimX,genere_CHAR) TypedefAI3(A___albumC,dimZ,dimY,dimX,genere_CHAR) TypedefEI3(E___albumC,dimZ,dimY,dimX,genere_CHAR) TypedefSI3(S___albumC,K___dimZ,K___dimY,K___dimX,genere_CHAR) TypedefSI3(E___S___albumC,K___dimZ,K___dimY,K___dimX,genere_CHAR) TypedefD3(F___albumC,KK___dimZ,KK___dimY,KK___dimX,genere_CHAR) /* Definition du type "album_CHAR". */ TypedefI3(albumIB,dimZ,dimY,dimX,genere_vrai_Int_de_base) TypedefAI3(A___albumIB,dimZ,dimY,dimX,genere_vrai_Int_de_base) TypedefEI3(E___albumIB,dimZ,dimY,dimX,genere_vrai_Int_de_base) TypedefSI3(S___albumIB,K___dimZ,K___dimY,K___dimX,genere_vrai_Int_de_base) TypedefSI3(E___S___albumIB,K___dimZ,K___dimY,K___dimX,genere_vrai_Int_de_base) TypedefD3(F___albumIB,KK___dimZ,KK___dimY,KK___dimX,genere_vrai_Int_de_base) /* Definition du type "album_vrai_Int_de_base". */ TypedefI3(albumI,dimZ,dimY,dimX,genere_Int) TypedefAI3(A___albumI,dimZ,dimY,dimX,genere_Int) TypedefEI3(E___albumI,dimZ,dimY,dimX,genere_Int) TypedefSI3(S___albumI,K___dimZ,K___dimY,K___dimX,genere_Int) TypedefSI3(E___S___albumI,K___dimZ,K___dimY,K___dimX,genere_Int) TypedefD3(F___albumI,KK___dimZ,KK___dimY,KK___dimX,genere_Int) /* Definition du type "album_Int". */ TypedefI3(albumUB,dimZ,dimY,dimX,genere_vrai_Positive_de_base) TypedefAI3(A___albumUB,dimZ,dimY,dimX,genere_vrai_Positive_de_base) TypedefEI3(E___albumUB,dimZ,dimY,dimX,genere_vrai_Positive_de_base) TypedefSI3(S___albumUB,K___dimZ,K___dimY,K___dimX,genere_vrai_Positive_de_base) TypedefSI3(E___S___albumUB,K___dimZ,K___dimY,K___dimX,genere_vrai_Positive_de_base) TypedefD3(F___albumUB,KK___dimZ,KK___dimY,KK___dimX,genere_vrai_Positive_de_base) /* Definition du type "album_vrai_Positive_de_base". */ TypedefI3(albumU,dimZ,dimY,dimX,genere_LPositive) TypedefAI3(A___albumU,dimZ,dimY,dimX,genere_LPositive) TypedefEI3(E___albumU,dimZ,dimY,dimX,genere_LPositive) TypedefSI3(S___albumU,K___dimZ,K___dimY,K___dimX,genere_LPositive) TypedefSI3(E___S___albumU,K___dimZ,K___dimY,K___dimX,genere_LPositive) TypedefD3(F___albumU,KK___dimZ,KK___dimY,KK___dimX,genere_LPositive) /* Definition du type "album_Positive". */ TypedefI3(albumF,dimZ,dimY,dimX,genere_Float) TypedefAI3(A___albumF,dimZ,dimY,dimX,genere_Float) TypedefEI3(E___albumF,dimZ,dimY,dimX,genere_Float) TypedefSI3(S___albumF,K___dimZ,K___dimY,K___dimX,genere_Float) TypedefSI3(E___S___albumF,K___dimZ,K___dimY,K___dimX,genere_Float) TypedefD3(F___albumF,KK___dimZ,KK___dimY,KK___dimX,genere_Float) /* Definition du type "album_Float". */ TypedefI3(albumD,dimZ,dimY,dimX,genere_Double) TypedefAI3(A___albumD,dimZ,dimY,dimX,genere_Double) TypedefEI3(E___albumD,dimZ,dimY,dimX,genere_Double) TypedefSI3(S___albumD,K___dimZ,K___dimY,K___dimX,genere_Double) TypedefSI3(E___S___albumD,K___dimZ,K___dimY,K___dimX,genere_Double) TypedefD3(F___albumD,KK___dimZ,KK___dimY,KK___dimX,genere_Double) /* Definition du type "album_Double". */ TypedefI3(albumJ,dimZ,dimY,dimX,genere_complexe) TypedefAI3(A___albumJ,dimZ,dimY,dimX,genere_complexe) TypedefEI3(E___albumJ,dimZ,dimY,dimX,genere_complexe) TypedefSI3(S___albumJ,K___dimZ,K___dimY,K___dimX,genere_complexe) TypedefSI3(E___S___albumJ,K___dimZ,K___dimY,K___dimX,genere_complexe) TypedefD3(F___albumJ,KK___dimZ,KK___dimY,KK___dimX,genere_complexe) /* Definition du type "album_complexe". On notera que ce type d'album est utilise par la */ /* transformee de Fourier. */ TypedefI3(albumHJ,dimZ,dimY,dimX,genere_hyper_complexe) TypedefAI3(A___albumHJ,dimZ,dimY,dimX,genere_hyper_complexe) TypedefEI3(E___albumHJ,dimZ,dimY,dimX,genere_hyper_complexe) TypedefSI3(S___albumHJ,K___dimZ,K___dimY,K___dimX,genere_hyper_complexe) TypedefSI3(E___S___albumHJ,K___dimZ,K___dimY,K___dimX,genere_hyper_complexe) TypedefD3(F___albumHJ,KK___dimZ,KK___dimY,KK___dimX,genere_hyper_complexe) /* Definition du type "album_hyper_complexe". */ TypedefI3(albumHHJ,dimZ,dimY,dimX,genere_hyper_hyper_complexe) TypedefAI3(A___albumHHJ,dimZ,dimY,dimX,genere_hyper_hyper_complexe) TypedefEI3(E___albumHHJ,dimZ,dimY,dimX,genere_hyper_hyper_complexe) TypedefSI3(S___albumHHJ,K___dimZ,K___dimY,K___dimX,genere_hyper_hyper_complexe) TypedefSI3(E___S___albumHHJ,K___dimZ,K___dimY,K___dimX,genere_hyper_hyper_complexe) TypedefD3(F___albumHHJ,KK___dimZ,KK___dimY,KK___dimX,genere_hyper_hyper_complexe) /* Definition du type "album_hyper_hyper_complexe" (introduit le 20150227094226). */ #Aif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \ ) #Eif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \ ) #if ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \ ) TypedefD1(album,KK___dimXYZ,genere_p) TypedefS(A___album,album) TypedefS(E___album,album) TypedefS(S___album,album) TypedefS(E___S___album,album) TypedefS(F___album,album) /* Definition du type "album" en tant que tableau rectangulaire, dont */ /* les dimensions sont dimX*dimY*dimZ donnees elles-memes par un */ /* fichier d'includes reference avant celui-ci de meme que le format */ /* de chaque pixel ("Format_p")... */ TypedefD1(albumC,KK___dimXYZ,genere_CHAR) TypedefS(A___albumC,albumC) TypedefS(E___albumC,albumC) TypedefS(S___albumC,albumC) TypedefS(E___S___albumC,albumC) TypedefS(F___albumC,albumC) /* Definition du type "album_CHAR" pour lequel la dimension est donnee par un */ /* fichier d'include, et le format de chaque pixel est fige (octet)... */ TypedefD1(albumIB,KK___dimXYZ,genere_vrai_Int_de_base) TypedefS(A___albumIB,albumIB) TypedefS(E___albumIB,albumIB) TypedefS(S___albumIB,albumIB) TypedefS(E___S___albumIB,albumIB) TypedefS(F___albumIB,albumIB) /* Definition du type "album_vrai_Int_de_base" pour lequel la dimension est donnee par un */ /* fichier d'include, et le format de chaque pixel est fige (mot entier). */ TypedefD1(albumI,KK___dimXYZ,genere_Int) TypedefS(A___albumI,albumI) TypedefS(E___albumI,albumI) TypedefS(S___albumI,albumI) TypedefS(E___S___albumI,albumI) TypedefS(F___albumI,albumI) /* Definition du type "album_Int" pour lequel la dimension est donnee par un */ /* fichier d'include, et le format de chaque pixel est fige (mot entier). */ TypedefD1(albumUB,KK___dimXYZ,genere_vrai_Positive_de_base) TypedefS(A___albumUB,albumUB) TypedefS(E___albumUB,albumUB) TypedefS(S___albumUB,albumUB) TypedefS(E___S___albumUB,albumUB) TypedefS(F___albumUB,albumUB) /* Definition du type "album_vrai_Positive_de_base" pour lequel la dimension est donnee par */ /* un fichier d'include, et le format de chaque pixel est fige (mot entier non signe). */ TypedefD1(albumU,KK___dimXYZ,genere_LPositive) TypedefS(A___albumU,albumU) TypedefS(E___albumU,albumU) TypedefS(S___albumU,albumU) TypedefS(E___S___albumU,albumU) TypedefS(F___albumU,albumU) /* Definition du type "album_positive_Int" pour lequel la dimension est donnee par un */ /* fichier d'include, et le format de chaque pixel est fige (mot entier non signe). */ TypedefD1(albumF,KK___dimXYZ,genere_Float) TypedefS(A___albumF,albumF) TypedefS(E___albumF,albumF) TypedefS(S___albumF,albumF) TypedefS(E___S___albumF,albumF) TypedefS(F___albumF,albumF) /* Definition du type "album_Float" pour lequel la dimension est donnee par un */ /* fichier d'include, et le format de chaque pixel est fige (mot flottant simple)... */ TypedefD1(albumD,KK___dimXYZ,genere_Double) TypedefS(A___albumD,albumD) TypedefS(E___albumD,albumD) TypedefS(S___albumD,albumD) TypedefS(E___S___albumD,albumD) TypedefS(F___albumD,albumD) /* Definition du type "album_Double" pour lequel la dimension est donnee par un */ /* fichier d'include, et le format de chaque pixel est fige (mot flottant double)... */ TypedefD1(albumJ,KK___dimXYZ,genere_complexe) TypedefS(A___albumJ,albumJ) TypedefS(E___albumJ,albumJ) TypedefS(S___albumJ,albumJ) TypedefS(E___S___albumJ,albumJ) TypedefS(F___albumJ,albumJ) /* Definition du type "album_complexe" pour lequel la dimension est donnee par un */ /* fichier d'include, et le format de chaque pixel est fige (mot complexe) ; on */ /* notera que ce type d'album est utilise par la transformee de Fourier. */ TypedefD1(albumHJ,KK___dimXYZ,genere_hyper_complexe) TypedefS(A___albumHJ,albumHJ) TypedefS(E___albumHJ,albumHJ) TypedefS(S___albumHJ,albumHJ) TypedefS(E___S___albumHJ,albumHJ) TypedefS(F___albumHJ,albumHJ) /* Definition du type "album_hyper_complexe" pour lequel la dimension est donnee par un */ /* fichier d'include, et le format de chaque pixel est fige (mot hyper_complexe). */ TypedefD1(albumHHJ,KK___dimXYZ,genere_hyper_hyper_complexe) TypedefS(A___albumHHJ,albumHHJ) TypedefS(E___albumHHJ,albumHHJ) TypedefS(S___albumHHJ,albumHHJ) TypedefS(E___S___albumHHJ,albumHHJ) TypedefS(F___albumHHJ,albumHHJ) /* Definition du type "album_hyper_hyper_complexe" pour lequel la dimension est donnee par */ /* un fichier d'include, et le format de chaque pixel est fige (mot hyper_hyper_complexe). */ /* Ceci fut introduit le 20150227094226. */ #Aif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \ ) #Eif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \ ) /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C H A N G E M E N T D E S D I M E N S I O N S D E S I M A G E S : */ /* */ /* */ /* Utilisation : */ /* */ /* SET_DIMENSIONS_2D_SANS_VALIDATION(xm,xM,ym,yM); */ /* SET_DIMENSIONS_3D_SANS_VALIDATION(xm,xM,ym,yM,zm,zM); */ /* */ /* SET_DIMENSIONS_2D(xm,xM,ym,yM); */ /* SET_DIMENSIONS_3D(xm,xM,ym,yM,zm,zM); */ /* */ /* PUSH_DIMENSIONS_2D; */ /* PULL_DIMENSIONS_2D; */ /* */ /* PUSH_DIMENSIONS_3D; */ /* PULL_DIMENSIONS_3D; */ /* */ /* */ /*************************************************************************************************************************************/ #if ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01)) \ ) # define SET_DIMENSIONS_2D(xm,xM,ym,yM) \ Bblock \ PRINT_ERREUR("le dimensionnement 2D des images n'est pas realisable dans cette version"); \ Eblock \ /* Dimensionnement de l'espace 2D lorsqu'il est valide... */ # define SET_DIMENSIONS_3D(xm,xM,ym,yM,zm,zM) \ Bblock \ PRINT_ERREUR("le dimensionnement 3D des images n'est pas realisable dans cette version"); \ Eblock \ /* Dimensionnement de l'espace 3D lorsqu'il est valide... */ #Aif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01)) \ ) #Eif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01)) \ ) #if ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \ || (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \ ) # ifdef GESTION_DES_IMAGES_STATIQUES_VERSION_01 # define LES_AXES_OX_ET_OY_NE_SONT_PAS_BIEN_REDEFINIS(xm,xM,ym,yM) \ IFOU(IFOU(IFGT(dimX,K___dimX),IFLE(xM,xm)) \ ,IFOU(IFGT(dimY,K___dimY),IFLE(yM,ym)) \ ) # define L_AXE_OZ_N_EST_PAS_BIEN_REDEFINI(xm,xM,ym,yM,zm,zM) \ IFOU(IFGT(dimZ,K___dimZ),IFLE(zM,zm)) \ /* Procedures de validation de la redefinition des trois axes 'OX', 'OY' et 'OZ'... */ # define AVERTISSEMENT_SUR_LE_NON_REDIMENSIONNEMENT_DE_CERTAINES_IMAGES \ Bblock \ PRINT_ATTENTION("les images pre-existantes non Statiques ne sont pas redimensionnees"); \ Eblock \ /* Procedure d'envoi d'un message sur le fait que les images pre-existantes non Statiques */ \ /* ne sont pas redimensionnees... */ # Aifdef GESTION_DES_IMAGES_STATIQUES_VERSION_01 # Eifdef GESTION_DES_IMAGES_STATIQUES_VERSION_01 # ifdef GESTION_DES_IMAGES_STATIQUES_VERSION_02 # define LES_AXES_OX_ET_OY_NE_SONT_PAS_BIEN_REDEFINIS(xm,xM,ym,yM) \ IFOU(IFLc(xM,xm,IL_NE_FAUT_PAS(valider_les_axes_OX_OY_OZ)) \ ,IFLc(yM,ym,IL_NE_FAUT_PAS(valider_les_axes_OX_OY_OZ)) \ ) # define L_AXE_OZ_N_EST_PAS_BIEN_REDEFINI(xm,xM,ym,yM,zm,zM) \ IFLc(zM,zm,IL_NE_FAUT_PAS(valider_les_axes_OX_OY_OZ)) /* Procedures de validation de la redefinition des trois axes 'OX', 'OY' et 'OZ'... */ # define AVERTISSEMENT_SUR_LE_NON_REDIMENSIONNEMENT_DE_CERTAINES_IMAGES \ Bblock \ PRINT_ATTENTION("les images pre-existantes, de meme que les 'Statiques', ne sont pas redimensionnees"); \ Eblock \ /* Procedure d'envoi d'un message sur le fait que les images pre-existantes, de meme que */ \ /* images 'Statiques' (ne pas oublier 'GESTION_DES_IMAGES_STATIQUES_VERSION_02'), ne sont */ \ /* pas redimensionnees... */ # Aifdef GESTION_DES_IMAGES_STATIQUES_VERSION_02 # Eifdef GESTION_DES_IMAGES_STATIQUES_VERSION_02 # define SET_DIMENSIONS_DE_L_AXE_OX(xm,xM) \ Bblock \ DEFV(Int,INIT(nouveau_Xmin,xm)); \ DEFV(Int,INIT(nouveau_Xmax,xM)); \ /* Dispositif introduit le 20010224190211 au cas ou 'xm' ou 'xM' dependraient des anciens */ \ /* 'Xmin' et/ou 'Xmax' ('v $xiidX/fonct$vv$FON SET_DIMENSIONS_2D_SANS_VALIDATION'). */ \ EGAL(Xmin,nouveau_Xmin); \ EGAL(Xmax,nouveau_Xmax); \ Eblock \ /* Dimensionnement de l'axe 'OX' sans validation... */ # define SET_DIMENSIONS_DE_L_AXE_OY(ym,yM) \ Bblock \ DEFV(Int,INIT(nouveau_Ymin,ym)); \ DEFV(Int,INIT(nouveau_Ymax,yM)); \ /* Dispositif introduit le 20010224190211 au cas ou 'ym' ou 'yM' dependraient des anciens */ \ /* 'Ymin' et/ou 'Ymax' ('v $xiidX/fonct$vv$FON SET_DIMENSIONS_2D_SANS_VALIDATION'). */ \ EGAL(Ymin,nouveau_Ymin); \ EGAL(Ymax,nouveau_Ymax); \ Eblock \ /* Dimensionnement de l'axe 'OY' sans validation... */ # define SET_DIMENSIONS_DE_L_AXE_OZ(zm,zM) \ Bblock \ DEFV(Int,INIT(nouveau_Zmin,zm)); \ DEFV(Int,INIT(nouveau_Zmax,zM)); \ /* Dispositif introduit le 20010224190211 au cas ou 'xm' ou 'xM' dependraient des anciens */ \ /* 'Ymin' et/ou 'Ymax' ('v $xiidX/fonct$vv$FON SET_DIMENSIONS_2D_SANS_VALIDATION'). */ \ EGAL(Zmin,nouveau_Zmin); \ EGAL(Zmax,nouveau_Zmax); \ Eblock \ /* Dimensionnement de l'axe 'OZ' sans validation... */ # define SET_DIMENSIONS_2D_SANS_VALIDATION(xm,xM,ym,yM) \ Bblock \ SET_DIMENSIONS_DE_L_AXE_OX(xm,xM); \ SET_DIMENSIONS_DE_L_AXE_OY(ym,yM); \ Eblock \ /* Dimensionnement de l'espace 2D sans validation... */ # define SET_DIMENSIONS_3D_SANS_VALIDATION(xm,xM,ym,yM,zm,zM) \ Bblock \ SET_DIMENSIONS_2D_SANS_VALIDATION(xm,xM,ym,yM); \ SET_DIMENSIONS_DE_L_AXE_OZ(zm,zM); \ Eblock \ /* Dimensionnement de l'espace 3D sans validation... */ # define SET_DIMENSIONS_2D(xm,xM,ym,yM) \ Bblock \ Test(LES_AXES_OX_ET_OY_NE_SONT_PAS_BIEN_REDEFINIS(xm,xM,ym,yM)) \ Bblock \ PRINT_ERREUR("le dimensionnement 2D demande est incorrect, les valeurs par defaut sont conservees"); \ CAL1(Prer4("OX : valeurs refusees=(%d,%d), valeurs par defaut utilisees=(%d,%d)\n",xm,xM,Xmin,Xmax)); \ CAL1(Prer4("OY : valeurs refusees=(%d,%d), valeurs par defaut utilisees=(%d,%d)\n",ym,yM,Ymin,Ymax)); \ Eblock \ ATes \ Bblock \ Test(TOUJOURS_FAUX) \ /* A cause de 'INITIALISATION_DU_FORMAT_DES_IMAGES_DANS_GET_ARGUMENTSi_VERSION_05' et de */ \ /* 'INITIALISATION_DU_FORMAT_DES_IMAGES_DANS_GET_ARGUMENTSi_VERSION_06', le message suivant */ \ /* n'est plus edite a compter du 20020213103458. */ \ Bblock \ AVERTISSEMENT_SUR_LE_NON_REDIMENSIONNEMENT_DE_CERTAINES_IMAGES; \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ SET_DIMENSIONS_2D_SANS_VALIDATION(xm,xM,ym,yM); \ Eblock \ ETes \ Eblock \ /* Dimensionnement de l'espace 2D lorsqu'il est valide... */ # define SET_DIMENSIONS_3D(xm,xM,ym,yM,zm,zM) \ Bblock \ Test(L_AXE_OZ_N_EST_PAS_BIEN_REDEFINI(xm,xM,ym,yM,zm,zM)) \ Bblock \ PRINT_ERREUR("le dimensionnement 3D demande est incorrect, les valeurs par defaut sont conservees"); \ CAL1(Prer4("OZ : valeurs refusees=(%d,%d), valeurs par defaut utilisees=(%d,%d)\n",zm,zM,Zmin,Zmax)); \ Eblock \ ATes \ Bblock \ SET_DIMENSIONS_DE_L_AXE_OZ(zm,zM);; \ /* On notera que l'on ne peut pas utiliser ici : */ \ /* */ \ /* SET_DIMENSIONS_3D_SANS_VALIDATION(xm,xM,ym,yM,zm,zM); */ \ /* */ \ /* car en effet, il manquerait alors la validation des axes 'OX' et 'OY'... */ \ Eblock \ ETes \ \ SET_DIMENSIONS_2D(xm,xM,ym,yM); \ /* On notera qu'avant le 20020213101159 le 'SET_DIMENSIONS_2D(...)' precedait immediatement */ \ /* le 'SET_DIMENSIONS_DE_L_AXE_OZ(...)' dans le 'Test(...)' ci-dessus. Cela avait un */ \ /* inconvenient : celui de ne pas tester les axes' OX' et 'OY' dans le cas ou l'axe 'OZ' */ \ /* etait incorrecetment defini. D'ou cette nouvelle disposition... */ \ Eblock \ /* Dimensionnement de l'espace 3D lorsqu'il est valide... */ # define PUSH_DIMENSIONS_2D \ Bblock \ /* Pour valider le couple (PUSH,PULL). ATTENTION : a cause des variables locales qui sont */ \ /* creees, il est impossible d'utiliser (BblockV,EblockV) qui, sur certains 'SYSTEME', peut */ \ /* etre vide... */ \ DEFV(Int,INIT(EnTete_de_sauvegardM ## Xmin,Xmin)); \ DEFV(Int,INIT(EnTete_de_sauvegardM ## Xmax,Xmax)); \ DEFV(Int,INIT(EnTete_de_sauvegardM ## Ymin,Ymin)); \ DEFV(Int,INIT(EnTete_de_sauvegardM ## Ymax,Ymax)); \ \ DEFV(Int,INIT(EnTete_de_sauvegardM ## dimX,dimX)); \ DEFV(Int,INIT(EnTete_de_sauvegardM ## dimY,dimY)); \ /* Sauvegarde de (Xmin,Xmax,Ymin,Ymax), et de (dimX,dimY) meme s'ils peuvent etre evalues */ \ /* a partir des (Xmin,Xmax,Ymin,Ymax) sauvegardes... */ # define PULL_DIMENSIONS_2D \ SET_DIMENSIONS_2D_SANS_VALIDATION(EnTete_de_sauvegardM ## Xmin,EnTete_de_sauvegardM ## Xmax \ ,EnTete_de_sauvegardM ## Ymin,EnTete_de_sauvegardM ## Ymax \ ); \ /* Restauration de (Xmin,Xmax,Ymin,Ymax). */ \ Eblock \ /* Pour valider le couple (PUSH,PULL). ATTENTION : a cause des variables locales qui sont */ \ /* creees, il est impossible d'utiliser (BblockV,EblockV) qui, sur certains 'SYSTEME', peut */ \ /* etre vide... */ # define PUSH_DIMENSIONS_3D \ /* Pour valider le couple (PUSH,PULL), le 'Bblock' initial est dans 'PUSH_DIMENSIONS_2D'... */ \ PUSH_DIMENSIONS_2D \ /* ATTENTION, l'absence de ";" en fin de 'PUSH_DIMENSIONS_2D' est essentiel a cause des */ \ /* 'Int' qui suivent... */ \ DEFV(Int,INIT(EnTete_de_sauvegardM ## Zmin,Zmin)); \ DEFV(Int,INIT(EnTete_de_sauvegardM ## Zmax,Zmax)); \ /* Sauvegarde de (Xmin,Xmax,Ymin,Ymax,Zmin,Zmax). */ # define PULL_DIMENSIONS_3D \ SET_DIMENSIONS_3D_SANS_VALIDATION(EnTete_de_sauvegardM ## Xmin,EnTete_de_sauvegardM ## Xmax \ ,EnTete_de_sauvegardM ## Ymin,EnTete_de_sauvegardM ## Ymax \ ,EnTete_de_sauvegardM ## Zmin,EnTete_de_sauvegardM ## Zmax \ ); \ /* Restauration de (Xmin,Xmax,Ymin,Ymax,Zmin,Zmax). */ \ Eblock \ /* Pour valider le couple (PUSH,PULL). ATTENTION : a cause des variables locales qui sont */ \ /* creees, il est impossible d'utiliser (BblockV,EblockV) qui, sur certains 'SYSTEME', peut */ \ /* etre vide... */ #Aif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \ || (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \ ) #Eif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \ || (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \ ) /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* N O T I O N D E S O U S - E C H A N T I L L O N N A G E D E S I M A G E S : */ /* */ /* */ /* Definition : */ /* */ /* Afin de permettre a toutes les */ /* fonctions de manipuler et traiter */ /* des images de dimensions apparentes */ /* inferieures a [dimX,dimY], les pas */ /* d'echantillonnage des images, soit */ /* [pasX,pasY], sont des donnees pro- */ /* grammables. La dimension apparente */ /* d'une image est alors [dimX/pasX,dimY/pasY]. */ /* De plus, il est possible de transla- */ /* ter ce maillage ; ainsi on pourra */ /* multiplexer plusieurs images sous- */ /* echantillonnees, et creer ainsi des */ /* images "spatio-temporelles", c'est- */ /* a-dire finalement une animation... */ /* */ /* */ /* Utilisation : */ /* */ /* PUSH_ECHANTILLONNAGE; */ /* PULL_ECHANTILLONNAGE; */ /* */ /* gPUSH_ECHANTILLONNAGE; */ /* gPULL_ECHANTILLONNAGE; */ /* */ /* de restaurer (pasX,pasY,pasZ), soit leurs */ /* valeurs locales (par exemple celles qui sont */ /* definies dans un couple ('begin_image'/'end_image'), */ /* soit leurs valeurs globales (celles qui sont definies */ /* dans 'v $xiii/Images$STR'). Et enfin, */ /* */ /* SET_ECHANTILLONNAGE(pas_sur_l_axe_OX,pas_sur_l_axe_OY); */ /* SET_ECHANTILLONNAGE_DE_PROFONDEUR(pas_sur_l_axe_OZ); */ /* SET_ECHANTILLONNAGE_DE_TEMPS(pas_sur_l_axe_OT); */ /* */ /* gSET_ECHANTILLONNAGE(pas_sur_l_axe_OX,pas_sur_l_axe_OY); */ /* gSET_ECHANTILLONNAGE_DE_PROFONDEUR(pas_sur_l_axe_OZ); */ /* gSET_ECHANTILLONNAGE_DE_TEMPS(pas_sur_l_axe_OT); */ /* */ /* permet de positionner (pasX,pasY) et 'pasZ' (seul), */ /* avec la meme distinction entre locales et globales... */ /* */ /* PUSH_TRANSLATION; */ /* PULL_TRANSLATION; */ /* */ /* permettent de sauvegarder, puis */ /* de restaurer (translationX,translationY), et enfin, */ /* */ /* SET_TRANSLATION(translation_sur_l_axe_OX,translation_sur_l_axe_OY); */ /* */ /* permet de positionner (translationX,translationY). */ /* */ /* Mais, attention, a cause des verifications */ /* qui sont faites dans 'SET_TRANSLATION', */ /* l'ordre des PUSH a de l'importance ; il */ /* conviendra de faire : */ /* */ /* PUSH_TRANSLATION; */ /* PUSH_ECHANTILLONNAGE; */ /* ... */ /* PULL_ECHANTILLONNAGE; */ /* PULL_TRANSLATION; */ /* */ /* ainsi (pasX,pasY) sont corrects au moment */ /* de la validation... */ /* */ /* */ /*************************************************************************************************************************************/ /* Le 20170712133515, l'eventuelle definition de '__VERSION__INDEXATION_SIMPLIFIEE_A_PRIORI' */ /* a ete deplacee dans 'v $xiiD/definit.2$DEF 20170712133515' afin que */ /* '__VERSION__INDEXATION_SIMPLIFIEE_A_PRIORI' puisse etre utilisable quasiment partout... */ #ifndef __VERSION__INDEXATION_SIMPLIFIEE_A_PRIORI # define TEST_ECHANTILLONNAGE \ Bblock \ EGAL(echantillonnage \ ,COND(IFET(I3ET(IFEQ(pasX,PasX) \ ,IFEQ(pasY,PasY) \ ,IFEQ(pasZ,PasZ) \ ) \ ,I3ET(IFEQ(translationX,TraX) \ ,IFEQ(translationY,TraY) \ ,IFEQ(translationZ,TraZ) \ ) \ ) \ ,FAUX \ ,VRAI \ ) \ ); \ Eblock \ /* Repositionnement de l'indicateur d'echantillonnage ; il n'y a */ \ /* pas d'echantillonnage ('FAUX') lorsque l'on est dans un etat */ \ /* identique a l'etat initial... */ #Aifndef __VERSION__INDEXATION_SIMPLIFIEE_A_PRIORI # define TEST_ECHANTILLONNAGE \ Bblock \ Test(I3ET(IFEQ(translationX,TraX) \ ,IFEQ(translationY,TraY) \ ,IFEQ(translationZ,TraZ) \ ) \ ) \ Bblock \ Eblock \ ATes \ Bblock \ PRINT_ATTENTION("c'est l'INDEXATION SIMPLIFIEE qui est a priori utilisee ici (1)"); \ CAL1(Prer3("les options ['%s','%s','%s'] sont donc ineffectives\n" \ ,ENTREE_ARGUMENT_translationX \ ,ENTREE_ARGUMENT_translationY \ ,ENTREE_ARGUMENT_translationZ \ ) \ ); \ /* On notera le 20170713095508 que certaines librairies ont pu etre generees en mode */ \ /* '__VERSION__INDEXATION_SIMPLIFIEE_A_PRIORI', alors que tous les '$K's utiles ne l'ont */ \ /* pas ete ainsi. Pour ces '$K's les arguments {ENTREE_ARGUMENT_translation?} existent */ \ /* donc, alors que les variables 'translation?' ne sont pas utilisees puisque les fonctions */ \ /* 'Findice_?(...)' ne seront pas referencees dans ces librairies. C'est pourquoi ces */ \ /* messages sont edites (alors qu'ils avaient ete supprimes pendant quelques heures...). */ \ Eblock \ ETes \ \ EGAL(echantillonnage,FAUX); \ /* L'indicateur d'echantillonnage est systematiquement mis a 'FAUX'... */ \ Eblock \ /* Repositionnement de l'indicateur d'echantillonnage ; il n'y a */ \ /* pas d'echantillonnage ('FAUX') lorsque l'on est dans un etat */ \ /* identique a l'etat initial... */ #Eifndef __VERSION__INDEXATION_SIMPLIFIEE_A_PRIORI #define PUSH_ECHANTILLONNAGE \ Bblock \ /* Pour valider le couple (PUSH,PULL). ATTENTION : a cause des variables locales qui sont */ \ /* creees, il est impossible d'utiliser (BblockV,EblockV) qui, sur certains 'SYSTEME', peut */ \ /* etre vide... */ \ DEFV(Int,INIT(EnTete_de_sauvegardM ## pasT,pasT)); \ DEFV(Int,INIT(EnTete_de_sauvegardM ## pasZ,pasZ)); \ DEFV(Int,INIT(EnTete_de_sauvegardM ## pasY,pasY)); \ DEFV(Int,INIT(EnTete_de_sauvegardM ## pasX,pasX)); \ /* Sauvegarde de (pasX,pasY,pasZ) "locales". */ #define PULL_ECHANTILLONNAGE \ SET_ECHANTILLONNAGE(EnTete_de_sauvegardM ## pasX,EnTete_de_sauvegardM ## pasY); \ /* Restauration de (pasX,pasY). */ \ SET_ECHANTILLONNAGE_DE_PROFONDEUR(EnTete_de_sauvegardM ## pasZ); \ /* Restauration de (pasZ). */ \ SET_ECHANTILLONNAGE_DE_TEMPS(EnTete_de_sauvegardM ## pasT); \ /* Restauration de (pasT). */ \ Eblock \ /* Pour valider le couple (PUSH,PULL). ATTENTION : a cause des variables locales qui sont */ \ /* creees, il est impossible d'utiliser (BblockV,EblockV) qui, sur certains 'SYSTEME', peut */ \ /* etre vide... */ #define SET_ECHANTILLONNAGE(pas_sur_l_axe_OX,pas_sur_l_axe_OY) \ Bblock \ Test(IFET(INCLff(pas_sur_l_axe_OX,PasX,dimX) \ ,INCLff(pas_sur_l_axe_OY,PasY,dimY) \ ) \ ) \ Bblock \ EGAL(pasX,pas_sur_l_axe_OX); \ EGAL(pasY,pas_sur_l_axe_OY); \ \ TEST_ECHANTILLONNAGE; \ Eblock \ ATes \ Bblock \ PRINT_ERREUR("les pas d'echantillonnage demandes sur les axes OX et OY sont mauvais"); \ CAL1(Prer2("pasX=%d pasY=%d\n",pas_sur_l_axe_OX,pas_sur_l_axe_OY)); \ Eblock \ ETes \ Eblock \ /* Positionnement de (pasX,pasY) "locales" lorsqu'ils sont valides. */ #define SET_ECHANTILLONNAGE_DE_PROFONDEUR(pas_sur_l_axe_OZ) \ Bblock \ Test(INCLff(pas_sur_l_axe_OZ,PasZ,dimZ)) \ Bblock \ EGAL(pasZ,pas_sur_l_axe_OZ); \ \ TEST_ECHANTILLONNAGE; \ Eblock \ ATes \ Bblock \ PRINT_ERREUR("le pas d'echantillonnage demande sur l'axe OZ est mauvais"); \ CAL1(Prer1("pasZ=%d\n",pas_sur_l_axe_OZ)); \ Eblock \ ETes \ Eblock \ /* Positionnement de (pasZ) "locales" lorsqu'il est valide. */ /* Positionnement de (pasX,pasY) "locales" lorsqu'ils sont valides. */ #define SET_ECHANTILLONNAGE_DE_TEMPS(pas_sur_l_axe_OT) \ Bblock \ Test(INCLff(pas_sur_l_axe_OT,PasT,dimT)) \ Bblock \ EGAL(pasT,pas_sur_l_axe_OT); \ \ TEST_ECHANTILLONNAGE; \ Eblock \ ATes \ Bblock \ PRINT_ERREUR("le pas d'echantillonnage demande sur l'axe OT est mauvais"); \ CAL1(Prer1("pasT=%d\n",pas_sur_l_axe_OT)); \ Eblock \ ETes \ Eblock \ /* Positionnement de (pasT) "locales" lorsqu'il est valide (introduit le 20171219110929). */ #ifndef __VERSION__INDEXATION_SIMPLIFIEE_A_PRIORI # define gTEST_ECHANTILLONNAGE \ Bblock \ EGAL(echantillonnage \ ,COND(IFET(I4ET(IFEQ(INDIRECT(ApasX),PasX) \ ,IFEQ(INDIRECT(ApasY),PasY) \ ,IFEQ(INDIRECT(ApasZ),PasZ) \ ,IFEQ(INDIRECT(ApasT),PasT) \ ) \ ,I4ET(IFEQ(translationX,TraX) \ ,IFEQ(translationY,TraY) \ ,IFEQ(translationZ,TraZ) \ ,IFEQ(translationT,TraT) \ ) \ ) \ ,FAUX \ ,VRAI \ ) \ ); \ Eblock \ /* Repositionnement de l'indicateur d'echantillonnage ; il n'y a */ \ /* pas d'echantillonnage ('FAUX') lorsque l'on est dans un etat */ \ /* identique a l'etat initial... */ #Aifndef __VERSION__INDEXATION_SIMPLIFIEE_A_PRIORI # define gTEST_ECHANTILLONNAGE \ Bblock \ Test(I3ET(IFEQ(translationX,TraX) \ ,IFEQ(translationY,TraY) \ ,IFEQ(translationZ,TraZ) \ ) \ ) \ Bblock \ Eblock \ ATes \ Bblock \ PRINT_ATTENTION("c'est l'INDEXATION SIMPLIFIEE qui est a priori utilisee ici (2)"); \ CAL1(Prer3("les options ['%s','%s','%s'] sont donc ineffectives\n" \ ,ENTREE_ARGUMENT_translationX \ ,ENTREE_ARGUMENT_translationY \ ,ENTREE_ARGUMENT_translationZ \ ) \ ); \ /* On notera le 20170713095508 que certaines librairies ont pu etre generees en mode */ \ /* '__VERSION__INDEXATION_SIMPLIFIEE_A_PRIORI', alors que tous les '$K's utiles ne l'ont */ \ /* pas ete ainsi. Pour ces '$K's les arguments {ENTREE_ARGUMENT_translation?} existent */ \ /* donc, alors que les variables 'translation?' ne sont pas utilisees puisque les fonctions */ \ /* 'Findice_?(...)' ne seront pas referencees dans ces librairies. C'est pourquoi ces */ \ /* messages sont edites (alors qu'ils avaient ete supprimes pendant quelques heures...). */ \ Eblock \ ETes \ \ EGAL(echantillonnage,FAUX); \ /* L'indicateur d'echantillonnage est systematiquement mis a 'FAUX'... */ \ Eblock \ /* Repositionnement de l'indicateur d'echantillonnage ; il n'y a */ \ /* pas d'echantillonnage ('FAUX') lorsque l'on est dans un etat */ \ /* identique a l'etat initial... */ #Eifndef __VERSION__INDEXATION_SIMPLIFIEE_A_PRIORI #define gPUSH_ECHANTILLONNAGE \ Bblock \ /* Pour valider le couple (PUSH,PULL). ATTENTION : a cause des variables locales qui sont */ \ /* creees, il est impossible d'utiliser (BblockV,EblockV) qui, sur certains 'SYSTEME', peut */ \ /* etre vide... */ \ DEFV(Int,INIT(EnTete_de_sauvegardM ## pasT,INDIRECT(ApasT))); \ DEFV(Int,INIT(EnTete_de_sauvegardM ## pasZ,INDIRECT(ApasZ))); \ DEFV(Int,INIT(EnTete_de_sauvegardM ## pasY,INDIRECT(ApasY))); \ DEFV(Int,INIT(EnTete_de_sauvegardM ## pasX,INDIRECT(ApasX))); \ /* Sauvegarde de (pasX,pasY,pasZ) "globales". */ #define gPULL_ECHANTILLONNAGE \ gSET_ECHANTILLONNAGE(EnTete_de_sauvegardM ## pasX,EnTete_de_sauvegardM ## pasY); \ /* Restauration de (pasX,pasY). */ \ gSET_ECHANTILLONNAGE_DE_PROFONDEUR(EnTete_de_sauvegardM ## pasZ); \ /* Restauration de (pasZ). */ \ gSET_ECHANTILLONNAGE_DE_TEMPS(EnTete_de_sauvegardM ## pasT); \ /* Restauration de (pasT). */ \ Eblock \ /* Pour valider le couple (PUSH,PULL). ATTENTION : a cause des variables locales qui sont */ \ /* creees, il est impossible d'utiliser (BblockV,EblockV) qui, sur certains 'SYSTEME', peut */ \ /* etre vide... */ #define gSET_ECHANTILLONNAGE(pas_sur_l_axe_OX,pas_sur_l_axe_OY) \ Bblock \ Test(IFET(INCLff(pas_sur_l_axe_OX,PasX,dimX) \ ,INCLff(pas_sur_l_axe_OY,PasY,dimY) \ ) \ ) \ Bblock \ EGAL(INDIRECT(ApasX),pas_sur_l_axe_OX); \ EGAL(INDIRECT(ApasY),pas_sur_l_axe_OY); \ \ gTEST_ECHANTILLONNAGE; \ Eblock \ ATes \ Bblock \ PRINT_ERREUR("les pas d'echantillonnage demandes sur les axes OX et OY sont mauvais"); \ CAL1(Prer2("pasX=%d pasY=%d\n",pas_sur_l_axe_OX,pas_sur_l_axe_OY)); \ Eblock \ ETes \ Eblock \ /* Positionnement de (pasX,pasY) "globales" lorsqu'ils sont valides. */ #define gSET_ECHANTILLONNAGE_DE_PROFONDEUR(pas_sur_l_axe_OZ) \ Bblock \ Test(INCLff(pas_sur_l_axe_OZ,PasZ,dimZ)) \ Bblock \ EGAL(INDIRECT(ApasZ),pas_sur_l_axe_OZ); \ \ gTEST_ECHANTILLONNAGE; \ Eblock \ ATes \ Bblock \ PRINT_ERREUR("le pas d'echantillonnage demande sur l'axe OZ est mauvais"); \ CAL1(Prer1("pasZ=%d\n",pas_sur_l_axe_OZ)); \ Eblock \ ETes \ Eblock \ /* Positionnement de (pasZ) "globales" lorsqu'il est valide. */ #define gSET_ECHANTILLONNAGE_DE_TEMPS(pas_sur_l_axe_OT) \ Bblock \ Test(INCLff(pas_sur_l_axe_OT,PasT,dimT)) \ Bblock \ EGAL(INDIRECT(ApasT),pas_sur_l_axe_OT); \ \ gTEST_ECHANTILLONNAGE; \ Eblock \ ATes \ Bblock \ PRINT_ERREUR("le pas d'echantillonnage demande sur l'axe OT est mauvais"); \ CAL1(Prer1("pasT=%d\n",pas_sur_l_axe_OT)); \ Eblock \ ETes \ Eblock \ /* Positionnement de (pasT) "globales" lorsqu'il est valide (introduit le 20171219110929). */ #define PUSH_TRANSLATION \ Bblock \ /* Pour valider le couple (PUSH,PULL). ATTENTION : a cause des variables locales qui sont */ \ /* creees, il est impossible d'utiliser (BblockV,EblockV) qui, sur certains 'SYSTEME', peut */ \ /* etre vide... */ \ DEFV(Int,INIT(EnTete_de_sauvegardM ## translationX,translationX)); \ DEFV(Int,INIT(EnTete_de_sauvegardM ## translationY,translationY)); \ /* Sauvegarde de (translationX,translationY). */ #define PULL_TRANSLATION \ SET_TRANSLATION(EnTete_de_sauvegardM ## translationX,EnTete_de_sauvegardM ## translationY); \ /* Restauration de (translationX,translationY). */ \ Eblock \ /* Pour valider le couple (PUSH,PULL). ATTENTION : a cause des variables locales qui sont */ \ /* creees, il est impossible d'utiliser (BblockV,EblockV) qui, sur certains 'SYSTEME', peut */ \ /* etre vide... */ #define SET_TRANSLATION(translation_sur_l_axe_OX,translation_sur_l_axe_OY) \ Bblock \ Test(IFET(IFET(IZGE(translation_sur_l_axe_OX) \ ,IFLT(translation_sur_l_axe_OX,pasX) \ ) \ ,IFET(IZGE(translation_sur_l_axe_OY) \ ,IFLT(translation_sur_l_axe_OY,pasY) \ ) \ ) \ ) \ Bblock \ EGAL(translationX,translation_sur_l_axe_OX); \ EGAL(translationY,translation_sur_l_axe_OY); \ \ TEST_ECHANTILLONNAGE; \ Eblock \ ATes \ Bblock \ PRINT_ERREUR("les translations d'echantillonnage demandees sur les axes OX et OY sont mauvaises"); \ CAL1(Prer2("translationX=%d translationY=%d\n",translation_sur_l_axe_OX,translation_sur_l_axe_OY)); \ CAL1(Prer2("pasX =%d pasY =%d\n",pasX,pasY)); \ Eblock \ ETes \ Eblock \ /* Positionnement de (translationX,translationY) lorsqu'ils sont valides. */ #define TraX ZERO \ /* Definition de la translation implicite sur l'axe 'OX', */ #define TraY ZERO \ /* Definition de la translation implicite sur l'axe 'OY', */ #define TraZ ZERO \ /* Definition de la translation implicite sur l'axe 'OZ'. */ #define TraT ZERO \ /* Definition de la translation implicite sur l'axe 'OT'. */ #define CALi(fonction) \ Bblock \ PUSH_MASQUE; \ DEMASQUE_IMAGES; \ \ gPUSH_ECHANTILLONNAGE; \ gSET_ECHANTILLONNAGE(PasX,PasY); \ \ CALS(fonction); \ \ gPULL_ECHANTILLONNAGE; \ \ PULL_MASQUE; \ Eblock \ /* Pour effectuer l'appel de type 'CALS(...)' d'une fonction se rapportant aux images, et */ \ /* de facon a ce qu'elle porte sur l'ensemble de l'image, quels que soient {pasX,pasY}... */ \ /* */ \ /* ATTENTION, jusqu'au 19970912100251, il y avait ici : */ \ /* */ \ /* #ifndef __VERSION__INDEXATION_SIMPLIFIEE_A_PRIORI */ \ /* # define CALi(fonction) \ */ \ /* <la definition precedente> */ \ /* #Aifndef __VERSION__INDEXATION_SIMPLIFIEE_A_PRIORI */ \ /* # define CALi(fonction) \ */ \ /* Bblock \ */ \ /* CALS(fonction); \ */ \ /* Eblock */ \ /* #Eifndef __VERSION__INDEXATION_SIMPLIFIEE_A_PRIORI */ \ /* */ \ /* mais cela me semble faux ; en particulier cela ne permet pas de nettoyer une image */ \ /* par 'CALi(Inoir(...))' correctement (c'est-a-dire completement...). */ \ /* */ \ /* Le 20070603103717 (c'est-a-dire bien tardivement !), j'ai pris en compte ici le 'Masque'. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* N O T I O N D E F I L T R A G E D E S N I V E A U X : */ /* */ /* */ /* Definition : */ /* */ /* Un certain nombre de traitements */ /* pourront affecter un niveau apres */ /* son calcul : */ /* */ /* 1 - le "masque", */ /* 2 - l'"ecrasement", */ /* 3 - la "substitution", */ /* 4 - le "calibrage", */ /* 5 - une fonction variable "Vf". */ /* */ /* Toutes ces operations pourront */ /* etre activees ou desactivees glo- */ /* balement grace a l'indicateur */ /* introduit ici. */ /* */ /* */ /* Utilisation : */ /* */ /* PUSH_FILTRAGE; */ /* PULL_FILTRAGE; */ /* */ /* permettent de sauvegarder, puis */ /* de restaurer l'etat courant du */ /* filtrage des niveaux, et enfin, */ /* */ /* SET_FILTRAGE(ACTIF ou INACTIF); */ /* */ /* puis : */ /* */ /* PUSH_OPTIMISATION; */ /* PULL_OPTIMISATION; */ /* */ /* permettent de sauvegarder, puis */ /* de restaurer l'etat courant de */ /* l'optimisation portant sur l'uti- */ /* lisation des substitutions seules, */ /* et enfin : */ /* */ /* SET_OPTIMISATION(VRAI ou FAUX); */ /* */ /* */ /*************************************************************************************************************************************/ #define EST_ACTIF_FILTRAGE \ EST_ACTIF(etat_Filtrage_niveaux) \ /* Pour tester si le filtrage est 'ACTIF'. */ #define EST_INACTIF_FILTRAGE \ EST_INACTIF(etat_Filtrage_niveaux) \ /* Pour tester si le filtrage est 'INACTIF'. */ #define PUSH_FILTRAGE \ Bblock \ /* Pour valider le couple (PUSH,PULL). ATTENTION : a cause des variables locales qui sont */ \ /* creees, il est impossible d'utiliser (BblockV,EblockV) qui, sur certains 'SYSTEME', peut */ \ /* etre vide... */ \ DEFV(Logical,INIT(EnTete_de_sauvegardM ## etat_Filtrage_niveaux,etat_Filtrage_niveaux)); \ /* Sauvegarde de l'etat courant du filtrage des niveaux. */ #define PULL_FILTRAGE \ SET_FILTRAGE(EnTete_de_sauvegardM ## etat_Filtrage_niveaux); \ /* Restauration de l'etat courant du filtrage des niveaux. */ \ Eblock \ /* Pour valider le couple (PUSH,PULL). ATTENTION : a cause des variables locales qui sont */ \ /* creees, il est impossible d'utiliser (BblockV,EblockV) qui, sur certains 'SYSTEME', peut */ \ /* etre vide... */ #define SET_FILTRAGE(etat) \ Bblock \ EGAL(etat_Filtrage_niveaux,etat); \ Test(EST_INACTIF_FILTRAGE) \ Bblock \ SET_NOIR_PLANCHER(NOIR_PLANCHER); \ SET_NOIR_PLANCHER_DES_VECTEURS(NOIR_PLANCHER); \ /* Lorsqu'il n'y a pas de FILTRAGE, le "plancher" choisi est le plus bas possible... */ \ Eblock \ ATes \ Bblock \ DEFV(genere_p,INIT(niveau_de_manoeuvre,NIVEAU_UNDEF)); \ /* Cette variable est inutile, mais imposee par le fait que 'Nsubstitution(...)' est une */ \ /* fonction et non pas un sous-programme (difference subtile...). */ \ EGAL(niveau_de_manoeuvre,Nsubstitution(NOIR)); \ /* Lorsqu'il y a FILTRAGE, le "plancher" est choisi par la fonction 'Nsubstitution(...)'. */ \ Eblock \ ETes \ Eblock \ /* Positionnement de l'indicateur 'etat_Filtrage_niveaux' ; il controle */ \ /* globalement les transformations portant sur un niveau. */ #define PUSH_OPTIMISATION \ Bblock \ /* Pour valider le couple (PUSH,PULL). ATTENTION : a cause des variables locales qui sont */ \ /* creees, il est impossible d'utiliser (BblockV,EblockV) qui, sur certains 'SYSTEME', peut */ \ /* etre vide... */ \ DEFV(Logical,INIT(EnTete_de_sauvegardM ## ne_faire_que_les_substitutions,ne_faire_que_les_substitutions)); \ /* Sauvegarde de l'etat courant du filtrage selectif des niveaux. */ #define PULL_OPTIMISATION \ SET_OPTIMISATION(EnTete_de_sauvegardM ## ne_faire_que_les_substitutions); \ /* Restauration de l'etat courant du filtrage selectif des niveaux. */ \ Eblock \ /* Pour valider le couple (PUSH,PULL). ATTENTION : a cause des variables locales qui sont */ \ /* creees, il est impossible d'utiliser (BblockV,EblockV) qui, sur certains 'SYSTEME', peut */ \ /* etre vide... */ #define SET_OPTIMISATION(etat) \ Bblock \ EGAL(ne_faire_que_les_substitutions,etat); \ Eblock \ /* Positionnement de l'indicateur 'ne_faire_que_les_substitutions' ; il controle */ \ /* le filtrage selectif (c'est-a-dire ne portant que sur les substitutions). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* N O T I O N D E M A S Q U E : */ /* */ /* */ /* Definition : */ /* */ /* Les acces aux images par les fonctions */ /* du type "load" ('load_point()',...), */ /* "store" ('store_point()',...) et de */ /* "parcours" ('traite_image_...') sont */ /* partiellement (point par point) inhibables */ /* a l'aide de ce que l'on appelera un */ /* "masque". Il s'agit d'une image parti- */ /* culiere ; lorsque l'on accede a un */ /* point {X,Y} d'une image quelconque, */ /* on teste la valeur du point {X,Y} du */ /* "masque", et suivant sa valeur et la */ /* fonction demandee ("load", "store" ou */ /* "acces"), l'acces a lieu ou pas... */ /* */ /* */ /* Utilisation : */ /* */ /* DEMASQUE_IMAGES; */ /* MASQUE_IMAGES(seuil_du_masquage); */ /* MASQUE_IMAGES_PORTEE(seuil_du_masquage,portee_du_masquage); */ /* */ /* permettent de mettre hors fonction */ /* ou bien d'activer le masquage avec */ /* un certain seuil (les points {X,Y} */ /* dont Masque(X,Y) associe est supe- */ /* rieur ou egal a "seuil" ne sont pas */ /* masques) et une certaine "portee" */ /* (c'est-a-dire suivant la fonction */ /* -"load", "store" ou "parcours"- */ /* demandee ; 'MASQUE_IMAGES a implicitement */ /* une portee limitee a la fonction de */ /* "parcours"), et enfin, */ /* */ /* PUSH_MASQUE; */ /* PULL_MASQUE; */ /* */ /* permettent de sauvegarder et de */ /* restaurer (respectivement) l'etat */ /* du masque. */ /* */ /* */ /*************************************************************************************************************************************/ #define k___MASQUER_PARCOURS \ BIT \ /* Signification de 'MASQUER_PARCOURS' : */ \ /* */ \ /* 0 : le "parcours" d'une image se fait sans aucun masquage, */ \ /* 1 : le "parcours" ne se fait que la ou Masque(X,Y) >= seuil. */ \ /* */ \ /* ATTENTION : la constante 'MASQUER_PARCOURS' est pre-generee dans '$xcp/Konstantes$K'. */ #define k___MASQUER_LOAD \ SLLS(MASQUER_PARCOURS,LBIT) \ /* Signification de 'MASQUER_LOAD' : */ \ /* */ \ /* 0 : les fonctions "load" d'une image se font sans aucun masquage, */ \ /* 1 : les fonctions "load" ne se font que la ou Masque(X,Y) >= seuil. */ \ /* */ \ /* ATTENTION : la constante 'MASQUER_LOAD' est pre-generee dans '$xcp/Konstantes$K'. */ #define k___MASQUER_STORE \ SLLS(MASQUER_LOAD,LBIT) \ /* Signification de 'MASQUER_STORE' : */ \ /* */ \ /* 0 : les fonctions "store" d'une image se font sans aucun masquage, */ \ /* 1 : les fonctions "store" ne se font que la ou Masque(X,Y) >= seuil. */ \ /* */ \ /* ATTENTION : la constante 'MASQUER_STORE' est pre-generee dans '$xcp/Konstantes$K'. */ #define k___MASQUER_LOAD_ET_STORE \ OUIN(MASQUER_LOAD,MASQUER_STORE) \ /* Est une combinaison de 'MASQUER_LOAD' et 'MASQUER_STORE'. */ \ /* */ \ /* ATTENTION : la constante 'MASQUER_LOAD_ET_STORE' est pre-generee dans */ \ /* '$xcp/Konstantes$K'. */ #define k___MASQUER_TOUTES_LES_FONCTIONS \ OUIN(MASQUER_PARCOURS,MASQUER_LOAD_ET_STORE) \ /* Afin de masquer toutes les fonctions... */ \ /* */ \ /* ATTENTION : la constante 'MASQUER_TOUTES_LES_FONCTIONS' est pre-generee dans */ \ /* '$xcp/Konstantes$K'. */ #define DEMASQUE_IMAGES \ Bblock \ EGAL(Masque_____etat,INACTIF); \ Eblock \ /* Fonction de mise a l'etat inactif du "masque". */ #define MASQUE_IMAGES_PORTEE(seuil_du_masquage,portee_du_masquage) \ Bblock \ EGAL(Masque_____etat,ACTIF); \ EGAL(Masque_____seuil,GENP(seuil_du_masquage)); \ Test(IZEQ(ETLO(COMK(MASQUER_TOUTES_LES_FONCTIONS),portee_du_masquage))) \ Bblock \ EGAL(Masque_____portee,portee_du_masquage); \ Eblock \ ATes \ Bblock \ PRINT_ERREUR("la portee de masquage demandee est mauvaise"); \ CAL1(Prer1("portee=%X\n",portee_du_masquage)); \ Eblock \ ETes \ Eblock \ /* Fonction de mise a l'etat actif du "masque" avec positionnement du seuil */ \ /* et de la portee. */ #define MASQUE_IMAGES(seuil_du_masquage) \ Bblock \ MASQUE_IMAGES_PORTEE(seuil_du_masquage,MASQUER_PARCOURS) \ Eblock \ /* Fonction de mise a l'etat actif du "masque" avec positionnement du seuil */ \ /* et d'une portee implicite ('MASQUER_PARCOURS'). */ #if ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01)) \ || (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \ ) # define TEST_MASQUE_ACTIF(x,y,portee_du_masquage) \ IFOU(EST_INACTIF(Masque_____etat) \ ,IFOU(IFGE(IMAGE(Masque,x,y),Masque_____seuil) \ ,IZEQ(ETLO(Masque_____portee,portee_du_masquage)) \ ) \ ) \ /* Le resultat de cette condition est 'VRAI' lorsque : */ \ /* */ \ /* 1 - le "masque" n'est pas actif, ou */ \ /* 2 - le point n'est pas masque par rapport au seuil (niveau>=seuil), ou */ \ /* 3 - la fonction ("load", "store" ou "parcours") n'est pas masquee. */ \ /* */ #Aif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01)) \ || (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \ ) #Eif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01)) \ || (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \ ) #if ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \ ) # define COND_MASQUE_NON_ACTIF(x,y,portee_du_masquage,action_si_non_actif,action_si_actif) \ COND(EST_INACTIF(Masque_____etat) \ ,action_si_non_actif \ ,COND(IFGE(IMAGE(Masque,x,y),Masque_____seuil) \ ,action_si_non_actif \ ,COND(IZEQ(ETLO(Masque_____portee,portee_du_masquage)) \ ,action_si_non_actif \ ,action_si_actif \ ) \ ) \ ) \ /* Cet operateur "bizarre" a ete introduit le 19970219154649 pour favoriser l'optimisation */ \ /* de 'loadQ_point', ce phenomene ayant ete mis en evidence lors de la mise en place de */ \ /* '$LACT29' et de l'introduction de 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_03' grace au */ \ /* programme 'v $xB/SGO200A1$D/CC$D/performan.04$c'. */ # define TEST_MASQUE_ACTIF(x,y,portee_du_masquage) \ COND_MASQUE_NON_ACTIF(x,y,portee_du_masquage,VRAI,FAUX) \ /* Le resultat de cette condition est 'VRAI' lorsque : */ \ /* */ \ /* 1 - le "masque" n'est pas actif, ou */ \ /* 2 - le point n'est pas masque par rapport au seuil (niveau>=seuil), ou */ \ /* 3 - la fonction ("load", "store" ou "parcours") n'est pas masquee. */ \ /* */ \ /* avant le 19970219155451, 'TEST_MASQUE_ACTIF(...)' etait defini par : */ \ /* */ \ /* IFOU(EST_INACTIF(Masque_____etat) \ */ \ /* ,IFOU(IFGE(IMAGE(Masque,x,y),Masque_____seuil) \ */ \ /* ,IZEQ(ETLO(Masque_____portee,portee_du_masquage)) \ */ \ /* ) \ */ \ /* ) */ \ /* */ \ /* mais des tests avec 'v $xB/SGO200A1$D/CC$D/performan.04$c' ont montre que de faire */ \ /* en "une fois" les tests 'TEST_MASQUE_ACTIF(X,Y,MASQUER_LOAD)' bloquait considerablement */ \ /* l'optimisation de 'loadQ_point(...)', d'ou cette version... */ #Aif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \ ) #Eif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \ ) #define PUSH_MASQUE \ Bblock \ /* Pour valider le couple (PUSH,PULL). ATTENTION : a cause des variables locales qui sont */ \ /* creees, il est impossible d'utiliser (BblockV,EblockV) qui, sur certains 'SYSTEME', peut */ \ /* etre vide... */ \ DEFV(Int,INIT(EnTete_de_sauvegardM ## Masque_____etat,Masque_____etat)); \ DEFV(genere_p,INIT(EnTete_de_sauvegardM ## Masque_____seuil,Masque_____seuil)); \ DEFV(Int,INIT(EnTete_de_sauvegardM ## Masque_____portee,Masque_____portee)); \ /* Sauvegarde de l'etat courant, du seuil et de la portee du masquage. */ #define PULL_MASQUE \ EGAL(Masque_____portee,EnTete_de_sauvegardM ## Masque_____portee); \ EGAL(Masque_____seuil,EnTete_de_sauvegardM ## Masque_____seuil); \ EGAL(Masque_____etat,EnTete_de_sauvegardM ## Masque_____etat); \ /* Restauration de l'etat courant, du seuil et de la portee du masquage. */ \ Eblock \ /* Pour valider le couple (PUSH,PULL). ATTENTION : a cause des variables locales qui sont */ \ /* creees, il est impossible d'utiliser (BblockV,EblockV) qui, sur certains 'SYSTEME', peut */ \ /* etre vide... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* " P R E - G E N E R A T I O N " D E S C O N S T A N T E S F O N D A M E N T A L E S : */ /* */ /*************************************************************************************************************************************/ #TestADef MASQUER_PARCOURS \ k___MASQUER_PARCOURS #TestADef MASQUER_LOAD \ k___MASQUER_LOAD #TestADef MASQUER_STORE \ k___MASQUER_STORE #TestADef MASQUER_LOAD_ET_STORE \ k___MASQUER_LOAD_ET_STORE #TestADef MASQUER_TOUTES_LES_FONCTIONS \ k___MASQUER_TOUTES_LES_FONCTIONS /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* N O T I O N D E M A R Q U E U R : */ /* */ /* */ /* Definition : */ /* */ /* Pour certains algorithmes, tels le */ /* remplissage de contour, il est neces- */ /* saire de marquer les points par les- */ /* quels on est passe. C'est le role */ /* des donnees et definition qui suivent. */ /* */ /* */ /* Utilisation : */ /* */ /* MARQUAGE_VALIDATION_ET_INITIALISATION; */ /* */ /* permet de verifier que la liste de */ /* substitution courante si elle est */ /* active est compatible avec les */ /* niveaux de marquage. */ /* */ /* MARQUAGE_POINT(x,y); */ /* */ /* permet de memoriser le passage par */ /* le point {x,y}. */ /* */ /* TEST_POINT_MARQUE(x,y); */ /* TEST_POINT_NON_MARQUE(x,y); */ /* */ /* qui permettent de savoir si le point */ /* {x,y} a deja ete atteint ou pas... */ /* */ /* */ /*************************************************************************************************************************************/ #define NIVEAU_DE_NON_MARQUAGE \ NOIR \ /* Niveau destine a marquer dans 'Marqueur' les points non encore rencontres. */ #define NIVEAU_DE_MARQUAGE \ BLANC \ /* Niveau destine a marquer dans 'Marqueur' les points deja rencontres. */ #define MARQUAGE_VALIDATION_ET_INITIALISATION \ Bblock \ Test(EST_ACTIF_FILTRAGE) \ Bblock \ MISE_A_L_ETAT_INITIAL_LISTE_DE_SUBSTITUTION; \ /* Lorsque la liste de substitution n'a pas ete encore initialisee, */ \ /* on le fait avant la validation... */ \ Test(IFEQ(NIVEAU_DE_NON_MARQUAGE,NIVEAU_DE_MARQUAGE)) \ Bblock \ PRINT_ERREUR("le 'NIVEAU_DE_NON_MARQUAGE' et le 'NIVEAU_DE_MARQUAGE' sont egaux"); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Test(IFNE(NIVEAU_DE_NON_MARQUAGE,NIVEAU_HORS_ECRAN)) \ Bblock \ PRINT_ERREUR("le 'NIVEAU_DE_NON_MARQUAGE' et le 'NIVEAU_HORS_ECRAN' sont differents"); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Test(IFOU(IFNE(ACCES_listes_de_substitution(num_liste_de_substitution,NIVEAU_DE_NON_MARQUAGE) \ ,NIVEAU_DE_NON_MARQUAGE \ ) \ ,IFEQ(ACCES_listes_de_substitution(num_liste_de_substitution,NIVEAU_DE_MARQUAGE) \ ,NIVEAU_DE_NON_MARQUAGE \ ) \ ) \ ) \ Bblock \ PRINT_ERREUR("'NIVEAU_DE_NON_MARQUAGE' et la 'liste de substitution' courante incompatibles"); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ CALS(Iinitialisation(Marqueur,NIVEAU_DE_NON_MARQUAGE)); \ /* Nettoyage de l'image de marquage. */ \ Eblock #define gMARQUAGE_POINT(ImageMarqueur,x,y) \ Bblock \ store_point_valide(NIVEAU_DE_MARQUAGE,ImageMarqueur,x,y,FVARIABLE); \ Eblock #define gTEST_POINT_MARQUE(ImageMarqueur,x,y) \ IFEQ(load_point_valide(ImageMarqueur,x,y),NIVEAU_DE_MARQUAGE) #define gTEST_POINT_NON_MARQUE(ImageMarqueur,x,y) \ IFEQ(load_point_valide(ImageMarqueur,x,y),NIVEAU_DE_NON_MARQUAGE) /* Introduites le 20231202125916 par "symetrie" avec ce qui a ete fait pour les Albums... */ #define MARQUAGE_POINT(x,y) \ Bblock \ gMARQUAGE_POINT(Marqueur,x,y); \ Eblock #define TEST_POINT_MARQUE(x,y) \ gTEST_POINT_MARQUE(Marqueur,x,y) #define TEST_POINT_NON_MARQUE(x,y) \ gTEST_POINT_NON_MARQUE(Marqueur,x,y) #define gMARQUAGE_POINT_ALBUM(AlbumMarqueur,x,y,z) \ Bblock \ Astore_point_valide(NIVEAU_DE_MARQUAGE,AlbumMarqueur,x,y,z); \ Eblock #define gTEST_POINT_ALBUM_MARQUE(AlbumMarqueur,x,y,z) \ IFEQ(Aload_point_valide(AlbumMarqueur,x,y,z),NIVEAU_DE_MARQUAGE) #define gTEST_POINT_ALBUM_NON_MARQUE(AlbumMarqueur,x,y,z) \ IFEQ(Aload_point_valide(AlbumMarqueur,x,y,z),NIVEAU_DE_NON_MARQUAGE) /* Procedures introduites le 20231201103747... */ \ /* */ \ /* On notera le 20231202121110 que contraiement aux images qui utilise le marqueur */ \ /* commeun 'Marqueur', pour les albums l'equivalent n'existe pas. Il est donc necessaire */ \ /* d'utiliser un album de marquage specifique et "local", soit 'AlbumMarqueur'... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* N O T I O N D E Z - B U F F E R : */ /* */ /* */ /* Definition : */ /* */ /* Une image de type 'imageF' va */ /* etre definie ici. Elle contiendra */ /* lorsque cela sera necessaire la */ /* troisieme coordonnee 'Z' telle que */ /* [Zmin,Zmax] soit ramene dans [0,1[ */ /* pour chaque point {X,Y}. Ainsi, elle */ /* donnera a tout instant en chaque */ /* point {X,Y}, la profondeur du point */ /* le plus proche de l'observateur */ /* marque. Un 'bypath' existe : s'il */ /* vaut +INFINI, on trace toujours, */ /* alors que pour -INFINI, on fait le */ /* test complet, et on ne trace que si */ /* Z >= Z-Buffer... */ /* */ /* On notera que l'axe 'OZ' va */ /* d'arriere en avant. */ /* */ /* */ /* Nota : */ /* */ /* Lorsque le 'Z-Buffer' est actif, on */ /* peut malgre tout faire que sa mise a */ /* jour soit conditionnelle. Cela permet, */ /* par exemple, de faire certains traitements */ /* sur les trois composantes d'une image en */ /* vraies couleurs (voir le commentaire de */ /* 'Z_Buffer_____mettre_a_jour' dans le fichier */ /* '$xiii/Images$STR'). */ /* */ /* Lorsque le 'Z-Buffer' est inactif, */ /* au lieu de le mettre a jour, on procede */ /* au comptage des "pseudo-collisions", */ /* c'est-a-dire des cas tels que : */ /* */ /* Z_Buffer(X,Y) + Zavant > Z > Z_Buffer(X,Y) - Zarriere */ /* */ /* ou P(X,Y,Z) est le point a tester et a condition */ /* que le point {X,Y} ne soit pas masque. */ /* */ /* */ /* ATTENTION : */ /* */ /* Ces definitions ne figurent pas dans le */ /* le fichier '$xiipd/fonction.1$FON' car en */ /* effet ce fichier pourrait etre remplace par */ /* '$xiipf/fonction.1$FON' qui lui ne pourrait */ /* pas les contenir... */ /* */ /* */ /*************************************************************************************************************************************/ #define TRAITEMENT_SPECIFIQUE_DES_IMAGES_DE_TYPE_Z_Buffer(image) \ Bblock \ Test(IFID(image,Z_Buffer)) \ Bblock \ CALS(IFnivo_extrema_avec_exclusion(Z_Buffer \ ,ADRESSE(Z_Buffer_____minimum) \ ,ADRESSE(Z_Buffer_____maximum) \ ,F_MOINS_LE_PETIT_INFINI \ ,F_PETIT_INFINI \ ) \ ); \ /* Lorsqu'il s'agit du 'Z-Buffer', on calcule ses extrema afin que 'Z_Buffer_____minimum' */ \ /* et 'Z_Buffer_____maximum' soient corrects en excluant les trop grandes valeurs en valeur */ \ /* absolue. Voir en effet 'v $xiii/Images$STR m..imum_du_Z_Buffer' ainsi que */ \ /* 'v $xiii/mono_image$FON Z_Buffer_____valeur_initiale'. */ \ EGAL(Z_Buffer_____etat,VALIDE); \ /* Enfin, on memorise que l'initialisation du 'Z-Buffer' est faite... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Traitement specifique des images de type 'Z-Buffer' (introduit le 20050418101815). */ #define DEMARRAGE_DU_COMPTAGE_DES_PSEUDO_COLLISIONS(seuil_avant,seuil_arriere) \ Bblock \ CLIR(Z_Buffer_____compteur_des_pseudo_collisions); \ /* Initialisation du compteur des pseudo-collisions. */ \ \ Test(IZLT(seuil_avant)) \ Bblock \ PRINT_ERREUR("le seuil avant demande pour le 'Z-Buffer' est negatif"); \ Eblock \ ATes \ Bblock \ EGAL(Z_Buffer_____avant,seuil_avant); \ /* Initialisation du seuil avant du 'Z-Buffer'. */ \ Eblock \ ETes \ \ Test(IZLT(seuil_arriere)) \ Bblock \ PRINT_ERREUR("le seuil arriere demande pour le 'Z-Buffer' est negatif"); \ Eblock \ ATes \ Bblock \ EGAL(Z_Buffer_____arriere,seuil_arriere); \ /* Initialisation du seuil arriere du 'Z-Buffer'. */ \ Eblock \ ETes \ \ EGAL(Z_Buffer_____actif,FAUX); \ /* Et enfin, desactivation du 'Z-Buffer'.... */ \ Eblock \ /* Primitive de demarrage du comptage des pseudo-collisions... */ #define ARRET_DU_COMPTAGE_DES_PSEUDO_COLLISIONS(nombre_de_pseudo_collisions) \ Bblock \ EGAL(Z_Buffer_____actif,VRAI); \ /* On active d'abord le 'Z-Buffer'... */ \ EGAL(nombre_de_pseudo_collisions,Z_Buffer_____compteur_des_pseudo_collisions); \ /* Et enfin, on renvoie le compteur de pseudo-collisions. */ \ Eblock \ /* Primitive d'arret du comptage des pseudo-collisions... */ #define METTRE_A_JOUR_LE_Z_Buffer \ Bblock \ EGAL(Z_Buffer_____mettre_a_jour,VRAI); \ /* Ainsi, le 'Z-Buffer' sera mis a jour (a condition bien sur que 'Z_Buffer_____actif' soit */ \ /* a l'etat 'VRAI'). */ \ Eblock \ /* Demande de mise-a-jour du 'Z-Buffer'. */ #define NE_PAS_METTRE_A_JOUR_LE_Z_Buffer \ Bblock \ EGAL(Z_Buffer_____mettre_a_jour,FAUX); \ /* Ainsi, le 'Z-Buffer' ne sera pas mis a jour (meme si 'Z_Buffer_____actif' est a l'etat */ \ /* 'VRAI'...). */ \ Eblock \ /* Demande de ne pas mettre a jour le 'Z-Buffer'. ATTENTION : cette procedure doit etre */ \ /* utilisee avec la plus grande precaution. En effet ecrire : */ \ /* */ \ /* NE_PAS_METTRE_A_JOUR_LE_Z_Buffer; */ \ /* GENERER_UNE_COMPOSANTE(ROUGE); */ \ /* GENERER_UNE_COMPOSANTE(VERTE); */ \ /* METTRE_A_JOUR_LE_Z_Buffer; */ \ /* GENERER_UNE_COMPOSANTE(BLEUE); */ \ /* */ \ /* ne fait pas exactement ce que l'on pourrait penser ; en effet, s'il y a par exemple */ \ /* plusieurs objets 'ROUGE' qui se cachent les uns les autres, le 'Z-Buffer' n'etant pas */ \ /* mis a jour pour le 'ROUGE', il n'y aura pas elimination des lignes cachees, et cette */ \ /* meme composante 'ROUGE' sera donc incorrecte, et incoherente vis a vis de la composante */ \ /* 'BLEUE'. Enfin, ce qui a ete dit pour le 'ROUGE' vaut aussi pour le 'VERTE'... */ #define INVALIDE_LE_BYPATH_DU_Z_Buffer \ Bblock \ EGAL(Z_Buffer_____bypath,F_MOINS_L_INFINI); \ /* Ainsi, le test complet sera fait... */ \ Eblock \ /* Suppression du "bypath" du 'Z-Buffer'. */ #define VALIDE_LE_BYPATH_DU_Z_Buffer \ Bblock \ EGAL(Z_Buffer_____bypath,F_INFINI); \ /* Ainsi, le test complet sera toujours 'VRAI'... */ \ Eblock \ /* Mise en place du "bypath" du 'Z-Buffer'. */ #define bTEST_Z_Buffer_(x,y,z,action_point_visible,action_Z_Buffer_actif_1,action_Z_Buffer_actif_2,action_Z_Buffer_inactif) \ /* ATTENTION : {x,y} E [Xmin,Xmax]x[Ymin,Ymax], mais : z E [0,1[... */ \ Bblock \ Test(EST_INVALIDE(Z_Buffer_____etat)) \ Bblock \ CALS(Iinit_Z_Buffer()); \ /* Si besoin est, le 'Z-Buffer' est initialise. */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Test(EST_INVALIDE(Z_Buffer_accumule_____etat)) \ Bblock \ CALS(Iinit_Z_Buffer_accumule()); \ /* Si besoin est, le 'Z-Buffer accumule' est initialise (introduit le 20010722100154). */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Test(TEST_DANS_L_IMAGE(x,y)) \ Bblock \ Test(EST_VRAI(Z_Buffer_____actif)) \ Bblock \ /* Lorsque le 'Z-Buffer' est actif, on gere l'elimination des parties cachees... */ \ BLOC(action_Z_Buffer_actif_1); \ \ Test(IFGc(MAX2(z,Z_Buffer_____bypath) \ ,loadF_point(Z_Buffer,x,y) \ ,Z_Buffer_____test_strict \ ) \ ) \ /* ATTENTION, il y avait autrefois : */ \ /* */ \ /* ...,loadF_point_valide(Z_Buffer,x,y)... */ \ /* */ \ /* mais la presence de : */ \ /* */ \ /* Test(TEST_DANS_L_IMAGE(x,y)) */ \ /* */ \ /* ci-dessus rend les fonctions du type '..._point_valide(...)' redondantes... */ \ /* */ \ /* Le 'IFGc(...)' a ete introduit le 20100223170820 pour etre utilise dans */ \ /* 'v $xiii/montagnes$FON Z_Buffer_____test_strict'... */ \ Bblock \ BLOC(action_point_visible); \ /* Lorsque le point {x,y} est devant ou au meme niveau, on agit "au meme niveau". Ceci */ \ /* permet en particulier deux choses importantes : */ \ /* */ \ /* 1-ecraser tout ou partie d'un vecteur trace anterieurement (par exemple pour faire un */ \ /* detourage), */ \ /* */ \ /* 2-utiliser un seul 'Z-Buffer' (ce qui est logique...) pour les trois composantes */ \ /* chromatiques d'une image ; on peut donc faire sans crainte : */ \ /* */ \ /* store_point_ND(niveau_ROUGE,Image_ROUGE,X,Y,_____cNORMALISE_OZ(Z),TRI_DIMENSIONNEL); */ \ /* store_point_ND(niveau_VERTE,Image_VERTE,X,Y,_____cNORMALISE_OZ(Z),TRI_DIMENSIONNEL); */ \ /* store_point_ND(niveau_BLEUE,Image_BLEUE,X,Y,_____cNORMALISE_OZ(Z),TRI_DIMENSIONNEL); */ \ /* */ \ /* et les trois composantes seront correctement mises a jour. Malgre cette remarque, */ \ /* on verra avec profit les deux fonctions 'NE_PAS_METTRE_A_JOUR_LE_Z_Buffer' et */ \ /* 'METTRE_A_JOUR_LE_Z_Buffer', a utiliser avec le plus grand soin (voir le commentaire */ \ /* qui accompagne 'NE_PAS_METTRE_A_JOUR_LE_Z_Buffer'), et qui permettent la mise a jour */ \ /* conditionnelle qui suit : */ \ \ BLOC(action_Z_Buffer_actif_2); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ /* Lorsque le 'Z-Buffer' n'est pas actif, on compte les pseudo-collisions... */ \ Bblock \ BLOC(action_Z_Buffer_inactif); \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Primitive de base d'acces au Z-Buffer (introduite le 20100120115242). */ \ /* ATTENTION : {x,y} E [Xmin,Xmax]x[Ymin,Ymax], mais : z E [0,1[... */ #define TEST_Z_Buffer_(x,y,z,action_point_visible) \ /* ATTENTION : {x,y} E [Xmin,Xmax]x[Ymin,Ymax], mais : z E [0,1[... */ \ Bblock \ bTEST_Z_Buffer_(x,y,z \ ,action_point_visible \ ,BLOC( \ EGAL(Z_Buffer_____minimum,MIN2(Z_Buffer_____minimum,z)); \ EGAL(Z_Buffer_____maximum,MAX2(Z_Buffer_____maximum,z)); \ /* Mise a jour des extrema du 'Z-Buffer'... */ \ \ EGAL(Z_Buffer_accumule_____minimum,MIN2(Z_Buffer_accumule_____minimum,z)); \ EGAL(Z_Buffer_accumule_____maximum,MAX2(Z_Buffer_accumule_____maximum,z)); \ /* Mise a jour des extrema du 'Z-Buffer accumule'... */ \ ) \ ,BLOC( \ Test(IL_FAUT(Z_Buffer_____mettre_a_jour)) \ Bblock \ storeF_point(z,Z_Buffer,x,y); \ /* Et le 'z' du point {x,y} courant est memorise dans le Z-Buffer, cette */ \ /* action est faite en dernier afin qu'eventuellement le 'BLOC' precedent */ \ /* puisse connaitre le 'z' du point anterieur. */ \ /* */ \ /* ATTENTION, il y avait autrefois : */ \ /* */ \ /* storeF_point_valide(z,Z_Buffer,x,y); */ \ /* */ \ /* mais la presence de : */ \ /* */ \ /* Test(TEST_DANS_L_IMAGE(x,y)) */ \ /* */ \ /* ci-dessus rend les fonctions du type '..._point_valide(...)' redondantes... */ \ \ Test(IFGE(MAX2(z,Z_Buffer_____bypath),loadF_point(Z_Buffer_accumule,x,y))) \ Bblock \ storeF_point(z,Z_Buffer_accumule,x,y); \ /* Et le 'z' du point {x,y} courant est memorise dans le Z-Buffer accumule (introduit le */ \ /* 20010722100154). */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ ) \ ,BLOC( \ Test(TEST_MASQUE_ACTIF(x,y,MASQUER_PARCOURS)) \ Bblock \ INCR(Z_Buffer_____compteur_des_pseudo_collisions \ ,COND(IFOU(IFGT(FLOT(z),ADD2(loadF_point(Z_Buffer,x,y),Z_Buffer_____avant)) \ ,IFLT(FLOT(z),SOUS(loadF_point(Z_Buffer,x,y),Z_Buffer_____arriere)) \ ) \ ,ZERO \ ,I \ ) \ ); \ /* Comptage des pseudo-collisions, c'est-a-dire des cas, P(x,y,z) etant le point a tester : */ \ /* Z_Buffer(x,y) + Zavant > z > Z_Buffer(x,y) - Zarriere et ce uniquement pour les points */ \ /* non masquees... */ \ /* */ \ /* ATTENTION, il y avait autrefois : */ \ /* */ \ /* ...,ADD2(loadF_point_valide(Z_Buffer,x,y),Z_Buffer_____avant)... */ \ /* ...,SOUS(loadF_point_valide(Z_Buffer,x,y),Z_Buffer_____arriere)... */ \ /* */ \ /* mais la presence de : */ \ /* */ \ /* Test(TEST_DANS_L_IMAGE(x,y)) */ \ /* */ \ /* ci-dessus rend les fonctions du type '..._point_valide(...)' redondantes... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ ) \ ); \ Eblock \ /* Primitive d'acces au Z-Buffer. */ \ /* ATTENTION : {x,y} E [Xmin,Xmax]x[Ymin,Ymax], mais : z E [0,1[... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F O N C T I O N S G E N E R A L E S D E M I S E D ' U N P O I N T */ /* D A N S U N E I M A G E E N F A U S S E S C O U L E U R S : */ /* */ /*************************************************************************************************************************************/ #define store_point_2D(niveau,image,x,y) \ /* ATTENTION : {x,y} E [Xmin,Xmax]x[Ymin,Ymax]. */ \ Bblock \ store_point_valide(niveau \ ,image \ ,x,y \ ,FVARIABLE \ ); \ Eblock \ /* Rangement standard d'un point bi-dimensionnel de coordonnees {x,y} */ \ /* avec le niveau 'niveau' dans l'image 'image'. */ \ /* ATTENTION : {x,y} E [Xmin,Xmax]x[Ymin,Ymax]. */ #define store_point_3D(niveau,image,x,y,z) \ /* ATTENTION : {x,y} E [Xmin,Xmax]x[Ymin,Ymax], mais : z E [0,1[... */ \ Bblock \ TEST_Z_Buffer_(x,y,z \ ,BLOC(store_point_valide(niveau \ ,image \ ,x,y \ ,FVARIABLE \ ); \ ) \ ); \ Eblock \ /* Rangement standard d'un point tri-dimensionnel de coordonnees {x,y,z} */ \ /* avec le niveau 'niveau' dans l'image 'image' ; on notera que la validite */ \ /* des coordonnees bi-dimensionnelles {x,y} est faite dans 'TEST_Z_Buffer_'. */ \ /* ATTENTION : {x,y} E [Xmin,Xmax]x[Ymin,Ymax], mais : z E [0,1[... */ #define store_point_ND(niveau,image,x,y,z,dimension_de_l_espace) \ /* ATTENTION : {x,y} E [Xmin,Xmax]x[Ymin,Ymax], mais : z E [0,1[... */ \ Bblock \ Choi(dimension_de_l_espace) \ Bblock \ Ca1e(BI_DIMENSIONNEL) \ Bblock \ store_point_2D(niveau,image,x,y); \ Eblock \ ECa1 \ \ Ca1e(TRI_DIMENSIONNEL) \ Bblock \ store_point_3D(niveau,image,x,y,z); \ Eblock \ ECa1 \ \ Defo \ Bblock \ PRINT_ERREUR("la dimension de l'espace n'est pas reconnue dans 'store_point_ND'"); \ Eblock \ EDef \ Eblock \ ECho \ Eblock \ /* Rangement standard d'un point N-dimensionnel de coordonnees {x,y,z}. */ \ /* ATTENTION : {x,y} E [Xmin,Xmax]x[Ymin,Ymax], mais : z E [0,1[... */ #define storeF_point_2D(niveau,image,x,y) \ /* ATTENTION : {x,y} E [Xmin,Xmax]x[Ymin,Ymax]. */ \ Bblock \ storeF_point_valide(niveau \ ,image \ ,x,y \ ); \ Eblock \ /* Rangement non standard d'un point bi-dimensionnel de coordonnees {x,y} avec le niveau */ \ /* avec le niveau 'niveau' dans l'image 'image' (introduit le 20091203180329). */ \ /* ATTENTION : {x,y} E [Xmin,Xmax]x[Ymin,Ymax]. */ #define storeF_point_3D(niveau,image,x,y,z) \ /* ATTENTION : {x,y} E [Xmin,Xmax]x[Ymin,Ymax], mais : z E [0,1[... */ \ Bblock \ TEST_Z_Buffer_(x,y,z \ ,BLOC(storeF_point_valide(niveau \ ,image \ ,x,y \ ); \ ) \ ); \ Eblock \ /* Rangement non standard d'un point tri-dimensionnel de coordonnees {x,y,z} avec le niveau */ \ /* 'niveau' dans l'image 'image' ; on notera que la validite des coordonnees */ \ /* bi-dimensionnelles {x,y} est faite dans 'TEST_Z_Buffer_' (introduit le 20091203180329). */ \ /* ATTENTION : {x,y} E [Xmin,Xmax]x[Ymin,Ymax], mais : z E [0,1[... */ #define storeF_point_ND(niveau,image,x,y,z,dimension_de_l_espace) \ /* ATTENTION : {x,y} E [Xmin,Xmax]x[Ymin,Ymax], mais : z E [0,1[... */ \ Bblock \ Choi(dimension_de_l_espace) \ Bblock \ Ca1e(BI_DIMENSIONNEL) \ Bblock \ storeF_point_2D(niveau,image,x,y); \ Eblock \ ECa1 \ \ Ca1e(TRI_DIMENSIONNEL) \ Bblock \ storeF_point_3D(niveau,image,x,y,z); \ Eblock \ ECa1 \ \ Defo \ Bblock \ PRINT_ERREUR("la dimension de l'espace n'est pas reconnue dans 'storeF_point_ND'"); \ Eblock \ EDef \ Eblock \ ECho \ Eblock \ /* Rangement non standard d'un point N-dimensionnel de coordonnees {x,y,z} (introduit */ \ /* le 20091203180329). */ \ /* ATTENTION : {x,y} E [Xmin,Xmax]x[Ymin,Ymax], mais : z E [0,1[... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F O N C T I O N S G E N E R A L E S D E M I S E D ' U N P O I N T */ /* D A N S U N E I M A G E E N V R A I E S C O U L E U R S : */ /* */ /*************************************************************************************************************************************/ #define store_point_2D_RVB(niveau_ROUGE,niveau_VERTE,niveau_BLEUE,image_ROUGE,image_VERTE,image_BLEUE,x,y) \ /* ATTENTION : {x,y} E [Xmin,Xmax]x[Ymin,Ymax]. */ \ Bblock \ store_point_2D(niveau_ROUGE,image_ROUGE,x,y); \ store_point_2D(niveau_VERTE,image_VERTE,x,y); \ store_point_2D(niveau_BLEUE,image_BLEUE,x,y); \ /* Rangement successif des trois composantes (ROUGE,VERTE,BLEUE)... */ \ Eblock \ /* Rangement standard d'un point bi-dimensionnel de coordonnees {x,y} */ \ /* avec le niveau (niveau_ROUGE,niveau_VERTE,niveau_BLEUE) dans l'image */ \ /* (image_ROUGE,image_VERTE,image_BLEUE). */ \ /* ATTENTION : {x,y} E [Xmin,Xmax]x[Ymin,Ymax]. */ #define store_point_3D_RVB(niveau_ROUGE,niveau_VERTE,niveau_BLEUE,image_ROUGE,image_VERTE,image_BLEUE,x,y,z) \ /* ATTENTION : {x,y} E [Xmin,Xmax]x[Ymin,Ymax], mais : z E [0,1[... */ \ Bblock \ TEST_Z_Buffer_(x,y,z \ ,BLOC(store_point_valide(niveau_ROUGE \ ,image_ROUGE \ ,x,y \ ,FVARIABLE \ ); \ store_point_valide(niveau_VERTE \ ,image_VERTE \ ,x,y \ ,FVARIABLE \ ); \ store_point_valide(niveau_BLEUE \ ,image_BLEUE \ ,x,y \ ,FVARIABLE \ ); \ ) \ ); \ /* Rangement successif des trois composantes (ROUGE,VERTE,BLEUE)... */ \ Eblock \ /* Rangement standard d'un point tri-dimensionnel de coordonnees {x,y,z} */ \ /* avec le niveau (niveau_ROUGE,niveau_VERTE,niveau_BLEUE) dans l'image */ \ /* (image_ROUGE,image_VERTE,image_BLEUE) ; on notera que la validite */ \ /* des coordonnees bi-dimensionnelles {x,y} est faite dans 'TEST_Z_Buffer_'. */ \ /* ATTENTION : {x,y} E [Xmin,Xmax]x[Ymin,Ymax], mais : z E [0,1[... */ #define store_point_ND_RVB(niveau_ROUGE,niveau_VERTE,niveau_BLEUE,image_ROUGE,image_VERTE,image_BLEUE,x,y,z,dimension_de_l_espace) \ /* ATTENTION : {x,y} E [Xmin,Xmax]x[Ymin,Ymax], mais : z E [0,1[... */ \ Bblock \ Choi(dimension_de_l_espace) \ Bblock \ Ca1e(BI_DIMENSIONNEL) \ Bblock \ store_point_2D_RVB(niveau_ROUGE,niveau_VERTE,niveau_BLEUE,image_ROUGE,image_VERTE,image_BLEUE,x,y); \ Eblock \ ECa1 \ \ Ca1e(TRI_DIMENSIONNEL) \ Bblock \ store_point_3D_RVB(niveau_ROUGE,niveau_VERTE,niveau_BLEUE,image_ROUGE,image_VERTE,image_BLEUE,x,y,z); \ Eblock \ ECa1 \ \ Defo \ Bblock \ PRINT_ERREUR("la dimension de l'espace n'est pas reconnue dans 'store_point_ND_RVB'"); \ Eblock \ EDef \ Eblock \ ECho \ Eblock \ /* Rangement standard d'un point N-dimensionnel de coordonnees {x,y,z} en vraies couleurs. */ \ /* ATTENTION : {x,y} E [Xmin,Xmax]x[Ymin,Ymax], mais : z E [0,1[... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* G E S T I O N D E S " V O I N T " S : */ /* */ /* */ /* Nota : */ /* */ /* Le "voint" est la version francisee */ /* du "voxel". Dans un premier temps, les */ /* images volumiques vont etre simulees */ /* dans une image surfacique avec la */ /* compatibilite avec '$xci/reduction_64$K'. */ /* */ /* */ /* Format : */ /* */ /* Y ^ */ /* | */ /* | */ /* | */ /* Ymax + + + + + + + + + + + + + + + + <-- "arriere-plan" */ /* + . + + */ /* + . + + */ /* + . + + */ /* + . + + */ /* + + + + + + + + + + + + + + + + + */ /* + . + + */ /* + . + + */ /* + . + + */ /* + . + + */ /* + . + + */ /* + . + + */ /* + . + + */ /* + . + + */ /* + . + + */ /* + Ymin . . . . . . . . . . + . . . . + ------------------> */ /* + Zmin . Xmin + Xmax X */ /* + . + + */ /* + . + + */ /* + . + + */ /* Zmax + + + + + + + + + + + + + + + + <-- "avant-plan" */ /* * */ /* * */ /* * */ /* Z * */ /* */ /* */ /* ATTENTION : */ /* */ /* Ces definitions ne figurent pas dans le */ /* le fichier '$xiipd/fonction.1$FON' car en */ /* effet ce fichier pourrait etre remplace par */ /* '$xiipf/fonction.1$FON' qui lui ne pourrait */ /* pas les contenir... */ /* */ /* */ /*************************************************************************************************************************************/ #define VProjection_OX(Cx,Cy,Cz) \ COXA(ADD2(QUOD(COXR(Cx),pasX) \ ,MUL2(REST(QUOD(COZR(Cz),pasZ) \ ,pasX \ ) \ ,QUOD(dimX,pasX) \ ) \ ) \ ) #define VProjection_OY(Cx,Cy,Cz) \ COYA(ADD2(QUOD(COYR(Cy),pasY) \ ,MUL2(QUOD(QUOD(COZR(Cz),pasZ) \ ,pasX \ ) \ ,QUOD(dimY,pasY) \ ) \ ) \ ) /* Definition des fonctions de pseudo-projection permettant de passer a une image */ /* "volumique" a une image bidimensionnelle. Dans le schema ci-dessous chaque carre */ /* numerote represente un plan (OX,OY) de 'Z' donne : */ /* */ /* Y ^ */ /* | */ /* Ymax |---------------------------------------- */ /* | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | */ /* |---------------------------------------\ */ /* | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 |\ */ /* |---------------------------------------- \ */ /* | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | avant-plan */ /* |---------------------------------------- ('Zmax') */ /* | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | */ /* |---------------------------------------- */ /* | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | */ /* arriere-plan |---------------------------------------- */ /* ('Zmin') | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | */ /* \ |---------------------------------------- */ /* \| 08 | 09 | 10 | 11 | 12 | 13 | 14 | 15 | */ /* \---------------------------------------- */ /* | 00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | */ /* Ymin |-------------------------------------------> */ /* Xmin Xmax X */ /* */ /* Le numero indique est donne par : */ /* */ /* z */ /* ------ */ /* pasZ */ /* */ /* Le nombre de colonnes est donne par 'pasX', et le nombre de lignes par 'pasY'. Les */ /* dimensions d'un carre sont donc : */ /* */ /* dimX dimY */ /* (------ , ------) */ /* pasX pasY */ /* */ /* Les coordonnees d'un tel carre sont donc (les carres etant ranges ligne par ligne, */ /* seul 'pasX' intervient) : */ /* */ /* dimX z dimY z */ /* (------xRESTE(------,pasX) , ------xQUOTIENT(------,pasX)) */ /* pasX pasZ pasY pasZ */ /* */ /* */ /* A l'interieur de chaque carre, les abscisses et les ordonnees sont donnees par : */ /* */ /* x y */ /* (------ , ------) */ /* pasX pasY */ /* */ /* D'ou : */ /* */ /* x dimX z */ /* X = ------ + (------xRESTE(------,pasX) */ /* pasX pasX pasZ */ /* */ /* y dimY z */ /* Y = ------ + (------xQUOTIENT(------,pasX) */ /* pasY pasY pasZ */ /* */ #define PAS_D_ECHANTILLONNAGE_POUR_SIMULER_LES_VOINTS \ ARRI(RAC3(dimZ)) \ /* Les "voint"s sont simules dans des images "normales" (c'est-a-dire bidimensionnelles), */ \ /* un pas de parcours du cube (c'est-a-dire l'image tridimensionnelle), commun aux trois */ \ /* axes, doit etre defini : c'est 'PAS_D_ECHANTILLONNAGE_POUR_SIMULER_LES_VOINTS'. On notera */ \ /* notera le 'ARRI(...)' qui est rendu necessaire par les imprecisions des calculs qui */ \ /* ferait que 'PAS_D_ECHANTILLONNAGE_POUR_SIMULER_LES_VOINTS' eleve ensuite a la puissance */ \ /* 'TRI_DIMENSIONNEL' ne redonnerait pas 'dimZ'... */ \ /* */ \ /* Le 20070227142149 : */ \ /* */ \ /* PUIX(dimZ,INVE(FLOT(TRI_DIMENSIONNEL))) */ \ /* */ \ /* fut remplace par 'RAC3(dimZ)'... */ #define SET_ECHANTILLONNAGE_POUR_SIMULER_LES_VOINTS \ Bblock \ SET_ECHANTILLONNAGE(PAS_D_ECHANTILLONNAGE_POUR_SIMULER_LES_VOINTS \ ,PAS_D_ECHANTILLONNAGE_POUR_SIMULER_LES_VOINTS \ ); \ SET_ECHANTILLONNAGE_DE_PROFONDEUR(PAS_D_ECHANTILLONNAGE_POUR_SIMULER_LES_VOINTS); \ Eblock \ /* Mise en place de l'echantillonnage necessaire sur les trois axes pour la simulation des */ \ /* "voint"s... */ #define loadQ_voint_GENERAL(niveau,image,Cx,Cy,Cz,load_bi_dimensionnel) \ /* ATTENTION : {X,Y,Z} E [Xmin,Xmax]x[Ymin,Ymax]x[Zmin,Zmax]... */ \ Bblock \ EGAL(niveau,NIVEAU_UNDEF); \ /* A priori et au cas ou il y aurait des erreurs... */ \ Test(TEST_DANS_L_ALBUM(Cx,Cy,Cz)) \ Bblock \ Test(IFEQ(dimZ,MUL3(pasX,pasY,pasZ))) \ Bblock \ DEFV(pointI_2D,point); \ /* Definition de coordonnees locales avant le changement des pas. Mais ATTENTION, il est */ \ /* impossible d'utiliser 'coordonnees_X_et_Y', car en effet si 'loadQ_voint_GENERAL(...)' */ \ /* etait appele avec comme argument {x,y}=(X,Y) provenant par exemple d'un couple */ \ /* 'begin_image'/'end_image', il y aurait confusion semantique entre {X,Y} local et {X,Y} */ \ /* exterieur... */ \ EGAL(ASD1(point,x),VProjection_OX(Cx,Cy,Cz)); \ /* Calcul de l'abscisse d'acces a l'image bidimensionnelle. */ \ EGAL(ASD1(point,y),VProjection_OY(Cx,Cy,Cz)); \ /* Calcul de l'ordonnee d'acces a l'image bidimensionnelle. */ \ Test(TEST_DANS_L_IMAGE(ASD1(point,x),ASD1(point,y))) \ Bblock \ PUSH_TRANSLATION; \ SET_TRANSLATION(TraX,TraY); \ PUSH_ECHANTILLONNAGE; \ SET_ECHANTILLONNAGE(PasX,PasY); \ /* Mise en place d'un echantillonnage compatible avec cette simulation. On notera que */ \ /* seuls les axes 'OX' et 'OY' sont concernes, puisque l'acces a l'image n'est que */ \ /* bidimensionnel... */ \ EGAL(niveau,load_bi_dimensionnel); \ /* Simulation de l'acces a une image surfacique... */ \ PULL_ECHANTILLONNAGE; \ PULL_TRANSLATION; \ /* Enfin, restauration des acces aux axes 'OX' et 'OY'. */ \ Eblock \ ATes \ Bblock \ PRINT_ERREUR("les coordonnees reduites d'acces a une image volumique sont hors-ecran"); \ CAL1(Prer5("(%d,%d,%d) --> (%d,%d)\n",Cx,Cy,Cz,ASD1(point,x),ASD1(point,y))); \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ PRINT_ERREUR("incompatibilite entre les dimensions et les pas"); \ CAL1(Prer4("dimZ=%d pas=(%d,%d,%d)\n",dimZ,pasX,pasY,pasZ)); \ /* Une image volumique tridimensionnelle est simulee dans une image bidimensionnelle */ \ /* suivant le format de '$xci/reduction_64$K'. Les trois axes sont donc sous-echantillonnes */ \ /* suivant les pas (pasX,pasY,pasZ). Le nombre de points sur les trois axes est donc de */ \ /* (dimX/pasX), (dimY/pasY) et (dimZ/pasZ) respectivement. Le nombre de points de l'image */ \ /* volumique est donc de : */ \ /* */ \ /* dimX dimY dimZ */ \ /* ------ x ------ x ------ */ \ /* pasX pasY pasZ */ \ /* */ \ /* Cette image volumique etant contenu dans une image "normale", il faut donc que l'on */ \ /* ait : */ \ /* */ \ /* dimX dimY dimZ */ \ /* ------ x ------ x ------ = dimX x dimY */ \ /* pasX pasY pasZ */ \ /* */ \ /* d'ou : */ \ /* */ \ /* dimZ = pasX x pasY x pasZ. */ \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ /* Les points {x,y,z} hors-image volumiques sont elimines... */ \ Eblock \ ETes \ Eblock \ /* Primitive d'acces a un "voint" quelconque. */ \ /* ATTENTION : {X,Y,Z} E [Xmin,Xmax]x[Ymin,Ymax]x[Zmin,Zmax]... */ #define load_voint(niveau,image,Cx,Cy,Cz) \ /* ATTENTION : {X,Y,Z} E [Xmin,Xmax]x[Ymin,Ymax]x[Zmin,Zmax]... */ \ Bblock \ loadQ_voint_GENERAL(niveau \ ,image \ ,Cx,Cy,Cz \ ,load_point(image,ASD1(point,x),ASD1(point,y)) \ ); \ Eblock \ /* Primitive d'acces a un "voint" "standard". */ \ /* ATTENTION : {X,Y,Z} E [Xmin,Xmax]x[Ymin,Ymax]x[Zmin,Zmax]... */ #define loadF_voint(niveau,image,Cx,Cy,Cz) \ /* ATTENTION : {X,Y,Z} E [Xmin,Xmax]x[Ymin,Ymax]x[Zmin,Zmax]... */ \ Bblock \ loadQ_voint_GENERAL(niveau \ ,image \ ,Cx,Cy,Cz \ ,loadF_point(image,ASD1(point,x),ASD1(point,y)) \ ); \ Eblock \ /* Primitive d'acces a un "voint" "Float". */ \ /* ATTENTION : {X,Y,Z} E [Xmin,Xmax]x[Ymin,Ymax]x[Zmin,Zmax]... */ #define storeQ_voint_GENERAL(niveau,image,Cx,Cy,Cz,store_bi_dimensionnel) \ /* ATTENTION : {X,Y,Z} E [Xmin,Xmax]x[Ymin,Ymax]x[Zmin,Zmax]... */ \ Bblock \ Test(TEST_DANS_L_ALBUM(Cx,Cy,Cz)) \ Bblock \ Test(IFEQ(dimZ,MUL3(pasX,pasY,pasZ))) \ Bblock \ DEFV(pointI_2D,point); \ /* Definition de coordonnees locales avant le changement des pas. Mais ATTENTION, il est */ \ /* impossible d'utiliser 'coordonnees_X_et_Y', car en effet si 'loadQ_voint_GENERAL(...)' */ \ /* etait appele avec comme argument {x,y}=(X,Y) provenant par exemple d'un couple */ \ /* 'begin_image'/'end_image', il y aurait confusion semantique entre {X,Y} local et {X,Y} */ \ /* exterieur... */ \ EGAL(ASD1(point,x),VProjection_OX(Cx,Cy,Cz)); \ /* Calcul de l'abscisse d'acces a l'image bidimensionnelle. */ \ EGAL(ASD1(point,y),VProjection_OY(Cx,Cy,Cz)); \ /* Calcul de l'ordonnee d'acces a l'image bidimensionnelle. */ \ Test(TEST_DANS_L_IMAGE(ASD1(point,x),ASD1(point,y))) \ Bblock \ PUSH_TRANSLATION; \ SET_TRANSLATION(TraX,TraY); \ PUSH_ECHANTILLONNAGE; \ SET_ECHANTILLONNAGE(PasX,PasY); \ /* Mise en place d'un echantillonnage compatible avec cette simulation. On notera que */ \ /* seuls les axes 'OX' et 'OY' sont concernes, puisque l'acces a l'image n'est que */ \ /* bidimensionnel... */ \ BLOC(store_bi_dimensionnel); \ /* Simulation de l'acces a une image surfacique... */ \ PULL_ECHANTILLONNAGE; \ PULL_TRANSLATION; \ /* Enfin, restauration des acces aux axes 'OX' et 'OY'. */ \ Eblock \ ATes \ Bblock \ PRINT_ERREUR("les coordonnees reduites d'acces a une image volumique sont hors-ecran"); \ CAL1(Prer5("(%d,%d,%d) --> (%d,%d)\n",Cx,Cy,Cz,ASD1(point,x),ASD1(point,y))); \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ PRINT_ERREUR("incompatibilite entre les dimensions et les pas"); \ CAL1(Prer4("dimZ=%d pas=(%d,%d,%d)\n",dimZ,pasX,pasY,pasZ)); \ /* Une image volumique tridimensionnelle est simulee dans une image bidimensionnelle */ \ /* suivant le format de '$xci/reduction_64$K'. Les trois axes sont donc sous-echantillonnes */ \ /* suivant les pas (pasX,pasY,pasZ). Le nombre de points sur les trois axes est donc de */ \ /* (dimX/pasX), (dimY/pasY) et (dimZ/pasZ) respectivement. Le nombre de points de l'image */ \ /* volumique est donc de : */ \ /* */ \ /* dimX dimY dimZ */ \ /* ------ x ------ x ------ */ \ /* pasX pasY pasZ */ \ /* */ \ /* Cette image volumique etant contenu dans une image "normale", il faut donc que l'on */ \ /* ait : */ \ /* */ \ /* dimX dimY dimZ */ \ /* ------ x ------ x ------ = dimX x dimY */ \ /* pasX pasY pasZ */ \ /* */ \ /* d'ou : */ \ /* */ \ /* dimZ = pasX x pasY x pasZ. */ \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ /* Les points {x,y,z} hors-image volumiques sont elimines... */ \ Eblock \ ETes \ Eblock \ /* Primitive de rangement d'un "voint" quelconque. */ \ /* ATTENTION : {X,Y,Z} E [Xmin,Xmax]x[Ymin,Ymax]x[Zmin,Zmax]... */ #define store_voint(niveau,image,Cx,Cy,Cz) \ /* ATTENTION : {X,Y,Z} E [Xmin,Xmax]x[Ymin,Ymax]x[Zmin,Zmax]... */ \ Bblock \ storeQ_voint_GENERAL(niveau \ ,image \ ,Cx,Cy,Cz \ ,store_point(niveau,image,ASD1(point,x),ASD1(point,y),FVARIABLE) \ ); \ Eblock \ /* Primitive de rangement d'un "voint" "standard". */ \ /* ATTENTION : {X,Y,Z} E [Xmin,Xmax]x[Ymin,Ymax]x[Zmin,Zmax]... */ #define storeF_voint(niveau,image,Cx,Cy,Cz) \ /* ATTENTION : {X,Y,Z} E [Xmin,Xmax]x[Ymin,Ymax]x[Zmin,Zmax]... */ \ Bblock \ storeQ_voint_GENERAL(niveau \ ,image \ ,Cx,Cy,Cz \ ,storeF_point(niveau,image,ASD1(point,x),ASD1(point,y)) \ ); \ Eblock \ /* Primitive de rangement d'un "voint" "Float". */ \ /* ATTENTION : {X,Y,Z} E [Xmin,Xmax]x[Ymin,Ymax]x[Zmin,Zmax]... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* G E N E R A T I O N D ' U N D I S Q U E C I R C U L A I R E C E N T R E : */ /* */ /*************************************************************************************************************************************/ #define store_disque(niveau_au_bord,niveau_au_centre,imageAR,X_centre,Y_centre,Z_centre,rayon_du_disque,dimension_de_la_generation) \ /* ATTENTION : {X,Y,Z} E [Xmin,Xmax]x[Ymin,Ymax]x[Zmin,Zmax]. */ \ Bblock \ DEFV(pointF_3D,centre_du_disque); \ /* Redefinition locale du centre du disque ; cela est rendu necessaire par le fait que */ \ /* la macro 'store_disque()' peut etre appelee avec comme argument 'X' et 'Y', qui se */ \ /* retrouveraient dans 'begin_colonneQ()' et 'begin_ligneQ()', et qui seraient donc */ \ /* confondus avec les 'X' et 'Y' locaux a ces fonctions de parcours. D'autre part, il */ \ /* est defini en 'Float' afin de conserver l'eventuelle precision des arguments d'appel... */ \ DEFV(Float,INIT(distance_au_centre,FLOT__UNDEF)); \ /* Distance normalisee dans [0,1] du point courant {X,Y} au centre du disque. */ \ INITIALISATION_POINT_3D(centre_du_disque \ ,F__cDENORMALISE_OX(Projection_OX(_____cNORMALISE_OX(X_centre) \ ,_____cNORMALISE_OY(Y_centre) \ ,_____cNORMALISE_OZ(Z_centre) \ ) \ ) \ ,F__cDENORMALISE_OY(Projection_OY(_____cNORMALISE_OX(X_centre) \ ,_____cNORMALISE_OY(Y_centre) \ ,_____cNORMALISE_OZ(Z_centre) \ ) \ ) \ ,F__cDENORMALISE_OZ(_____cNORMALISE_OZ(Z_centre)) \ ); \ /* Initialisation du centre effectif du disque, en se souvenant du fait que si le point */ \ /* (X_centre,Y_centre,Z_centre) etait en 'Float', la precision est conservee... */ \ begin_colonneQ(DoIn \ ,INTE(SOUS(ASD1(centre_du_disque,y),rayon_du_disque)) \ ,INTE(ADD2(ASD1(centre_du_disque,y),rayon_du_disque)) \ ,pasY \ ) \ Bblock \ begin_ligneQ(DoIn \ ,INTE(SOUS(ASD1(centre_du_disque,x),rayon_du_disque)) \ ,INTE(ADD2(ASD1(centre_du_disque,x),rayon_du_disque)) \ ,pasX \ ) \ Bblock \ EGAL(distance_au_centre \ ,RdisF2D(ASD1(centre_du_disque,x),ASD1(centre_du_disque,y) \ ,FLOT(X),FLOT(Y) \ ) \ ); \ /* Calcul de la distance euclidienne du point courant {X,Y} au centre du disque. */ \ Test(IFLE(distance_au_centre,rayon_du_disque)) \ Bblock \ Test(IZGT(rayon_du_disque)) \ Bblock \ EGAL(distance_au_centre \ ,DIVI(distance_au_centre \ ,FLOT(rayon_du_disque) \ ) \ ); \ EGAL(distance_au_centre \ ,TRON(distance_au_centre \ ,COORDONNEE_BARYCENTRIQUE_MINIMALE \ ,COORDONNEE_BARYCENTRIQUE_MAXIMALE \ ) \ ); \ /* Normalisation de la distance afin de moduler le niveau de trace. On notera que cette */ \ /* operation est faite en deux temps afin de soulager le compilateur eventuellement... */ \ Eblock \ ATes \ Bblock \ EGAL(distance_au_centre,COORDONNEE_BARYCENTRIQUE_MINIMALE); \ /* Lorsque le rayon demande est negatif ou nul, la distance minimale est forcee, et ce afin */ \ /* d'obtenir le niveau maximum... */ \ Eblock \ ETes \ store_point_ND(TRON(GENP(NIVA(BARY(FLOT(NIVR(niveau_au_centre)) \ ,FLOT(NIVR(niveau_au_bord)) \ ,distance_au_centre \ ) \ ) \ ) \ ,NOIR_PLANCHER_SUBSTITUTION \ ,BLANC \ ) \ ,imageAR \ ,X,Y,_____cNORMALISE_OZ(ASD1(centre_du_disque,z)) \ ,dimension_de_la_generation \ ); \ /* Generation des points intermediaires avec interpolation lineaire pour les niveaux, */ \ /* et interpolation cubique pour les coordonnees en 2D ou en 3D suivant l'option... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ end_ligneQ(EDoI) \ Eblock \ end_colonneQ(EDoI) \ Eblock \ /* ATTENTION : {X,Y,Z} E [Xmin,Xmax]x[Ymin,Ymax]x[Zmin,Zmax]. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* N O T I O N D E C A L I B R A G E : */ /* */ /* */ /* Definition : */ /* */ /* Lors des rangements des points dans */ /* les matrices "images", leurs niveaux, */ /* suivant la valeur des indicateurs qui */ /* suivront, sont calibres. Trois calibra- */ /* ges sont prevus : */ /* */ /* 1 - "modulo" : le niveau est ramene */ /* dans le segment [noir,blanc], */ /* */ /* 2 - "seuillage bas" : tous les niveaux */ /* inferieurs au "noir" sont mis a "noir", */ /* */ /* 3 - "seuillage haut" : tous les niveaux */ /* superieurs au "blanc" sont mis a "blanc". */ /* */ /* */ /* Utilisation : */ /* */ /* SEUILLAGE_BAS_INACTIF; */ /* SEUILLAGE_BAS_ACTIF(seuil); */ /* SEUILLAGE_HAUT_INACTIF; */ /* SEUILLAGE_HAUT_ACTIF(seuil); */ /* SEUILLAGE_MODULO_INACTIF; */ /* SEUILLAGE_MODULO_ACTIF(origine,extremite); */ /* */ /* permettent d'inactiver ou d'activer */ /* respectivement les trois seuillages */ /* disponibles. */ /* */ /* */ /*************************************************************************************************************************************/ #define SEUILLAGE_MODULO_INACTIF \ Bblock \ EGAL(etat_Cmodulo,INACTIF); \ Eblock \ /* Fonction de mise a l'etat inactif du "seuillage modulo". */ #define SEUILLAGE_MODULO(origine,extremite) \ Bblock \ EGAL(etat_Cmodulo,ACTIF); \ EGAL(seuil_Corigine,GENP(origine)); \ EGAL(seuil_Cextremite,GENP(extremite)); \ Eblock \ /* Fonction de mise a l'etat actif du "seuillage modulo" */ \ /* avec positionnement des deux seuils. */ #define TEST_NIVEAU_MODULO(niveau) \ GENP(COND(EST_ACTIF(etat_Cmodulo) \ ,MODU(INTE(niveau),INTE(seuil_Corigine),INTE(seuil_Cextremite)) \ ,niveau \ ) \ ) \ /* Fonction de calibrage eventuel d'un "niveau" de type "modulo". */ #define SEUILLAGE_BAS_INACTIF \ Bblock \ EGAL(etat_Cbas,INACTIF); \ Eblock \ /* Fonction de mise a l'etat inactif du "seuillage bas". */ #define SEUILLAGE_BAS_ACTIF(seuil) \ Bblock \ EGAL(etat_Cbas,ACTIF); \ EGAL(seuil_Cbas,GENP(seuil)); \ Eblock \ /* Fonction de mise a l'etat actif du "seuillage bas" avec positionnement du seuil. */ #define TEST_NIVEAU_SEUIL_BAS(niveau) \ GENP(COND(EST_ACTIF(etat_Cbas) \ ,MAX2(INTE(niveau),INTE(seuil_Cbas)) \ ,niveau \ ) \ ) \ /* Fonction de calibrage eventuel d'un "niveau" de type "seuil bas". */ #define SEUILLAGE_HAUT_INACTIF \ Bblock \ EGAL(etat_Chaut,INACTIF); \ Eblock \ /* Fonction de mise a l'etat inactif du "seuillage haut". */ #define SEUILLAGE_HAUT_ACTIF(seuil) \ Bblock \ EGAL(etat_Chaut,ACTIF); \ EGAL(seuil_Chaut,GENP(seuil)); \ Eblock \ /* Fonction de mise a l'etat actif du "seuillage haut" avec positionnement du seuil. */ #define TEST_NIVEAU_SEUIL_HAUT(niveau) \ GENP(COND(EST_ACTIF(etat_Chaut) \ ,MIN2(INTE(niveau),INTE(seuil_Chaut)) \ ,niveau \ ) \ ) \ /* Fonction de calibrage eventuel d'un "niveau" de type "seuil haut". */ #define CALIBRAGE_NIVEAU(niveau) \ TEST_NIVEAU_SEUIL_BAS(TEST_NIVEAU_SEUIL_HAUT(TEST_NIVEAU_MODULO(niveau))) /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* N O T I O N D E S U B S T I T U T I O N : */ /* */ /* */ /* Definition : */ /* */ /* Nous allons definir la notion de */ /* substitution ; lorsqu'un niveau a ete */ /* fixe pour un point d'une image, et ce */ /* apres les fonctions 'Vf' et le "cali- */ /* brage", il passe par une phase de */ /* substitution, ou ce niveau calcule */ /* est un indice dans un vecteur qui donne */ /* le niveau a attribuer au point. */ /* Ce vecteur, est lui-meme range dans */ /* une matrice, ce qui permet d'avoir */ /* plusieurs listes de substitution */ /* accessibles simultanement. */ /* */ /* */ /* Utilisation : */ /* */ /* PUSH_SUBSTITUTION; */ /* PULL_SUBSTITUTION; */ /* */ /* permettent de sauvegarder, puis */ /* de restaurer la substitution */ /* courante, et enfin, */ /* */ /* SUBSTITUTION(L_SUBSTITUTION_XX); */ /* MISE_A_L_ETAT_INITIAL_LISTE_DE_SUBSTITUTION; */ /* REINITIALISATION_LISTE_DE_SUBSTITUTION; */ /* */ /* permet de choisir la substitu- */ /* tion courante parmi la liste */ /* suivante : */ /* */ /* L_SUBSTITUTION_NEUTRE, */ /* L_SUBSTITUTION_01, */ /* L_SUBSTITUTION_02, */ /* L_SUBSTITUTION_11, */ /* L_SUBSTITUTION_12, */ /* L_SUBSTITUTION_13, */ /* L_SUBSTITUTION_14, */ /* L_SUBSTITUTION_21, */ /* L_SUBSTITUTION_22, */ /* L_SUBSTITUTION_23, */ /* L_SUBSTITUTION_24, */ /* L_SUBSTITUTION_25, */ /* L_SUBSTITUTION_26, */ /* L_SUBSTITUTION_27, */ /* L_SUBSTITUTION_28, */ /* L_SUBSTITUTION_31, */ /* L_SUBSTITUTION_32, */ /* L_SUBSTITUTION_33, */ /* L_SUBSTITUTION_34, */ /* L_SUBSTITUTION_35, */ /* L_SUBSTITUTION_36, */ /* L_SUBSTITUTION_37, */ /* L_SUBSTITUTION_38, */ /* L_SUBSTITUTION_39, */ /* L_SUBSTITUTION_3A, */ /* L_SUBSTITUTION_3B, */ /* L_SUBSTITUTION_3C, */ /* L_SUBSTITUTION_3D, */ /* L_SUBSTITUTION_3E, */ /* L_SUBSTITUTION_3F, */ /* L_SUBSTITUTION_3G, */ /* L_SUBSTITUTION_FF, */ /* L_SUBSTITUTION_FE, */ /* L_SUBSTITUTION_FC, */ /* L_SUBSTITUTION_F8, */ /* L_SUBSTITUTION_F0, */ /* L_SUBSTITUTION_E0, */ /* L_SUBSTITUTION_C0, */ /* L_SUBSTITUTION_80, */ /* L_SUBSTITUTION_ROUGE, */ /* L_SUBSTITUTION_VERTE, */ /* L_SUBSTITUTION_BLEUE, */ /* L_SUBSTITUTION_VARIABLE, */ /* L_SUBSTITUTION_HISTOGRAMME, */ /* L_SUBSTITUTION_SOLAR, */ /* L_SUBSTITUTION_X_WINDOW. */ /* */ /* et, */ /* */ /* MOVE_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_Arrivee,L_SUBSTITUTION_Depart,niveau_de_depart,niveau_d_arrivee); */ /* SCALING_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_XX,niveau_de_depart,niveau_d_arrivee); */ /* INTERPOLATION_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_XX,niveau_de_depart,niveau_d_arrivee); */ /* INTERPOLATION_ENTRE_DEUX_NIVEAUX(niveau_1,niveau_2,niveau_substitue_1,niveau_substitue_2); */ /* LISSAGE_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_XX,niveau_D1,niveau_D2,niveau_A3,niveau_A4,facteur_derivees); */ /* LISSAGE_ENTRE_QUATRE_NIVEAUX(niv_1,niv_2,niv_3,niv_4,subst_1,subst_2,subst_3,subst_4,facteur_derivees); */ /* MODIFICATION_LISTE_DE_COLORIAGE_X_WINDOW(niveau,niveau_substitue); */ /* MODIFICATION_LISTE_DE_SUBSTITUTION(niveau,niveau_substitue); */ /* MODIFICATION_LISTE_DE_COLORIAGE(niveau,niveau_substitue_R,niveau_substitue_V,niveau_substitue_B); */ /* */ /* permettent de modifier la liste */ /* "VARIABLE" element par element, */ /* ainsi que la liste dite de */ /* "COLORIAGE" ou triplet (ROUGE,VERTE,BLEUE) */ /* qui fait office de "look-up tables". */ /* */ /* Enfin, il est possible d'editer */ /* le contenu d'une liste quelconque */ /* par : */ /* */ /* PRINT_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_XX); */ /* */ /* */ /*************************************************************************************************************************************/ #define ACCES_liste_d_autorisation_de_substitution_des_niveaux(niveau) \ ITb1(liste_d_autorisation_de_substitution_des_niveaux,INDX(niveau,NOIR)) \ /* Acces a la liste d'autorisation/interdiction de substitution des niveaux. */ #define AUTORISATION_DE_SUBSTITUTION_D_UN_NIVEAU(niveau) \ Bblock \ EGAL(ACCES_liste_d_autorisation_de_substitution_des_niveaux(niveau),AUTORISE); \ Eblock \ /* Cette procedure autorise la substitution du niveau argument. */ #define INTERDICTION_DE_SUBSTITUTION_D_UN_NIVEAU(niveau) \ Bblock \ EGAL(ACCES_liste_d_autorisation_de_substitution_des_niveaux(niveau),INTERDIT); \ Eblock \ /* Cette procedure interdit la substitution du niveau argument. */ #define PUSH_SUBSTITUTION \ Bblock \ /* Pour valider le couple (PUSH,PULL). ATTENTION : a cause des variables locales qui sont */ \ /* creees, il est impossible d'utiliser (BblockV,EblockV) qui, sur certains 'SYSTEME', peut */ \ /* etre vide... */ \ DEFV(Int,INIT(EnTete_de_sauvegardM ## num_liste_de_substitution,num_liste_de_substitution)); \ /* Sauvegarde du numero de la liste de substitution courante. */ #define PULL_SUBSTITUTION \ SUBSTITUTION(EnTete_de_sauvegardM ## num_liste_de_substitution); \ /* Restauration du numero de la liste de substitution courante. */ \ Eblock \ /* Pour valider le couple (PUSH,PULL). ATTENTION : a cause des variables locales qui sont */ \ /* creees, il est impossible d'utiliser (BblockV,EblockV) qui, sur certains 'SYSTEME', peut */ \ /* etre vide... */ #define ACCES_listes_de_substitution(L_SUBSTITUTION_XX,niveau) \ ITb2(listes_de_substitution,INDX(L_SUBSTITUTION_XX,L_SUBSTITUTION_NEUTRE),INDX(niveau,NOIR)) #define ACCES_listes_inverses_de_substitution(L_SUBSTITUTION_XX,niveau) \ ITb2(listes_inverses_de_substitution,INDX(L_SUBSTITUTION_XX,L_SUBSTITUTION_NEUTRE),INDX(niveau,NOIR)) #define ACCES_blocage_des_listes_de_substitution(L_SUBSTITUTION_XX,niveau) \ ITb2(blocage_des_listes_de_substitution,INDX(L_SUBSTITUTION_XX,L_SUBSTITUTION_NEUTRE),INDX(niveau,NOIR)) /* Acces aux differents objets associes aux listes de substitution... */ #define L_SUBSTITUTION_FIRST \ INDEX0 \ /* Definition de la premiere liste de substitution. */ Den48( /* ATTENTION, lors de l'introduction d'une nouvelle liste de substitution, les fichiers */ /* suivants (qui en dependent) sont a recompiler : */ /* */ /* $xcp/Konstantes$K xcp ; CL Konstantes */ /* */ /* $xiii/Images$STR xbii ; CB Images */ /* $xiii/di_image$FON xbii ; CB di_image */ /* $xiii/files$FON xbii ; CB files */ /* $xiii/quad_image$FON xbii ; CB quad_image */ /* $xiidX/fonct$vv$FON xbidX ; CB fonction */ /* $xiidd/fonction$FON xbidd ; CB fonction */ /* $xiin/fonction.1$FON xbin ; CB fonction.1 */ /* */ /* */ /* On notera le 20170622144746 que l'on ne peut pas utiliser 'DeT48(...)' a cause de */ /* l'usage de 'INIS(...)' en tant que premier argument... */ INIS(_L_SUBSTITUTION_NEUTRE,L_SUBSTITUTION_FIRST) /* 'L_SUBSTITUTION_NEUTRE' : */ /* definition de la liste de substitution standard ("1" pour "1"...). */ ,_L_SUBSTITUTION_01 /* 'L_SUBSTITUTION_01' : */ /* definition de la liste de substitution [NOIR,FRA2(BLANC)], ou : */ /* definition de la liste de substitution [GRO0(FRA2(BLANC)),GRO1(FRA2(BLANC))]. */ ,_L_SUBSTITUTION_02 /* 'L_SUBSTITUTION_02' : */ /* definition de la liste de substitution [FRA2(BLANC),BLANC], ou : */ /* definition de la liste de substitution [GRO1(FRA2(BLANC)),GRO2(FRA2(BLANC))]. */ ,_L_SUBSTITUTION_11 /* 'L_SUBSTITUTION_11' : */ /* definition de la liste de substitution [NOIR,FRA4(BLANC)], ou : */ /* definition de la liste de substitution [GRO0(FRA4(BLANC)),GRO1(FRA4(BLANC))]. */ ,_L_SUBSTITUTION_12 /* 'L_SUBSTITUTION_12' : */ /* definition de la liste de substitution [FRA4(BLANC),FRA2(BLANC)], ou : */ /* definition de la liste de substitution [GRO1(FRA4(BLANC)),GRO2(FRA4(BLANC))]. */ ,_L_SUBSTITUTION_13 /* 'L_SUBSTITUTION_13' : */ /* definition de la liste de substitution [FRA2(BLANC),GRO3(FRA4(BLANC))], ou : */ /* definition de la liste de substitution [GRO2(FRA4(BLANC)),GRO3(FRA4(BLANC))]. */ ,_L_SUBSTITUTION_14 /* 'L_SUBSTITUTION_14' : */ /* definition de la liste de substitution [GRO3(FRA4(BLANC)),BLANC], ou : */ /* definition de la liste de substitution [GRO3(FRA4(BLANC)),GRO4(FRA4(BLANC))]. */ ,_L_SUBSTITUTION_21 /* 'L_SUBSTITUTION_21' : */ /* definition de la liste de substitution [GRO0(FRA8(BLANC)),GRO1(FRA8(BLANC))]. */ ,_L_SUBSTITUTION_22 /* 'L_SUBSTITUTION_22' : */ /* definition de la liste de substitution [GRO1(FRA8(BLANC)),GRO2(FRA8(BLANC))]. */ ,_L_SUBSTITUTION_23 /* 'L_SUBSTITUTION_23' : */ /* definition de la liste de substitution [GRO2(FRA8(BLANC)),GRO3(FRA8(BLANC))]. */ ,_L_SUBSTITUTION_24 /* 'L_SUBSTITUTION_24' : */ /* definition de la liste de substitution [GRO3(FRA8(BLANC)),GRO4(FRA8(BLANC))]. */ ,_L_SUBSTITUTION_25 /* 'L_SUBSTITUTION_25' : */ /* definition de la liste de substitution [GRO4(FRA8(BLANC)),GRO5(FRA8(BLANC))]. */ ,_L_SUBSTITUTION_26 /* 'L_SUBSTITUTION_26' : */ /* definition de la liste de substitution [GRO5(FRA8(BLANC)),GRO6(FRA8(BLANC))]. */ ,_L_SUBSTITUTION_27 /* 'L_SUBSTITUTION_27' : */ /* definition de la liste de substitution [GRO6(FRA8(BLANC)),GRO7(FRA8(BLANC))]. */ ,_L_SUBSTITUTION_28 /* 'L_SUBSTITUTION_28' : */ /* definition de la liste de substitution [GRO7(FRA8(BLANC)),GRO8(FRA8(BLANC))]. */ ,_L_SUBSTITUTION_31 /* 'L_SUBSTITUTION_31' : */ /* definition de la liste de substitution [GRO0(FRA16(BLANC)),GRO1(FRA16(BLANC))]. */ ,_L_SUBSTITUTION_32 /* 'L_SUBSTITUTION_32' : */ /* definition de la liste de substitution [GRO1(FRA16(BLANC)),GRO2(FRA16(BLANC))]. */ ,_L_SUBSTITUTION_33 /* 'L_SUBSTITUTION_33' : */ /* definition de la liste de substitution [GRO2(FRA16(BLANC)),GRO3(FRA16(BLANC))]. */ ,_L_SUBSTITUTION_34 /* 'L_SUBSTITUTION_34' : */ /* definition de la liste de substitution [GRO3(FRA16(BLANC)),GRO4(FRA16(BLANC))]. */ ,_L_SUBSTITUTION_35 /* 'L_SUBSTITUTION_35' : */ /* definition de la liste de substitution [GRO4(FRA16(BLANC)),GRO5(FRA16(BLANC))]. */ ,_L_SUBSTITUTION_36 /* 'L_SUBSTITUTION_36' : */ /* definition de la liste de substitution [GRO5(FRA16(BLANC)),GRO6(FRA16(BLANC))]. */ ,_L_SUBSTITUTION_37 /* 'L_SUBSTITUTION_37' : */ /* definition de la liste de substitution [GRO6(FRA16(BLANC)),GRO7(FRA16(BLANC))]. */ ,_L_SUBSTITUTION_38 /* 'L_SUBSTITUTION_38' : */ /* definition de la liste de substitution [GRO7(FRA16(BLANC)),GRO8(FRA16(BLANC))]. */ ,_L_SUBSTITUTION_39 /* 'L_SUBSTITUTION_39' : */ /* definition de la liste de substitution [GRO8(FRA16(BLANC)),GRO9(FRA16(BLANC))]. */ ,_L_SUBSTITUTION_3A /* 'L_SUBSTITUTION_3A' : */ /* definition de la liste de substitution [GRO9(FRA16(BLANC)),GRO10(FRA16(BLANC))]. */ ,_L_SUBSTITUTION_3B /* 'L_SUBSTITUTION_3B' : */ /* definition de la liste de substitution [GRO10(FRA16(BLANC)),GRO11(FRA16(BLANC))]. */ ,_L_SUBSTITUTION_3C /* 'L_SUBSTITUTION_3C' : */ /* definition de la liste de substitution [GRO11(FRA16(BLANC)),GRO12(FRA16(BLANC))]. */ ,_L_SUBSTITUTION_3D /* 'L_SUBSTITUTION_3D' : */ /* definition de la liste de substitution [GRO12(FRA16(BLANC)),GRO13(FRA16(BLANC))]. */ ,_L_SUBSTITUTION_3E /* 'L_SUBSTITUTION_3E' : */ /* definition de la liste de substitution [GRO13(FRA16(BLANC)),GRO14(FRA16(BLANC))]. */ ,_L_SUBSTITUTION_3F /* 'L_SUBSTITUTION_3F' : */ /* definition de la liste de substitution [GRO14(FRA16(BLANC)),GRO15(FRA16(BLANC))]. */ ,_L_SUBSTITUTION_3G /* 'L_SUBSTITUTION_3G' : */ /* definition de la liste de substitution [GRO15(FRA16(BLANC)),GRO16(FRA16(BLANC))]. */ ,_L_SUBSTITUTION_FF /* 'L_SUBSTITUTION_FF' : */ /* definition de la liste de substitution [FRA1(FRA1(BLANC)),FRA1(FRA1(BLANC))]. */ ,_L_SUBSTITUTION_FE /* 'L_SUBSTITUTION_FE' : */ /* definition de la liste de substitution [FRA1(FRA2(BLANC)),FRA1(FRA2(BLANC))]. */ ,_L_SUBSTITUTION_FC /* 'L_SUBSTITUTION_FC' : */ /* definition de la liste de substitution [FRA1(FRA4(BLANC)),FRA1(FRA4(BLANC))]. */ ,_L_SUBSTITUTION_F8 /* 'L_SUBSTITUTION_F8' : */ /* definition de la liste de substitution [FRA1(FRA8(BLANC)),FRA1(FRA8(BLANC))]. */ ,_L_SUBSTITUTION_F0 /* 'L_SUBSTITUTION_F0' : */ /* definition de la liste de substitution [FRA1(FRA16(BLANC)),FRA1(FRA16(BLANC))]. */ ,_L_SUBSTITUTION_E0 /* 'L_SUBSTITUTION_E0' : */ /* definition de la liste de substitution [FRA2(FRA16(BLANC)),FRA2(FRA16(BLANC))]. */ ,_L_SUBSTITUTION_C0 /* 'L_SUBSTITUTION_C0' : */ /* definition de la liste de substitution [FRA4(FRA16(BLANC)),FRA4(FRA16(BLANC))]. */ ,_L_SUBSTITUTION_80 /* 'L_SUBSTITUTION_80' : */ /* definition de la liste de substitution [FRA8(FRA16(BLANC)),FRA8(FRA16(BLANC))]. */ ,_L_SUBSTITUTION_ROUGE /* 'L_SUBSTITUTION_ROUGE' : */ /* definition de la liste de coloriage ROUGE, variable et arbitraire. */ ,_L_SUBSTITUTION_VERTE /* 'L_SUBSTITUTION_VERTE' : */ /* definition de la liste de coloriage VERTE, variable et arbitraire. */ ,_L_SUBSTITUTION_BLEUE /* 'L_SUBSTITUTION_BLEUE' : */ /* definition de la liste de coloriage BLEUE, variable et arbitraire. */ ,_L_SUBSTITUTION_VARIABLE /* 'L_SUBSTITUTION_VARIABLE' : */ /* definition de la liste de substitution variable et arbitraire. */ ,_L_SUBSTITUTION_HISTOGRAMME /* 'L_SUBSTITUTION_HISTOGRAMME' : */ /* definition de la liste de substitution triant les niveaux suivant l'histogramme (elle */ /* fut introduite le 20081004115448...). */ ,_L_SUBSTITUTION_SOLAR /* 'L_SUBSTITUTION_SOLAR' : */ /* definition de la liste de substitution d'acces au SOLAR. */ ,_L_SUBSTITUTION_X_WINDOW /* 'L_SUBSTITUTION_X_WINDOW' : */ /* definition de la liste de substitution d'acces aux palettes de 'X-Window'. ATTENTION, on */ /* notera qu'elle est toujours definie, meme si '__VERSION__COMPILER_LE_GRAPHIQUE_X_WINDOW' */ /* n'est pas definie, car en effet, sinon, cela complique terriblement l'initialisation */ /* des listes de 'SUBSTITUTION's, car en effet, il faudrait pouvoir disposer de '#if..' */ /* a l'interieur d'une macro '#define...', ce qui est malheureusement impossible... */ /* ATTENTION, lors de l'introduction d'une nouvelle liste de substitution, les fichiers */ /* suivants (qui en dependent) sont a recompiler : */ /* */ /* $xcp/Konstantes$K xcp ; CL Konstantes */ /* */ /* $xiii/Images$STR xbii ; CB Images */ /* $xiii/di_image$FON xbii ; CB di_image */ /* $xiii/files$FON xbii ; CB files */ /* $xiii/quad_image$FON xbii ; CB quad_image */ /* $xiidX/fonct$vv$FON xbidX ; CB fonction */ /* $xiidd/fonction$FON xbidd ; CB fonction */ /* $xiin/fonction.1$FON xbin ; CB fonction.1 */ /* */ /* en notant le 20081004115448 qu'il est plus simple de faire : */ /* */ /* $xcp/Konstantes$K xcp ; CL Konstantes */ /* */ /* $xb/GENERE$Z */ /* */ /* etant ainsi sur de ne pas se tromper... */ ,_L_SUBSTITUTION_AJOUT /* 'L_SUBSTITUTION_AJOUT' : */ /* definition de la prochaine liste de substitution. ATTENTION, lors de l'ajout d'une */ /* nouvelle liste de substitution, on pourra etre amene a modifier la variable definissant */ /* le "plancher du noir", soit 'NOIR_PLANCHER_SUBSTITUTION'... */ /* ATTENTION, lors de l'introduction d'une nouvelle liste de substitution, les fichiers */ /* suivants (qui en dependent) sont a recompiler : */ /* */ /* $xcp/Konstantes$K xcp ; CL Konstantes */ /* */ /* $xiii/Images$STR xbii ; CB Images */ /* $xiii/di_image$FON xbii ; CB di_image */ /* $xiii/files$FON xbii ; CB files */ /* $xiii/quad_image$FON xbii ; CB quad_image */ /* $xiidX/fonct$vv$FON xbidX ; CB fonction */ /* $xiidd/fonction$FON xbidd ; CB fonction */ /* $xiin/fonction.1$FON xbin ; CB fonction.1 */ /* */ ,DERNIERE_L_SUBSTITUTION ,nom_des_listes_de_substitution ); #define L_SUBSTITUTION_NEUTRE \ ENUM(_L_SUBSTITUTION_NEUTRE) #define L_SUBSTITUTION_01 \ ENUM(_L_SUBSTITUTION_01) #define L_SUBSTITUTION_02 \ ENUM(_L_SUBSTITUTION_02) #define L_SUBSTITUTION_11 \ ENUM(_L_SUBSTITUTION_11) #define L_SUBSTITUTION_12 \ ENUM(_L_SUBSTITUTION_12) #define L_SUBSTITUTION_13 \ ENUM(_L_SUBSTITUTION_13) #define L_SUBSTITUTION_14 \ ENUM(_L_SUBSTITUTION_14) #define L_SUBSTITUTION_21 \ ENUM(_L_SUBSTITUTION_21) #define L_SUBSTITUTION_22 \ ENUM(_L_SUBSTITUTION_22) #define L_SUBSTITUTION_23 \ ENUM(_L_SUBSTITUTION_23) #define L_SUBSTITUTION_24 \ ENUM(_L_SUBSTITUTION_24) #define L_SUBSTITUTION_25 \ ENUM(_L_SUBSTITUTION_25) #define L_SUBSTITUTION_26 \ ENUM(_L_SUBSTITUTION_26) #define L_SUBSTITUTION_27 \ ENUM(_L_SUBSTITUTION_27) #define L_SUBSTITUTION_28 \ ENUM(_L_SUBSTITUTION_28) #define L_SUBSTITUTION_31 \ ENUM(_L_SUBSTITUTION_31) #define L_SUBSTITUTION_32 \ ENUM(_L_SUBSTITUTION_32) #define L_SUBSTITUTION_33 \ ENUM(_L_SUBSTITUTION_33) #define L_SUBSTITUTION_34 \ ENUM(_L_SUBSTITUTION_34) #define L_SUBSTITUTION_35 \ ENUM(_L_SUBSTITUTION_35) #define L_SUBSTITUTION_36 \ ENUM(_L_SUBSTITUTION_36) #define L_SUBSTITUTION_37 \ ENUM(_L_SUBSTITUTION_37) #define L_SUBSTITUTION_38 \ ENUM(_L_SUBSTITUTION_38) #define L_SUBSTITUTION_39 \ ENUM(_L_SUBSTITUTION_39) #define L_SUBSTITUTION_3A \ ENUM(_L_SUBSTITUTION_3A) #define L_SUBSTITUTION_3B \ ENUM(_L_SUBSTITUTION_3B) #define L_SUBSTITUTION_3C \ ENUM(_L_SUBSTITUTION_3C) #define L_SUBSTITUTION_3D \ ENUM(_L_SUBSTITUTION_3D) #define L_SUBSTITUTION_3E \ ENUM(_L_SUBSTITUTION_3E) #define L_SUBSTITUTION_3F \ ENUM(_L_SUBSTITUTION_3F) #define L_SUBSTITUTION_3G \ ENUM(_L_SUBSTITUTION_3G) #define L_SUBSTITUTION_FF \ ENUM(_L_SUBSTITUTION_FF) #define L_SUBSTITUTION_FE \ ENUM(_L_SUBSTITUTION_FE) #define L_SUBSTITUTION_FC \ ENUM(_L_SUBSTITUTION_FC) #define L_SUBSTITUTION_F8 \ ENUM(_L_SUBSTITUTION_F8) #define L_SUBSTITUTION_F0 \ ENUM(_L_SUBSTITUTION_F0) #define L_SUBSTITUTION_E0 \ ENUM(_L_SUBSTITUTION_E0) #define L_SUBSTITUTION_C0 \ ENUM(_L_SUBSTITUTION_C0) #define L_SUBSTITUTION_80 \ ENUM(_L_SUBSTITUTION_80) %define L_SUBSTITUTION_ROUGE_BASIC \ ENUM(_L_SUBSTITUTION_ROUGE) %define L_SUBSTITUTION_VERTE_BASIC \ ENUM(_L_SUBSTITUTION_VERTE) %define L_SUBSTITUTION_BLEUE_BASIC \ ENUM(_L_SUBSTITUTION_BLEUE) /* 'L_SUBSTITUTION_ROUGE_BASIC', 'L_SUBSTITUTION_VERTE_BASIC', 'L_SUBSTITUTION_BLEUE_BASIC' */ /* sont definies par "%define" et non par "#define" afin de pouvoir utiliser le nouvel */ /* operateur de concatenation "`" du pre-processeur : il faut que leur substitution ait */ /* lieu apres la gestion de cet operateur de concatenation... */ /* De plus, les trois listes precedentes sont les versions de bases, non permutables... */ %define L_SUBSTITUTION_ROUGE \ num_liste_de_substitution_ROUGE %define L_SUBSTITUTION_VERTE \ num_liste_de_substitution_VERTE %define L_SUBSTITUTION_BLEUE \ num_liste_de_substitution_BLEUE /* On notera que 'L_SUBSTITUTION_ROUGE', 'L_SUBSTITUTION_VERTE' et 'L_SUBSTITUTION_BLEUE' */ /* sont definies par "%define" et non par "#define" afin de pouvoir utiliser le nouvel */ /* operateur de concatenation "`" du pre-processeur : il faut que leur substitution ait */ /* lieu apres la gestion de cet operateur de concatenation... */ /* De plus, les trois listes precedentes sont les versions permutables et remplacables... */ #define L_SUBSTITUTION_VARIABLE \ ENUM(_L_SUBSTITUTION_VARIABLE) #define L_SUBSTITUTION_HISTOGRAMME \ ENUM(_L_SUBSTITUTION_HISTOGRAMME) #define L_SUBSTITUTION_SOLAR \ ENUM(_L_SUBSTITUTION_SOLAR) #define L_SUBSTITUTION_X_WINDOW \ ENUM(_L_SUBSTITUTION_X_WINDOW) #define L_SUBSTITUTION_AJOUT \ ENUM(_L_SUBSTITUTION_AJOUT) #define L_SUBSTITUTION_LAST \ PRED(L_SUBSTITUTION_AJOUT) \ /* Definition de la derniere liste de substitution. */ #define k___NOMBRE_DE_SUBSTITUTIONS \ LENG(L_SUBSTITUTION_FIRST,L_SUBSTITUTION_LAST) \ /* Nombre de listes de substitution. */ \ /* */ \ /* ATTENTION : la constante 'NOMBRE_DE_SUBSTITUTIONS' est pre-generee dans */ \ /* '$xcp/Konstantes$K'. */ #TestADef NOMBRE_DE_SUBSTITUTIONS \ k___NOMBRE_DE_SUBSTITUTIONS \ /* "Pre-generation" des constantes fondamentales. */ #define SUBSTITUTION(L_SUBSTITUTION_XX) \ Bblock \ EGAL(num_liste_de_substitution,L_SUBSTITUTION_XX); \ Eblock \ /* Mise en place de la substitution demandee et ce, sans verification ; */ \ /* celle-ci sera faite dans la fonction 'Nsubstitution'... */ #define MODIFICATION_LISTE_DE_COLORIAGE_QUELCONQUE(L_SUBSTITUTION_XX,niveau,niveau_substitue) \ Bblock \ VALIDATION_NIVEAU \ ( \ niveau \ ,BLOC(MISE_A_L_ETAT_INITIAL_LISTE_DE_SUBSTITUTION; \ /* Lorsque les listes n'ont pas ete initialisees, on le fait au prealable... */ \ Test(EST_AUTORISE(ACCES_blocage_des_listes_de_substitution(L_SUBSTITUTION_XX \ ,niveau \ ) \ ) \ ) \ Bblock \ EGAL(ACCES_listes_de_substitution(L_SUBSTITUTION_XX,niveau),niveau_substitue); \ CALCUL_LISTE_INVERSE_DE_SUBSTITUTION(L_SUBSTITUTION_XX,niveau); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ ) \ ,BLOC(PRINT_ERREUR("la modification de 'L_SUBSTITUTION_XX' est invalide"); \ CAL1(Prer1("dans la demande de la substitution de %08X\n",niveau)); \ ) \ ); \ Eblock \ /* Fonction de definition de la substitution de "niveau" par "niveau_substitue" dans une */ \ /* liste de substitution quelconque 'L_SUBSTITUTION_XX'. */ #define MODIFICATION_LISTE_DE_COLORIAGE_X_WINDOW(niveau,niveau_substitue) \ Bblock \ MODIFICATION_LISTE_DE_COLORIAGE_QUELCONQUE(L_SUBSTITUTION_X_WINDOW,niveau,niveau_substitue); \ Eblock \ /* Fonction de definition de la substitution de "niveau" par */ \ /* "niveau_substitue" dans la liste specifique a 'X-Window'. */ #define MODIFICATION_LISTE_DE_SUBSTITUTION(niveau,niveau_substitue) \ Bblock \ MODIFICATION_LISTE_DE_COLORIAGE_QUELCONQUE(L_SUBSTITUTION_VARIABLE,niveau,niveau_substitue); \ Eblock \ /* Fonction de definition de la substitution de "niveau" par */ \ /* "niveau_substitue" dans la liste variable. */ #define MODIFICATION_LISTE_DE_SUBSTITUTION_HISTOGRAMME(niveau,niveau_substitue) \ Bblock \ MODIFICATION_LISTE_DE_COLORIAGE_QUELCONQUE(L_SUBSTITUTION_HISTOGRAMME,niveau,niveau_substitue); \ Eblock \ /* Fonction de definition de la substitution de "niveau" par */ \ /* "niveau_substitue" dans la liste "histogramme" (introduit le 20081004115448). */ #define MODIFICATION_LISTE_DE_COLORIAGE(niveau,niveau_substitue_R,niveau_substitue_V,niveau_substitue_B) \ Bblock \ VALIDATION_NIVEAU \ ( \ niveau \ ,BLOC(Test(EST_AUTORISE(ACCES_blocage_des_listes_de_substitution(L_SUBSTITUTION_ROUGE \ ,niveau \ ) \ ) \ ) \ Bblock \ EGAL(ACCES_listes_de_substitution(L_SUBSTITUTION_ROUGE,niveau),niveau_substitue_R); \ CALCUL_LISTE_INVERSE_DE_SUBSTITUTION(L_SUBSTITUTION_ROUGE,niveau); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Test(EST_AUTORISE(ACCES_blocage_des_listes_de_substitution(L_SUBSTITUTION_VERTE \ ,niveau \ ) \ ) \ ) \ Bblock \ EGAL(ACCES_listes_de_substitution(L_SUBSTITUTION_VERTE,niveau),niveau_substitue_V); \ CALCUL_LISTE_INVERSE_DE_SUBSTITUTION(L_SUBSTITUTION_VERTE,niveau); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Test(EST_AUTORISE(ACCES_blocage_des_listes_de_substitution(L_SUBSTITUTION_BLEUE \ ,niveau \ ) \ ) \ ) \ Bblock \ EGAL(ACCES_listes_de_substitution(L_SUBSTITUTION_BLEUE,niveau),niveau_substitue_B); \ CALCUL_LISTE_INVERSE_DE_SUBSTITUTION(L_SUBSTITUTION_BLEUE,niveau); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ ) \ ,BLOC(PRINT_ERREUR("la modification de la liste de 'COLORIAGE' est invalide"); \ CAL1(Prer1("dans la demande de la substitution de %08X\n",niveau)); \ ) \ ); \ Eblock \ /* Fonction de definition du coloriage de "niveau" par */ \ /* {R,V,B} dans la liste de coloriage variable. */ #define MISE_A_L_ETAT_INITIAL_LISTE_DE_SUBSTITUTION \ Bblock \ Test(EST_FAUX(init_substitution)) \ Bblock \ REINITIALISATION_LISTE_DE_SUBSTITUTION; \ /* Lorsque les listes n'ont pas ete initialisees, on le fait... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Fonction d'initialisation "initiale" des listes de substitution. */ #define REINITIALISATION_LISTE_DE_SUBSTITUTION \ Bblock \ DEFV(genere_p,INIT(niveau_de_manoeuvre,NIVEAU_UNDEF)); \ /* Cette variable est inutile, mais imposee par le fait que 'Nsubstitution(...)' est une */ \ /* fonction et non pas un sous-programme (difference subtile...). */ \ EGAL(init_substitution,FAUX); \ EGAL(niveau_de_manoeuvre,Nsubstitution(NOIR)); \ /* C'est un peu brutal, mais ca marche. On notera que l'on ne peut ecrire directement : */ \ /* */ \ /* DEFV(genere_p,INIT(niveau_de_manoeuvre,Nsubstitution(NOIR))); */ \ /* */ \ /* parce qu'il faut faire au prealable : */ \ /* */ \ /* EGAL(init_substitution,FAUX); */ \ /* */ \ /* si l'on veut que la reinitialisation soit effective... */ \ SUBSTITUTION(L_SUBSTITUTION_NEUTRE); \ Eblock \ /* Fonction de reinitialisation generale des listes de substitution. */ #define NOMBRE_D_ELEMENTS_DE_SUBSTITUTION \ HUIT \ /* Nombre d'elements de liste de substitution que l'on edite par ligne... */ #define NOMBRE_DE_CHIFFRES_DECIMAUX_D_EDITION_DES_NIVEAUX \ NOMBRE_DE_CHIFFRES_DECIMAUX(BLANC) \ /* Nombre de chiffres necessaires pour editer les niveaux (introduit le 20131206151219). */ #define PRINT_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_XX) \ Bblock \ Test(INCLff(L_SUBSTITUTION_XX,L_SUBSTITUTION_FIRST,L_SUBSTITUTION_LAST)) \ Bblock \ MISE_A_L_ETAT_INITIAL_LISTE_DE_SUBSTITUTION; \ /* Lorsque les listes n'ont pas ete initialisees, on le fait au prealable... */ \ \ CAL3(Prme1("Edition de la liste '%d' :",L_SUBSTITUTION_XX)); \ CALS(Fsauts_de_lignes(UN)); \ \ BoIn(index,NOIR,BLANC,PAS_COULEURS) \ Bblock \ Test(IZEQ(REST(NIVR(index),NOMBRE_D_ELEMENTS_DE_SUBSTITUTION))) \ Bblock \ CALS(Fsauts_de_lignes(UN)); \ /* On change de ligne... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ CAL3(Prme4("%0*d->%0*d " \ ,NOMBRE_DE_CHIFFRES_DECIMAUX_D_EDITION_DES_NIVEAUX \ ,index \ ,NOMBRE_DE_CHIFFRES_DECIMAUX_D_EDITION_DES_NIVEAUX \ ,INTE(ACCES_listes_de_substitution(L_SUBSTITUTION_XX,index)) \ ) \ ); \ /* Le 20081004121324 les formats "%02X" ont ete remplaces par "0*d" plus lisibles... */ \ /* */ \ /* Pour 'v $xig/fonct$vv$FON chain_Acopie_avec_gestion_des_formats_des_editions_entieres' */ \ /* il a fallu introduire un 'INTE(...)'s par prudence au cas ou l'expression ne serait */ \ /* pas du type 'Int' (introduit le 20131206170137). */ \ Eblock \ EBoI \ \ CALS(Fsauts_de_lignes(UN)); \ CALS(Fsauts_de_lignes(UN)); \ CAL3(Prme1("Edition de la liste inverse '%d' :",L_SUBSTITUTION_XX)); \ CALS(Fsauts_de_lignes(UN)); \ \ BoIn(index,NOIR,BLANC,PAS_COULEURS) \ Bblock \ Test(IZEQ(REST(NIVR(index),NOMBRE_D_ELEMENTS_DE_SUBSTITUTION))) \ Bblock \ CALS(Fsauts_de_lignes(UN)); \ /* On change de ligne... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ CAL3(Prme4("%0*d->%0*d " \ ,NOMBRE_DE_CHIFFRES_DECIMAUX_D_EDITION_DES_NIVEAUX \ ,index \ ,NOMBRE_DE_CHIFFRES_DECIMAUX_D_EDITION_DES_NIVEAUX \ ,INTE(ACCES_listes_inverses_de_substitution(L_SUBSTITUTION_XX,index)) \ ) \ ); \ /* Le 20081004121324 les formats "%02X" ont ete remplaces par "0*d" plus lisibles... */ \ /* */ \ /* Pour 'v $xig/fonct$vv$FON chain_Acopie_avec_gestion_des_formats_des_editions_entieres' */ \ /* il a fallu introduire un 'INTE(...)'s par prudence au cas ou l'expression ne serait */ \ /* pas du type 'Int' (introduit le 20131206170137). */ \ Eblock \ EBoI \ \ CALS(Fsauts_de_lignes(UN)); \ CALS(Fsauts_de_lignes(UN)); \ Eblock \ ATes \ Bblock \ PRINT_ERREUR("l'edition d'une liste de substitution inexistante a ete demande"); \ Eblock \ ETes \ Eblock \ /* Fonction d'edition d'une liste de substitution quelconque. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* P A S S A G E D ' U N E L I S T E A L ' A U T R E : */ /* */ /* */ /* Utilisation : */ /* */ /* MOVE_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_Arrivee,L_SUBSTITUTION_Depart,niveau_de_depart,niveau_d_arrivee); */ /* */ /* permet de modifier les listes "VARIABLE", */ /* "ROUGE", "VERTE" et "BLEUE" par recopie */ /* entre un niveau de depart et un niveau */ /* d'arrivee (dans un ordre quelconque), a */ /* partir d'une autre liste. */ /* */ /* */ /*************************************************************************************************************************************/ #define MOVE_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_Arrivee,L_SUBSTITUTION_Depart,niveau_de_depart,niveau_d_arrivee) \ Bblock \ Test(IFOU(IFEQ(L_SUBSTITUTION_Arrivee,L_SUBSTITUTION_VARIABLE) \ ,IFOU(IFEQ(L_SUBSTITUTION_Arrivee,L_SUBSTITUTION_ROUGE) \ ,IFOU(IFEQ(L_SUBSTITUTION_Arrivee,L_SUBSTITUTION_VERTE) \ ,IFOU(IFEQ(L_SUBSTITUTION_Arrivee,L_SUBSTITUTION_BLEUE) \ ,TOUJOURS_FAUX \ ) \ ) \ ) \ ) \ ) \ Bblock \ MISE_A_L_ETAT_INITIAL_LISTE_DE_SUBSTITUTION; \ /* Lorsque les listes n'ont pas ete initialisees, on le fait au prealable... */ \ VALIDATION_NIVEAU \ (niveau_de_depart \ ,BLOC( \ VALIDATION_NIVEAU \ (niveau_d_arrivee \ ,BLOC(Bblock \ DEFV(genere_p,INIT(depart,MIN2(niveau_de_depart,niveau_d_arrivee))); \ /* Vrai niveau de depart, */ \ DEFV(genere_p,INIT(arrivee,MAX2(niveau_de_depart,niveau_d_arrivee))); \ /* Vrai niveau d'arrivee. */ \ BoIn(index,depart,arrivee,PAS_COULEURS) \ Bblock \ Test(EST_AUTORISE(ACCES_blocage_des_listes_de_substitution(L_SUBSTITUTION_Arrivee \ ,index \ ) \ ) \ ) \ Bblock \ EGAL(ACCES_listes_de_substitution(L_SUBSTITUTION_Arrivee,index) \ ,ACCES_listes_de_substitution(L_SUBSTITUTION_Depart,index) \ ); \ CALCUL_LISTE_INVERSE_DE_SUBSTITUTION(L_SUBSTITUTION_Arrivee,index); \ /* Puis initialisation des listes "directes" et "inverses". */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ EBoI \ Eblock \ ) \ ,BLOC(PRINT_ERREUR("le niveau d'arrivee est inexistant"); \ ) \ ); \ ) \ ,BLOC(PRINT_ERREUR("le niveau de depart est inexistant"); \ ) \ ); \ Eblock \ ATes \ Bblock \ PRINT_ERREUR("la liste de substitution d'arrivee a 'mover' n'est pas modifiable"); \ Eblock \ ETes \ Eblock /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* L I S S A G E P A R A P P R O X I M A T I O N P A R A B O L I Q U E : */ /* */ /*************************************************************************************************************************************/ #define COEFFICIENT_DE_LISSAGE_PAR_APPROXIMATION_PARABOLIQUE_DE_n_m2 \ NEGA(TROIS) #define COEFFICIENT_DE_LISSAGE_PAR_APPROXIMATION_PARABOLIQUE_DE_n_m1 \ NEUT(DOUZE) #define COEFFICIENT_DE_LISSAGE_PAR_APPROXIMATION_PARABOLIQUE_DE_n_0 \ NEUT(ADD2(SEIZE,UN)) #define COEFFICIENT_DE_LISSAGE_PAR_APPROXIMATION_PARABOLIQUE_DE_n_p1 \ NEUT(COEFFICIENT_DE_LISSAGE_PAR_APPROXIMATION_PARABOLIQUE_DE_n_m1) #define COEFFICIENT_DE_LISSAGE_PAR_APPROXIMATION_PARABOLIQUE_DE_n_p2 \ NEUT(COEFFICIENT_DE_LISSAGE_PAR_APPROXIMATION_PARABOLIQUE_DE_n_m2) #define LISSAGE_PAR_APPROXIMATION_PARABOLIQUE(point_n_m2,point_n_m1,point_n_0,point_n_p1,point_n_p2) \ LRZ5(LISSAGE_PAR_APPROXIMATION_PARABOLIQUE_____coefficient_de__n_m2 \ ,point_n_m2 \ ,LISSAGE_PAR_APPROXIMATION_PARABOLIQUE_____coefficient_de__n_m1 \ ,point_n_m1 \ ,LISSAGE_PAR_APPROXIMATION_PARABOLIQUE_____coefficient_de__n_0 \ ,point_n_0 \ ,LISSAGE_PAR_APPROXIMATION_PARABOLIQUE_____coefficient_de__n_p1 \ ,point_n_p1 \ ,LISSAGE_PAR_APPROXIMATION_PARABOLIQUE_____coefficient_de__n_p2 \ ,point_n_p2 \ ) \ /* Fonction de lissage par approximation parabolique ('v $xtc/lissage.01$c', tout ceci etant */ \ /* tire de 'METHODE DE CALCUL NUMERIQUE' de JP. Nougier, page 120). Le probleme consiste */ \ /* donc a se donner cinq ordonnees {Y(n-2),Y(n-1),Y(n),Y(n+1),Y(n+2)} correspondant a cinq */ \ /* abscisses regulierement espacees. On cherche donc a lisser ces cinq ordonnees au point */ \ /* "central" d'abscisse X(n) ; on utilise des arcs de parabole, ce qui donne : */ \ /* */ \ /* - 3.Y(n-2) + 12.Y(n-1) + 17.Y(n) + 12.Y(n+1) - 3.Y(n+2) */ \ /* Y = --------------------------------------------------------- */ \ /* - 3 + 12 + 17 + 12 - 3 */ \ /* */ \ /* Le 20160603151923 a ete introduite une generalisation via des 'Float'... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C O N V E R S I O N " F L O T T A N T E " D E L A L I S T E D E S U B S T I T U T I O N */ /* C O U R A N T E " S T A N D A R D " : */ /* */ /*************************************************************************************************************************************/ #define CONVERSION_FLOTTANTE_D_UNE_LISTE_DE_SUBSTITUTION(liste_flottante,minimum,maximum,lissage,nombre_de_passes,pas_lisse) \ Bblock \ DEFV(genere_p,INIT(niveau_courant_a_convertir_en_flottant,NIVEAU_UNDEF)); \ \ BoIn(niveau_courant_a_convertir_en_flottant,NOIR,BLANC,PAS_COULEURS) \ Bblock \ EGAL(ITb1(liste_flottante,INDX(niveau_courant_a_convertir_en_flottant,NOIR)) \ ,HOMO(FLOT(Nsubstitution(niveau_courant_a_convertir_en_flottant)) \ ,FLOT__NOIR,FLOT__BLANC \ ,minimum,maximum \ ) \ ); \ /* Conversion de la liste de SUBSTITUTION courante... */ \ Eblock \ EBoI \ \ Test(IL_FAUT(lissage)) \ Bblock \ /* ('v $xtc/lissage.01$c'). */ \ \ DEFV(genere_Float,INIT(minimum_apres_lissage,F_INFINI)); \ DEFV(genere_Float,INIT(maximum_apres_lissage,F_MOINS_L_INFINI)); \ /* Minimum et maximum de 'liste_flottante' apres les passes de lissage. */ \ \ Repe(nombre_de_passes) \ Bblock \ DEFV(genere_p,INIT(niveau_a_lisser,NIVEAU_UNDEF)); \ DEFV(genere_Float,DTb1(liste_flottante_intermediaire_de_substitution,COULEURS)); \ /* Cette table contient la liste de SUBSTITUTION courante convertie en 'genere_Float' au */ \ /* cours des differentes passes de lissage... */ \ \ BoIn(niveau_a_lisser,NOIR,BLANC,PAS_COULEURS) \ Bblock \ EGAL(ITb1(liste_flottante_intermediaire_de_substitution,INDX(niveau_a_lisser,NOIR)) \ ,ITb1(liste_flottante,INDX(niveau_a_lisser,NOIR)) \ ); \ /* Deplacement systematique... */ \ Eblock \ EBoI \ \ BoIn(niveau_a_lisser,NOIR,BLANC,PAS_COULEURS) \ Bblock \ DEFV(genere_Float,INIT(point_n_m2 \ ,ITb1(liste_flottante_intermediaire_de_substitution \ ,INDX(nPREK_TRON(nPREK_TRON(niveau_a_lisser,pas_lisse),pas_lisse),NOIR) \ ) \ ) \ ); \ DEFV(genere_Float,INIT(point_n_m1 \ ,ITb1(liste_flottante_intermediaire_de_substitution \ ,INDX(nPREK_TRON(niveau_a_lisser,pas_lisse),NOIR) \ ) \ ) \ ); \ DEFV(genere_Float,INIT(point_n_0 \ ,ITb1(liste_flottante_intermediaire_de_substitution \ ,INDX(niveau_a_lisser,NOIR) \ ) \ ) \ ); \ DEFV(genere_Float,INIT(point_n_p1 \ ,ITb1(liste_flottante_intermediaire_de_substitution \ ,INDX(nSUCK_TRON(niveau_a_lisser,pas_lisse),NOIR) \ ) \ ) \ ); \ DEFV(genere_Float,INIT(point_n_p2 \ ,ITb1(liste_flottante_intermediaire_de_substitution \ ,INDX(nSUCK_TRON(nSUCK_TRON(niveau_a_lisser,pas_lisse),pas_lisse),NOIR) \ ) \ ) \ ); \ \ EGAL(ITb1(liste_flottante,INDX(niveau_a_lisser,NOIR)) \ ,LISSAGE_PAR_APPROXIMATION_PARABOLIQUE(point_n_m2,point_n_m1,point_n_0,point_n_p1,point_n_p2) \ ); \ /* Lissage par approximation (voir 'METHODE DE CALCUL NUMERIQUE' de JP. Nougier, page 120) */ \ /* avec des morceaux de paraboles qui sont chacun defini par 5 points consecutifs de la */ \ /* liste 'liste_flottante_intermediaire_de_substitution'. On notera que c'est pourquoi, les */ \ /* deux premiers points, ainsi que les deux derniers (5 = 2 + 1 + 2) ne sont pas traites */ \ /* comme les autres (d'ou les fonctions 'nPREK_TRON(...)' et 'nSUCK_TRON(...)'). */ \ Eblock \ EBoI \ Eblock \ ERep \ \ Test(IL_FAUT(CONVERSION_FLOTTANTE_D_UNE_LISTE_DE_SUBSTITUTION_____renormaliser)) \ Bblock \ /* Test introduit le 20130114163012 car, en effet, la renormalisation qui suit peut etre */ \ /* tout a fait nefaste ('v $xci/substitue$K _____renormaliser' a ce propos...). */ \ BoIn(niveau_courant_a_convertir_en_flottant,NOIR,BLANC,PAS_COULEURS) \ /* Jusqu'au 20220505101108, cette boucle de recherche des extrema figurait, par erreur de */ \ /* toute evidence, hors de ce test (et avant evidemment...). */ \ Bblock \ EGAL(minimum_apres_lissage \ ,MIN2(minimum_apres_lissage \ ,ITb1(liste_flottante,INDX(niveau_courant_a_convertir_en_flottant,NOIR)) \ ) \ ); \ EGAL(maximum_apres_lissage \ ,MAX2(maximum_apres_lissage \ ,ITb1(liste_flottante,INDX(niveau_courant_a_convertir_en_flottant,NOIR)) \ ) \ ); \ /* Calcul du minimum et du maximum de 'liste_flottante' apres les passes de lissage. */ \ Eblock \ EBoI \ \ BoIn(niveau_courant_a_convertir_en_flottant,NOIR,BLANC,PAS_COULEURS) \ Bblock \ EGAL(ITb1(liste_flottante,INDX(niveau_courant_a_convertir_en_flottant,NOIR)) \ ,HOMO(ITb1(liste_flottante,INDX(niveau_courant_a_convertir_en_flottant,NOIR)) \ ,minimum_apres_lissage,maximum_apres_lissage \ ,minimum,maximum \ ) \ ); \ /* Et enfin, renormalisation de 'liste_flottante' par rapport aux extrema effectifs apres */ \ /* les passes de lissage. On notera que cela a ete ajoute le 19980903124014 car cette */ \ /* renormalisation manquait clairement... */ \ Eblock \ EBoI \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Procedure de conversion de la liste de SUBSTITUTION courante en une liste flottante */ \ /* eventuellement lissee... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* " S C A L I N G " E N T R E D E U X N I V E A U X : */ /* */ /* */ /* Utilisation : */ /* */ /* SCALING_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_XX,niveau_de_depart,niveau_d_arrivee); */ /* */ /* permet de modifier les listes "VARIABLE", */ /* "ROUGE", "VERTE" et "BLEUE" par mise a */ /* l'echelle entre un niveau de depart et un */ /* niveau d'arrivee (dans un ordre quel- */ /* conque). La mise a l'echelle est dy type */ /* lineaire, soit 'A.n + B'. */ /* */ /* */ /*************************************************************************************************************************************/ #define SCALING_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_XX,niveau_de_depart,niveau_d_arrivee,multiplieur,translateur) \ Bblock \ Test(IFOU(IFEQ(L_SUBSTITUTION_XX,L_SUBSTITUTION_VARIABLE) \ ,IFOU(IFEQ(L_SUBSTITUTION_XX,L_SUBSTITUTION_ROUGE) \ ,IFOU(IFEQ(L_SUBSTITUTION_XX,L_SUBSTITUTION_VERTE) \ ,IFOU(IFEQ(L_SUBSTITUTION_XX,L_SUBSTITUTION_BLEUE) \ ,FAUX \ ) \ ) \ ) \ ) \ ) \ Bblock \ MISE_A_L_ETAT_INITIAL_LISTE_DE_SUBSTITUTION; \ /* Lorsque les listes n'ont pas ete initialisees, on le fait au prealable... */ \ VALIDATION_NIVEAU \ (niveau_de_depart \ ,BLOC( \ VALIDATION_NIVEAU \ (niveau_d_arrivee \ ,BLOC(Bblock \ DEFV(genere_p,INIT(depart,MIN2(niveau_de_depart,niveau_d_arrivee))); \ /* Vrai niveau de depart, */ \ DEFV(genere_p,INIT(arrivee,MAX2(niveau_de_depart,niveau_d_arrivee))); \ /* Vrai niveau d'arrivee. */ \ BoIn(index,depart,arrivee,PAS_COULEURS) \ Bblock \ Test(EST_AUTORISE(ACCES_blocage_des_listes_de_substitution(L_SUBSTITUTION_XX \ ,index \ ) \ ) \ ) \ Bblock \ EGAL(ACCES_listes_de_substitution(L_SUBSTITUTION_XX,index) \ ,GENP(TRNF(AXPB(FLOT(multiplieur) \ ,FLOT(NIVR(ACCES_listes_de_substitution \ (L_SUBSTITUTION_XX \ ,index \ ) \ ) \ ) \ ,FLOT(translateur) \ ) \ ) \ ) \ ); \ /* ATTENTION : il y a des 'FLOT' partout, car sinon, le compilateur */ \ /* genere un code incorrect... */ \ CALCUL_LISTE_INVERSE_DE_SUBSTITUTION(L_SUBSTITUTION_XX,index); \ /* Puis initialisation des listes "directes" et "inverses". */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ EBoI \ Eblock \ ) \ ,BLOC(PRINT_ERREUR("le niveau d'arrivee est inexistant"); \ ) \ ); \ ) \ ,BLOC(PRINT_ERREUR("le niveau de depart est inexistant"); \ ) \ ); \ Eblock \ ATes \ Bblock \ PRINT_ERREUR("la liste de substitution a interpoler n'est pas modifiable"); \ Eblock \ ETes \ Eblock /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I N T E R P O L A T I O N E N T R E D E U X N I V E A U X : */ /* */ /* */ /* Utilisation : */ /* */ /* INTERPOLATION_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_XX,niveau_de_depart,niveau_d_arrivee); */ /* INTERPOLATION_ENTRE_DEUX_NIVEAUX(niveau_1,niveau_2,niveau_substitue_1,niveau_substitue_2); */ /* */ /* permet de modifier les listes "VARIABLE", */ /* "ROUGE", "VERTE" et "BLEUE" par interpo- */ /* lation entre un niveau de depart et un */ /* niveau d'arrivee (dans un ordre quel- */ /* conque), ou specifiquement la liste */ /* "VARIABLE" pour la deuxieme primitive. */ /* */ /* */ /*************************************************************************************************************************************/ #define INTERPOLATION_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_XX,niveau_de_depart,niveau_d_arrivee) \ Bblock \ Test(IFOU(IFEQ(L_SUBSTITUTION_XX,L_SUBSTITUTION_VARIABLE) \ ,IFOU(IFEQ(L_SUBSTITUTION_XX,L_SUBSTITUTION_ROUGE) \ ,IFOU(IFEQ(L_SUBSTITUTION_XX,L_SUBSTITUTION_VERTE) \ ,IFOU(IFEQ(L_SUBSTITUTION_XX,L_SUBSTITUTION_BLEUE) \ ,FAUX \ ) \ ) \ ) \ ) \ ) \ Bblock \ MISE_A_L_ETAT_INITIAL_LISTE_DE_SUBSTITUTION; \ /* Lorsque les listes n'ont pas ete initialisees, on le fait au prealable... */ \ VALIDATION_NIVEAU \ (niveau_de_depart \ ,BLOC( \ VALIDATION_NIVEAU \ (niveau_d_arrivee \ ,BLOC(Bblock \ DEFV(genere_p,INIT(depart,MIN2(niveau_de_depart,niveau_d_arrivee))); \ /* Vrai niveau de depart, */ \ DEFV(genere_p,INIT(arrivee,MAX2(niveau_de_depart,niveau_d_arrivee))); \ /* Vrai niveau d'arrivee. */ \ BoIn(index,depart,arrivee,PAS_COULEURS) \ Bblock \ Test(EST_AUTORISE(ACCES_blocage_des_listes_de_substitution(L_SUBSTITUTION_XX \ ,index \ ) \ ) \ ) \ Bblock \ EGAL(ACCES_listes_de_substitution(L_SUBSTITUTION_XX,index) \ ,GENP(NIVA(ADD2(FLOT(NIVR(ACCES_listes_de_substitution \ (L_SUBSTITUTION_XX \ ,depart \ ) \ ) \ ) \ ,SCAL(SOUS(FLOT(NIVR(ACCES_listes_de_substitution \ (L_SUBSTITUTION_XX \ ,arrivee \ ) \ ) \ ) \ ,FLOT(NIVR(ACCES_listes_de_substitution \ (L_SUBSTITUTION_XX \ ,depart \ ) \ ) \ ) \ ) \ ,SOUS(FLOT(arrivee),FLOT(depart)) \ ,SOUS(FLOT(index),FLOT(depart)) \ ) \ ) \ ) \ ) \ ); \ /* ATTENTION : il y a des 'FLOT' partout, car sinon, le compilateur */ \ /* genere un code incorrect... */ \ CALCUL_LISTE_INVERSE_DE_SUBSTITUTION(L_SUBSTITUTION_XX,index); \ /* Puis initialisation des listes "directes" et "inverses". */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ EBoI \ Eblock \ ) \ ,BLOC(PRINT_ERREUR("le niveau d'arrivee est inexistant"); \ ) \ ); \ ) \ ,BLOC(PRINT_ERREUR("le niveau de depart est inexistant"); \ ) \ ); \ Eblock \ ATes \ Bblock \ PRINT_ERREUR("la liste de substitution a interpoler n'est pas modifiable"); \ Eblock \ ETes \ Eblock #define INTERPOLATION_ENTRE_DEUX_NIVEAUX(niveau_1,niveau_2,niveau_substitue_1,niveau_substitue_2) \ Bblock \ MODIFICATION_LISTE_DE_SUBSTITUTION(niveau_1,niveau_substitue_1); \ MODIFICATION_LISTE_DE_SUBSTITUTION(niveau_2,niveau_substitue_2); \ INTERPOLATION_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_VARIABLE,niveau_1,niveau_2); \ Eblock \ /* Passage du segment [niveau_1,niveau_2] au segment */ \ /* [niveau_substitue_1,niveau_substitue_2]. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* L I S S A G E E N T R E D E U X N I V E A U X : */ /* */ /* */ /* Utilisation : */ /* */ /* LISSAGE_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_XX,niveau_D1,niveau_D2,niveau_A3,niveau_A4,facteur_derivees); */ /* LISSAGE_ENTRE_QUATRE_NIVEAUX(niv_1,niv_2,niv_3,niv_4,subst_1,subst_2,subst_3,subst_4,facteur_derivees); */ /* */ /* permet de modifier les listes "ROUGE", */ /* "VERTE", "BLEUE" et "VARAIBLE" par lissage */ /* defini par quatre niveaux, et controle par */ /* un facteur, et ce a l'aide d'une interpolation */ /* bi-cubique. */ /* */ /* */ /*************************************************************************************************************************************/ #define LISSAGE_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_XX,niveau_D1,niveau_D2,niveau_A3,niveau_A4,facteur_des_derivees) \ Bblock \ Test(IFOU(IFEQ(L_SUBSTITUTION_XX,L_SUBSTITUTION_VARIABLE) \ ,IFOU(IFEQ(L_SUBSTITUTION_XX,L_SUBSTITUTION_ROUGE) \ ,IFOU(IFEQ(L_SUBSTITUTION_XX,L_SUBSTITUTION_VERTE) \ ,IFOU(IFEQ(L_SUBSTITUTION_XX,L_SUBSTITUTION_BLEUE) \ ,FAUX \ ) \ ) \ ) \ ) \ ) \ Bblock \ Test(IFET(IFLT(niveau_D1,niveau_D2) \ ,IFET(IFLT(niveau_D2,niveau_A3) \ ,IFET(IFLT(niveau_A3,niveau_A4) \ ,VRAI \ ) \ ) \ ) \ ) \ Bblock \ MISE_A_L_ETAT_INITIAL_LISTE_DE_SUBSTITUTION; \ /* Lorsque les listes n'ont pas ete initialisees, on le fait au prealable... */ \ VALIDATION_NIVEAU \ (niveau_D1 \ ,BLOC( \ VALIDATION_NIVEAU \ (niveau_A4 \ ,BLOC(Bblock \ DEFV(genere_p,INIT(niveau_D,NIVEAU_UNDEF)); \ DEFV(genere_p,INIT(niveau_A,NIVEAU_UNDEF)); \ /* Definition des niveaux de depart 'D' ('D1' ou 'D2') et d'arrivee 'A' ('A4' ou 'A3') selon */ \ /* l'indicateur 'interpoler_les_listes_de_substitution_entre_D2_et_A3'... */ \ \ DEFV(genere_Float,INIT(niveau_de_depart,FLOT__NIVEAU_UNDEF)); \ DEFV(Float,INIT(derivee_de_depart \ ,MUL2(facteur_des_derivees \ ,DEFINITION_DES_DERIVEES \ (______NORMALISE_NIVEAU(ACCES_listes_de_substitution \ (L_SUBSTITUTION_XX,niveau_D1) \ ) \ ,______NORMALISE_NIVEAU(ACCES_listes_de_substitution \ (L_SUBSTITUTION_XX,niveau_D2) \ ) \ ) \ ) \ ) \ ); \ /* Definition du "point de depart" de l'interpolation... */ \ DEFV(genere_Float,INIT(niveau_d_arrivee,FLOT__NIVEAU_UNDEF)); \ DEFV(Float,INIT(derivee_d_arrivee \ ,MUL2(facteur_des_derivees \ ,DEFINITION_DES_DERIVEES \ (______NORMALISE_NIVEAU(ACCES_listes_de_substitution \ (L_SUBSTITUTION_XX,niveau_A3) \ ) \ ,______NORMALISE_NIVEAU(ACCES_listes_de_substitution \ (L_SUBSTITUTION_XX,niveau_A4) \ ) \ ) \ ) \ ) \ ); \ /* Definition du "point d'arrivee" de l'interpolation... */ \ \ Test(IL_FAUT(interpoler_les_listes_de_substitution_entre_D2_et_A3)) \ Bblock \ EGAL(niveau_D,niveau_D2); \ EGAL(niveau_A,niveau_A3); \ /* Cas de l'interpolation D2-->A3 (mode unique existant anterieurement a 19970929115853). */ \ Eblock \ ATes \ Bblock \ EGAL(niveau_D,niveau_D1); \ EGAL(niveau_A,niveau_A4); \ /* Cas de l'interpolation D1-->A4 (mode nouveau introduit le 19970929115853 et correspondant */ \ /* au fonctionnement par defaut...). */ \ Eblock \ ETes \ \ INIT(niveau_de_depart \ ,______NORMALISE_NIVEAU(ACCES_listes_de_substitution(L_SUBSTITUTION_XX,niveau_D)) \ ); \ INIT(niveau_d_arrivee \ ,______NORMALISE_NIVEAU(ACCES_listes_de_substitution(L_SUBSTITUTION_XX,niveau_A)) \ ); \ \ BoIn(index,niveau_D,niveau_A,PAS_COULEURS) \ Bblock \ Test(EST_AUTORISE(ACCES_blocage_des_listes_de_substitution(L_SUBSTITUTION_XX \ ,index \ ) \ ) \ ) \ Bblock \ DEFV(Float,INIT(parametre_t \ ,DIVI(FLOT(SOUS(index,niveau_D)) \ ,FLOT(SOUS(niveau_A,niveau_D)) \ ) \ ) \ ); \ /* Parametre courant d'interpolation cubique 't'. ATTENTION, jusqu'au 19971117093839, il */ \ /* y a eu par erreur ici : */ \ /* */ \ /* DEFV(Float,INIT(parametre_t */ \ /* ,DIVI(FLOT(SOUS(index,niveau_D2)) */ \ /* ,FLOT(SOUS(niveau_A3,niveau_D2)) */ \ /* ) */ \ /* ) */ \ /* ); */ \ /* */ \ /* il y a donc quelques palettes incorrectes qui ont ete regenerees ('$xiP/abso.46$Z', */ \ /* '$xiP/abso.47$Z' et '$xiP/abso.48$Z' ; cela a donc des consequences sur les images */ \ /* '$xiirf/PAYS.r*' et '$xiirf/PAYS.s*' qui utilisent '$xiP/abso.48$Z'). */ \ \ EGAL(ACCES_listes_de_substitution(L_SUBSTITUTION_XX,index) \ ,GENP(a__DENORMALISE_NIVEAU(INTERPOLATION_CUBIQUE(niveau_de_depart \ ,derivee_de_depart \ ,niveau_d_arrivee \ ,derivee_d_arrivee \ ,parametre_t \ ) \ ,epsilon_de_LISSAGE_LISTE_DE_SUBSTITUTION \ ) \ ) \ ); \ /* L'interpolation cubique se fait entre les points 'niveau_D2' et 'niveau_A3', avec */ \ /* comme derivees respectives 'niveau_D2-niveau_D1' et 'niveau_A4-niveau_A3' et non pas */ \ /* 'niveau_A3-niveau_D1' et 'niveau_A4-niveau_D2' comme cela aurait ete le cas en utilisant */ \ /* une formule du type de celle utilisee dans 'Ivisualisation_arc_de_cubique_4P()'... */ \ /* */ \ /* On notera le 20040910134825 le remplacement de '__DENORMALISE_NIVEAU(...)' par */ \ /* 'a__DENORMALISE_NIVEAU(...)' a cause d'un phenomene mis en evidence dans la commande */ \ /* 'v $xciP/LISSE$K GET_ARGUMENTSf' et qui fait qu'en general : */ \ /* */ \ /* __DENORMALISE_NIVEAU(______NORMALISE_NIVEAU(niveau)) # niveau */ \ /* */ \ /* et meme : */ \ /* */ \ /* __DENORMALISE_NIVEAU(______NORMALISE_NIVEAU(niveau)) < niveau */ \ /* */ \ /* Cela a donc des consequences ennuyeuses dans 'v $xigP/.INTERPOLE$Y .xciP/LISSE.X' */ \ /* ce qui s'est manifeste a cette date dans 'v $xigP/gris.52.1$Z'. */ \ \ CALCUL_LISTE_INVERSE_DE_SUBSTITUTION(L_SUBSTITUTION_XX,index); \ /* Puis initialisation des listes "directes" et "inverses". */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ EBoI \ Eblock \ ) \ ,BLOC(PRINT_ERREUR("le niveau d'arrivee est inexistant"); \ ) \ ); \ ) \ ,BLOC(PRINT_ERREUR("le niveau de depart est inexistant"); \ ) \ ); \ Eblock \ ATes \ Bblock \ PRINT_ERREUR("l'ordre des niveaux argument est incompatible avec la methode"); \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ PRINT_ERREUR("la liste de substitution a lisser n'est pas modifiable"); \ Eblock \ ETes \ Eblock #define LISSAGE_ENTRE_QUATRE_NIVEAUX(niv_1,niv_2,niv_3,niv_4,subst_1,subst_2,subst_3,subst_4,facteur_des_derivees) \ Bblock \ MODIFICATION_LISTE_DE_SUBSTITUTION(niv_1,subst_1); \ MODIFICATION_LISTE_DE_SUBSTITUTION(niv_2,subst_2); \ MODIFICATION_LISTE_DE_SUBSTITUTION(niv_3,subst_3); \ MODIFICATION_LISTE_DE_SUBSTITUTION(niv_4,subst_4); \ LISSAGE_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_VARIABLE,niv_1,niv_2,niv_3,niv_4,facteur_des_derivees); \ Eblock \ /* Passage du segment [niv_1,niv_2] au segment [subst_1,subst_2] par une interpolation */ \ /* bi-cubique. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* N O T I O N D ' E C R A S E M E N T : */ /* */ /* */ /* Definition : */ /* */ /* Avant les operations 'Vf', */ /* "calibrage" et "substitution" */ /* d'un point de coordonnees {X,Y}, */ /* on regarde le niveau anterieur ; */ /* ce niveau anterieur est un index */ /* dans un vecteur d'autorisation */ /* indiquant si l'on a le droit */ /* de l'ecraser ou pas... */ /* */ /* */ /* Utilisation : */ /* */ /* ECRASEMENT_AUTORISE(niveau); */ /* ECRASEMENT_INTERDIT(niveau); */ /* */ /* qui permettent d'autoriser et */ /* d'interdire individuellement */ /* chaque niveau, et */ /* */ /* TOUS_ECRASEMENTS_AUTORISES; */ /* */ /* qui (re-)autorise l'ecrasement */ /* de tous les niveaux. */ /* */ /* */ /*************************************************************************************************************************************/ #define ACCES_liste_d_ecrasement(index) \ ITb1(liste_d_ecrasement,INDX(index,NOIR)) \ /* Pour indexer la liste d'ecrasement. */ #define TOUS_ECRASEMENTS_AUTORISES \ Bblock \ EGAL(init_ecrasement,FAUX); \ Necrasement(NOIR); \ Eblock \ /* Ainsi, on force la reinitialisation sur 'AUTORISE' de toute */ \ /* la liste des ecrasements. */ #define ECRASEMENT_AUTORISE(niveau) \ Bblock \ VALIDATION_NIVEAU \ ( \ niveau \ ,BLOC(Necrasement(niveau); \ /* On appelle 'Necrasement' afin d'initialiser eventuellement la */ \ /* liste avant de la modifier... */ \ EGAL(ACCES_liste_d_ecrasement(niveau),AUTORISE); \ /* Mise a jour de la liste d'ecrasement. */ \ ) \ ,BLOC(PRINT_ERREUR("l'ecrasement autorise est demande pour un NIVEAU inexistant"); \ CAL1(Prer1("ce NIVEAU est %08X\n",niveau)); \ ) \ ); \ Eblock #define ECRASEMENT_INTERDIT(niveau) \ Bblock \ VALIDATION_NIVEAU \ ( \ niveau \ ,BLOC(Necrasement(niveau); \ /* On appelle 'Necrasement' afin d'initialiser eventuellement la */ \ /* liste avant de la modifier... */ \ EGAL(ACCES_liste_d_ecrasement(niveau),INTERDIT); \ /* Mise a jour de la liste d'ecrasement. */ \ ) \ ,BLOC(PRINT_ERREUR("l'ecrasement interdit est demande pour un NIVEAU inexistant"); \ CAL1(Prer1("ce NIVEAU est %08X\n",niveau)); \ ) \ ); \ Eblock /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* N O T I O N D E T A B L E D E M U L T I P L I C A T I O N G E N E R A L I S E E : */ /* */ /* */ /* Definition : */ /* */ /* Nous allons definir la notion de */ /* produit generalise ; il s'agit la */ /* d'une operation binaire en general */ /* non commutative. On se donne deux */ /* images 'A1' et 'A2', et une matrice */ /* [COULEURS][COULEURS] qui donne pour */ /* chaque couple de niveaux (n(A1),n(A2)) */ /* le niveau n(R) de l'image resultante. */ /* */ /* On peut considerer cela comme une */ /* extension bi-dimensionnelle des */ /* listes de substitution. */ /* */ /* */ /* Utilisation : */ /* */ /* INITIALISATION_QUELCONQUE_TABLE_DE_MULTIPLICATION(table_de_multiplication,DEFINITION_DU_PRODUIT); */ /* */ /* permet d'initialiser une table de multiplication */ /* de facon tout a fait arbitraire, et : */ /* */ /* INITIALISATION_TABLE_DE_MULTIPLICATION(table_de_multiplication,DEFINITION_DU_PRODUIT); */ /* */ /* permet d'initialiser une table de multiplication */ /* a l'aide d'une certaine definition, et par */ /* exemple : 'PRODUIT_OU_FLOU',... */ /* */ /* */ /*************************************************************************************************************************************/ TypedefD2(table_de_multiplication_generalisee,COULEURS,COULEURS,genere_p) TypedefS(A___table_de_multiplication_generalisee,table_de_multiplication_generalisee) TypedefS(E___table_de_multiplication_generalisee,table_de_multiplication_generalisee) /* Definition du type "table_de_multiplication_generalisee" en tant que */ /* tableau rectangulaire, dont les dimensions sont COULEURSxCOULEURS. */ #define PRODUIT_NIVEAU1(niveau1,niveau2) \ GENP(niveau1) #define PRODUIT_NIVEAU2(niveau1,niveau2) \ GENP(niveau2) /* Introduit preventivement le 20081228114814 pour 'v $xiii/di_image$FON 20081228112836', */ /* l'une de ces deux procedures assurant l'independance vis-a-vis de l'etat anterieur. En */ /* effet, 'PRODUIT_NIVEAU1(...)' et 'PRODUIT_NIVEAU2(...)' sont independants de 'niveau2' */ /* et de 'niveau1' respectivement... */ #define PRODUIT_OU_LOGIQUE(niveau1,niveau2) \ GENP(VOR(niveau1,niveau2)) \ /* Definition du "OU logique". */ #define PRODUIT_ET_LOGIQUE(niveau1,niveau2) \ GENP(VAND(niveau1,niveau2)) \ /* Definition du "ET logique". */ #define PRODUIT_EOR_LOGIQUE(niveau1,niveau2) \ GENP(VEOR(niveau1,niveau2)) \ /* Definition du "OU EXCLUSIF logique". */ #define PRODUIT_OU_FLOU(niveau1,niveau2) \ GENP(VMAX(niveau1,niveau2)) \ /* Definition du "OU flou". */ #define PRODUIT_ET_FLOU(niveau1,niveau2) \ GENP(VMIN(niveau1,niveau2)) \ /* Definition du "ET flou". */ #define PRODUIT_EOR_FLOU(niveau1,niveau2) \ GENP(VMINMAX(niveau1,niveau2)) \ /* Definition du "OU EXCLUSIF flou". */ #define PRODUIT_MOYENNE(niveau1,niveau2) \ GENP(NIVA(MOYE(NIVR(niveau1),NIVR(niveau2)))) \ /* Definition de la "moyenne" de deux images. */ #define POINTS_DE_NIVEAUX_DIFFERENTS \ NOIR \ /* Niveau caracterisant les points de deux images ayant des niveaux differents, */ #define POINTS_DE_MEME_NIVEAU \ BLANC \ /* Niveau caracterisant les points de deux images ayant le meme niveau. */ #define PRODUIT_IDENTITE(niveau1,niveau2) \ GENP(COND(IFEQ(niveau1,niveau2),POINTS_DE_MEME_NIVEAU,POINTS_DE_NIVEAUX_DIFFERENTS)) \ /* Definition de la recherche des points de meme niveau sur deux images. */ #define PRODUIT_DISTANCE_NOIR(niveau1,niveau2) \ GENP(NIVA(SOUA(niveau1,niveau2))) \ /* Definition de la "distance" 'NOIR' de deux images. On aura par exemple : */ \ /* */ \ /* PRODUIT_DISTANCE(niveau,niveau) = NOIR quel que soit 'niveau', */ \ /* PRODUIT_DISTANCE(NOIR,BLANC) = BLANC, */ \ /* */ \ /* Ainsi pour deux niveaux identiques, on obtient 'NOIR', puis, plus la difference entre */ \ /* les deux niveaux augmente, plus on s'approche de 'BLANC'... */ #define PRODUIT_DISTANCE_BLANC(niveau1,niveau2) \ GENP(NIVA(SOUS(BLANC,NIVA(SOUA(niveau1,niveau2))))) \ /* Definition de la "distance" 'BLANC' de deux images. On aura par exemple : */ \ /* */ \ /* PRODUIT_DISTANCE(niveau,niveau) = BLANC quel que soit 'niveau', */ \ /* PRODUIT_DISTANCE(NOIR,BLANC) = NOIR, */ \ /* */ \ /* Ainsi pour deux niveaux identiques, on obtient 'BLANC', puis, plus la difference entre */ \ /* les deux niveaux augmente, plus on s'approche de 'NOIR'... */ #define PRODUIT_MASQUE(niveau1,niveau2) \ GENP(COND(IFEQ(niveau1,NOIR),niveau2,niveau1)) \ /* Definition du masquage de 'niveau2' par 'niveau1' : */ \ /* */ \ /* NOIR SUCK(NOIR) n1 BLANC */ \ /* |------------------------------ */ \ /* NOIR | NOIR SUCK(NOIR)...n1....BLANC */ \ /* | . . . . */ \ /* | . . . . */ \ /* | . . . . */ \ /* | . . . . */ \ /* | . . . . */ \ /* | . . . . */ \ /* | . . . . */ \ /* n2 | n2 SUCK(NOIR)...n1....BLANC */ \ /* | . . . . */ \ /* | . . . . */ \ /* | . . . . */ \ /* | . . . . */ \ /* | . . . . */ \ /* BLANC |BLANC SUCK(NOIR)...n1....BLANC */ \ /* */ \ /* on peut considerer que 'niveau1' est devant 'niveau2'. */ #define PRODUIT_ANTI_MASQUE(niveau1,niveau2) \ GENP(COND(IFEQ(niveau1,NOIR),niveau1,niveau2)) \ /* Definition de l'anti-masquage de 'niveau2' par 'niveau1' : */ \ /* */ \ /* NOIR SUCK(NOIR) n1 BLANC */ \ /* |------------------------------ */ \ /* NOIR | NOIR NOIR......NOIR...NOIR */ \ /* | . . . . */ \ /* | . . . . */ \ /* | . . . . */ \ /* | . . . . */ \ /* | . . . . */ \ /* | . . . . */ \ /* | . . . . */ \ /* n2 | NOIR n2.......n2......n2 */ \ /* | . . . . */ \ /* | . . . . */ \ /* | . . . . */ \ /* | . . . . */ \ /* | . . . . */ \ /* BLANC | NOIR BLANC... BLANC...BLANC */ \ /* */ #define PRODUIT_MASQUE_ANTI_ALIASE(niveau1,niveau2) \ GENP(COND(IFLT(niveau1 \ ,NIVA(DIVI(FLOT(NIVR(niveau2)),ADD2(FU,______NORMALISE_NIVEAU(niveau2)))) \ ) \ ,NIVA(AXPB(NEGA(______NORMALISE_NIVEAU(niveau2)) \ ,NIVR(niveau1) \ ,NIVR(niveau2) \ ) \ ) \ ,niveau1 \ ) \ ) \ /* Definition du masquage "anti-aliase" de 'niveau2' par 'niveau1' : */ \ /* */ \ /* ^ */ \ /* PR | */ \ /* | */ \ /* BLANC |-----------------------------* */ \ /* | * | */ \ /* | * | */ \ /* | * | */ \ /* | * | */ \ /* n2 * * | */ \ /* | * * | */ \ /* | * * | */ \ /* | * * | */ \ /* |-----------P | */ \ /* | . | . | */ \ /* | . | . | */ \ /* | . | . | */ \ /* | . | . | */ \ /* NOIR | . | . | */ \ /* -------------------------------------------> */ \ /* NOIR BLANC n1 */ \ /* */ \ /* on peut considerer que 'niveau1' est devant 'niveau2' avec une certaine transparence */ \ /* faisant effet d'"anti-aliasing"... */ \ /* */ \ /* Le produit PR(n1,n2) decroit d'abord suivant l'equation lineaire : */ \ /* */ \ /* n2 */ \ /* PR(n1,n2) = - -------.n1 + n2 */ \ /* BLANC */ \ /* */ \ /* puis croit ensuite suivant l'equation lineaire : */ \ /* */ \ /* PR(n1,n2) = n1 */ \ /* */ \ /* le "point de rebroussement" (ou le produit PR(n1,n2) est egal a n1) 'P' a lieu pour : */ \ /* */ \ /* n2 */ \ /* n1 = ------------- */ \ /* n2 */ \ /* 1 + ------- */ \ /* BLANC */ \ /* */ \ /* Ceci fut introduit le 20090126101208... */ #define PRODUIT_GENERAL(niveau1,niveau2) \ GENP(TRNF(SCAL(FLOT(NIVR(niveau2)) \ ,FLOT(NIVR(BLANC)) \ ,FLOT(NIVR(niveau1)) \ ) \ ) \ ) \ /* Definition du produit de 'niveau2' par 'niveau1' : */ \ /* */ \ /* NOIR n1 BLANC */ \ /* |------------------- */ \ /* NOIR | NOIR..........NOIR */ \ /* | .\ . . */ \ /* | . \ . . */ \ /* | . \ . . */ \ /* | . \ . . */ \ /* | . \. . */ \ /* n2 | NOIR...\.......n2 */ \ /* | . .\ . */ \ /* | . . \ . F(n1,n2) = SCAL(n2,BLANC,n1). */ \ /* | . . \ . */ \ /* | . . \ . */ \ /* | . . \ . */ \ /* | . . \ . */ \ /* | . . \. */ \ /* BLANC |NOIR....n1....BLANC */ \ /* */ #define PRODUIT_DEPTH_CUEING(niveau1,niveau2) \ PRODUIT_GENERAL(VCOMP(niveau1),niveau2) \ /* Definition de l'attenuation de type "depth-cueing" de 'niveau2' par 'niveau1' : */ \ /* */ \ /* NOIR n1 BLANC */ \ /* |------------------- */ \ /* NOIR | NOIR..........NOIR */ \ /* | .\ . NOIR */ \ /* | . \ . NOIR */ \ /* | . \ . NOIR */ \ /* | . \ . NOIR */ \ /* | . \. . */ \ /* n2 | n2...NOIR . */ \ /* | . \ . */ \ /* | . \ . F(n1,n2) = SCAL(n2,BLANC,BLANC-n1). */ \ /* | . \ . */ \ /* | . \ . */ \ /* | . \ NOIR */ \ /* | . \NOIR */ \ /* | . NOIR */ \ /* BLANC |BLANC..........NOIR */ \ /* */ #define PRODUIT_BRUME(niveau1,niveau2) \ GENP(BARY(niveau2 \ ,BLANC \ ,______NORMALISE_NIVEAU(niveau1) \ ) \ ) \ /* Definition de l'effet de brume de 'niveau2' par 'niveau1' : */ \ /* */ \ /* n1 - NOIR */ \ /* F(n1,n2) = BARY(n2,BLANC,--------------) */ \ /* BLANC - NOIR */ \ /* */ \ /* ATTENTION, on notera bien que l'on n'ecrit pas : */ \ /* */ \ /* GENP(TRNF(BARY(NIVR(niveau2) */ \ /* ,NIVR(BLANC) */ \ /* ,DIVI(FLOT(NIVR(niveau1)),FLOT(NIVR(BLANC))) */ \ /* ) */ \ /* ) */ \ /* ) */ \ /* */ \ /* afin que que les relations suivantes soient verifiees... */ \ /* */ \ /* On notera les valeurs particulieres suivantes : */ \ /* */ \ /* F(Z,NOIR) = Z */ \ /* F(Z,BLANC) = BLANC quel que soit le 'Z', */ \ /* */ \ /* ou 'Z' designe la troisieme coordonnee vue comme un "pixel"... */ %define PRODUIT_TRANSPARENCE__01(niveau1,niveau2) \ GENP(TRNF(ADD2(SCAL(FLOT(NIVR(niveau2)) \ ,FLOT(NIVR(BLANC)) \ ,SOUS(FLOT(NIVR(BLANC)) \ ,MOIT(FLOT(NIVR(niveau1))) \ ) \ ) \ ,MOIT(FLOT(NIVR(niveau1))) \ ) \ ) \ ) /* Definition de la transparence de 'niveau2' vu a travers 'niveau1' : */ /* */ /* Cette fonction ramene, par une regle de trois, 'niveau2', qui etait */ /* initialement dans le segment [NOIR,BLANC], dans le segment [niveau1/2,BLANC] : */ /* */ /* NOIR n1 BLANC */ /* |------------------- */ /* NOIR | NOIR..n1/2....GRIS */ /* | . . GRIS */ /* | . . . */ /* | . . . */ /* | . . . */ /* | . . . n1 */ /* | . . . BLANC - ---- */ /* | . . . 2 n1 */ /* n2 | ....... . F(n1,n2) = n2 x -------------- + ----. */ /* | . . . BLANC 2 */ /* | . . . */ /* | . . . */ /* | . . . */ /* | . . BLANC */ /* BLANC |BLANC.BLANC...BLANC */ /* */ /* On notera que 'PRODUIT_TRANSPARENCE__01/02/03/04/05/06(niveau1,niveau2)' */ /* sont definis par "%define" et non par "#define" afin de pouvoir utiliser le nouvel */ /* operateur de concatenation "`" du pre-processeur : il faut que leur substitution ait */ /* lieu apres la gestion de cet operateur de concatenation... */ %define PRODUIT_TRANSPARENCE__02(niveau1,niveau2) \ GENP(TRNF(ADD2(FLOT(NIVR(niveau1)) \ ,FLOT(NIVR(niveau2)) \ ) \ ) \ ) /* Definition de la transparence de 'niveau2' vu a travers 'niveau1' : */ /* */ /* Cette fonction translate 'niveau2', qui etait initialement dans le segment */ /* [NOIR,BLANC], dans le segment [NOIR+niveau1,BLANC+niveau1] ramene par TRONcation au */ /* segment [NOIR+niveau1,BLANC] : */ /* */ /* NOIR n1 BLANC */ /* |------------------- */ /* NOIR | NOIR...n1....BLANC */ /* | . . BLANC */ /* | . . BLANC */ /* | . . /BLANC */ /* | . . / BLANC */ /* | . . / . */ /* | . . / . */ /* | . ./ . */ /* n2 | ....BLANC . F(n1,n2) = TRNP(n1+n2). */ /* | . / . */ /* | . / . */ /* | . / BLANC */ /* | . / BLANC */ /* | ./ BLANC */ /* BLANC |BLANC.........BLANC */ /* */ /* On notera que 'PRODUIT_TRANSPARENCE__01/02/03/04/05/06(niveau1,niveau2)' */ /* sont definis par "%define" et non par "#define" afin de pouvoir utiliser le nouvel */ /* operateur de concatenation "`" du pre-processeur : il faut que leur substitution ait */ /* lieu apres la gestion de cet operateur de concatenation... */ %define PRODUIT_TRANSPARENCE__03(niveau1,niveau2) \ GENP(TRNF(SOUS(FLOT(NIVR(niveau2)) \ ,FLOT(NIVR(niveau1)) \ ) \ ) \ ) /* Definition de la transparence de 'niveau2' vu a travers 'niveau1' : */ /* */ /* Cette fonction translate 'niveau2', qui etait initialement dans le segment */ /* [NOIR,BLANC], dans le segment [NOIR-niveau1,BLANC-niveau1] ramene par TRONcation au */ /* segment [NOIR,BLANC-niveau1] : */ /* */ /* NOIR n1 BLANC */ /* |------------------- */ /* NOIR | NOIR..NOIR....NOIR */ /* | \ NOIR */ /* | .\ NOIR */ /* | . \ NOIR */ /* | . \ NOIR */ /* | . \ . */ /* | . \ . */ /* | . \ . */ /* n2 | .... NOIR . F(n1,n2) = TRNP(n1-n2). */ /* | . . \ . */ /* | . . \ . */ /* | . . \ NOIR */ /* | . . \ NOIR */ /* | . . \NOIR */ /* BLANC |BLANC.BLANC-n1.NOIR */ /* */ /* On notera que 'PRODUIT_TRANSPARENCE__01/02/03/04/05/06(niveau1,niveau2)' */ /* sont definis par "%define" et non par "#define" afin de pouvoir utiliser le nouvel */ /* operateur de concatenation "`" du pre-processeur : il faut que leur substitution ait */ /* lieu apres la gestion de cet operateur de concatenation... */ %define PRODUIT_TRANSPARENCE__04(niveau1,niveau2) \ PRODUIT_GENERAL(niveau1,niveau2) /* Definition de la transparence de 'niveau2' vu a travers 'niveau1' : */ /* */ /* Cette fonction conserve 'niveau2' dans le segment [NOIR,niveau1] : */ /* */ /* NOIR n1 BLANC */ /* |------------------- */ /* NOIR | NOIR..........NOIR */ /* | .\ . . */ /* | . \ . . */ /* | . \ . . */ /* | . \ . . */ /* | . \. . */ /* n2 | NOIR...\.......n2 */ /* | . .\ . n1 x n2 */ /* | . . \ . F(n1,n2) = --------- = SCAL(n2,BLANC,n1). */ /* | . . \ . BLANC */ /* | . . \ . */ /* | . . \ . */ /* | . . \ . */ /* | . . \. */ /* BLANC |NOIR....n1....BLANC */ /* */ /* On notera que 'PRODUIT_TRANSPARENCE__01/02/03/04/05/06(niveau1,niveau2)' */ /* sont definis par "%define" et non par "#define" afin de pouvoir utiliser le nouvel */ /* operateur de concatenation "`" du pre-processeur : il faut que leur substitution ait */ /* lieu apres la gestion de cet operateur de concatenation... */ %define PRODUIT_TRANSPARENCE__05(niveau1,niveau2) \ GENP(TRNF(GpytF2D(FLOT(NIVR(niveau1)) \ ,FLOT(NIVR(niveau2)) \ ) \ ) \ ) /* Definition de la transparence de 'niveau2' vu a travers 'niveau1' : */ /* */ /* Cette fonction est assez voisine de 'PRODUIT_TRANSPARENCE__02()', a cette difference */ /* pres, qu'au lieu de considerer 'niveau1+niveau2', elle considere la racine carre de */ /* la somme de leur carre ramenee dans le segment [NOIR+niveau1,BLANC] : */ /* */ /* NOIR n1 BLANC */ /* |------------------- */ /* NOIR | NOIR...n1....BLANC */ /* | . . BLANC */ /* | . . BLANC */ /* | . . BLANC */ /* | . . BLANC */ /* | . . * . */ /* | . . . _______ */ /* | . . * . / 2 2 */ /* n2 | ....... . F(n1,n2) = TRNP(\/(n1 +n2 )). */ /* | . BLANC. */ /* | . BLANC . */ /* | . * BLANC */ /* | . * BLANC */ /* | . * BLANC */ /* BLANC |BLANC.........BLANC */ /* */ /* On notera que 'PRODUIT_TRANSPARENCE__01/02/03/04/05/06(niveau1,niveau2)' */ /* sont definis par "%define" et non par "#define" afin de pouvoir utiliser le nouvel */ /* operateur de concatenation "`" du pre-processeur : il faut que leur substitution ait */ /* lieu apres la gestion de cet operateur de concatenation... */ /* */ /* La procedure 'GpytF2D(...)' a ete introduite le 20021120102146. */ %define PRODUIT_TRANSPARENCE__06(niveau1,niveau2) \ GENP(TRNF(BARY(FLOT(NIVR(niveau2)) \ ,FLOT(NIVR(BLANC)) \ ,______NORMALISE_NIVEAU(niveau1) \ ) \ ) \ ) /* Definition de la transparence de 'niveau2' vu a travers 'niveau1' : */ /* */ /* Cette fonction interpole dans [niveau2,BLANC] suivant le parametre d'interpolation */ /* 'niveau1' normalise (ceci fut introduit le 20070312094056) : */ /* */ /* NOIR n1 BLANC */ /* |------------------- */ /* NOIR | NOIR...n1....BLANC */ /* | \ BLANC */ /* | .\ BLANC */ /* | . \ BLANC */ /* | . \ BLANC */ /* | . \ . */ /* | . \ . */ /* | . \ . */ /* n2 | n2..........BLANC F(n1,n2) = (1-l1).n2 + l1.BLANC */ /* | . . \ . */ /* | . . \ . (ou 'l2' est 'n1' normalise). */ /* | . . \ BLANC */ /* | . . \BLANC */ /* | . . BLANC */ /* BLANC |BLANC..BLANC..BLANC */ /* */ /* On notera que 'PRODUIT_TRANSPARENCE__01/02/03/04/05/06(niveau1,niveau2)' */ /* sont definis par "%define" et non par "#define" afin de pouvoir utiliser le nouvel */ /* operateur de concatenation "`" du pre-processeur : il faut que leur substitution ait */ /* lieu apres la gestion de cet operateur de concatenation... */ #define ACCES_A_UN_PRODUIT_GENERALISE(table_de_multiplication,niveau1,niveau2) \ ITb2(table_de_multiplication \ ,INDX(niveau1,NOIR) \ ,INDX(niveau2,NOIR) \ ) \ /* Procedure d'acces a la definition d'un produit generalise compatible avec la procedure */ \ /* 'v $xiii/Images$DEF IMAGE.image.x.y.' avec les correspondances suivantes : */ \ /* */ \ /* niveau1 --> Y */ \ /* niveau2 --> X */ \ /* */ \ /* Cette procedure a ete introduite le 20021003102723. Le nom 'PRODUIT_GENERALISE(...)' */ \ /* a ete change en 'ACCES_A_UN_PRODUIT_GENERALISE(...)' a cause d'une "collision" */ \ /* avec 'v $xci/accumule.04$K PRODUIT_GENERALISE'. */ #define INITIALISATION_QUELCONQUE_TABLE_DE_MULTIPLICATION(table_de_multiplication,DEFINITION_DU_PRODUIT) \ Bblock \ BoIn(niveau1,NOIR,BLANC,PAS_COULEURS) \ Bblock \ BoIn(niveau2,NOIR,BLANC,PAS_COULEURS) \ Bblock \ EGAL(ACCES_A_UN_PRODUIT_GENERALISE(table_de_multiplication,niveau1,niveau2) \ ,DEFINITION_DU_PRODUIT \ ); \ Eblock \ EBoI \ Eblock \ EBoI \ \ Test(IFEQ(table_de_multiplication,table_de_multiplication_standard)) \ Bblock \ EGAL(initialisation_table_de_multiplication_standard,VALIDE); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Cette macro permet d'initialiser une "table de multiplication" d'une facon tout a fait */ \ /* arbitraire... */ #define INITIALISATION_TABLE_DE_MULTIPLICATION(table_de_multiplication,DEFINITION_DU_PRODUIT) \ Bblock \ INITIALISATION_QUELCONQUE_TABLE_DE_MULTIPLICATION(table_de_multiplication \ ,DEFINITION_DU_PRODUIT(niveau1,niveau2) \ ); \ Eblock \ /* Cette macro permet d'initialiser une "table de multiplication" a l'aide d'une certaine */ \ /* fonction (a deux arguments). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* N O T I O N D ' A U T O M A T E S C E L L U L A I R E S M O N O D I M E N S I O N N E L S : */ /* */ /* */ /* Definition : */ /* */ /* Nous allons definir la notion de */ /* d'automates cellulaires monodimensionnels. */ /* Il s'agit donc d'une suite de cellules */ /* mono-dimensionnelles qui evoluent au */ /* cours du temps suivant le principe */ /* suivant : */ /* */ /* CELLULE(i,t+1) <-- REGLE(CELLULE(i-1,t),CELLULE(i,t),CELLULE(i+1,t)) */ /* */ /* ou 'REGLE(...)' va etre definie a partir */ /* d'une matrice a trois dimensions. */ /* */ /* Ceci a commence d'etre introduit */ /* le 20021002110644. */ /* */ /* */ /* Utilisation : */ /* */ /* INITIALISATION_QUELCONQUE_AUTOMATE_CELLULAIRE_MONODIMENSIONNEL(automate_cellulaire,DEFINITION_DE_LA_REGLE); */ /* */ /* permet d'initialiser un automate cellulaire monodimensionnel */ /* de facon tout a fait arbitraire, et : */ /* */ /* INITIALISATION_AUTOMATE_CELLULAIRE_MONODIMENSIONNEL(automate_cellulaire,DEFINITION_DE_LA_REGLE); */ /* */ /* permet d'initialiser un automate cellulaire monodimensionnel */ /* a l'aide d'une certaine definition... */ /* */ /* */ /*************************************************************************************************************************************/ TypedefD3(automate_cellulaire_monodimensionnel,COULEURS,COULEURS,COULEURS,genere_p) TypedefS(A___automate_cellulaire_monodimensionnel,automate_cellulaire_monodimensionnel) TypedefS(E___automate_cellulaire_monodimensionnel,automate_cellulaire_monodimensionnel) /* Definition du type "automate_cellulaire_monodimensionnel" en tant que */ /* tableau parallelepipedique, dont les dimensions sont COULEURSxCOULEURSxCOULEURS. */ #define AUTOMATE_CELLULAIRE_MONODIMENSIONNEL(automate_cellulaire,point_a_gauche,point__courant,point_a_droite) \ /* Le nom 'AUTOMATE_CELLULAIRE_MONODIMENSIONNEL(...)' a remplace 'AUTOMATE_CELLULAIRE(...)' */ \ /* le 20021007161340 afin de prevoir des evolutions multidimensionnelles futures... */ \ ITb3(automate_cellulaire \ ,INDX(NIVR(point__courant),NOIR) \ ,INDX(NIVR(point_a_gauche),NOIR) \ ,INDX(NIVR(point_a_droite),NOIR) \ ) \ /* Procedure d'acces a la definition d'un automate cellulaire monodimensionnel compatible */ \ /* avec la procedure 'v $xiii/Images$DEF ALBUM.album.x.y.z.' avec les correspondances */ \ /* suivantes : */ \ /* */ \ /* point_a_gauche --> Y */ \ /* point__courant --> Z */ \ /* point_a_droite --> X */ \ /* */ \ /* soit encore : */ \ /* */ \ /* X --> point_a_droite */ \ /* Y --> point_a_gauche */ \ /* Z --> point__courant */ \ /* */ #define INITIALISATION_QUELCONQUE_AUTOMATE_CELLULAIRE_MONODIMENSIONNEL(automate_cellulaire,DEFINITION_DE_LA_REGLE) \ Bblock \ BoIn(point_a_gauche,NOIR,BLANC,PAS_COULEURS) \ Bblock \ BoIn(point__courant,NOIR,BLANC,PAS_COULEURS) \ Bblock \ BoIn(point_a_droite,NOIR,BLANC,PAS_COULEURS) \ Bblock \ EGAL(AUTOMATE_CELLULAIRE_MONODIMENSIONNEL(automate_cellulaire \ ,point_a_gauche \ ,point__courant \ ,point_a_droite \ ) \ ,DEFINITION_DE_LA_REGLE \ ); \ Eblock \ EBoI \ Eblock \ EBoI \ Eblock \ EBoI \ \ Test(IFEQ(automate_cellulaire,automate_cellulaire_standard)) \ Bblock \ EGAL(initialisation_automate_cellulaire_standard,VALIDE); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Cette macro permet d'initialiser un "automate cellulaire" d'une facon tout a fait */ \ /* arbitraire... */ #define INITIALISATION_AUTOMATE_CELLULAIRE_MONODIMENSIONNEL(automate_cellulaire,DEFINITION_DE_LA_REGLE) \ Bblock \ INITIALISATION_QUELCONQUE_AUTOMATE_CELLULAIRE_MONODIMENSIONNEL(automate_cellulaire \ ,DEFINITION_DE_LA_REGLE(point_a_gauche \ ,point__courant \ ,point_a_droite \ ) \ ); \ Eblock \ /* Cette macro permet d'initialiser un "automate cellulaire" a l'aide d'une certaine */ \ /* fonction (a trois arguments). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* N O T I O N D ' A U T O M A T E S C E L L U L A I R E S B I D I M E N S I O N N E L S : */ /* */ /* */ /* Definition : */ /* */ /* Nous allons definir la notion de */ /* d'automates cellulaires bidimensionnels. */ /* Ils sont definis a l'aide d'images de */ /* type standard dont les 'N' premieres */ /* lignes contiennent la definition d'une */ /* regle particuliere. Le premier point */ /* de chaque ligne (d'abscisse 'Xmin') donne */ /* la nouvelle valeur 'NIVEAU' d'un point dans */ /* le cas ou la regle courante (correspondant a la */ /* ligne courante d'ordonnee 'Y') est appliquee. */ /* */ /* La regle courant est en fait definie par une */ /* "forme" contenue dans les 'P' points suivants */ /* le point 'Xmin' ; cette definition est faite */ /* en spirale selon le principe de 'v $xiii/di_image$FON GENERE__FonctionF_C'. */ /* */ /* Les 'N' premieres lignes d'une image 'automate_cellulaire_bidimensionnel' */ /* qui definit les regles de comportement d'un automate cellulaire */ /* bidimensionnel ont donc le format suivant : */ /* */ /* */ /* Xmin +01 +02 +03 +04 +05 +06 ... */ /* */ /* ------------------------------------------------------------------------------- */ /* | | | | | | | | */ /* Y | NIVEAU | P(00) | P(01) | P(02) | P(03) | P(04) | P(05) | ... */ /* | | | | | | | | */ /* ------------------------------------------------------------------------------- */ /* */ /* */ /* ou la regle de numero 'Y' (ordonnee dans */ /* 'automate_cellulaire_bidimensionnel') est */ /* definie par la liste des niveaux {P(00),P(01),P(02),...} ; */ /* si cette regle s'applique au point courant {X,Y} de l'etat */ /* courant de l'automate, alors ce point {X,Y} recoit le */ /* niveau 'NIVEAU'. On rappelle que la suite de niveaux */ /* {P(00),P(01),P(02),...} est testee par rapport a la suite */ /* des niveaux des points d'une spirale carree centree en */ /* {X,Y} (le centre de cette spirale est donc associe au */ /* niveau 'P(00)') : */ /* */ /* */ /* P(04) -- P(03) -- P(02) */ /* | | */ /* | | */ /* | | . */ /* | | . */ /* P(05) P(00) -- P(01) . */ /* | | */ /* | | */ /* | | */ /* | | */ /* P(06) -- P(07) -- P(08) -- P(09) */ /* */ /* */ /* Ceci a commence a etre introduit */ /* le 20030116120647. */ /* */ /* */ /*************************************************************************************************************************************/ TypedefS(automate_cellulaire_bidimensionnel,imageF) TypedefS(A___automate_cellulaire_bidimensionnel,A___imageF) TypedefS(E___automate_cellulaire_bidimensionnel,E___imageF) /* Definition du type "automate_cellulaire_bidimensionnel" en tant qu'image de type 'Float'. */ /* Le 20030123165109, je suis passe de 'image' a 'imageF' afin de prevoir des extensions */ /* futures... */ #define AUTOMATE_CELLULAIRE_BIDIMENSIONNEL(automate_cellulaire,x,y) \ loadF_point(automate_cellulaire,x,y) \ /* Procedure d'acces a la definition d'un automate cellulaire bidimensionnel. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D U V O I S I N A G E D ' U N P O I N T : */ /* */ /*************************************************************************************************************************************/ #define nPAS(N,pas) \ MUL2(N,pas) \ /* Pour faire 'N' pas... */ #define nPREX(x,N) \ SOUS(x,nPAS(N,pasX)) \ /* N-voisin de gauche, */ #define nSUCX(x,N) \ ADD2(x,nPAS(N,pasX)) \ /* N-voisin de droite. */ #define nPREY(y,N) \ SOUS(y,nPAS(N,pasY)) \ /* N-voisin du bas, */ #define nSUCY(y,N) \ ADD2(y,nPAS(N,pasY)) \ /* N-voisin du haut. */ #define nPREZ(z,N) \ SOUS(z,nPAS(N,pasZ)) \ /* N-voisin de derriere, */ #define nSUCZ(z,N) \ ADD2(z,nPAS(N,pasZ)) \ /* N-voisin de devant. */ #define nPRET(t,N) \ SOUS(t,nPAS(N,pasT)) \ /* N-voisin d'avant. */ #define nSUCT(t,N) \ ADD2(t,nPAS(N,pasT)) \ /* N-voisin de d'apres. */ #define nPREX_TRON(x,N) \ TROX(nPREX(x,N)) \ /* N-voisin de gauche avec validation de ce voisin, */ #define nSUCX_TRON(x,N) \ TROX(nSUCX(x,N)) \ /* N-voisin de droite avec validation de ce voisin. */ #define nPREY_TRON(y,N) \ TROY(nPREY(y,N)) \ /* N-voisin du bas avec validation de ce voisin, */ #define nSUCY_TRON(y,N) \ TROY(nSUCY(y,N)) \ /* N-voisin du haut avec validation de ce voisin. */ #define nPREZ_TRON(z,N) \ TROZ(nPREZ(z,N)) \ /* N-voisin de derriere avec validation de ce voisin, */ #define nSUCZ_TRON(z,N) \ TROZ(nSUCZ(z,N)) \ /* N-voisin de devant avec validation de ce voisin. */ #define nPRET_TRON(t,N) \ TROT(nPRET(t,N)) \ /* N-voisin d'avant avec validation de ce voisin, */ #define nSUCT_TRON(t,N) \ TROT(nSUCT(t,N)) \ /* N-voisin d'apres avec validation de ce voisin. */ #define PREX(x) \ nPREX(x,UN) \ /* Voisin de gauche, */ #define SUCX(x) \ nSUCX(x,UN) \ /* Voisin de droite. */ #define PREY(y) \ nPREY(y,UN) \ /* Voisin du bas, */ #define SUCY(y) \ nSUCY(y,UN) \ /* Voisin du haut. */ #define PREZ(z) \ nPREZ(z,UN) \ /* Voisin de derriere, */ #define SUCZ(z) \ nSUCZ(z,UN) \ /* Voisin de devant. */ #define PRET(t) \ nPRET(t,UN) \ /* Voisin d'avant, */ #define SUCT(t) \ nSUCT(t,UN) \ /* Voisin d'apres. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D U V O I S I N A G E D ' U N N I V E A U : */ /* */ /*************************************************************************************************************************************/ #define PREN(n) \ SOUS(n,PAS_COULEURS) \ /* Niveau d'avant, */ #define SUCN(n) \ ADD2(n,PAS_COULEURS) \ /* Niveau d'apres. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D ' U N E S P A C E " T O R I Q U E " : */ /* */ /*************************************************************************************************************************************/ /* ATTENTION, a cause de l'usage qui est fait de ces procedures dans d'autre procedures */ /* definies en '$PASSE_3', ces definitions ont ete deplacees le 1995110700 dans le fichier */ /* '$xiiD/definit.1$DEF'. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D ' U N E S P A C E " P R O L O N G E " : */ /* A l ' E X T E R I E U R C O M M E I L E S T A U B O R D : */ /* */ /*************************************************************************************************************************************/ /* ATTENTION, a cause de l'usage qui est fait de ces procedures dans d'autre procedures */ /* definies en '$PASSE_3', ces definitions ont ete deplacees le 1995110700 dans le fichier */ /* '$xiiD/definit.1$DEF'. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F O N C T I O N S D E P A S S A G E D E S L O N G U E U R S */ /* A U X C O O R D O N N E E S E T I N V E R S E M E N T : */ /* */ /*************************************************************************************************************************************/ #define COOR(coordonnee,coordonnee_minimale) \ SOUS(coordonnee,coordonnee_minimale) \ /* Passage d'une coordonnee a une longueur : */ #define COXR(abscisse) \ COOR(abscisse,Xmin) \ /* Passage d'un 'X' a une longueur, */ #define COYR(ordonnee) \ COOR(ordonnee,Ymin) \ /* Passage d'un 'Y' a une longueur. */ #define COZR(hauteur) \ COOR(hauteur,Zmin) \ /* Passage d'un 'Z' a une longueur. */ #define COTR(hauteur) \ COOR(hauteur,Tmin) \ /* Passage d'un 'T' a un temps. */ /* Avant le 20190726105745, il y avait ici la definition : */ /* */ /* #define COOA(longueur,coordonnee_minimale) \ */ /* ADD2(coordonnee_minimale,longueur) */ /* */ /* Elle fut deplacee dans 'v $xiiD/definit.1$DEF 20190726101713' a cette date... */ /* */ /* Passage d'une longueur a une coordonnee : */ #define COXA(longueur) \ COOA(longueur,Xmin) \ /* Passage d'une longueur a un 'X', */ #define COYA(longueur) \ COOA(longueur,Ymin) \ /* Passage d'une longueur a un 'Y', */ #define COZA(longueur) \ COOA(longueur,Zmin) \ /* Passage d'une longueur a un 'Z', */ #define COTA(longueur) \ COOA(longueur,Tmin) \ /* Passage d'un temps a un 'T', */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D U R E N V E R S E M E N T D E S A X E S : */ /* */ /*************************************************************************************************************************************/ #define RENX(abscisse) \ COXA(SOUS(Xmax,abscisse)) \ /* Renversement de l'axe 'OX' (introduit le 20091125135652), */ #define RENY(ordonnee) \ COYA(SOUS(Ymax,ordonnee)) \ /* Renversement de l'axe 'OY' (introduit le 20091125135652), */ #define RENZ(hauteur) \ COZA(SOUS(Zmax,hauteur)) \ /* Renversement de l'axe 'OZ' (introduit le 20091125135652). */ #define RENT(temps) \ COTA(SOUS(Tmax,temps)) \ /* Renversement de l'axe 'OT' (introduit le 20171219114035). */ #define cRENX(renverser_l_axe_OX,abscisse) \ OPC1(IL_NE_FAUT_PAS(renverser_l_axe_OX),NEUT,RENX,abscisse) \ /* Renversement Conditionnel de l'axe 'OX' (introduit le 20120707085902). */ #define cRENY(renverser_l_axe_OY,ordonnee) \ OPC1(IL_NE_FAUT_PAS(renverser_l_axe_OY),NEUT,RENY,ordonnee) \ /* Renversement Conditionnel de l'axe 'OY' (introduit le 20120707085902). */ #define cRENZ(renverser_l_axe_OZ,hauteur) \ OPC1(IL_NE_FAUT_PAS(renverser_l_axe_OZ),NEUT,RENZ,hauteur) \ /* Renversement Conditionnel de l'axe 'OZ' (introduit le 20120707085902). */ #define cRENT(renverser_l_axe_OT,temps) \ OPC1(IL_NE_FAUT_PAS(renverser_l_axe_OT),NEUT,RENT,temps) \ /* Renversement Conditionnel de l'axe 'OT' (introduit le 20171219114035). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D U M A I L L A G E D ' U N E I M A G E : */ /* */ /*************************************************************************************************************************************/ #define MAIL(coordonnee,minimum,maximum,pas) \ COND(IFEQ(pas,UNITE) \ ,ENTE(coordonnee) \ ,COOA(minimum \ ,MUL2(QUOD(COOR(ENTE(coordonnee),minimum) \ ,pas \ ) \ ,pas \ ) \ ) \ ) \ /* Cette fonction permet de ramener une coordonnee quelconque au noeud */ \ /* le plus voisin du maillage courant. On notera la presence de */ \ /* l'argument 'maximum' inutilise : c'est en fait pour prevoir des */ \ /* extensions futures ; enfin, 'UNITE' est utilise ici et non pas */ \ /* la valeur du 'pas' initial, car il est l'element neutre de 'MUL2' */ \ /* et de 'DIVI'. */ #define INTX(x) MAIL(x,Xmin,Xmax,pasX) #define INTY(y) MAIL(y,Ymin,Ymax,pasY) #define INTZ(z) MAIL(z,Zmin,Zmax,pasZ) #define INTT(t) MAIL(t,Tmin,Tmax,pasT) /* Fonctions equivalentes a 'INTE' mais valables sur les maillages */ /* des coordonnees. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E L A D E F O R M A T I O N D U M A I L L A G E D ' U N E I M A G E : */ /* */ /* */ /* Definition : */ /* */ /* Le maillage de sous-echantillonnage */ /* d'une image peut etre deforme a l'aide */ /* des deux fonctions suivantes ; pour */ /* l'instant il ne s'agit que de fonctions */ /* neutres... */ /* */ /* */ /*************************************************************************************************************************************/ #define DEFORMATION_OX(x,y) \ SE12(x,y) \ /* Deformation horizontale : initialement "unite", */ #define DEFORMATION_OY(x,y) \ SE22(x,y) \ /* Deformation verticale : initialement "unite". */ #define DEFORMATION_OZ(x,y,z) \ SE33(x,y,z) \ /* Deformation de profondeur : initialement "unite". */ #define DEFORMATION_OT(x,y,z,t) \ SE44(x,y,z,t) \ /* Deformation de temps : initialement "unite". */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A C C E S A U N P O I N T D ' U N E I M A G E R A S T E R */ /* D ' U N E L I G N E O U D ' U N E C O L O N N E : */ /* */ /* */ /* Nota : */ /* */ /* Lorsqu'il n'y a pas d'echantillonnage, */ /* les coordonnees {x,y} sont utilisees */ /* telles quel, sans deformation, et autre */ /* transformation... */ /* */ /* */ /* Optimisation : */ /* */ /* Il est possible de simplifier l'indexation en */ /* definissant la variable '__VERSION__INDEXATION_SIMPLIFIEE_A_PRIORI', */ /* auquel cas les fonctions 'Findice_X(...)', 'Findice_Y(...)' */ /* et 'Findice_Z(...)' ne sont pas utilisees (de meme que le */ /* sous-echantillonnage)... */ /* */ /* La variable '__VERSION__INDEXATION_SIMPLIFIEE_A_PRIORI' est */ /* definie specifiquement (ou pas) pour chaque MACHINE */ /* et SYSTEME dans le fichier 'v $xcc/cpp$D/cpp$Y INDEXATION_SIMPLIFIEE_A_PRIORI'... */ /* */ /* */ /*************************************************************************************************************************************/ #ifndef __VERSION__INDEXATION_SIMPLIFIEE_A_PRIORI # define INDEXATION_OX(x,y) \ INDX(COND(IL_NE_FAUT_PAS(echantillonnage) \ ,x \ ,Findice_X(INTE(x),INTE(y)) \ ) \ ,Xmin \ ) \ /* Calcul d'un index horizontal (le Long de 'OX'). */ # define INDEXATION_OY(x,y) \ INDX(COND(IL_NE_FAUT_PAS(echantillonnage) \ ,y \ ,Findice_Y(INTE(x),INTE(y)) \ ) \ ,Ymin \ ) \ /* Calcul d'un index vertical (le Long de 'OY'). */ # define INDEXATION_OZ(x,y,z) \ INDX(COND(IL_NE_FAUT_PAS(echantillonnage) \ ,z \ ,Findice_Z(INTE(x),INTE(y),INTE(z)) \ ) \ ,Zmin \ ) \ /* Calcul d'un index de profondeur (le Long de 'OZ'). */ #Aifndef __VERSION__INDEXATION_SIMPLIFIEE_A_PRIORI # define INDEXATION_OX(x,y) \ INDX(x \ ,Xmin \ ) \ /* Calcul d'un index horizontal (le Long de 'OX'). */ # define INDEXATION_OY(x,y) \ INDX(y \ ,Ymin \ ) \ /* Calcul d'un index vertical (le Long de 'OY'). */ # define INDEXATION_OZ(x,y,z) \ INDX(z \ ,Zmin \ ) \ /* Calcul d'un index de profondeur (le Long de 'OZ'). */ #Eifndef __VERSION__INDEXATION_SIMPLIFIEE_A_PRIORI #define LINEARISATION_DES_INDEX_X(x) \ ITb1c(x,dimX) #define LINEARISATION_DES_INDEX_XY(x,y) \ ITb2c(INDEXATION_OX(x,y),dimX,INDEXATION_OY(x,y),dimY) #define LINEARISATION_DES_INDEX_XYZ(x,y,z) \ ITb3c(INDEXATION_OX(x,y),dimX,INDEXATION_OY(x,y),dimY,INDEXATION_OZ(x,y,z),dimZ) /* "Sequentialisation" des n-uples de coordonnees. ATTENTION, ces definitions doivent */ /* etre en accord avec les usages de 'ITb2v(...)' et de 'ITb3v(...)' dans les definitions */ /* de 'IMAGE(...)' et de 'ALBUM(...)' respectivement tel qu'il est fait dans les versions */ /* 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_02' et 'GESTION_DU_FORMAT_DES_IMAGES_VERSION_03'. */ #if ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01)) \ ) # define VECTEUR(vecteur,x,y) \ ITb1(vecteur,CHOI(INDEXATION_OX(x,y),INDEXATION_OY(x,y))) \ /* Acces a un element d'un vecteur (a noter la necessite : dimX=dimY...). */ # define LIGNE(ligne,x,y) \ ITb1(ligne,INDEXATION_OX(x,y)) \ /* Acces a un element d'une ligne d'image. */ # define COLONNE(colonne,x,y) \ ITb1(colonne,INDEXATION_OY(x,y)) \ /* Acces a un element d'une colonne d'image. */ # define IMAGE(image,x,y) \ ITb2(image,INDEXATION_OY(x,y),INDEXATION_OX(x,y)) \ /* Acces a un element d'une image (rappelons que c'est la coordonnee 'x' qui varie le plus */ \ /* vite). */ # define ALBUM(album,x,y,z) \ ITb3(album,INDEXATION_OZ(x,y,z),INDEXATION_OY(x,y),INDEXATION_OX(x,y)) \ /* Acces a un element d'un album (rappelons que c'est la coordonnee 'x' qui varie le plus */ \ /* vite). */ # if ( (defined(SYSTEME_CRAY2_UNICOS_CC)) \ || (defined(SYSTEME_CRAY2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC98_UNICOS_CC)) \ || (defined(SYSTEME_CRAYC98_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC916_UNICOS_CC)) \ || (defined(SYSTEME_CRAYC916_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS_SCC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_FXC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_PCC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_SCC)) \ || (defined(SYSTEME_FX40_CONCENTRIX_CC)) \ || (defined(SYSTEME_FX40_CONCENTRIX_FXC)) \ || (defined(SYSTEME_NWS3000_NEWSOS_CC)) \ || (defined(SYSTEME_NWS3000_NEWSOS_2CC)) \ || (defined(SYSTEME_SUN3_SUNOS_CC)) \ || (defined(SYSTEME_SUN4_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_NCC)) \ ) # define PAGE(album,z) \ ADRESSE(ALBUM(album,Xmin,Ymin,z)) \ /* Acces a une page (ou "image") d'un album. */ # Aif ( (defined(SYSTEME_CRAY2_UNICOS_CC)) \ || (defined(SYSTEME_CRAY2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC98_UNICOS_CC)) \ || (defined(SYSTEME_CRAYC98_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC916_UNICOS_CC)) \ || (defined(SYSTEME_CRAYC916_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS_SCC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_FXC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_PCC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_SCC)) \ || (defined(SYSTEME_FX40_CONCENTRIX_CC)) \ || (defined(SYSTEME_FX40_CONCENTRIX_FXC)) \ || (defined(SYSTEME_NWS3000_NEWSOS_CC)) \ || (defined(SYSTEME_NWS3000_NEWSOS_2CC)) \ || (defined(SYSTEME_SUN3_SUNOS_CC)) \ || (defined(SYSTEME_SUN4_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_NCC)) \ ) # define PAGE(album,z) \ ALBUM(album,Xmin,Ymin,z) \ /* Acces a une page (ou "image") d'un album. */ # Eif ( (defined(SYSTEME_CRAY2_UNICOS_CC)) \ || (defined(SYSTEME_CRAY2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC98_UNICOS_CC)) \ || (defined(SYSTEME_CRAYC98_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC916_UNICOS_CC)) \ || (defined(SYSTEME_CRAYC916_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS_SCC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_FXC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_PCC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_SCC)) \ || (defined(SYSTEME_FX40_CONCENTRIX_CC)) \ || (defined(SYSTEME_FX40_CONCENTRIX_FXC)) \ || (defined(SYSTEME_NWS3000_NEWSOS_CC)) \ || (defined(SYSTEME_NWS3000_NEWSOS_2CC)) \ || (defined(SYSTEME_SUN3_SUNOS_CC)) \ || (defined(SYSTEME_SUN4_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_NCC)) \ ) #Aif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01)) \ ) #Eif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01)) \ ) #if ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \ ) # ifdef GESTION_DES_IMAGES_STATIQUES_VERSION_01 # define VALIDE_IMPLANTATION(objet,dimension) \ NEUT(objet) \ /* Procedure de validation (inutile ici...) d'un objet quelconque... */ # Aifdef GESTION_DES_IMAGES_STATIQUES_VERSION_01 # Eifdef GESTION_DES_IMAGES_STATIQUES_VERSION_01 # ifdef GESTION_DES_IMAGES_STATIQUES_VERSION_02 # define VALIDE_IMPLANTATION(objet,dimension) \ NEUT(objet) \ /* Procedure de validation d'un objet quelconque. On notera que cette procedure est */ \ /* actuellement (et provisoirement) ineffective ; en effet, il est impossible d'ecrire : */ \ /* */ \ /* # define VALIDE_IMPLANTATION(objet,dimension) \ */ \ /* COND(IFNE(objet,STATIQUE_UNDEF) \ */ \ /* ,objet \ */ \ /* ,Malo(MUL2(dimension,SIZP(INDIRECT(objet)))) \ */ \ /* ) */ \ /* */ \ /* ou plus simplement : */ \ /* */ \ /* # define VALIDE_IMPLANTATION(objet,dimension) \ */ \ /* COND(IFNE(objet,STATIQUE_UNDEF) \ */ \ /* ,objet \ */ \ /* ,AllocIn(dimension,type_de_l_objet) \ */ \ /* ) */ \ /* */ \ /* car, en effet, malheureusement, lorsque 'VALIDE_IMPLANTATION(...)' est utilisee, le */ \ /* type de l'objet n'est pas connu, et il est donc impossible de "caster" le 'Malo(...)' */ \ /* ce qui donne alors le message : */ \ /* */ \ /* ... Unacceptable operand of conditional operator. */ \ /* */ \ /* de la part des compilateurs '$Cc'... */ \ /* */ \ /* On notera que tout ceci serait destine a se debarasser de la valeur initiale de la liste */ \ /* '$liste_utiles' dans la '$PASSE_7' de '$xcc/cpp$Z'... */ # Aifdef GESTION_DES_IMAGES_STATIQUES_VERSION_02 # Eifdef GESTION_DES_IMAGES_STATIQUES_VERSION_02 # define VECTEUR(vecteur,x,y) \ IdTb1(VALIDE_IMPLANTATION(vecteur,CHOI(dimX,dimY)) \ ,CHOI(INDEXATION_OX(x,y),INDEXATION_OY(x,y)) \ ,CHOI(dimX,dimY) \ ) \ /* Acces a un element d'un vecteur (a noter la necessite : dimX=dimY...). */ # define LIGNE(ligne,x,y) \ IdTb1(VALIDE_IMPLANTATION(ligne,dimX) \ ,INDEXATION_OX(x,y) \ ,dimX \ ) \ /* Acces a un element d'une ligne d'image. */ # define COLONNE(colonne,x,y) \ IdTb1(VALIDE_IMPLANTATION(colonne,dimY) \ ,INDEXATION_OY(x,y) \ ,dimY \ ) \ /* Acces a un element d'une colonne d'image. */ # define IMAGE(image,x,y) \ IdTb2(VALIDE_IMPLANTATION(image,dimXY) \ ,INDEXATION_OX(x,y) \ ,dimX \ ,INDEXATION_OY(x,y) \ ,dimY \ ) \ /* Acces a un element d'une image (rappelons que c'est la coordonnee 'x' qui varie le plus */ \ /* vite). */ # define ALBUM(album,x,y,z) \ IdTb3(VALIDE_IMPLANTATION(album,dimXYZ) \ ,INDEXATION_OX(x,y) \ ,dimX \ ,INDEXATION_OY(x,y) \ ,dimY \ ,INDEXATION_OZ(x,y,z) \ ,dimZ \ ) \ /* Acces a un element d'un album (rappelons que c'est la coordonnee 'x' qui varie le plus */ \ /* vite). */ # define PAGE(album,z) \ ADRESSE(ALBUM(album,Xmin,Ymin,z)) \ /* Acces a une page (ou "image") d'un album. */ #Aif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \ ) #Eif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \ ) #if ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \ ) # define VALIDE_IMPLANTATION(objet,dimension) \ NEUT(objet) \ /* Procedure de validation (inutile ici...) d'un objet quelconque... */ # define VECTEUR(vecteur,x,y) \ ITb1v(VALIDE_IMPLANTATION(vecteur,CHOI(dimX,dimY)) \ ,CHOI(INDEXATION_OX(x,y),INDEXATION_OY(x,y)) \ ,CHOI(dimX,dimY) \ ) \ /* Acces a un element d'un vecteur (a noter la necessite : dimX=dimY...). */ # define LIGNE(ligne,x,y) \ ITb1v(VALIDE_IMPLANTATION(ligne,dimX) \ ,INDEXATION_OX(x,y) \ ,dimX \ ) \ /* Acces a un element d'une ligne d'image. */ # define COLONNE(colonne,x,y) \ ITb1v(VALIDE_IMPLANTATION(colonne,dimY) \ ,INDEXATION_OY(x,y) \ ,dimY \ ) \ /* Acces a un element d'une colonne d'image. */ # define IMAGE(image,x,y) \ ITb2v(VALIDE_IMPLANTATION(image,dimXY) \ ,INDEXATION_OX(x,y) \ ,dimX \ ,INDEXATION_OY(x,y) \ ,dimY \ ) \ /* Acces a un element d'une image (rappelons que c'est la coordonnee 'x' qui varie le plus */ \ /* vite). */ # define ALBUM(album,x,y,z) \ ITb3v(VALIDE_IMPLANTATION(album,dimXYZ) \ ,INDEXATION_OX(x,y) \ ,dimX \ ,INDEXATION_OY(x,y) \ ,dimY \ ,INDEXATION_OZ(x,y,z) \ ,dimZ \ ) \ /* Acces a un element d'un album (rappelons que c'est la coordonnee 'x' qui varie le plus */ \ /* vite). */ # if ( (defined(SYSTEME_CRAY2_UNICOS_CC)) \ || (defined(SYSTEME_CRAY2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC98_UNICOS_CC)) \ || (defined(SYSTEME_CRAYC98_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC916_UNICOS_CC)) \ || (defined(SYSTEME_CRAYC916_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS_SCC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_FXC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_PCC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_SCC)) \ || (defined(SYSTEME_FX40_CONCENTRIX_CC)) \ || (defined(SYSTEME_FX40_CONCENTRIX_FXC)) \ || (defined(SYSTEME_NWS3000_NEWSOS_CC)) \ || (defined(SYSTEME_NWS3000_NEWSOS_2CC)) \ || (defined(SYSTEME_SUN3_SUNOS_CC)) \ || (defined(SYSTEME_SUN4_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_NCC)) \ ) # define PAGE(album,z) \ ADRESSE(ALBUM(album,Xmin,Ymin,z)) \ /* Acces a une page (ou "image") d'un album. */ # Aif ( (defined(SYSTEME_CRAY2_UNICOS_CC)) \ || (defined(SYSTEME_CRAY2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC98_UNICOS_CC)) \ || (defined(SYSTEME_CRAYC98_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC916_UNICOS_CC)) \ || (defined(SYSTEME_CRAYC916_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS_SCC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_FXC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_PCC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_SCC)) \ || (defined(SYSTEME_FX40_CONCENTRIX_CC)) \ || (defined(SYSTEME_FX40_CONCENTRIX_FXC)) \ || (defined(SYSTEME_NWS3000_NEWSOS_CC)) \ || (defined(SYSTEME_NWS3000_NEWSOS_2CC)) \ || (defined(SYSTEME_SUN3_SUNOS_CC)) \ || (defined(SYSTEME_SUN4_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_NCC)) \ ) # define PAGE(album,z) \ ALBUM(album,Xmin,Ymin,z) \ /* Acces a une page (ou "image") d'un album. */ # Eif ( (defined(SYSTEME_CRAY2_UNICOS_CC)) \ || (defined(SYSTEME_CRAY2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC98_UNICOS_CC)) \ || (defined(SYSTEME_CRAYC98_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC916_UNICOS_CC)) \ || (defined(SYSTEME_CRAYC916_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS_SCC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_FXC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_PCC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_SCC)) \ || (defined(SYSTEME_FX40_CONCENTRIX_CC)) \ || (defined(SYSTEME_FX40_CONCENTRIX_FXC)) \ || (defined(SYSTEME_NWS3000_NEWSOS_CC)) \ || (defined(SYSTEME_NWS3000_NEWSOS_2CC)) \ || (defined(SYSTEME_SUN3_SUNOS_CC)) \ || (defined(SYSTEME_SUN4_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_NCC)) \ ) #Aif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \ ) #Eif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \ ) /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* R E N V O I D ' U N E I M A G E P A R U N E F O N C T I O N : */ /* */ /* */ /* Utilisation : */ /* */ /* Lors de la declaration d'une fonction */ /* Ifonction(imageR,imageA,...), on la declare */ /* 'FonctionP', afin qu'on puisse l'utiliser */ /* de deux facons differentes : */ /* */ /* 1 - "normalement" : Ifonction(imageR,imageA,...); */ /* */ /* 2 - comme argument d'une autre fonction (voir 'RETI') : */ /* Ifonction1(imageR,Ifonction2(imageR,imageA,...),...); */ /* */ /* A cette fin, le resultat 'imageR' */ /* est renvoye comme argument, mais aussi */ /* en tant que valeur de type 'POINTERp' */ /* de la fonction. */ /* */ /* */ /*************************************************************************************************************************************/ #if ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01)) \ ) # if ( (defined(SYSTEME_CRAY2_UNICOS_CC)) \ || (defined(SYSTEME_CRAY2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC98_UNICOS_CC)) \ || (defined(SYSTEME_CRAYC98_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC916_UNICOS_CC)) \ || (defined(SYSTEME_CRAYC916_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS_SCC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_FXC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_PCC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_SCC)) \ || (defined(SYSTEME_FX40_CONCENTRIX_CC)) \ || (defined(SYSTEME_FX40_CONCENTRIX_FXC)) \ || (defined(SYSTEME_NWS3000_NEWSOS_CC)) \ || (defined(SYSTEME_NWS3000_NEWSOS_2CC)) \ || (defined(SYSTEME_SUN3_SUNOS_CC)) \ || (defined(SYSTEME_SUN4_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_NCC)) \ ) # define RETI(image) \ RETU(ADRESSE(IMAGE(image,Xmin,Ymin))) \ /* Ainsi, la fonction correspondante peut etre argument d'une autre... */ # Aif ( (defined(SYSTEME_CRAY2_UNICOS_CC)) \ || (defined(SYSTEME_CRAY2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC98_UNICOS_CC)) \ || (defined(SYSTEME_CRAYC98_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC916_UNICOS_CC)) \ || (defined(SYSTEME_CRAYC916_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS_SCC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_FXC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_PCC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_SCC)) \ || (defined(SYSTEME_FX40_CONCENTRIX_CC)) \ || (defined(SYSTEME_FX40_CONCENTRIX_FXC)) \ || (defined(SYSTEME_NWS3000_NEWSOS_CC)) \ || (defined(SYSTEME_NWS3000_NEWSOS_2CC)) \ || (defined(SYSTEME_SUN3_SUNOS_CC)) \ || (defined(SYSTEME_SUN4_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_NCC)) \ ) # define RETI(image) \ RETU(image) \ /* Ainsi, la fonction correspondante peut etre argument d'une autre... */ \ /* valeur par defaut. */ # Eif ( (defined(SYSTEME_CRAY2_UNICOS_CC)) \ || (defined(SYSTEME_CRAY2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC98_UNICOS_CC)) \ || (defined(SYSTEME_CRAYC98_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYC916_UNICOS_CC)) \ || (defined(SYSTEME_CRAYC916_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS_SCC)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS_CC)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS_SCC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_FXC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_PCC)) \ || (defined(SYSTEME_FX2800_CONCENTRIX_SCC)) \ || (defined(SYSTEME_FX40_CONCENTRIX_CC)) \ || (defined(SYSTEME_FX40_CONCENTRIX_FXC)) \ || (defined(SYSTEME_NWS3000_NEWSOS_CC)) \ || (defined(SYSTEME_NWS3000_NEWSOS_2CC)) \ || (defined(SYSTEME_SUN3_SUNOS_CC)) \ || (defined(SYSTEME_SUN4_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_CC)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS_NCC)) \ ) #Aif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01)) \ ) #Eif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_01)) \ ) #if ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \ ) # define RETI(image) \ RETU(image) \ /* Ainsi, la fonction correspondante peut etre argument d'une autre... */ #Aif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \ ) #Eif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \ ) #if ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \ ) # define RETI(image) \ RETU(ADRESSE(IMAGE(image,Xmin,Ymin))) \ /* Ainsi, la fonction correspondante peut etre argument d'une autre... */ #Aif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \ ) #Eif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \ ) #define RETIC(image) \ RETI(image) #define RETII(image) \ RETI(image) #define RETIU(image) \ RETI(image) #define RETIF(image) \ RETI(image) #define RETID(image) \ RETI(image) #define RETIJ(image) \ RETI(image) #define RETIHJ(image) \ RETI(image) #define RETIHHJ(image) \ RETI(image) /* Identique a 'RETI(...)' mais pour des types d'images non standard, de type "imageC", */ /* "imageI", "imageU", "imageF", "imageD", "imageJ", "imageHJ" et "imageHHJ" respectivement. */ #define RETA(album) \ RETI(album) #define RETAF(album) \ RETA(album) /* Fonction de renvoi d'un album en tant que resultat... */