/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N S   G E N E R A L E S  :                                                                               */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xiiD/definit.2$DEF' :                                                                                          */
/*                                                                                                                                   */
/*                    Jean-Francois Colonna (LACTAMME, 19870000000000).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D E   L ' I N D E X A T I O N   D E S   I M A G E S  :                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

                                        /* Ce qui suit a ete deplace depuis 'v $xiii/Images$DEF 20170712133515' le 20170712133515    */
                                        /* afin que '__VERSION__INDEXATION_SIMPLIFIEE_A_PRIORI' puisse etre utilisable quasiment     */
                                        /* partout...                                                                                */

#if       (         (defined(SYSTEME_SGIND524_IRIX_CC))                                                                                 \
          ||        (defined(SYSTEME_SGO200A1_IRIX_CC))                                                                                 \
          ||        (defined(SYSTEME_SGO200A2_IRIX_CC))                                                                                 \
          ||        (defined(SYSTEME_SGO200A4_IRIX_CC))                                                                                 \
          ||        (defined(SYSTEME_SGPCM801_IRIX_CC))                                                                                 \
          ||        (defined(SYSTEME_SGPCMA01_IRIX_CC))                                                                                 \
          ||        (defined(SYSTEME_VAX9000_ULTRIX_CC))                                                                                \
          ||        (defined(SYSTEME_VAX9000_ULTRIX_GCC))                                                                               \
          ||        (defined(SYSTEME_VAX9000_ULTRIX_VCC))                                                                               \
           )

#    ifndef    NE_PAS_FORCER_L_INDEXATION_SIMPLIFIEE_A_PRIORI
#         TestADef  __VERSION__INDEXATION_SIMPLIFIEE_A_PRIORI                                                                           \
                                        /* Cette "option" etait dans 'v $xcc/cpp$D/cpp$Y INDEXATION_SIMPLIFIEE_A_PRIORI' avant le    */ \
                                        /* 20000328161359. Il est en fait de loin preferable qu'elle soit ici car, en effet, placee  */ \
                                        /* dans le symbole '$Includes' utilise dans tous les appels a '$xcp/cpp$X' faisait qu'il     */ \
                                        /* etait impossible d'annuler cette definition dans un source particulier. Ceci est possible */ \
                                        /* dorenavant en utilisant 'NE_PAS_FORCER_L_INDEXATION_SIMPLIFIEE_A_PRIORI'. Mais ATTENTION, */ \
                                        /* cela n'est pas aussi simple que cela, car l'indexation dont il s'agit ici se retrouve     */ \
                                        /* evidemment dans de nombreux modules '$FON' de '$xi' qui doivent alors a etre recompiles.  */ \
                                        /*                                                                                           */ \
                                        /* Le 20030316120258, 'INDEXATION_SIMPLIFIEE_A_PRIORI' a ete remplace par                    */ \
                                        /* '__VERSION__INDEXATION_SIMPLIFIEE_A_PRIORI' pour 'v $xcc/cpp$Z _VERSION_'.                */
#    Aifndef   NE_PAS_FORCER_L_INDEXATION_SIMPLIFIEE_A_PRIORI
#    Eifndef   NE_PAS_FORCER_L_INDEXATION_SIMPLIFIEE_A_PRIORI

#Aif      (         (defined(SYSTEME_SGIND524_IRIX_CC))                                                                                 \
          ||        (defined(SYSTEME_SGO200A1_IRIX_CC))                                                                                 \
          ||        (defined(SYSTEME_SGO200A2_IRIX_CC))                                                                                 \
          ||        (defined(SYSTEME_SGO200A4_IRIX_CC))                                                                                 \
          ||        (defined(SYSTEME_SGPCM801_IRIX_CC))                                                                                 \
          ||        (defined(SYSTEME_SGPCMA01_IRIX_CC))                                                                                 \
          ||        (defined(SYSTEME_VAX9000_ULTRIX_CC))                                                                                \
          ||        (defined(SYSTEME_VAX9000_ULTRIX_GCC))                                                                               \
          ||        (defined(SYSTEME_VAX9000_ULTRIX_VCC))                                                                               \
           )
#Eif      (         (defined(SYSTEME_SGIND524_IRIX_CC))                                                                                 \
          ||        (defined(SYSTEME_SGO200A1_IRIX_CC))                                                                                 \
          ||        (defined(SYSTEME_SGO200A2_IRIX_CC))                                                                                 \
          ||        (defined(SYSTEME_SGO200A4_IRIX_CC))                                                                                 \
          ||        (defined(SYSTEME_SGPCM801_IRIX_CC))                                                                                 \
          ||        (defined(SYSTEME_SGPCMA01_IRIX_CC))                                                                                 \
          ||        (defined(SYSTEME_VAX9000_ULTRIX_CC))                                                                                \
          ||        (defined(SYSTEME_VAX9000_ULTRIX_GCC))                                                                               \
          ||        (defined(SYSTEME_VAX9000_ULTRIX_VCC))                                                                               \
           )

                                        /* Ce qui precede a ete deplace depuis 'v $xiii/Images$DEF 20170712133515' le 20170712133515 */
                                        /* afin que '__VERSION__INDEXATION_SIMPLIFIEE_A_PRIORI' puisse etre utilisable quasiment     */
                                        /* partout...                                                                                */

