/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P R I M I T I V E S   D E   T R A I T E M E N T   D E S                                                                    */
/*        N I V E A U X   S O U S   F O R M E   D E   " F O N C T I O N S "  :                                                       */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition :                                                                                                               */
/*                                                                                                                                   */
/*                    Dans ce fichier se trouvent toutes les                                                                         */
/*                  primitives de traitement des niveaux d'une                                                                       */
/*                  image raster ; elles sont exprimees                                                                              */
/*                  sous forme de fonctions ce qui fait                                                                              */
/*                  que la duree d'execution par rapport                                                                             */
/*                  aux "defines" est tres allongee...                                                                               */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xiin/fonction.1$DEF' :                                                                                         */
/*                                                                                                                                   */
/*                    Jean-Francois Colonna (LACTAMME, 19870000000000).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        S U B S T I T U T I O N   D ' U N   N I V E A U  :                                                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   INITIALISATION_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_XX,fonction_de_substitution,modification_de_la_liste)                     \
                    Bblock                                                                                                              \
                    CLEAR_LISTE_INVERSE_DE_SUBSTITUTION(L_SUBSTITUTION_XX);                                                             \
                                        /* Initialisation preliminaire a 'NIVEAU_UNDEF' des listes "inverses".                       */ \
                    BoIn(index,NOIR,BLANC,PAS_COULEURS)                                                                                 \
                         Bblock                                                                                                         \
                         EGAL(ACCES_listes_de_substitution(L_SUBSTITUTION_XX,index)                                                     \
                             ,fonction_de_substitution(index)                                                                           \
                              );                                                                                                        \
                         CALCUL_LISTE_INVERSE_DE_SUBSTITUTION(L_SUBSTITUTION_XX,index);                                                 \
                                        /* Puis initialisation des listes "directes" et "inverses",                                  */ \
                         EGAL(ACCES_blocage_des_listes_de_substitution(L_SUBSTITUTION_XX,index)                                         \
                             ,modification_de_la_liste                                                                                  \
                              );                                                                                                        \
                                        /* Ainsi que de la matrice des blocages de modification des listes "directes".               */ \
                         Eblock                                                                                                         \
                    EBoI                                                                                                                \
                    Eblock                                                                                                              \
                                        /* Deplace de 'v $xiin/$xiin/fonction.1$FON 20110401185706' a ici le 20110401190030 pour     */ \
                                        /* etre utilisable dans 'v $ximf/aleatoires$DEF INITIALISATION_LISTES_DE_SUBSTITUTION'...    */

