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



Copyright © Jean-François COLONNA, 2019-2024.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / École polytechnique, Institut Polytechnique de Paris, 2019-2024.