_______________________________________________________________________________________________________________________________________
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        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$FON' :                                                                                         */
/*                                                                                                                                   */
/*                    Jean-Francois Colonna (LACTAMME, 19870000000000).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C A L I B R A G E   D ' U N   N I V E A U   D E   T Y P E   " M O D U L O "  :                                             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionP

DEFV(Common,DEFV(FonctionP,Ncalib_modulo(niveau)))
DEFV(Argument,DEFV(genere_p,niveau));
                                        /* Niveau a calibrer a la facon "modulo[origine,extremite]" ; ceci signifie que              */
                                        /* le niveau argument est ramene dans le segment [seuil_Corigine,seuil_Cextremite]           */
                                        /* lorsque ce calibrage est actif (voir 'etat_Cmodulo').                                     */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     RETU(TEST_NIVEAU_MODULO(niveau));
     Eblock

EFonctionP

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C A L I B R A G E   D ' U N   N I V E A U   D E   T Y P E   " S E U I L   B A S "  :                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionP

DEFV(Common,DEFV(FonctionP,Ncalib_bas(niveau)))
DEFV(Argument,DEFV(genere_p,niveau));
                                        /* Niveau a calibrer a la facon "seuil bas" ; ceci signifie que le niveau                    */
                                        /* argument est ramene a 'seuil_bas' s'il lui est inferieur, et si ce calibrage              */
                                        /* est actif (voir 'etat_Cbas').                                                             */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     RETU(TEST_NIVEAU_SEUIL_BAS(niveau));
     Eblock

EFonctionP

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C A L I B R A G E   D ' U N   N I V E A U   D E   T Y P E   " S E U I L   H A U T "  :                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionP

DEFV(Common,DEFV(FonctionP,Ncalib_haut(niveau)))
DEFV(Argument,DEFV(genere_p,niveau));
                                        /* Niveau a calibrer a la facon "seuil haut" ; ceci signifie que le niveau                   */
                                        /* argument est ramene a 'seuil_haut' s'il lui est superieur, et si ce calibrage             */
                                        /* est actif (voir 'etat_Chaut').                                                            */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     RETU(TEST_NIVEAU_SEUIL_HAUT(niveau));
     Eblock

EFonctionP

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C A L I B R A G E   D ' U N   N I V E A U   D E   T Y P E   " M U L T I P L E "  :                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionP

DEFV(Common,DEFV(FonctionP,Ncalibrage(niveau)))
DEFV(Argument,DEFV(genere_p,niveau));
                                        /* Niveau a calibrer a la facon dans l'ordre "modulo", "seuil haut"                          */
                                        /* puis "seuil haut".                                                                        */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     /*..............................................................................................................................*/
     RETU(Ncalib_bas(Ncalib_haut(Ncalib_modulo(niveau))));
     Eblock

EFonctionP

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        S U B S T I T U T I O N   D ' U N   N I V E A U  :                                                                         */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Utilisation :                                                                                                              */
/*                                                                                                                                   */
/*                  MODIFICATION_LISTE_DE_SUBSTITUTION(niveau,niveau_substitue);                                                     */
/*                                                                                                                                   */
/*                  permet de modifier la liste "VARIABLE",                                                                          */
/*                  en indiquant que le niveau 'niveau'                                                                              */
/*                  doit etre remplace par 'niveau_substitue', et                                                                    */
/*                                                                                                                                   */
/*                  REINITIALISATION_LISTE_DE_SUBSTITUTION;                                                                          */
/*                  MISE_A_L_ETAT_INITIAL_LISTE_DE_SUBSTITUTION;                                                                     */
/*                                                                                                                                   */
/*                  permet une reinitialisation de la                                                                                */
/*                  liste "VARIABLE", et un position-                                                                                */
/*                  nement sur la liste "NEUTRE".                                                                                    */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

                                        /* Le 20110401185706 'INITIALISATION_LISTE_DE_SUBSTITUTION' a ete deplace vers               */
                                        /* 'v $xiin/fonction.1$DEF INITIALISATION_LISTES_DE_SUBSTITUTION' pour etre utilisable       */
                                        /* dans 'v $ximf/aleatoires$DEF INITIALISATION_LISTES_DE_SUBSTITUTION'...                    */

                                        /* Le 20110401185706 'INITIALISATION_LISTES_DE_SUBSTITUTION' a ete deplace vers              */
                                        /* 'v $xiin/fonction.1$DEF INITIALISATION_LISTES_DE_SUBSTITUTION' pour etre utilisable       */
                                        /* dans 'v $ximf/aleatoires$DEF INITIALISATION_LISTES_DE_SUBSTITUTION'...                    */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        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  :                                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