#define   INITIALISATION_LISTES_DE_SUBSTITUTION                                                                                         \
                    Bblock                                                                                                              \
                    Test(EST_FAUX(init_substitution))                                                                                   \
                         Bblock                                                                                                         \
                         BoIn(index,NOIR,BLANC,PAS_COULEURS)                                                                            \
                              Bblock                                                                                                    \
                              AUTORISATION_DE_SUBSTITUTION_D_UN_NIVEAU(index);                                                          \
                                        /* A priori, on autorise la substitution de tous les niveaux...                              */ \
                              Eblock                                                                                                    \
                         EBoI                                                                                                           \
                                                                                                                                        \
                         INITIALISATION_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_NEUTRE,fonction_neutre_de_substitution,INTERDIT);          \
                         INITIALISATION_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_01,fonction_01_de_substitution,INTERDIT);                  \
                         INITIALISATION_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_02,fonction_02_de_substitution,INTERDIT);                  \
                         INITIALISATION_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_11,fonction_11_de_substitution,INTERDIT);                  \
                         INITIALISATION_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_12,fonction_12_de_substitution,INTERDIT);                  \
                         INITIALISATION_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_13,fonction_13_de_substitution,INTERDIT);                  \
                         INITIALISATION_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_14,fonction_14_de_substitution,INTERDIT);                  \
                         INITIALISATION_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_21,fonction_21_de_substitution,INTERDIT);                  \
                         INITIALISATION_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_22,fonction_22_de_substitution,INTERDIT);                  \
                         INITIALISATION_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_23,fonction_23_de_substitution,INTERDIT);                  \
                         INITIALISATION_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_24,fonction_24_de_substitution,INTERDIT);                  \
                         INITIALISATION_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_25,fonction_25_de_substitution,INTERDIT);                  \
                         INITIALISATION_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_26,fonction_26_de_substitution,INTERDIT);                  \
                         INITIALISATION_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_27,fonction_27_de_substitution,INTERDIT);                  \
                         INITIALISATION_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_28,fonction_28_de_substitution,INTERDIT);                  \
                         INITIALISATION_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_31,fonction_31_de_substitution,INTERDIT);                  \
                         INITIALISATION_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_32,fonction_32_de_substitution,INTERDIT);                  \
                         INITIALISATION_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_33,fonction_33_de_substitution,INTERDIT);                  \
                         INITIALISATION_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_34,fonction_34_de_substitution,INTERDIT);                  \
                         INITIALISATION_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_35,fonction_35_de_substitution,INTERDIT);                  \
                         INITIALISATION_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_36,fonction_36_de_substitution,INTERDIT);                  \
                         INITIALISATION_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_37,fonction_37_de_substitution,INTERDIT);                  \
                         INITIALISATION_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_38,fonction_38_de_substitution,INTERDIT);                  \
                         INITIALISATION_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_39,fonction_39_de_substitution,INTERDIT);                  \
                         INITIALISATION_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_3A,fonction_3A_de_substitution,INTERDIT);                  \
                         INITIALISATION_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_3B,fonction_3B_de_substitution,INTERDIT);                  \
                         INITIALISATION_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_3C,fonction_3C_de_substitution,INTERDIT);                  \
                         INITIALISATION_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_3D,fonction_3D_de_substitution,INTERDIT);                  \
                         INITIALISATION_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_3E,fonction_3E_de_substitution,INTERDIT);                  \
                         INITIALISATION_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_3F,fonction_3F_de_substitution,INTERDIT);                  \
                         INITIALISATION_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_3G,fonction_3G_de_substitution,INTERDIT);                  \
                         INITIALISATION_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_FF,fonction_FF_de_substitution,INTERDIT);                  \
                         INITIALISATION_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_FE,fonction_FE_de_substitution,INTERDIT);                  \
                         INITIALISATION_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_FC,fonction_FC_de_substitution,INTERDIT);                  \
                         INITIALISATION_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_F8,fonction_F8_de_substitution,INTERDIT);                  \
                         INITIALISATION_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_F0,fonction_F0_de_substitution,INTERDIT);                  \
                         INITIALISATION_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_E0,fonction_E0_de_substitution,INTERDIT);                  \
                         INITIALISATION_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_C0,fonction_C0_de_substitution,INTERDIT);                  \
                         INITIALISATION_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_80,fonction_80_de_substitution,INTERDIT);                  \
                         INITIALISATION_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_ROUGE_BASIC,fonction_ROUGE_de_substitution,AUTORISE);      \
                         INITIALISATION_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_VERTE_BASIC,fonction_VERTE_de_substitution,AUTORISE);      \
                         INITIALISATION_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_BLEUE_BASIC,fonction_BLEUE_de_substitution,AUTORISE);      \
                         INITIALISATION_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_VARIABLE,fonction_variable_de_substitution,AUTORISE);      \
                         INITIALISATION_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_HISTOGRAMME,fonction_variable_de_substitution,AUTORISE);   \
                                        /* Introduit le 20081004123137...                                                            */ \
                         INITIALISATION_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_SOLAR,fonction_SOLAR_de_substitution,INTERDIT);            \
                         INITIALISATION_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_X_WINDOW,fonction_X_WINDOW_de_substitution,AUTORISE);      \
                                                                                                                                        \
                         EGAL(init_substitution,VRAI);                                                                                  \
                                        /* Et on memorise que l'initialisation est faite...                                          */ \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock                                                                                                              \
                                        /* Deplace de 'v $xiin/$xiin/fonction.1$FON 20110401185706' a ici le 20110401190030 pour     */ \
                                        /* etre utilisable dans 'v $ximf/aleatoires$DEF INITIALISATION_LISTES_DE_SUBSTITUTION'...    */

#define   BLANC_SOLAR                                                                                                                   \
                    MOCD                                                                                                                \
                                        /* Definition du niveau de blanc sur le SOLAR.                                               */
#define   NOIR_SOLAR                                                                                                                    \
                    NOIR                                                                                                                \
                                        /* Definition du niveau de noir sur le SOLAR.                                                */
#define   fonction_neutre_de_substitution(niveau)                                                                                       \
                    NEUT(niveau)                                                                                                        \
                                        /* Definition de la fonction standard ("1" pour "1")...                                      */
#define   fonction_01_de_substitution(niveau)                                                                                           \
                    NIVA(COND(EST_PAIR(ADD2(NIVR(NOIR)                                                                                  \
                                           ,NIVR(NOIR)                                                                                  \
                                            )                                                                                           \
                                       )                                                                                                \
                             ,MOID(ADD2(NIVR(NOIR),NIVR(niveau)))                                                                       \
                             ,MOIE(ADD2(NIVR(NOIR),NIVR(niveau)))                                                                       \
                              )                                                                                                         \
                         )                                                                                                              \
                                        /* Definition de la fonction de mise dans [NOIR,FRA2(BLANC)].                                */
#define   fonction_02_de_substitution(niveau)                                                                                           \
                    NIVA(COND(EST_PAIR(ADD2(NIVR(BLANC)                                                                                 \
                                           ,NIVR(NOIR)                                                                                  \
                                            )                                                                                           \
                                       )                                                                                                \
                             ,MOID(ADD2(NIVR(BLANC),NIVR(niveau)))                                                                      \
                             ,MOIE(ADD2(NIVR(BLANC),NIVR(niveau)))                                                                      \
                              )                                                                                                         \
                         )                                                                                                              \
                                        /* Definition de la fonction de mise dans [FRA2(BLANC),BLANC].                               */
