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