DEFV(Common,DEFV(Logical,ZINT(RECHERCHE_D_UNE_LISTE_DE_SUBSTITUTION_____signaler_erreurs,VRAI)));
                                        /* Controle des messages d'erreur de 'RECHERCHE_D_UNE_LISTE_DE_SUBSTITUTION(...)'. Cet       */
                                        /* indicateur a ete introduit le 19990302094348 car au prealable, la procedure               */
                                        /* 'RECHERCHE_D_UNE_LISTE_DE_SUBSTITUTION(...)' ne signalait pas les recherches              */
                                        /* infructueuses de listes de SUBSTITUTION. Afin d'assurer une eventuelle compatibilite      */
                                        /* avec les versions anterieures et donc ne pas forcer l'edition d'un message d'erreur,      */
                                        /* cet indicateur a ete introduit...                                                         */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        S U B S T I T U T I O N   D ' U N   N I V E A U  :                                                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   ACCES_LISTE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_XX,niveau)                                                        \
                    Bblock                                                                                                              \
                    VALIDATION_NIVEAU                                                                                                   \
                        (                                                                                                               \
                         niveau                                                                                                         \
                        ,BLOC(EGAL(niveau_substitue                                                                                     \
                                  ,ACCES_listes_de_substitution(L_SUBSTITUTION_XX,niveau)                                               \
                                   );                                                                                                   \
                              )                                                                                                         \
                        ,BLOC(PRINT_ERREUR("un NIVEAU a substituer est invalide");                                                      \
                              CAL1(Prer1("lors de la demande de la substitution de %08X\n",niveau));                                    \
                              )                                                                                                         \
                         );                                                                                                             \
                    Eblock

#define   ACCES_LISTE_INVERSE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_XX,niveau)                                                \
                    Bblock                                                                                                              \
                    VALIDATION_NIVEAU                                                                                                   \
                        (                                                                                                               \
                         niveau                                                                                                         \
                        ,BLOC(EGAL(niveau_substitue                                                                                     \
                                  ,ACCES_listes_inverses_de_substitution(L_SUBSTITUTION_XX,niveau)                                      \
                                   );                                                                                                   \
                              )                                                                                                         \
                        ,BLOC(PRINT_ERREUR("un NIVEAU a substituer est invalide");                                                      \
                              CAL1(Prer1("lors de la demande de la substitution de %08X\n",niveau));                                    \
                              )                                                                                                         \
                         );                                                                                                             \
                    Eblock

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        S U B S T I T U T I O N   " D I R E C T E "   D ' U N   N I V E A U  :                                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionP

#define   FIXER_LE_PLANCHER                                                                                                             \
                    VRAI
#define   LAISSER_LE_PLANCHER                                                                                                           \
                    NOTL(FIXER_LE_PLANCHER)
                                        /* Pour savoir s'il faut ou pas modifier 'noir_plancher_substitution'...                     */