#define   fonction_11_de_substitution(niveau)                                                                                           \
                    NIVA(ADD2(GRO1(FRA4(NIVR(niveau)))                                                                                  \
                             ,GRO0(FRA4(COULEURS))                                                                                      \
                              )                                                                                                         \
                         )                                                                                                              \
                                        /* Definition de la fonction de mise dans [NOIR,FRA4(BLANC)].                                */
#define   fonction_12_de_substitution(niveau)                                                                                           \
                    NIVA(ADD2(GRO1(FRA4(NIVR(niveau)))                                                                                  \
                             ,GRO1(FRA4(COULEURS))                                                                                      \
                              )                                                                                                         \
                         )                                                                                                              \
                                        /* Definition de la fonction de mise dans [FRA4(BLANC),FRA2(BLANC)].                         */
#define   fonction_13_de_substitution(niveau)                                                                                           \
                    NIVA(ADD2(GRO1(FRA4(NIVR(niveau)))                                                                                  \
                             ,GRO2(FRA4(COULEURS))                                                                                      \
                              )                                                                                                         \
                         )                                                                                                              \
                                        /* Definition de la fonction de mise dans [FRA2(BLANC),GRO3(FRA4(BLANC))].                   */
#define   fonction_14_de_substitution(niveau)                                                                                           \
                    NIVA(ADD2(GRO1(FRA4(NIVR(niveau)))                                                                                  \
                             ,GRO3(FRA4(COULEURS))                                                                                      \
                              )                                                                                                         \
                         )                                                                                                              \
                                        /* Definition de la fonction de mise dans [GRO3(FRA4(BLANC)),BLANC].                         */
#define   fonction_21_de_substitution(niveau)                                                                                           \
                    NIVA(ADD2(GRO1(FRA8(NIVR(niveau)))                                                                                  \
                             ,GRO0(FRA8(COULEURS))                                                                                      \
                              )                                                                                                         \
                         )                                                                                                              \
                                        /* Definition de la fonction de mise dans [GRO0(FRA8(BLANC)),GRO1(FRA8(BLANC))].             */
#define   fonction_22_de_substitution(niveau)                                                                                           \
                    NIVA(ADD2(GRO1(FRA8(NIVR(niveau)))                                                                                  \
                             ,GRO1(FRA8(COULEURS))                                                                                      \
                              )                                                                                                         \
                         )                                                                                                              \
                                        /* Definition de la fonction de mise dans [GRO1(FRA8(BLANC)),GRO2(FRA8(BLANC))].             */
#define   fonction_23_de_substitution(niveau)                                                                                           \
                    NIVA(ADD2(GRO1(FRA8(NIVR(niveau)))                                                                                  \
                             ,GRO2(FRA8(COULEURS))                                                                                      \
                              )                                                                                                         \
                         )                                                                                                              \
                                        /* Definition de la fonction de mise dans [GRO2(FRA8(BLANC)),GRO3(FRA8(BLANC))].             */
#define   fonction_24_de_substitution(niveau)                                                                                           \
                    NIVA(ADD2(GRO1(FRA8(NIVR(niveau)))                                                                                  \
                             ,GRO3(FRA8(COULEURS))                                                                                      \
                              )                                                                                                         \
                         )                                                                                                              \
                                        /* Definition de la fonction de mise dans [GRO3(FRA8(BLANC)),GRO4(FRA8(BLANC))].             */
#define   fonction_25_de_substitution(niveau)                                                                                           \
                    NIVA(ADD2(GRO1(FRA8(NIVR(niveau)))                                                                                  \
                             ,GRO4(FRA8(COULEURS))                                                                                      \
                              )                                                                                                         \
                         )                                                                                                              \
                                        /* Definition de la fonction de mise dans [GRO4(FRA8(BLANC)),GRO5(FRA8(BLANC))].             */
#define   fonction_26_de_substitution(niveau)                                                                                           \
                    NIVA(ADD2(GRO1(FRA8(NIVR(niveau)))                                                                                  \
                             ,GRO5(FRA8(COULEURS))                                                                                      \
                              )                                                                                                         \
                         )                                                                                                              \
                                        /* Definition de la fonction de mise dans [GRO5(FRA8(BLANC)),GRO6(FRA8(BLANC))].             */
#define   fonction_27_de_substitution(niveau)                                                                                           \
                    NIVA(ADD2(GRO1(FRA8(NIVR(niveau)))                                                                                  \
                             ,GRO6(FRA8(COULEURS))                                                                                      \
                              )                                                                                                         \
                         )                                                                                                              \
                                        /* Definition de la fonction de mise dans [GRO6(FRA8(BLANC)),GRO7(FRA8(BLANC))].             */