#define    __VERSION__INDEXATION_SIMPLIFIEE_A_PRIORI                                                                                    \
                                        /* Le 20170712142708, a des fins de tests de performances, je generalise l'indexation        */ \
                                        /* simplifiee, en conservant malgre tout ce qui precede (on ne sait jamais...).              */ \
                                        /*                                                                                           */ \
                                        /* On notera le 20170712143531, qu'ainsi, le test :                                          */ \
                                        /*                                                                                           */ \
                                        /*                  Std                                                                      */ \
                                        /*                  time      $xci/convol.01$X    A=$xiio/MIRE points=500 ...                */ \
                                        /*                                                                                           */ \
                                        /* est passe de :                                                                            */ \
                                        /*                                                                                           */ \
                                        /*                  3.150u 0.020s 0:03.24 97.8%     0+0k 2072+512io 5pf+0w                   */ \
                                        /*                                                                                           */ \
                                        /* a (apres 'v $xb/GENERE$Z'...) :                                                           */ \
                                        /*                                                                                           */ \
                                        /*                  2.900u 0.000s 0:02.89 100.3%    0+0k 0+512io 0pf+0w                      */ \
                                        /*                                                                                           */ \
                                        /* sur '$LACT19', ce qui n'est pas negligeable...                                            */ \
                                        /*                                                                                           */ \
                                        /*                                                                                           */ \
                                        /* Mais a cause de 'v $xiirv/.CARB.61.1.$U t.=.calcul' (et d'autres peut-etre...), je fais   */ \
                                        /* marche arriere le 20170712172532...                                                       */ \
                                        /*                                                                                           */ \
                                        /* Le 20170713133909, je note qu'activer '__VERSION__INDEXATION_SIMPLIFIEE_A_PRIORI' peut    */ \
                                        /* etre en fait tres dangereux. En effet, si elle est activee, les procedures d'indexation   */ \
                                        /* se reduisent a :                                                                          */ \
                                        /*                                                                                           */ \
                                        /*                  INDEXATION_OX(...) = IND?(?,?min)                                        */ \
                                        /*                                                                                           */ \
                                        /* ce qui ne teste pas la presence des coordonnees '?' dans [?min,?max]. Alors que si elle   */ \
                                        /* n'est pas activee et si 'IL_FAUT(echantillonnage), alors les procedures d'indexation      */ \
                                        /* sont en fait :                                                                            */ \
                                        /*                                                                                           */ \
                                        /*                  INDEXATION_OX(...) = IND?(Findice_?(...),?min)                           */ \
                                        /*                                                                                           */ \
                                        /* les fonctions 'Findice_?(...)' faisant un 'v $xiipf/fonction.3$FON MODU' dans [?min,?max] */ \
                                        /* ce qui est securisant...                                                                  */ \
                                        /*                                                                                           */ \
                                        /* Le 20170715111607, apres avoir corrige 'v $xiirv/.CARB.61.1.$U 20170715101236' je         */ \
                                        /* reactive '__VERSION__INDEXATION_SIMPLIFIEE_A_PRIORI', on verra bien...                    */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D U   B L A N C  :                                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   BITS_SUPPRIMES_OCTET                                                                                                          \
                    ZERO                                                                                                                \
                                        /* Nombre de bits a supprimer pour les points tenant sur un octet.                           */
#define   BITS_SUPPRIMES_MOT                                                                                                            \
                    DEUX                                                                                                                \
                                        /* Nombre de bits a supprimer pour les points tenant sur un mot.                             */
#define   NOMBRE_DE_BITS_POUR_LE_BLANC(taille_p)                                                                                        \
                    SOUS(MUL2(NBITOC,taille_p),COND(IFEQ(taille_p,NOCMO),BITS_SUPPRIMES_MOT,BITS_SUPPRIMES_OCTET))                      \
                                        /* Nombre de bits utilises pour le niveau de blanc ; lorsque un point                        */ \
                                        /* occupe un mot entier, on evite d'utiliser le bit de signe, ainsi,                         */ \
                                        /* 'BLANC' reste positif ; de plus, afin que 'COULEURS' soit elle aussi                      */ \
                                        /* une constante positive, on enleve encore un bit, d'ou le 'DEUX'...                        */
#define   GENERE_BLANC(taille_p)                                                                                                        \
                    gMASQUE(NOMBRE_DE_BITS_POUR_LE_BLANC(taille_p))                                                                     \
                                        /* Definition du niveau de blanc.                                                            */