#define   CAS_ACCES_LISTE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_XX,fixer_le_noir_plancher,niveau_plancher,niveau)             \
                    Ca1e(L_SUBSTITUTION_XX)                                                                                             \
                         Bblock                                                                                                         \
                         Test(IL_FAUT(Nsubstitution_____utiliser_effectivement_la_substitution_directe))                                \
                              Bblock                                                                                                    \
                              ACCES_LISTE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_XX,niveau);                                   \
                                        /* Cas du fonctionnement "normal"...                                                         */ \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              ACCES_LISTE_INVERSE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_XX,niveau);                           \
                                        /* Cas du fonctionnement "inverse" (introduit le 20081005101150).                            */ \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                                                                                                                                        \
                         Test(IL_FAUT(fixer_le_noir_plancher))                                                                          \
                              Bblock                                                                                                    \
                              SET_NOIR_PLANCHER(niveau_plancher);                                                                       \
                              SET_NOIR_PLANCHER_DES_VECTEURS(niveau_plancher);                                                          \
                                        /* Mise en place systematique des niveaux planchers...                                       */ \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                         Eblock                                                                                                         \
                    ECa1                                                                                                                \
                                        /* Acces aux listes de substitution...                                                       */

DEFV(Common,DEFV(Logical,SINT(Nsubstitution_____utiliser_effectivement_la_substitution_directe,VRAI)));
                                        /* Introduit le 20081005101150 afin de permettre a 'Nsubstitution(...)' d'utiliser les       */
                                        /* listes de substitution inverses.                                                          */