#define   fonction_28_de_substitution(niveau)                                                                                           \
                    NIVA(ADD2(GRO1(FRA8(NIVR(niveau)))                                                                                  \
                             ,GRO7(FRA8(COULEURS))                                                                                      \
                              )                                                                                                         \
                         )                                                                                                              \
                                        /* Definition de la fonction de mise dans [GRO7(FRA8(BLANC)),GRO8(FRA8(BLANC))].             */
#define   fonction_31_de_substitution(niveau)                                                                                           \
                    NIVA(ADD2(GRO1(FRA16(NIVR(niveau)))                                                                                 \
                             ,GRO0(FRA16(COULEURS))                                                                                     \
                              )                                                                                                         \
                         )                                                                                                              \
                                        /* Definition de la fonction de mise dans [GRO0(FRA16(BLANC)),GRO1(FRA16(BLANC))].           */
#define   fonction_32_de_substitution(niveau)                                                                                           \
                    NIVA(ADD2(GRO1(FRA16(NIVR(niveau)))                                                                                 \
                             ,GRO1(FRA16(COULEURS))                                                                                     \
                              )                                                                                                         \
                         )                                                                                                              \
                                        /* Definition de la fonction de mise dans [GRO1(FRA16(BLANC)),GRO2(FRA16(BLANC))].           */
#define   fonction_33_de_substitution(niveau)                                                                                           \
                    NIVA(ADD2(GRO1(FRA16(NIVR(niveau)))                                                                                 \
                             ,GRO2(FRA16(COULEURS))                                                                                     \
                              )                                                                                                         \
                         )                                                                                                              \
                                        /* Definition de la fonction de mise dans [GRO2(FRA16(BLANC)),GRO3(FRA16(BLANC))].           */
#define   fonction_34_de_substitution(niveau)                                                                                           \
                    NIVA(ADD2(GRO1(FRA16(NIVR(niveau)))                                                                                 \
                             ,GRO3(FRA16(COULEURS))                                                                                     \
                              )                                                                                                         \
                         )                                                                                                              \
                                        /* Definition de la fonction de mise dans [GRO3(FRA16(BLANC)),GRO4(FRA16(BLANC))].           */
#define   fonction_35_de_substitution(niveau)                                                                                           \
                    NIVA(ADD2(GRO1(FRA16(NIVR(niveau)))                                                                                 \
                             ,GRO4(FRA16(COULEURS))                                                                                     \
                              )                                                                                                         \
                         )                                                                                                              \
                                        /* Definition de la fonction de mise dans [GRO4(FRA16(BLANC)),GRO5(FRA16(BLANC))].           */
#define   fonction_36_de_substitution(niveau)                                                                                           \
                    NIVA(ADD2(GRO1(FRA16(NIVR(niveau)))                                                                                 \
                             ,GRO5(FRA16(COULEURS))                                                                                     \
                              )                                                                                                         \
                         )                                                                                                              \
                                        /* Definition de la fonction de mise dans [GRO5(FRA16(BLANC)),GRO6(FRA16(BLANC))].           */
#define   fonction_37_de_substitution(niveau)                                                                                           \
                    NIVA(ADD2(GRO1(FRA16(NIVR(niveau)))                                                                                 \
                             ,GRO6(FRA16(COULEURS))                                                                                     \
                              )                                                                                                         \
                         )                                                                                                              \
                                        /* Definition de la fonction de mise dans [GRO6(FRA16(BLANC)),GRO7(FRA16(BLANC))].           */
#define   fonction_38_de_substitution(niveau)                                                                                           \
                    NIVA(ADD2(GRO1(FRA16(NIVR(niveau)))                                                                                 \
                             ,GRO7(FRA16(COULEURS))                                                                                     \
                              )                                                                                                         \
                         )                                                                                                              \
                                        /* Definition de la fonction de mise dans [GRO7(FRA16(BLANC)),GRO8(FRA16(BLANC))].           */
#define   fonction_39_de_substitution(niveau)                                                                                           \
                    NIVA(ADD2(GRO1(FRA16(NIVR(niveau)))                                                                                 \
                             ,GRO8(FRA16(COULEURS))                                                                                     \
                              )                                                                                                         \
                         )                                                                                                              \
                                        /* Definition de la fonction de mise dans [GRO8(FRA16(BLANC)),GRO9(FRA16(BLANC))].           */
#define   fonction_3A_de_substitution(niveau)                                                                                           \
                    NIVA(ADD2(GRO1(FRA16(NIVR(niveau)))                                                                                 \
                             ,GRO9(FRA16(COULEURS))                                                                                     \
                              )                                                                                                         \
                         )                                                                                                              \
                                        /* Definition de la fonction de mise dans [GRO9(FRA16(BLANC)),GRO10(FRA16(BLANC))].          */
#define   fonction_3B_de_substitution(niveau)                                                                                           \
                    NIVA(ADD2(GRO1(FRA16(NIVR(niveau)))                                                                                 \
                             ,GRO10(FRA16(COULEURS))                                                                                    \
                              )                                                                                                         \
                         )                                                                                                              \
                                        /* Definition de la fonction de mise dans [GRO10(FRA16(BLANC)),GRO11(FRA16(BLANC))].         */