#define   k___BLANC                                                                                                                     \
                    GENP(GENERE_BLANC(size_p))                                                                                          \
                                        /* Definition du niveau de blanc standard.                                                   */ \
                                        /*                                                                                           */ \
                                        /* ATTENTION : la constante 'BLANC' est pre-generee dans '$xcp/Konstantes$K'.                */
#define   k___GRIS                                                                                                                      \
                    GENP(NIVA(MOYD(NIVR(NOIR),NIVR(BLANC))))                                                                            \
                                        /* Definition de l'intermediaire entre le NOIR et le BLANC.                                  */
                                        /*                                                                                           */
                                        /* ATTENTION : la constante 'GRIS' est pre-generee dans '$xcp/Konstantes$K'.                 */

#TestADef GRIS_0                                                                                                                        \
                    NOIR
#TestADef GRIS_1                                                                                                                        \
                    GENP(NIVA(BARY(NIVR(NOIR),NIVR(BLANC),DIVI(FU,FLOT(HUIT)))))
#TestADef GRIS_2                                                                                                                        \
                    GENP(NIVA(BARY(NIVR(NOIR),NIVR(BLANC),DIVI(FDEUX,FLOT(HUIT)))))
#TestADef GRIS_3                                                                                                                        \
                    GENP(NIVA(BARY(NIVR(NOIR),NIVR(BLANC),DIVI(FLOT(TROIS),FLOT(HUIT)))))
#TestADef GRIS_4                                                                                                                        \
                    GENP(NIVA(BARY(NIVR(NOIR),NIVR(BLANC),DIVI(FLOT(QUATRE),FLOT(HUIT)))))
#TestADef GRIS_5                                                                                                                        \
                    GENP(NIVA(BARY(NIVR(NOIR),NIVR(BLANC),DIVI(FLOT(CINQ),FLOT(HUIT)))))
#TestADef GRIS_6                                                                                                                        \
                    GENP(NIVA(BARY(NIVR(NOIR),NIVR(BLANC),DIVI(FLOT(SIX),FLOT(HUIT)))))
#TestADef GRIS_7                                                                                                                        \
                    GENP(NIVA(BARY(NIVR(NOIR),NIVR(BLANC),DIVI(FLOT(SEPT),FLOT(HUIT)))))
#TestADef GRIS_8                                                                                                                        \
                    BLANC
                                        /* ATTENTION, j'ai decouvert le 20000202134317 que :                                         */
                                        /*                                                                                           */
                                        /*                   GRIS_7=+223        : $xiiD/definit.2$DEF                                */
                                        /*                   GRIS_7=+224        : $Fimages                                           */
                                        /*                                                                                           */
                                        /* ces differences se retrouvent aussi pour :                                                */
                                        /*                                                                                           */
                                        /*                   {GRIS_1,GRIS_2,GRIS_3,GRIS_4,GRIS_5,GRIS_6,GRIS_7}                      */
                                        /*                                                                                           */
                                        /* Malgre les problemes de compatibilite que cela pose, je corrige cela dans '$Fimages'.     */
                                        /*                                                                                           */
                                        /* Le 20050111155519 a cause de la modification 'v $xig/edite$vv$FON 20050111154812', ces    */
                                        /* definitions sont passees de 'define' a 'TestADef'...                                      */

#define   FLOT__BLANC                                                                                                                   \
                    FLOT(BLANC)

#define   BLANC_char                                                                                                                    \
                    CAST_CHAR(GENERE_BLANC(size_CHAR))                                                                                  \
                                        /* La procedure 'CAST_CHAR(...)' a remplace un 'CAST(genere_CHAR,...)' le 20090331102045.    */
#define   BLANC_int                                                                                                                     \
                    CASP_Int(GENERE_BLANC(size_Int))
#define   BLANC_float                                                                                                                   \
                    CASP_Float(GENERE_BLANC(size_Int))                                                                                  \
                                        /* ATTENTION : on utilise 'size_Int' pour simplifier les problemes dus a la definition       */ \
                                        /* de 'Float' qui peut etre soit simple, soit double precision...                            */ \
                                        /*                                                                                           */ \
                                        /* ATTENTION a ne pas confondre 'BLANC_float' et 'FLOT__BLANC', le premier donnant le        */ \
                                        /* 'BLANC' en format 'genere_Float' et le second en format 'genere_p'. Ils n'ont donc        */ \
                                        /* pas du tout la meme valeur (par exemple le premier sera fait de 31 bits a 1, alors que    */ \
                                        /* le second sera fait de 8 bits a 1)...                                                     */

                                        /* Les procedures 'CASP...(...)' ont remplace les 'CASP(genere_...,...)' le 20090331104611.  */

#define   BLANC_double                                                                                                                  \
                    BLANC_float                                                                                                         \
                                        /* ATTENTION : on ne peut generer 'BLANC_double' par des decalages...                        */