DEFV(Common,DEFV(FonctionP,Nsubstitution(niveau)))
DEFV(Argument,DEFV(genere_p,niveau));
                                        /* Niveau a substituer.                                                                      */
                                        /* RESULTAT : la fonction renvoie le niveau substitue.                                       */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(genere_p,INIT(niveau_substitue,NIVEAU_UNDEF));
                                        /* Niveau resultant de la substitution.                                                      */
     DEFV(Int,INIT(index,UNDEF));
                                        /* Index d'acces aux niveaux dans les listes de substitution.                                */
     /*..............................................................................................................................*/
     INITIALISATION_LISTES_DE_SUBSTITUTION;

     Test(EST_AUTORISE(ACCES_liste_d_autorisation_de_substitution_des_niveaux(niveau)))
          Bblock
                                        /* Lorsque la substitution du niveau argument est AUTORISEe, on le substitue :               */
          Choi(num_liste_de_substitution)
                                        /* Choix de la liste de substitution.                                                        */
               Bblock
               CAS_ACCES_LISTE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_NEUTRE,FIXER_LE_PLANCHER,NOIR_PLANCHER,niveau);
               CAS_ACCES_LISTE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_ROUGE_BASIC,FIXER_LE_PLANCHER,NOIR_PLANCHER,niveau);
               CAS_ACCES_LISTE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_VERTE_BASIC,FIXER_LE_PLANCHER,NOIR_PLANCHER,niveau);
               CAS_ACCES_LISTE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_BLEUE_BASIC,FIXER_LE_PLANCHER,NOIR_PLANCHER,niveau);
                                        /* On notera ici la necessite imperative d'acceder sans permutation aux listes de            */
                                        /* COLORIAGE (ROUGE,VERTE,BLEUE), car en effet 'num_liste_de_substitution' contient          */
                                        /* en general un numero de liste deja substitue s'il a ete initialise par l'une des          */
                                        /* trois valeurs 'L_SUBSTITUTION_ROUGE', 'L_SUBSTITUTION_VERTE' ou 'L_SUBSTITUTION_BLEUE'.   */
               CAS_ACCES_LISTE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_01,FIXER_LE_PLANCHER,NOIR_PLANCHER_0,niveau);
               CAS_ACCES_LISTE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_02,FIXER_LE_PLANCHER,NOIR_PLANCHER_0,niveau);
               CAS_ACCES_LISTE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_11,FIXER_LE_PLANCHER,NOIR_PLANCHER_1,niveau);
               CAS_ACCES_LISTE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_12,FIXER_LE_PLANCHER,NOIR_PLANCHER_1,niveau);
               CAS_ACCES_LISTE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_13,FIXER_LE_PLANCHER,NOIR_PLANCHER_1,niveau);
               CAS_ACCES_LISTE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_14,FIXER_LE_PLANCHER,NOIR_PLANCHER_1,niveau);
               CAS_ACCES_LISTE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_21,FIXER_LE_PLANCHER,NOIR_PLANCHER_2,niveau);
               CAS_ACCES_LISTE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_22,FIXER_LE_PLANCHER,NOIR_PLANCHER_2,niveau);
               CAS_ACCES_LISTE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_23,FIXER_LE_PLANCHER,NOIR_PLANCHER_2,niveau);
               CAS_ACCES_LISTE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_24,FIXER_LE_PLANCHER,NOIR_PLANCHER_2,niveau);
               CAS_ACCES_LISTE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_25,FIXER_LE_PLANCHER,NOIR_PLANCHER_2,niveau);
               CAS_ACCES_LISTE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_26,FIXER_LE_PLANCHER,NOIR_PLANCHER_2,niveau);
               CAS_ACCES_LISTE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_27,FIXER_LE_PLANCHER,NOIR_PLANCHER_2,niveau);
               CAS_ACCES_LISTE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_28,FIXER_LE_PLANCHER,NOIR_PLANCHER_2,niveau);
               CAS_ACCES_LISTE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_31,FIXER_LE_PLANCHER,NOIR_PLANCHER_3,niveau);
               CAS_ACCES_LISTE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_32,FIXER_LE_PLANCHER,NOIR_PLANCHER_3,niveau);
               CAS_ACCES_LISTE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_33,FIXER_LE_PLANCHER,NOIR_PLANCHER_3,niveau);
               CAS_ACCES_LISTE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_34,FIXER_LE_PLANCHER,NOIR_PLANCHER_3,niveau);
               CAS_ACCES_LISTE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_35,FIXER_LE_PLANCHER,NOIR_PLANCHER_3,niveau);
               CAS_ACCES_LISTE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_36,FIXER_LE_PLANCHER,NOIR_PLANCHER_3,niveau);
               CAS_ACCES_LISTE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_37,FIXER_LE_PLANCHER,NOIR_PLANCHER_3,niveau);
               CAS_ACCES_LISTE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_38,FIXER_LE_PLANCHER,NOIR_PLANCHER_3,niveau);
               CAS_ACCES_LISTE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_39,FIXER_LE_PLANCHER,NOIR_PLANCHER_3,niveau);
               CAS_ACCES_LISTE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_3A,FIXER_LE_PLANCHER,NOIR_PLANCHER_3,niveau);
               CAS_ACCES_LISTE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_3B,FIXER_LE_PLANCHER,NOIR_PLANCHER_3,niveau);
               CAS_ACCES_LISTE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_3C,FIXER_LE_PLANCHER,NOIR_PLANCHER_3,niveau);
               CAS_ACCES_LISTE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_3D,FIXER_LE_PLANCHER,NOIR_PLANCHER_3,niveau);
               CAS_ACCES_LISTE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_3E,FIXER_LE_PLANCHER,NOIR_PLANCHER_3,niveau);
               CAS_ACCES_LISTE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_3F,FIXER_LE_PLANCHER,NOIR_PLANCHER_3,niveau);
               CAS_ACCES_LISTE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_3G,FIXER_LE_PLANCHER,NOIR_PLANCHER_3,niveau);
               CAS_ACCES_LISTE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_FF,FIXER_LE_PLANCHER,NOIR_PLANCHER_0,niveau);
               CAS_ACCES_LISTE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_FE,FIXER_LE_PLANCHER,NOIR_PLANCHER_1,niveau);
               CAS_ACCES_LISTE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_FC,FIXER_LE_PLANCHER,NOIR_PLANCHER_2,niveau);
               CAS_ACCES_LISTE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_F8,FIXER_LE_PLANCHER,NOIR_PLANCHER_3,niveau);
               CAS_ACCES_LISTE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_F0,FIXER_LE_PLANCHER,NOIR_PLANCHER_4,niveau);
               CAS_ACCES_LISTE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_E0,FIXER_LE_PLANCHER,NOIR_PLANCHER_5,niveau);
               CAS_ACCES_LISTE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_C0,FIXER_LE_PLANCHER,NOIR_PLANCHER_6,niveau);
               CAS_ACCES_LISTE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_80,FIXER_LE_PLANCHER,NOIR_PLANCHER_7,niveau);
               CAS_ACCES_LISTE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_VARIABLE,LAISSER_LE_PLANCHER,NIVEAU_UNDEF,niveau);
               CAS_ACCES_LISTE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_HISTOGRAMME,LAISSER_LE_PLANCHER,NIVEAU_UNDEF,niveau);
                                        /* Introduit le 20081004123137...                                                            */ \
               CAS_ACCES_LISTE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_SOLAR,FIXER_LE_PLANCHER,NOIR_PLANCHER,niveau);
               CAS_ACCES_LISTE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_X_WINDOW,LAISSER_LE_PLANCHER,NIVEAU_UNDEF,niveau);

               Defo
                    Bblock
                    PRINT_ERREUR("une liste de substitution inconnue est demandee");
                    CAL1(Prer1("son numero est %d\n",num_liste_de_substitution));

                    ACCES_LISTE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_NEUTRE,niveau);
                    Eblock
               EDef
               Eblock
          ECho
          Eblock
     ATes
          Bblock
          EGAL(niveau_substitue,niveau);
                                        /* Lorsque la substitution du niveau argument est INTERDITe, on le renvoie tel quel...       */
          Eblock
     ETes

     RETU(niveau_substitue);
     Eblock