#define   fonction_3C_de_substitution(niveau)                                                                                           \
                    NIVA(ADD2(GRO1(FRA16(NIVR(niveau)))                                                                                 \
                             ,GRO11(FRA16(COULEURS))                                                                                    \
                              )                                                                                                         \
                         )                                                                                                              \
                                        /* Definition de la fonction de mise dans [GRO11(FRA16(BLANC)),GRO12(FRA16(BLANC))].         */
#define   fonction_3D_de_substitution(niveau)                                                                                           \
                    NIVA(ADD2(GRO1(FRA16(NIVR(niveau)))                                                                                 \
                             ,GRO12(FRA16(COULEURS))                                                                                    \
                              )                                                                                                         \
                         )                                                                                                              \
                                        /* Definition de la fonction de mise dans [GRO12(FRA16(BLANC)),GRO13(FRA16(BLANC))].         */
#define   fonction_3E_de_substitution(niveau)                                                                                           \
                    NIVA(ADD2(GRO1(FRA16(NIVR(niveau)))                                                                                 \
                             ,GRO13(FRA16(COULEURS))                                                                                    \
                              )                                                                                                         \
                         )                                                                                                              \
                                        /* Definition de la fonction de mise dans [GRO13(FRA16(BLANC)),GRO14(FRA16(BLANC))].         */
#define   fonction_3F_de_substitution(niveau)                                                                                           \
                    NIVA(ADD2(GRO1(FRA16(NIVR(niveau)))                                                                                 \
                             ,GRO14(FRA16(COULEURS))                                                                                    \
                              )                                                                                                         \
                         )                                                                                                              \
                                        /* Definition de la fonction de mise dans [GRO14(FRA16(BLANC)),GRO15(FRA16(BLANC))].         */
#define   fonction_3G_de_substitution(niveau)                                                                                           \
                    NIVA(ADD2(GRO1(FRA16(NIVR(niveau)))                                                                                 \
                             ,GRO15(FRA16(COULEURS))                                                                                    \
                              )                                                                                                         \
                         )                                                                                                              \
                                        /* Definition de la fonction de mise dans [GRO15(FRA16(BLANC)),GRO16(FRA16(BLANC))].         */
#define   fonction_FF_de_substitution(niveau)                                                                                           \
                    NIVA(FRA1(FRA1(NIVR(niveau))))                                                                                      \
                                        /* Definition de la fonction de mise dans [NOIR,FRA1(FRA1(BLANC))].                          */
#define   fonction_FE_de_substitution(niveau)                                                                                           \
                    NIVA(FRA1(FRA2(NIVR(niveau))))                                                                                      \
                                        /* Definition de la fonction de mise dans [NOIR,FRA1(FRA2(BLANC))].                          */
#define   fonction_FC_de_substitution(niveau)                                                                                           \
                    NIVA(FRA1(FRA4(NIVR(niveau))))                                                                                      \
                                        /* Definition de la fonction de mise dans [NOIR,FRA1(FRA4(BLANC))].                          */
#define   fonction_F8_de_substitution(niveau)                                                                                           \
                    NIVA(FRA1(FRA8(NIVR(niveau))))                                                                                      \
                                        /* Definition de la fonction de mise dans [NOIR,FRA1(FRA8(BLANC))].                          */
#define   fonction_F0_de_substitution(niveau)                                                                                           \
                    NIVA(FRA1(FRA16(NIVR(niveau))))                                                                                     \
                                        /* Definition de la fonction de mise dans [NOIR,FRA1(FRA16(BLANC))].                         */
#define   fonction_E0_de_substitution(niveau)                                                                                           \
                    NIVA(FRA2(FRA16(NIVR(niveau))))                                                                                     \
                                        /* Definition de la fonction de mise dans [NOIR,FRA2(FRA16(BLANC))].                         */
#define   fonction_C0_de_substitution(niveau)                                                                                           \
                    NIVA(FRA4(FRA16(NIVR(niveau))))                                                                                     \
                                        /* Definition de la fonction de mise dans [NOIR,FRA4(FRA16(BLANC))].                         */
#define   fonction_80_de_substitution(niveau)                                                                                           \
                    NIVA(FRA8(FRA16(NIVR(niveau))))                                                                                     \
                                        /* Definition de la fonction de mise dans [NOIR,FRA8(FRA16(BLANC))].                         */
#define   fonction_ROUGE_de_substitution(niveau)                                                                                        \
                    fonction_neutre_de_substitution(niveau)                                                                             \
                                        /* Definition de la fonction ROUGE initialisee a l'etat neutre.                              */
#define   fonction_VERTE_de_substitution(niveau)                                                                                        \
                    fonction_neutre_de_substitution(niveau)                                                                             \
                                        /* Definition de la fonction VERTE initialisee a l'etat neutre.                              */