#define   k___COULEURS                                                                                                                  \
                    LENG(NOIR,BLANC)                                                                                                    \
                                        /* Nombre de niveaux du noir au blanc.                                                       */ \
                                        /*                                                                                           */ \
                                        /* ATTENTION : la constante 'COULEURS' est pre-generee dans '$xcp/Konstantes$K'.             */
#define   PAS_COULEURS                                                                                                                  \
                    I                                                                                                                   \
                                        /* Pas de passage d'une couleur a la suivante...                                             */

                                        /* ATTENTION, on notera le passage en 'FLOT(...)' du niveau argument ; ceci est rendu        */
                                        /* necesaire si l'on veut eviter des "repliements" en mode 'GENP(...)'. A titre d'exemple,   */
                                        /* en l'absence de ceci, on a :                                                              */
                                        /*                                                                                           */
                                        /*                  SUCK(BLANC) = NOIR                                                       */
                                        /*                  PREK(NOIR)  = BLANC                                                      */
                                        /*                                                                                           */
                                        /* ceci ayant ete mis en place le 19970505091407.                                            */

#define   nPREK(x,N)                                                                                                                    \
                    SOUS(FLOT(x),nPAS(N,PAS_COULEURS))                                                                                  \
                                        /* Fonction N-ieme 'PREDecesseur Kouleur'.                                                   */
#define   nSUCK(x,N)                                                                                                                    \
                    ADD2(FLOT(x),nPAS(N,PAS_COULEURS))                                                                                  \
                                        /* Fonction N-ieme 'SUCCesseur Kouleur'.                                                     */

                                        /* ATTENTION, on notera le passage en 'FLOT(...)' du niveau argument ; ceci est rendu        */
                                        /* necesaire si l'on veut eviter des "repliements" en mode 'GENP(...)'. A titre d'exemple,   */
                                        /* en l'absence de ceci, on a :                                                              */
                                        /*                                                                                           */
                                        /*                  SUCK(BLANC) = NOIR                                                       */
                                        /*                  PREK(NOIR)  = BLANC                                                      */
                                        /*                                                                                           */
                                        /* ceci ayant ete mis en place le 19970505091407.                                            */

#define   nPREK_TRON(x,N)                                                                                                               \
                    TRNP(nPREK(x,N))                                                                                                    \
                                        /* Fonction N-ieme 'PREDecesseur Kouleur' avec validation de ce predecesseur...              */
#define   nSUCK_TRON(x,N)                                                                                                               \
                    TRNP(nSUCK(x,N))                                                                                                    \
                                        /* Fonction N-ieme 'SUCCesseur Kouleur' avec validation de ce successeur...                  */

                                        /* ATTENTION, on notera le passage en 'FLOT(...)' du niveau argument ; ceci est rendu        */
                                        /* necesaire si l'on veut eviter des "repliements" en mode 'GENP(...)'. A titre d'exemple,   */
                                        /* en l'absence de ceci, on a :                                                              */
                                        /*                                                                                           */
                                        /*                  SUCK(BLANC) = NOIR                                                       */
                                        /*                  PREK(NOIR)  = BLANC                                                      */
                                        /*                                                                                           */
                                        /* ceci ayant ete mis en place le 19970505091407.                                            */

#define   PREK(x)                                                                                                                       \
                    nPREK(x,UN)                                                                                                         \
                                        /* Fonction 'PREDecesseur Kouleur'.                                                          */
#define   SUCK(x)                                                                                                                       \
                    nSUCK(x,UN)                                                                                                         \
                                        /* Fonction 'SUCCesseur Kouleur'.                                                            */

                                        /* ATTENTION, on notera le passage en 'FLOT(...)' du niveau argument ; ceci est rendu        */
                                        /* necesaire si l'on veut eviter des "repliements" en mode 'GENP(...)'. A titre d'exemple,   */
                                        /* en l'absence de ceci, on a :                                                              */
                                        /*                                                                                           */
                                        /*                  SUCK(BLANC) = NOIR                                                       */
                                        /*                  PREK(NOIR)  = BLANC                                                      */
                                        /*                                                                                           */
                                        /* ceci ayant ete mis en place le 19970505091407.                                            */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        " P R E - G E N E R A T I O N "   D E S   C O N S T A N T E S   F O N D A M E N T A L E S  :                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#TestADef GRIS                                                                                                                          \
                    k___GRIS
#TestADef BLANC                                                                                                                         \
                    k___BLANC
#TestADef COULEURS                                                                                                                      \
                    k___COULEURS

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

#if       (PRECISION_DU_Float==SIMPLE_PRECISION)
#    define    nEPSILON_GENP                                                                                                            \
                         PARE(1.0E-2)                                                                                                   \
                                        /* Petite constante destinee a corriger les defauts d'arrondi mis en evidence le             */ \
                                        /* 19961202142828 dans 'v $xci/format.01$K' avec le "mode=1".                                */
#Aif      (PRECISION_DU_Float==SIMPLE_PRECISION)
#Eif      (PRECISION_DU_Float==SIMPLE_PRECISION)