#undef    CAS_ACCES_LISTE_DE_SUBSTITUTION
#undef    FIXER_LE_PLANCHER
#undef    LAISSER_LE_PLANCHER

EFonctionP

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        S U B S T I T U T I O N   " I N V E R S E "   D ' U N   N I V E A U  :                                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionP

#define   CAS_ACCES_LISTE_INVERSE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_XX,niveau)                                            \
                    Ca1e(L_SUBSTITUTION_XX)                                                                                             \
                         Bblock                                                                                                         \
                         Test(IL_FAUT(Nsubstitution_inverse_____utiliser_effectivement_la_substitution_inverse))                        \
                              Bblock                                                                                                    \
                              ACCES_LISTE_INVERSE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_XX,niveau);                           \
                                        /* Cas du fonctionnement "normal"...                                                         */ \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              ACCES_LISTE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_XX,niveau);                                   \
                                        /* Cas du fonctionnement "inverse" (introduit le 20081005101150).                            */ \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                         Eblock                                                                                                         \
                    ECa1                                                                                                                \
                                        /* Acces aux listes inverses de substitution...                                              */

DEFV(Common,DEFV(Logical,SINT(Nsubstitution_inverse_____utiliser_effectivement_la_substitution_inverse,VRAI)));
                                        /* Introduit le 20081005101150 par symetrie avec 'Nsubstitution(...)'...                     */