#define   fonction_BLEUE_de_substitution(niveau)                                                                                        \
                    fonction_neutre_de_substitution(niveau)                                                                             \
                                        /* Definition de la fonction BLEUE initialisee a l'etat neutre.                              */
#define   fonction_variable_de_substitution(niveau)                                                                                     \
                    fonction_neutre_de_substitution(niveau)                                                                             \
                                        /* Definition de la fonction variable initialisee a l'etat neutre.                           */
#define   fonction_SOLAR_de_substitution(niveau)                                                                                        \
                    ADD2(INTE(MUL2(DIVI(FLOT(NIVR(niveau))                                                                              \
                                       ,FLOT(NIVR(BLANC))                                                                               \
                                        )                                                                                               \
                                  ,FLOT(SOUS(BLANC_SOLAR,NOIR_SOLAR))                                                                   \
                                   )                                                                                                    \
                              )                                                                                                         \
                        ,NOIR_SOLAR                                                                                                     \
                         )                                                                                                              \
                                        /* Definition de la fonction d'acces au SOLAR.                                               */
#define   fonction_X_WINDOW_de_substitution(niveau)                                                                                     \
                    fonction_neutre_de_substitution(niveau)                                                                             \
                                        /* Definition de la fonction X_WINDOW initialisee a l'etat neutre.                           */
#define   CLEAR_LISTE_INVERSE_DE_SUBSTITUTION(L_SUBSTITUTION_XX)                                                                        \
                    Bblock                                                                                                              \
                    BoIn(niveau,NOIR,BLANC,PAS_COULEURS)                                                                                \
                         Bblock                                                                                                         \
                         EGAL(ACCES_listes_inverses_de_substitution(L_SUBSTITUTION_XX,niveau)                                           \
                             ,NIVEAU_UNDEF                                                                                              \
                              );                                                                                                        \
                         Eblock                                                                                                         \
                    EBoI                                                                                                                \
                    Eblock                                                                                                              \
                                        /* Initialisation preliminaire a 'NIVEAU_UNDEF' des listes "inverses".                       */
#define   CALCUL_LISTE_INVERSE_DE_SUBSTITUTION(L_SUBSTITUTION_XX,niveau)                                                                \
                    Bblock                                                                                                              \
                    EGAL(ACCES_listes_inverses_de_substitution(L_SUBSTITUTION_XX                                                        \
                                                              ,ACCES_listes_de_substitution(L_SUBSTITUTION_XX,niveau)                   \
                                                               )                                                                        \
                        ,niveau                                                                                                         \
                         );                                                                                                             \
                    Eblock                                                                                                              \
                                        /* Puis initialisation d'un element de liste "inverse" a partir d'un                         */ \
                                        /* element de liste "directe".                                                               */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P A S S A G E   D E S   I M A G E S   A   L A   L I S T E                                                                  */
/*        D E   S U B S T I T U T I O N   V A R I A B L E   E T   I N V E R S E M E N T  :                                           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   IMAGE_VERS_LISTE_DE_SUBSTITUTION(niveau,imageA,X,Y)                                                                           \
                    Bblock                                                                                                              \
                    MODIFICATION_LISTE_DE_SUBSTITUTION(niveau                                                                           \
                                                      ,load_point_valide(imageA,X,Y)                                                    \
                                                       );                                                                               \
                    Eblock                                                                                                              \
                                        /* L_SUBSTITUTION_VARIABLE(niveau) <-- imageA(X,Y).                                          */
#define   LISTE_DE_SUBSTITUTION_VERS_IMAGE(imageR,X,Y,Vf,niveau)                                                                        \
                    Bblock                                                                                                              \
                    store_point_valide(ACCES_listes_de_substitution(L_SUBSTITUTION_VARIABLE,niveau)                                     \
                                      ,imageR                                                                                           \
                                      ,X,Y                                                                                              \
                                      ,Vf                                                                                               \
                                       );                                                                                               \
                    Eblock                                                                                                              \
                                        /* ImageR(X,Y) <-- L_SUBSTITUTION_VARIABLE(niveau).                                          */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        I D E N T I F I C A T I O N   D ' U N E   L I S T E   D E   S U B S T I T U T I O N                                        */