#if       (PRECISION_DU_Float==DOUBLE_PRECISION)
#    define    nEPSILON_GENP                                                                                                            \
                         PARE(1.0E-10)                                                                                                  \
                                        /* Petite constante destinee a corriger les defauts d'arrondi mis en evidence le             */ \
                                        /* 19961202142828 dans 'v $xci/format.01$K' avec le "mode=1".                                */
#Aif      (PRECISION_DU_Float==DOUBLE_PRECISION)
#Eif      (PRECISION_DU_Float==DOUBLE_PRECISION)

#define   gGENP(x)                                                                                                                      \
                    GENP(FLIN(x,GENP_____epsilon_des_fonctions_de_ce_type))                                                             \
                                        /* Partie entiere avec prise en compte des erreurs d'arrondi (voir les commentaires relatifs */ \
                                        /* a la definition de 'nEPSILON_GENP').                                                      */
#define   gVGENP(x)                                                                                                                     \
                    GENP(VFLIN(x,GENP_____epsilon_des_fonctions_de_ce_type))                                                            \
                                        /* Partie entiere avec prise en compte des erreurs d'arrondi (voir les commentaires relatifs */ \
                                        /* a la definition de 'nEPSILON_GENP') et validation de non debordement...                   */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C H O I X   E N T R E   U N   A X E   D E S   N I V E A U X                                                                */
/*        " F E R M E S "   O U   " O U V E R T S   A   D R O I T E "  :                                                             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   AXE_NIVEAUX_OUVERT_FERME(maximum_ouvert,maximum_ferme)                                                                        \
                    COND(IL_FAUT(AXE_NIVEAUX_OUVERT_FERME_____compatibilite_19951221)                                                   \
                        ,maximum_ouvert                                                                                                 \
                        ,maximum_ferme                                                                                                  \
                         )                                                                                                              \
                                        /* Introduit le 20091015112207, on ne sait jamais : l'axe est ferme a droite par             */ \
                                        /* defaut (soit [0,1]). On notera que cela fut fait par analogie avec ce qui avait ete       */ \
                                        /* fait quelques temps avant pour les coordonnees ('v $xiif/format$DEF 20090929093052').     */ \
                                        /*                                                                                           */ \
                                        /* ATTENTION : le 20091015114101 je note que l'usage de 'COULEURS' par defaut peut etre      */ \
                                        /* en quelque sorte "masque" (et faire utiliser en fait 'BLANC') a cause des procedures      */ \
                                        /* 'TRNP(...)' et 'TRNF(...)' qui font des troncations en utilisant 'BLANC' explicitement.   */ \
                                        /* C'est pourquoi, a cette date, il est conseille (provisoirement ?) d'utiliser un axe       */ \
                                        /* ferme a droite. On notera que pour simplifier les choses, dans les procedures 'TRNP(...)' */ \
                                        /* et 'TRNF(...)', on utilise simplement 'AXE_NIVEAUX_OUVERT_FERME(BLANC,BLANC)' afin        */ \
                                        /* d'utiliser 'BLANC' dans les deux cas...                                                   */ \
                                        /*                                                                                           */ \
                                        /* Le 20091015174146, "compatibilite_20091015" a ete change en "compatibilite_19951221"      */ \
                                        /* la date "19951221" etant approximative et resultat d'un 'retrouva $xiiD/definit.2$DEF'    */ \
                                        /* en choisissant la plus ancienne archive utilisant 'BLANC' et non plus 'COULEURS',         */ \
                                        /* c'est-a-dire finalement la premiere...                                                    */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        M A I N T I E N   D ' U N   N I V E A U   D A N S   [ N O I R , B L A N C ]  :                                             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   gTRNP(niveau,maximum_ouvert,maximum_ferme)                                                                                    \
                    TRON(niveau                                                                                                         \
                        ,NOIR                                                                                                           \
                        ,AXE_NIVEAUX_OUVERT_FERME(maximum_ouvert,maximum_ferme)                                                         \
                         )