DEFV(Common,DEFV(FonctionP,Nsubstitution_inverse(niveau)))
DEFV(Argument,DEFV(genere_p,niveau));
                                        /* Niveau a substituer.                                                                      */
                                        /* RESULTAT : la fonction renvoie le niveau substitue.                                       */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(genere_p,INIT(niveau_substitue,NIVEAU_UNDEF));
                                        /* Niveau resultant de la substitution.                                                      */
     DEFV(Int,INIT(index,UNDEF));
                                        /* Index d'acces aux niveaux dans les listes de substitution.                                */
     /*..............................................................................................................................*/
     INITIALISATION_LISTES_DE_SUBSTITUTION;

     Choi(num_liste_de_substitution)
                                        /* Choix de la liste de substitution.                                                        */
          Bblock
          CAS_ACCES_LISTE_INVERSE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_NEUTRE,niveau);
          CAS_ACCES_LISTE_INVERSE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_ROUGE_BASIC,niveau);
          CAS_ACCES_LISTE_INVERSE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_VERTE_BASIC,niveau);
          CAS_ACCES_LISTE_INVERSE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_BLEUE_BASIC,niveau);
                                        /* On notera ici la necessite imperative d'acceder sans permutation aux listes de            */
                                        /* COLORIAGE (ROUGE,VERTE,BLEUE), car en effet 'num_liste_de_substitution' contient          */
                                        /* en general un numero de liste deja substitue s'il a ete initialise par l'une des          */
                                        /* trois valeurs 'L_SUBSTITUTION_ROUGE', 'L_SUBSTITUTION_VERTE' ou 'L_SUBSTITUTION_BLEUE'.   */
          CAS_ACCES_LISTE_INVERSE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_01,niveau);
          CAS_ACCES_LISTE_INVERSE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_02,niveau);
          CAS_ACCES_LISTE_INVERSE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_11,niveau);
          CAS_ACCES_LISTE_INVERSE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_12,niveau);
          CAS_ACCES_LISTE_INVERSE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_13,niveau);
          CAS_ACCES_LISTE_INVERSE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_14,niveau);
          CAS_ACCES_LISTE_INVERSE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_21,niveau);
          CAS_ACCES_LISTE_INVERSE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_22,niveau);
          CAS_ACCES_LISTE_INVERSE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_23,niveau);
          CAS_ACCES_LISTE_INVERSE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_24,niveau);
          CAS_ACCES_LISTE_INVERSE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_25,niveau);
          CAS_ACCES_LISTE_INVERSE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_26,niveau);
          CAS_ACCES_LISTE_INVERSE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_27,niveau);
          CAS_ACCES_LISTE_INVERSE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_28,niveau);
          CAS_ACCES_LISTE_INVERSE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_31,niveau);
          CAS_ACCES_LISTE_INVERSE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_32,niveau);
          CAS_ACCES_LISTE_INVERSE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_33,niveau);
          CAS_ACCES_LISTE_INVERSE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_34,niveau);
          CAS_ACCES_LISTE_INVERSE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_35,niveau);
          CAS_ACCES_LISTE_INVERSE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_36,niveau);
          CAS_ACCES_LISTE_INVERSE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_37,niveau);
          CAS_ACCES_LISTE_INVERSE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_38,niveau);
          CAS_ACCES_LISTE_INVERSE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_39,niveau);
          CAS_ACCES_LISTE_INVERSE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_3A,niveau);
          CAS_ACCES_LISTE_INVERSE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_3B,niveau);
          CAS_ACCES_LISTE_INVERSE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_3C,niveau);
          CAS_ACCES_LISTE_INVERSE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_3D,niveau);
          CAS_ACCES_LISTE_INVERSE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_3E,niveau);
          CAS_ACCES_LISTE_INVERSE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_3F,niveau);
          CAS_ACCES_LISTE_INVERSE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_3G,niveau);
          CAS_ACCES_LISTE_INVERSE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_FF,niveau);
          CAS_ACCES_LISTE_INVERSE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_FE,niveau);
          CAS_ACCES_LISTE_INVERSE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_FC,niveau);
          CAS_ACCES_LISTE_INVERSE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_F8,niveau);
          CAS_ACCES_LISTE_INVERSE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_F0,niveau);
          CAS_ACCES_LISTE_INVERSE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_E0,niveau);
          CAS_ACCES_LISTE_INVERSE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_C0,niveau);
          CAS_ACCES_LISTE_INVERSE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_80,niveau);
          CAS_ACCES_LISTE_INVERSE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_VARIABLE,niveau);
          CAS_ACCES_LISTE_INVERSE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_HISTOGRAMME,niveau);
                                        /* Introduit le 20081004123137...                                                            */ \
          CAS_ACCES_LISTE_INVERSE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_SOLAR,niveau);
          CAS_ACCES_LISTE_INVERSE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_X_WINDOW,niveau);

          Defo
               Bblock
               PRINT_ERREUR("une liste de substitution inconnue est demandee");
               CAL1(Prer1("son numero est %d\n",num_liste_de_substitution));

               ACCES_LISTE_INVERSE_DE_SUBSTITUTION(niveau_substitue,L_SUBSTITUTION_NEUTRE,niveau);
               Eblock
          EDef
          Eblock
     ECho

     RETU(niveau_substitue);
     Eblock