/*        P A R   S O N   N O M   E T   N O N   P A R   S O N   N U M E R O  :                                                       */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Utilisation :                                                                                                              */
/*                                                                                                                                   */
/*                  RECHERCHE_D_UNE_LISTE_DE_SUBSTITUTION(liste_cherchee,numero,liste_par_defaut);                                   */
/*                                                                                                                                   */
/*                  ou :                                                                                                             */
/*                                                                                                                                   */
/*                  'liste_cherchee'                        : nom (alphanumerique) de la liste recherchee,                           */
/*                  'numero'                                : numero renvoye lorsque la liste a ete trouvee (ou sinon,               */
/*                                                            donne 'liste_par_defaut').                                             */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   RECHERCHE_LISTE_DE_SUBSTITUTION(liste_courante,liste_associee,liste_cherchee,numero)                                          \
                    Bblock                                                                                                              \
                    Test(EST_FAUX(on_a_trouve_la_liste_de_substitution))                                                                \
                         Bblock                                                                                                         \
                         Test(IFOU(IFEQ_chaine(liste_cherchee,"liste_courante")                                                         \
                                  ,IFEQ_chaine(liste_cherchee,"L_SUBSTITUTION`liste_courante")                                          \
                                   )                                                                                                    \
                              )                                                                                                         \
                                        /* La possibilite d'omettre "L_SUBSTITUTION_" pour abreger le nom des listes de substitution */ \
                                        /* a ete introduite le 20101029100412...                                                     */ \
                              Bblock                                                                                                    \
                              EGAL(numero,liste_associee);                                                                              \
                                        /* Recuperation de la liste de substitution lorsqu'on l'a trouve...                          */ \
                              EGAL(on_a_trouve_la_liste_de_substitution,VRAI);                                                          \
                                        /* Afin d'indiquer qu'on a trouve la liste cherchee...                                       */ \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock                                                                                                              \
                                        /* Tentative d'identification d'une liste de substitution par comparaison a un nom courant.  */