#define   TRNP(niveau)                                                                                                                  \
                    gTRNP(niveau,BLANC,BLANC)
                                        /* Maintien d'un niveau de type 'genere_p' dans [NOIR,BLANC]. On notera que l'utilisation    */
                                        /* courante sera du type :                                                                   */
                                        /*                                                                                           */
                                        /*                  GENP(TRNP(NIVA(...FLOT(NIVR(...)))))                                     */
                                        /*                                                                                           */
                                        /* en notant bien l'importance de l'ordre des operations ; en particulier 'TRNP(...)'        */
                                        /* qui fait un 'TRON(...)' dans [NOIR,BLANC] doit preceder imperativement 'GENP(...)' qui    */
                                        /* ferait une troncation automatique...                                                      */
                                        /*                                                                                           */
                                        /* Le 20190124112346 fut introduit 'gTRNP(...)' pour 'v $xiii/aleat.1$FON gTRNP' et ce       */
                                        /* afin que 'Irandom_niveaux(...)' puisse donner une equirepartition des niveaux y compris   */
                                        /* aux deux extremites ('NOIR' et 'BLANC'), niveaux pour lesquels il y avait deux fois       */
                                        /* moins de points presents que pour les autres niveaux...                                   */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        M A I N T I E N   D ' U N   N I V E A U   F L O T T A N T   D A N S   [ N O I R , B L A N C ]  :                           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   TRNF(niveau_flottant)                                                                                                         \
                    NIVA(TRON(niveau_flottant                                                                                           \
                             ,FLOT(NIVR(NOIR))                                                                                          \
                             ,FLOT(NIVR(AXE_NIVEAUX_OUVERT_FERME(BLANC,BLANC)))                                                         \
                              )                                                                                                         \
                         )                                                                                                              \
                                        /* Maintien d'un niveau de type 'genere_p', mais exprime actuellement sous une forme         */ \
                                        /* flottante, dans [NOIR,BLANC] avec troncation.                                             */
#define   MONF(niveau_flottant)                                                                                                         \
                    NIVA(MODF(niveau_flottant                                                                                           \
                             ,FLOT(NIVR(NOIR))                                                                                          \
                             ,FLOT(NIVR(AXE_NIVEAUX_OUVERT_FERME(BLANC,BLANC)))                                                         \
                              )                                                                                                         \
                         )                                                                                                              \
                                        /* Maintien d'un niveau de type 'genere_p', mais exprime actuellement sous une forme         */ \
                                        /* flottante, dans [NOIR,BLANC] avec modulo (introduit le 20131205160605).                   */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E N O R M A L I S A T I O N   D ' U N   N I V E A U  :                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   F___DENORMALISE_NIVEAU(niveau)                                                                                                \
                    MUL2(FLOT(niveau)                                                                                                   \
                        ,FLOT(NIVR(AXE_NIVEAUX_OUVERT_FERME(COULEURS,BLANC)))                                                           \
                         )                                                                                                              \
                                        /* Afin de passer un niveau de [0,1] a [NOIR,BLANC] en restant en flottant et en debordant   */ \
                                        /* eventuellement de [NOIR,BLANC]. ATTENTION, il y a eu pendant longtemps (par erreur ?) la  */ \
                                        /* constante 'COULEURS' a la place de 'BLANC'. En fait le 20091015112207 cela fut restaure   */ \
                                        /* potentiellement (via "compatibilite_19951221") et ce par symetrie avec les axes de        */ \
                                        /* coordonnees ('v $xiif/format$DEF 20090929093052').                                        */

#define   __gDENORMALISE_NIVEAU(niveau,reduction)                                                                                       \
                    GENP(reduction(F___DENORMALISE_NIVEAU(niveau)))

#define   __DENORMALISE_NIVEAU_TEL_QUEL_______(niveau)                                                                                  \
                    __gDENORMALISE_NIVEAU(niveau,NEUT)
#define   __DENORMALISE_NIVEAU_AVEC_TRONCATION(niveau)                                                                                  \
                    __gDENORMALISE_NIVEAU(niveau,TRNF)
#define   __DENORMALISE_NIVEAU_AVEC_MODULO____(niveau)                                                                                  \
                    __gDENORMALISE_NIVEAU(niveau,MONF)
                                        /* Le 20190724142350 fut introduit '__DENORMALISE_NIVEAU_TEL_QUEL_______(...)', on ne sait   */
                                        /* jamais...                                                                                 */

#define   __DENORMALISE_NIVEAU(niveau)                                                                                                  \
                    __DENORMALISE_NIVEAU_AVEC_TRONCATION(niveau)
                                        /* Afin de passer un niveau de [0,1] a [NOIR,BLANC] (introduit le 20131205160838 sous cette  */
                                        /* forme...).                                                                                */

#define   a__gDENORMALISE_NIVEAU(niveau,epsilon,reduction)                                                                              \
                    GENP(reduction(F___DENORMALISE_NIVEAU(fFLIN(niveau,epsilon))))

#define   a__DENORMALISE_NIVEAU_AVEC_TRONCATION(niveau,epsilon)                                                                         \
                    a__gDENORMALISE_NIVEAU(niveau,epsilon,TRNF)
#define   a__DENORMALISE_NIVEAU_AVEC_MODULO____(niveau,epsilon)                                                                         \
                    a__gDENORMALISE_NIVEAU(niveau,epsilon,MONF)