#undef    CAS_ACCES_LISTE_INVERSE_DE_SUBSTITUTION

EFonctionP

#undef    ACCES_LISTE_INVERSE_DE_SUBSTITUTION
#undef    ACCES_LISTE_DE_SUBSTITUTION

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        G E S T I O N   D E   L ' E C R A S E M E N T   D E S   N I V E A U X  :                                                   */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Utilisation :                                                                                                              */
/*                                                                                                                                   */
/*                  ECRASEMENT_AUTORISE(niveau);                                                                                     */
/*                  ECRASEMENT_INTERDIT(niveau);                                                                                     */
/*                                                                                                                                   */
/*                  permettent d'autoriser ou                                                                                        */
/*                  interdire respectivement                                                                                         */
/*                  l'ecrasement du niveau argument,                                                                                 */
/*                                                                                                                                   */
/*                  et,                                                                                                              */
/*                                                                                                                                   */
/*                  Necrasement(niveau);                                                                                             */
/*                                                                                                                                   */
/*                  permet de savoir si le niveau                                                                                    */
/*                  argument "niveau" peut etre                                                                                      */
/*                  ecrase ('AUTORISE') ou pas                                                                                       */
/*                  ('INTERDIT').                                                                                                    */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Nota :                                                                                                                     */
/*                                                                                                                                   */
/*                    Lorsque le niveau argument                                                                                     */
/*                  n'est pas dans [NOIR,BLANC],                                                                                     */
/*                  il est ecrasable a priori...                                                                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionL

DEFV(Common,DEFV(FonctionL,Necrasement(niveau)))
DEFV(Argument,DEFV(genere_p,niveau));
                                        /* Niveau dont on doit tester l'autorisation d'ecrasement.                                   */
                                        /* RESULTAT : la fonction renvoie l'autorisation ou l'interdiction de ce niveau.             */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(Logical,INIT(ecrasement,LUNDEF));
                                        /* Indicateur logique precisant si l'ecrasement du niveau argument est                       */
                                        /* autorise ou pas...                                                                        */
     /*..............................................................................................................................*/
     Test(EST_FAUX(init_ecrasement))
          Bblock
          BoIn(index,NOIR,BLANC,PAS_COULEURS)
               Bblock
               EGAL(ACCES_liste_d_ecrasement(index),AUTORISE);
                                        /* A priori, on autorise l'ecrasement de tous les niveaux...                                 */
               Eblock
          EBoI

          EGAL(init_ecrasement,VRAI);
                                        /* Et on memorise que l'initialisation est faite...                                          */
          Eblock
     ATes
          Bblock
          Eblock
     ETes

     VALIDATION_NIVEAU
         (
          niveau
         ,BLOC(EGAL(ecrasement,ACCES_liste_d_ecrasement(niveau));
               )
                                        /* Pour un niveau dans [NOIR,BLANC], on teste la liste d'ecrasement.                         */
         ,BLOC(EGAL(ecrasement,AUTORISE);
               )
                                        /* Pour les niveaux hors de [NOIR,BLANC], l'ecrasement n'est pas inhibable.                  */
          )

     RETU(ecrasement);
                                        /* Et renvoi de l'autorisation portant sur l'ecrasement du niveau argument.                  */
     Eblock

EFonctionL

_______________________________________________________________________________________________________________________________________



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