#define   RECHERCHE_D_UNE_LISTE_DE_SUBSTITUTION(liste_cherchee,numero,liste_par_defaut)                                                 \
                    Bblock                                                                                                              \
                    DEFV(Logical,INIT(on_a_trouve_la_liste_de_substitution,FAUX));                                                      \
                                        /* Afin de savoir si la liste de substitution recherchee existe...                           */ \
                    RECHERCHE_LISTE_DE_SUBSTITUTION(NEUTRE,L_SUBSTITUTION_NEUTRE,liste_cherchee,numero);                                \
                    RECHERCHE_LISTE_DE_SUBSTITUTION(01,L_SUBSTITUTION_01,liste_cherchee,numero);                                        \
                    RECHERCHE_LISTE_DE_SUBSTITUTION(02,L_SUBSTITUTION_02,liste_cherchee,numero);                                        \
                    RECHERCHE_LISTE_DE_SUBSTITUTION(11,L_SUBSTITUTION_11,liste_cherchee,numero);                                        \
                    RECHERCHE_LISTE_DE_SUBSTITUTION(12,L_SUBSTITUTION_12,liste_cherchee,numero);                                        \
                    RECHERCHE_LISTE_DE_SUBSTITUTION(13,L_SUBSTITUTION_13,liste_cherchee,numero);                                        \
                    RECHERCHE_LISTE_DE_SUBSTITUTION(14,L_SUBSTITUTION_14,liste_cherchee,numero);                                        \
                    RECHERCHE_LISTE_DE_SUBSTITUTION(21,L_SUBSTITUTION_21,liste_cherchee,numero);                                        \
                    RECHERCHE_LISTE_DE_SUBSTITUTION(22,L_SUBSTITUTION_22,liste_cherchee,numero);                                        \
                    RECHERCHE_LISTE_DE_SUBSTITUTION(23,L_SUBSTITUTION_23,liste_cherchee,numero);                                        \
                    RECHERCHE_LISTE_DE_SUBSTITUTION(24,L_SUBSTITUTION_24,liste_cherchee,numero);                                        \
                    RECHERCHE_LISTE_DE_SUBSTITUTION(25,L_SUBSTITUTION_25,liste_cherchee,numero);                                        \
                    RECHERCHE_LISTE_DE_SUBSTITUTION(26,L_SUBSTITUTION_26,liste_cherchee,numero);                                        \
                    RECHERCHE_LISTE_DE_SUBSTITUTION(27,L_SUBSTITUTION_27,liste_cherchee,numero);                                        \
                    RECHERCHE_LISTE_DE_SUBSTITUTION(28,L_SUBSTITUTION_28,liste_cherchee,numero);                                        \
                    RECHERCHE_LISTE_DE_SUBSTITUTION(31,L_SUBSTITUTION_31,liste_cherchee,numero);                                        \
                    RECHERCHE_LISTE_DE_SUBSTITUTION(32,L_SUBSTITUTION_32,liste_cherchee,numero);                                        \
                    RECHERCHE_LISTE_DE_SUBSTITUTION(33,L_SUBSTITUTION_33,liste_cherchee,numero);                                        \
                    RECHERCHE_LISTE_DE_SUBSTITUTION(34,L_SUBSTITUTION_34,liste_cherchee,numero);                                        \
                    RECHERCHE_LISTE_DE_SUBSTITUTION(35,L_SUBSTITUTION_35,liste_cherchee,numero);                                        \
                    RECHERCHE_LISTE_DE_SUBSTITUTION(36,L_SUBSTITUTION_36,liste_cherchee,numero);                                        \
                    RECHERCHE_LISTE_DE_SUBSTITUTION(37,L_SUBSTITUTION_37,liste_cherchee,numero);                                        \
                    RECHERCHE_LISTE_DE_SUBSTITUTION(38,L_SUBSTITUTION_38,liste_cherchee,numero);                                        \
                    RECHERCHE_LISTE_DE_SUBSTITUTION(39,L_SUBSTITUTION_39,liste_cherchee,numero);                                        \
                    RECHERCHE_LISTE_DE_SUBSTITUTION(3A,L_SUBSTITUTION_3A,liste_cherchee,numero);                                        \
                    RECHERCHE_LISTE_DE_SUBSTITUTION(3B,L_SUBSTITUTION_3B,liste_cherchee,numero);                                        \
                    RECHERCHE_LISTE_DE_SUBSTITUTION(3C,L_SUBSTITUTION_3C,liste_cherchee,numero);                                        \
                    RECHERCHE_LISTE_DE_SUBSTITUTION(3D,L_SUBSTITUTION_3D,liste_cherchee,numero);                                        \
                    RECHERCHE_LISTE_DE_SUBSTITUTION(3E,L_SUBSTITUTION_3E,liste_cherchee,numero);                                        \
                    RECHERCHE_LISTE_DE_SUBSTITUTION(3F,L_SUBSTITUTION_3F,liste_cherchee,numero);                                        \
                    RECHERCHE_LISTE_DE_SUBSTITUTION(3G,L_SUBSTITUTION_3G,liste_cherchee,numero);                                        \
                    RECHERCHE_LISTE_DE_SUBSTITUTION(FF,L_SUBSTITUTION_FF,liste_cherchee,numero);                                        \
                    RECHERCHE_LISTE_DE_SUBSTITUTION(FE,L_SUBSTITUTION_FE,liste_cherchee,numero);                                        \
                    RECHERCHE_LISTE_DE_SUBSTITUTION(FC,L_SUBSTITUTION_FC,liste_cherchee,numero);                                        \
                    RECHERCHE_LISTE_DE_SUBSTITUTION(F8,L_SUBSTITUTION_F8,liste_cherchee,numero);                                        \
                    RECHERCHE_LISTE_DE_SUBSTITUTION(F0,L_SUBSTITUTION_F0,liste_cherchee,numero);                                        \
                    RECHERCHE_LISTE_DE_SUBSTITUTION(E0,L_SUBSTITUTION_E0,liste_cherchee,numero);                                        \
                    RECHERCHE_LISTE_DE_SUBSTITUTION(C0,L_SUBSTITUTION_C0,liste_cherchee,numero);                                        \
                    RECHERCHE_LISTE_DE_SUBSTITUTION(80,L_SUBSTITUTION_80,liste_cherchee,numero);                                        \
                    RECHERCHE_LISTE_DE_SUBSTITUTION(ROUGE,L_SUBSTITUTION_ROUGE_BASIC,liste_cherchee,numero);                            \
                    RECHERCHE_LISTE_DE_SUBSTITUTION(VERTE,L_SUBSTITUTION_VERTE_BASIC,liste_cherchee,numero);                            \
                    RECHERCHE_LISTE_DE_SUBSTITUTION(BLEUE,L_SUBSTITUTION_BLEUE_BASIC,liste_cherchee,numero);                            \
                    RECHERCHE_LISTE_DE_SUBSTITUTION(VARIABLE,L_SUBSTITUTION_VARIABLE,liste_cherchee,numero);                            \
                    RECHERCHE_LISTE_DE_SUBSTITUTION(HISTOGRAMME,L_SUBSTITUTION_HISTOGRAMME,liste_cherchee,numero);                      \
                                        /* Introduit le 20081004123309...                                                            */ \
                    RECHERCHE_LISTE_DE_SUBSTITUTION(L_SUBSTITUTION_SOLAR,L_SUBSTITUTION_SOLAR,liste_cherchee,numero);                   \
                                                                                                                                        \
                    Test(EST_FAUX(on_a_trouve_la_liste_de_substitution))                                                                \
                         Bblock                                                                                                         \
                         Test(IL_FAUT(RECHERCHE_D_UNE_LISTE_DE_SUBSTITUTION_____signaler_erreurs))                                      \
                              Bblock                                                                                                    \
                              PRINT_ERREUR("la liste de SUBSTITUTION demandee n'existe pas");                                           \
                              CAL1(Prer1("il s'agissait de '%s'.\n",liste_cherchee));                                                   \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                                                                                                                                        \
                         EGAL(numero,liste_par_defaut);                                                                                 \
                                        /* Enfin, on force la substitution precisee par defaut.                                      */ \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock                                                                                                              \
                                        /* Tentative d'identification d'une liste de substitution par comparaison a l'ensemble       */ \
                                        /* des listes de 'SUBSTITUTION' disponibles et d'acces "autorise" (c'est ainsi que la        */ \
                                        /* liste 'L_SUBSTITUTION_X_WINDOW' ne figure pas ici...).                                    */



Copyright © Jean-François Colonna, 2019-2021.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / Ecole Polytechnique, 2019-2021.