#define   a__DENORMALISE_NIVEAU(niveau,epsilon)                                                                                         \
                    a__DENORMALISE_NIVEAU_AVEC_TRONCATION(niveau,epsilon)
                                        /* Afin de passer un niveau de [0,1] a [NOIR,BLANC] avec gestion eventuelle (suivant la      */
                                        /* valeur de 'epsilon') des problemes d'arrondi. Ceci a ete introduit le 20040910141428      */
                                        /* pour 'v $xiii/Images$DEF 20040910134825' et ameliore le 20131205160838...                 */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        N O R M A L I S A T I O N   D ' U N   N I V E A U  :                                                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   ______NORMALISE_NIVEAU(niveau)                                                                                                \
                    DIVI(FLOT(NIVR(niveau))                                                                                             \
                        ,FLOT(NIVR(AXE_NIVEAUX_OUVERT_FERME(COULEURS,BLANC)))                                                           \
                         )                                                                                                              \
                                        /* Afin de passer un niveau de [NOIR,BLANC] a [0,1].                                         */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D U   ' NOIR '   E T   D U   ' BLANC '   D E S   ' imageF '  :                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   ______________NOIR_NORMALISE                                                                                                  \
                    ______NORMALISE_NIVEAU(NOIR)                                                                                        \
                                        /* Definition du 'NOIR' normalise...                                                         */
#define   ______________BLANC_NORMALISE                                                                                                 \
                    ______NORMALISE_NIVEAU(BLANC)                                                                                       \
                                        /* Definition du 'BLANC' normalise...                                                        */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        V A L I D A T I O N   D ' U N   N I V E A U  :                                                                             */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   VALIDATION_NIVEAU(niveau,action_si_valide,action_si_invalide)                                                                 \
                    Bblock                                                                                                              \
                    Test(INCLff(niveau,NOIR,BLANC))                                                                                     \
                         Bblock                                                                                                         \
                         BLOC(action_si_valide);                                                                                        \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         BLOC(action_si_invalide);                                                                                      \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                    Eblock                                                                                                              \
                                        /* ATTENTION : le test suivant :                                                             */ \
                                        /*                                                                                           */ \
                                        /*                  Test(INCLff(niveau,NOIR,BLANC))                                          */ \
                                        /*                                                                                           */ \
                                        /* implique l'evaluation des expressions 'MINI(NOIR,BLANC)' et 'MAXI(NOIR,BLANC)', et alors  */ \
                                        /* le compilateur de 'SYSTEME_ES9000_AIX_CC' sort le message de warning suivant :            */ \
                                        /*                                                                                           */ \
                                        /*                  w "..."....:      Unsigned compare with zero always true.                */ \
                                        /*                                                                                           */ \
                                        /* ce qui est intolerable. Plutot que de passer de 'INCLff(...)' a 'IFINff(...)', et parce   */ \
                                        /* qu'il est des cas ou je n'ai pu faire disparaitre ce message, j'ai introduit dans         */ \
                                        /* 'v $xcc/cb$Z' le fichier '$xcc/cb$D/sup.Mwarning$sed' qui elimine ces messages...         */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        " R O T A T I O N "   D ' U N   N I V E A U   O U   " A N I M A T I O N "   D E S   P A L E T T E S  :                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   LE_NOIR_EST_TRANSLATABLE                                                                                                      \
                    VRAI
#define   LE_NOIR_N_EST_PAS_TRANSLATABLE                                                                                                \
                    NOTL(LE_NOIR_EST_TRANSLATABLE)
                                        /* Indique si le niveau 'NOIR' est translatable...                                           */

#define   ROTATION_NIVEAU(niveau,increment_du_niveau,translater_le_NOIR)                                                                \
                    GENP(NIVA(MODS(NIVR(ADD2(niveau                                                                                     \
                                            ,COND(IFET(IFEQ(niveau,NOIR)                                                                \
                                                      ,IL_NE_FAUT_PAS(translater_le_NOIR)                                               \
                                                       )                                                                                \
                                                 ,ZERO                                                                                  \
                                                 ,increment_des_niveaux                                                                 \
                                                  )                                                                                     \
                                             )                                                                                          \
                                        )                                                                                               \
                                  ,NIVR(NOIR)                                                                                           \
                                  ,NIVR(BLANC)                                                                                          \
                                   )                                                                                                    \
                              )                                                                                                         \
                         )                                                                                                              \
                                        /* "Rotation" d'un niveau utilise par exemple pour la rotation des palettes de couleurs dans */ \
                                        /* 'IXpalette(...)' ('v $xiidX/fonct$vv$FON IXpalette').                                     */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D E   L A   T A I L L E   D E S   I M A G E S  :                                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   TAILLE_D_UN_FICHIER_IMAGE(nombre_de_points_de_l_image,type_de_l_image)                                                        \
                    MUL2(nombre_de_points_de_l_image,type_de_l_image)                                                                   \
                                        /* Definition de la taille en octets d'une image de type donne.                              */

#define   size_i                                                                                                                        \
                    TAILLE_D_UN_FICHIER_IMAGE(dimXY,size_p)                                                                             \
                                        /* Definition de la taille en octets d'une image "standard".                                 */
#define   size_iC                                                                                                                       \
                    TAILLE_D_UN_FICHIER_IMAGE(dimXY,size_CHAR)                                                                          \
                                        /* Definition de la taille en octets d'une image "CHAR".                                     */
#define   size_iIB                                                                                                                      \
                    TAILLE_D_UN_FICHIER_IMAGE(dimXY,size_vrai_Int_de_base)                                                              \
                                        /* Definition de la taille en octets d'une image "vrai_Int_de_base" (introduit le            */ \
                                        /* 20100326190221).                                                                          */
#define   size_iI                                                                                                                       \
                    TAILLE_D_UN_FICHIER_IMAGE(dimXY,size_Int)                                                                           \
                                        /* Definition de la taille en octets d'une image "Int".                                      */
#define   size_iUB                                                                                                                      \
                    TAILLE_D_UN_FICHIER_IMAGE(dimXY,size_vrai_Positive_de_base)                                                         \
                                        /* Definition de la taille en octets d'une image "vrai_Positive_de_base" (introduit le       */ \
                                        /* 20100326190221).                                                                          */
#define   size_iU                                                                                                                       \
                    TAILLE_D_UN_FICHIER_IMAGE(dimXY,size_LPositive)                                                                     \
                                        /* Definition de la taille en octets d'une image "Positive".                                 */
#define   size_iF                                                                                                                       \
                    TAILLE_D_UN_FICHIER_IMAGE(dimXY,size_Float)                                                                         \
                                        /* Definition de la taille en octets d'une image "Float".                                    */
#define   size_iFB                                                                                                                      \
                    TAILLE_D_UN_FICHIER_IMAGE(dimXY,size_vrai_float_de_base)
#define   size_i_vrai_float_de_base                                                                                                     \
                    size_iFB
                                        /* Definition de la taille en octets d'une image "vrai_float_de_base" (introduite le         */
                                        /* 20170406105903).                                                                          */
#define   size_iD                                                                                                                       \
                    TAILLE_D_UN_FICHIER_IMAGE(dimXY,size_Double)                                                                        \
                                        /* Definition de la taille en octets d'une image "Double".                                   */
#define   size_iJ                                                                                                                       \
                    TAILLE_D_UN_FICHIER_IMAGE(dimXY,size_complexe)                                                                      \
                                        /* Definition de la taille en octets d'une image "complexe".                                 */
#define   size_iHJ                                                                                                                      \
                    TAILLE_D_UN_FICHIER_IMAGE(dimXY,size_hyper_complexe)                                                                \
                                        /* Definition de la taille en octets d'une image "hyper-complexe".                           */
#define   size_iHHJ                                                                                                                     \
                    TAILLE_D_UN_FICHIER_IMAGE(dimXY,size_hyper_hyper_complexe)                                                          \
                                        /* Definition de la taille en octets d'une image "hyper-hyper-complexe" (introduit           */ \
                                        /* le 20150227112922).                                                                       */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D E   L A   T A I L L E   D E S   A L B U M S  :                                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   TAILLE_D_UN_FICHIER_ALBUM(nombre_de_points_de_l_album,type_de_l_album)                                                        \
                    TAILLE_D_UN_FICHIER_IMAGE(nombre_de_points_de_l_album,type_de_l_album)                                              \
                                        /* Definition de la taille en octets d'un album de type donne.                               */

#define   size_a                                                                                                                        \
                    TAILLE_D_UN_FICHIER_ALBUM(dimXYZ,size_p)                                                                            \
                                        /* Definition de la taille en octets d'un album "standard".                                  */
#define   size_aC                                                                                                                       \
                    TAILLE_D_UN_FICHIER_ALBUM(dimXYZ,size_CHAR)                                                                         \
                                        /* Definition de la taille en octets d'un album "CHAR".                                      */
#define   size_aI                                                                                                                       \
                    TAILLE_D_UN_FICHIER_ALBUM(dimXYZ,size_Int)                                                                          \
                                        /* Definition de la taille en octets d'un album "Int".                                       */
#define   size_aU                                                                                                                       \
                    TAILLE_D_UN_FICHIER_ALBUM(dimXYZ,size_LPositive)                                                                    \
                                        /* Definition de la taille en octets d'un album "Positive".                                  */
#define   size_aF                                                                                                                       \
                    TAILLE_D_UN_FICHIER_ALBUM(dimXYZ,size_Float)                                                                        \
                                        /* Definition de la taille en octets d'un album "Float".                                     */
#define   size_aD                                                                                                                       \
                    TAILLE_D_UN_FICHIER_ALBUM(dimXYZ,size_Double)                                                                       \
                                        /* Definition de la taille en octets d'un album "Double".                                    */
#define   size_aJ                                                                                                                       \
                    TAILLE_D_UN_FICHIER_ALBUM(dimXYZ,size_complexe)                                                                     \
                                        /* Definition de la taille en octets d'un album "complexe".                                  */
#define   size_aHJ                                                                                                                      \
                    TAILLE_D_UN_FICHIER_ALBUM(dimXYZ,size_hyper_complexe)                                                               \
                                        /* Definition de la taille en octets d'un album "hyper-complexe".                            */



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