/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F O N C T I O N S   D E   B A S E   A   Q U A T R E   I M A G E S  :                                                       */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition :                                                                                                               */
/*                                                                                                                                   */
/*                    Ce fichier contient toutes les definitions                                                                     */
/*                  de base de gestion et de manipulation de                                                                         */
/*                  quatre images raster, quelle que soit la definition.                                                             */
/*                  Ainsi, on pourra avec elles passer des                                                                           */
/*                  fausses aux vraies couleurs...                                                                                   */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xiii/quad_image$DEF' :                                                                                         */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 19890000000000).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        A D D I T I O N   D E   T R O I S   I M A G E S   Q U E L C O N Q U E S  :                                                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   gIaddition3(les_images_sont_standards,imaR,FimaR,imaA1,FimaA1,imaA2,FimaA2,imaA3,FimaA3)                                      \
                    gCALC(EST_VRAI(les_images_sont_standards)                                                                           \
                         ,Iaddition3_avec_renormalisation(imaR,imaA1,imaA2,imaA3)                                                       \
                         ,IFaddition3(FimaR,FimaA1,FimaA2,FimaA3)                                                                       \
                          )                                                                                                             \
                                        /* Addition de trois images quelconques ("standards" ou "flottantes").                       */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        M U L T I P L I C A T I O N   D E   T R O I S   I M A G E S   Q U E L C O N Q U E S  :                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   gImultiplication3(les_images_sont_standards,imaR,FimaR,imaA1,FimaA1,imaA2,FimaA2,imaA3,FimaA3)                                \
                    gCALC(EST_VRAI(les_images_sont_standards)                                                                           \
                         ,Imultiplication3_avec_renormalisation(imaR,imaA1,imaA2,imaA3)                                                 \
                         ,IFmultiplication3(FimaR,FimaA1,FimaA2,FimaA3)                                                                 \
                          )                                                                                                             \
                                        /* Multiplication de trois images quelconques ("standards" ou "flottantes").                 */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        I N T E R P O L A T I O N   E N T R E   T R O I S   I M A G E S  :                                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   INTERPOLATION_BARYCENTRIQUE(coefficient1,valeur1,coefficient2,valeur2,coefficient3,valeur3)                                   \
                    ADD3(MUL2(coefficient1,valeur1)                                                                                     \
                        ,MUL2(coefficient2,valeur2)                                                                                     \
                        ,MUL2(coefficient3,valeur3)                                                                                     \
                         )                                                                                                              \
                                        /* Interpolation entre (valeur1,valeur2,valeur3) par l'intermediaire des                     */ \
                                        /* coefficients (coefficient1,coefficient2,coefficient3).                                    */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        I N T E R P O L A T I O N   E N T R E   T R O I S   I M A G E S  :                                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   gIinterpolation_barycentrique(les_images_sont_standards,imaR,FimaR,alpha,imaA1,FimaA1,beta,imaA2,FimaA2,gamma,imaA3,FimaA3)   \
                    gCALC(EST_VRAI(les_images_sont_standards)                                                                           \
                         ,Iinterpolation_barycentrique(imaR,alpha,imaA1,beta,imaA2,gamma,imaA3)                                         \
                         ,IFinterpolation_barycentrique(FimaR,alpha,FimaA1,beta,FimaA2,gamma,FimaA3)                                    \
                          )                                                                                                             \
                                        /* Interpolation entre trois images quelconques ("standards" ou "flottantes") introduite     */ \
                                        /* le 20031110165936.                                                                        */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        M I N I M U M   D E   T R O I S   I M A G E S   Q U E L C O N Q U E S  :                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   gIminimum3(les_images_sont_standards,imaR,FimaR,imaA1,FimaA1,imaA2,FimaA2,imaA3,FimaA3)                                       \
                    gCALC(EST_VRAI(les_images_sont_standards)                                                                           \
                         ,Iminimum3(imaR,imaA1,imaA2,imaA3)                                                                             \
                         ,IFminimum3(FimaR,FimaA1,FimaA2,FimaA3)                                                                        \
                          )                                                                                                             \
                                        /* Minimum de trois images quelconques ("standards" ou "flottantes"). Ceci fut introduit     */ \
                                        /* le 20060710151231...                                                                      */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        M A X I M U M   D E   T R O I S   I M A G E S   Q U E L C O N Q U E S  :                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   gImaximum3(les_images_sont_standards,imaR,FimaR,imaA1,FimaA1,imaA2,FimaA2,imaA3,FimaA3)                                       \
                    gCALC(EST_VRAI(les_images_sont_standards)                                                                           \
                         ,Imaximum3(imaR,imaA1,imaA2,imaA3)                                                                             \
                         ,IFmaximum3(FimaR,FimaA1,FimaA2,FimaA3)                                                                        \
                          )                                                                                                             \
                                        /* Maximum de trois images quelconques ("standards" ou "flottantes"). Ceci fut introduit     */ \
                                        /* le 20060710151231...                                                                      */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C A L C U L   D E   L A   L U M I N A N C E   D ' U N   T R I P L E T   ( R , V , B )  :                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   LUMINANCE_DU_ROUGE                                                                                                            \
                    PARE(0.30)                                                                                                          \
                                        /* Poids de la composante ROUGE dans le calcul de la luminance.                              */
#define   LUMINANCE_DU_VERTE                                                                                                            \
                    PARE(0.59)                                                                                                          \
                                        /* Poids de la composante VERTE dans le calcul de la luminance.                              */
#define   LUMINANCE_DU_BLEUE                                                                                                            \
                    PARE(0.11)                                                                                                          \
                                        /* Poids de la composante BLEUE dans le calcul de la luminance.                              */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C A L C U L   D E   L A   L U M I N A N C E   D ' U N   T R I P L E T   ( R , V , B )  :                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   gIluminance(les_images_sont_standards,imaR,FimaR,imaA1,FimaA1,imaA2,FimaA2,imaA3,FimaA3)                                      \
                    gCALC(EST_VRAI(les_images_sont_standards)                                                                           \
                         ,Iluminance(imaR,imaA1,imaA2,imaA3)                                                                            \
                         ,IFluminance(FimaR,FimaA1,FimaA2,FimaA3)                                                                       \
                          )                                                                                                             \
                                        /* Calcul de la luminance d'un triplet {R,V,B} quelconque ("standards" ou "flottantes")      */ \
                                        /* introduit le 20031110165936.                                                              */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        N O M S   D E S   E S P A C E S   D E   C O U L E U R S  :                                                                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   ESPACE_DE_COULEURS_RVB                                                                                                        \
                    GvarDefaut("SystemeRVB","RVB")                                                                                      \
                                        /* Nom de l'espace des couleurs 'RVB'. L'introduction de 'GvarDefaut(...)' a ete faite le    */ \
                                        /* 19980408123842 a cause de l'introduction du 'HLS' dans '$xigP/.INTERPOLE$Z'.              */
#define   ESPACE_DE_COULEURS_HLS                                                                                                        \
                    GvarDefaut("SystemeHLS","HLS")                                                                                      \
                                        /* Nom de l'espace des couleurs 'HLS'. L'introduction de 'GvarDefaut(...)' a ete faite le    */ \
                                        /* 19980408123842 a cause de l'introduction du 'HLS' dans '$xigP/.INTERPOLE$Z'.              */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P A S S A G E   E X A C T   D E S   V R A I E S   A U X   F A U S S E S   C O U L E U R S                                  */
/*        P A R   P A R C O U R S   E X H A U S T I F   D E   L ' E S P A C E   ' R V B '  :                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   CALCUL_DE_LA_LUMINANCE(niveau_ROUGE,niveau_VERTE,niveau_BLEUE)                                                                \
                    INTERPOLATION_BARYCENTRIQUE(LUMINANCE_DU_ROUGE,FLOT(NIVR(niveau_ROUGE))                                             \
                                               ,LUMINANCE_DU_VERTE,FLOT(NIVR(niveau_VERTE))                                             \
                                               ,LUMINANCE_DU_BLEUE,FLOT(NIVR(niveau_BLEUE))                                             \
                                                )                                                                                       \
                                        /* Calcul de la luminance des trois niveaux {R,V,B}.                                         */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P A S S A G E   D U   S Y S T E M E   ' R V B '   A U   S Y S T E M E   ' H L S '   E T   V I C E - V E R S A  :           */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition :                                                                                                               */
/*                                                                                                                                   */
/*                    Le systeme HLS (Hue ou teinte, Luminance                                                                       */
/*                  Saturation) est un systeme de couleurs a                                                                         */
/*                  trois dimensions.                                                                                                */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*                                                          ^  Luminance                                                             */
/*                                                          |                                                                        */
/*                                                          |                                                                        */
/*                                                          |                                                                        */
/*                                              (Blanc) 1.0 +                                                                        */
/*                                                         /X\                                                                       */
/*                                                        / . \                                                                      */
/*                                                       /  X  \                                                                     */
/*                                                      / . . . \                                                                    */
/*                                                     /   X.X   \                                                                   */
/*                                                    /  .  .  .  \                                                                  */
/*                                                   /    X . X    \                                                                 */
/*                                                  /  .    .    .  \                                                                */
/*                                                 /     X  .  X     \                                                               */
/*                                                /  .      .      .  \                                                              */
/*                                               /      X   .   X      \                                                             */
/*                                              /  .        .        .  \                                                            */
/*                                           Ve/t      X    .    X      J\une                                                        */
/*                                            /   . . . . . . . . . . .   \                                                          */
/*                                           /  .     X     .     X     .  \                                                         */
/*                                          / .    .        .        .    . \                                                        */
/*                                         /.        X      .      X        .\                                                       */
/*                                        /         .       .       .         \                                                      */
/*                                   Cyan X         X   0.5 +       X         X Rouge                                                */
/*                                         \X        .      .      .        X/                                                       */
/*                                          \ X    X        .        X    X /                                                        */
/*                                           \  X     .     .     .     X  /                                                         */
/*                                            \   X X X X X X X X X X X   /                                                          */
/*                                           Bleu      .    .    .      Magenta                                                      */
/*                                              \   X       .       X   /                                                            */
/*                                               \      .   .   .      /                                                             */
/*                                                \   X     .     X   /                                                              */
/*                                                 \     .  .  .     /                                                               */
/*                                                  \   X   .   X   /                                                                */
/*                                                   \    . . .    /                                                                 */
/*                                                    \   X . X   /                                                                  */
/*                                                     \   ...   /         .                                                         */
/*                                                      \   X   /       .                                                            */
/*                                                       \  .  /     .  ^                                                            */
/*                                                        \ X /   .     | Hue (angle mesure dans le plan RVB)                        */
/*                                                         \./ .        |                                                            */
/*                                               (Noir) 0.0 +------------------+-------------->                                      */
/*                                                          |                 1.0                                                    */
/*                                                          |                             Saturation                                 */
/*                                                          |                                                                        */
/*                                                          |                                                                        */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   ECHELLE_GENERALE_HLS_ENTIERE                                                                                                  \
                    NIVR(BLANC)                                                                                                         \
                                        /* Echelle entiere dans laquelle sont renvoyees les trois composantes (H,L,S) ; cette        */ \
                                        /* variable intermediaire est introduite a cause de 'SYSTEME_SG4D..._IRIX_CC', de meme que   */ \
                                        /* le tableau 'espace_inverse' de la fonction 'Ifausses_couleurs_HLS_approximees_3(...)'.    */
#define   ECHELLE_GENERALE_HLS                                                                                                          \
                    FLOT(ECHELLE_GENERALE_HLS_ENTIERE)                                                                                  \
                                        /* Echelle flottante dans laquelle sont renvoyees les trois composantes (H,L,S)...           */

#define   ECHELLE_DES_HUES                                                                                                              \
                    CERCLE_TRIGONOMETRIQUE                                                                                              \
                                        /* Echelle dans laquelle sont calculees les teintes...                                       */
#define   HUE_MINIMALE                                                                                                                  \
                    SOUS(______________NOIR_NORMALISE,______________BLANC_NORMALISE)                                                    \
                                        /* Plus petite valeur possible des trois variables 'Luminance_ROUGE', 'Luminance_VERTE'      */ \
                                        /* et 'Luminance_BLEUE'.                                                                     */
#define   HUE_MAXIMALE                                                                                                                  \
                    SOUS(______________BLANC_NORMALISE,______________NOIR_NORMALISE)                                                    \
                                        /* Plus grande valeur possible des trois variables 'Luminance_ROUGE', 'Luminance_VERTE'      */ \
                                        /* et 'Luminance_BLEUE'.                                                                     */
#define   AMPLITUDE_DES_HUES                                                                                                            \
                    SOUS(HUE_MAXIMALE,HUE_MINIMALE)                                                                                     \
                                        /* Amplitude des teinte (2 a priori...) lors de leur calcul.                                 */

#define   NOMBRE_DE_COULEURS_HLS                                                                                                        \
                    MUL2(AMPLITUDE_DES_HUES,NOMBRE_DE_COMPOSANTES_CHROMATIQUES)                                                         \
                                        /* Nombre de couleurs de base (6 a priori...) du systme 'HLS', qui sont dans l'ordre :       */ \
                                        /*                                                                                           */ \
                                        /*                  Rouge,                                                                   */ \
                                        /*                  Jaune,                                                                   */ \
                                        /*                  Vert,                                                                    */ \
                                        /*                  Cyan,                                                                    */ \
                                        /*                  Bleu,                                                                    */ \
                                        /*                  Magenta.                                                                 */ \
                                        /*                                                                                           */
#define   PAS_DES_COULEURS_HLS                                                                                                          \
                    DIVI(ECHELLE_DES_HUES,NOMBRE_DE_COULEURS_HLS)                                                                       \
                                        /* Pas de passage d'une couleur 'HLS' (c'est-a-dire 'Rouge', 'Jaune', 'Vert', 'Cyan',        */ \
                                        /* 'Bleu' et 'Magenta') a la suivante sur le cercle 'HLS'...                                 */
#define   PAS_DES_COMPOSANTES_CHROMATIQUES_HLS                                                                                          \
                    MUL2(AMPLITUDE_DES_HUES,PAS_DES_COULEURS_HLS)                                                                       \
                                        /* Pas de passage d'une composante chromatique (c'est-a-dire 'Rouge', 'vert' et 'Bleu')      */ \
                                        /* a la suivante sur le cercle 'HLS'...                                                      */

#define   TRANSLATION_HUE_ROUGE                                                                                                         \
                    FZERO                                                                                                               \
                                        /* Translation des teintes a dominante ROUGE,                                                */
#define   TRANSLATION_HUE_VERTE                                                                                                         \
                    ADD2(TRANSLATION_HUE_ROUGE,AMPLITUDE_DES_HUES)                                                                      \
                                        /* Translation des teintes a dominante VERTE,                                                */
#define   TRANSLATION_HUE_BLEUE                                                                                                         \
                    ADD2(TRANSLATION_HUE_VERTE,AMPLITUDE_DES_HUES)                                                                      \
                                        /* Translation des teintes a dominante BLEUE,                                                */
#define   TRANSLATION_HUE_ROUGE_REPLIEE                                                                                                 \
                    ADD2(TRANSLATION_HUE_BLEUE,AMPLITUDE_DES_HUES)                                                                      \
                                        /* Translation des teintes a dominante ROUGE mais repliee sur le cercle trigonometrique.     */

#define   HUE_UNDEF                                                                                                                     \
                    FZERO                                                                                                               \
                                        /* Teinte indefinie a donner aux points "achromatiques"...                                   */
#define   SATURATION_MAXIMALE                                                                                                           \
                    FU                                                                                                                  \
                                        /* Definition de la saturation maximale...                                                   */

#define   AMPLITUDE_DES_NIVEAUX_ROUGE_VERTE_BLEUE                                                                                       \
                    COND(IL_FAUT(PASSAGE_RVB_HLS_____compatibilite_20120911)                                                            \
                        ,ADD2(NIVR(niveau_maximum),NIVR(niveau_minimum))                                                                \
                        ,SOUS(niveau_maximum,niveau_minimum)                                                                            \
                         )                                                                                                              \
                                        /* Introduit le 20120911132421 afin de simplifier ce qui suit...                             */

#define   PASSAGE_RVB_HLS(Hue,Luminance,Saturation,niveau_ROUGE,niveau_VERTE,niveau_BLEUE)                                              \
                                        /* ATTENTION : 'Hue', 'Luminance' et 'Saturation' sont malgre tout des variables             */ \
                                        /* declarees 'Float'...                                                                      */ \
                    Bblock                                                                                                              \
                                        /* ATTENTION, le 19980114090550, a cause de l'introduction de '$xcg/RVB_HLS$K', les          */ \
                                        /* variables 'niveau_minimum' et 'niveau_maximum', qui jusque la etaient declarees avec      */ \
                                        /* le type 'genere_p', sont passees au type 'genere_Float'.                                  */ \
                    DEFV(genere_Float,INIT(niveau_minimum,MIN4(niveau_ROUGE,niveau_VERTE,niveau_BLEUE,BLANC)));                         \
                                        /* Recherche du plus petit des trois niveaux {R,V,B},                                        */ \
                    DEFV(genere_Float,INIT(niveau_maximum,MAX4(niveau_ROUGE,niveau_VERTE,niveau_BLEUE,NOIR)));                          \
                                        /* Recherche du plus grand des trois niveaux {R,V,B}.                                        */ \
                                                                                                                                        \
                    EGAL(Luminance,NIVA(MOYE(FLOT(NIVR(niveau_minimum)),FLOT(NIVR(niveau_maximum)))));                                  \
                                        /* Calcul de la Luminance comme la moyenne des extrema...                                    */ \
                                                                                                                                        \
                    Test(IFEQ(niveau_minimum,niveau_maximum))                                                                           \
                         Bblock                                                                                                         \
                                        /* Cas dit "achromatique" :                                                                  */ \
                         EGAL(Saturation,FZERO);                                                                                        \
                                        /* La Saturation est nulle,                                                                  */ \
                         EGAL(Hue,HUE_UNDEF);                                                                                           \
                                        /* Et la Hue est indefinie.                                                                  */ \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                                        /* Cas dit "chromatique" :                                                                   */ \
                         DEFV(Float                                                                                                     \
                             ,INIT(Luminance_ROUGE                                                                                      \
                                  ,DIVI(FLOT(SOUS(niveau_maximum,niveau_ROUGE))                                                         \
                                       ,FLOT(AMPLITUDE_DES_NIVEAUX_ROUGE_VERTE_BLEUE)                                                   \
                                        )                                                                                               \
                                   )                                                                                                    \
                              );                                                                                                        \
                         DEFV(Float                                                                                                     \
                             ,INIT(Luminance_VERTE                                                                                      \
                                  ,DIVI(FLOT(SOUS(niveau_maximum,niveau_VERTE))                                                         \
                                       ,FLOT(AMPLITUDE_DES_NIVEAUX_ROUGE_VERTE_BLEUE)                                                   \
                                        )                                                                                               \
                                   )                                                                                                    \
                              );                                                                                                        \
                         DEFV(Float                                                                                                     \
                             ,INIT(Luminance_BLEUE                                                                                      \
                                  ,DIVI(FLOT(SOUS(niveau_maximum,niveau_BLEUE))                                                         \
                                       ,FLOT(AMPLITUDE_DES_NIVEAUX_ROUGE_VERTE_BLEUE)                                                   \
                                        )                                                                                               \
                                   )                                                                                                    \
                              );                                                                                                        \
                                                                                                                                        \
                         Test(IFLE(Luminance,FLOT(GRIS)))                                                                               \
                              Bblock                                                                                                    \
                              EGAL(Saturation                                                                                           \
                                  ,DIVI(FLOT(SOUS(niveau_maximum,niveau_minimum))                                                       \
                                       ,FLOT(ADD2(NIVR(niveau_maximum),NIVR(niveau_minimum)))                                           \
                                        )                                                                                               \
                                   );                                                                                                   \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              EGAL(Saturation                                                                                           \
                                  ,DIVI(FLOT(SOUS(niveau_maximum,niveau_minimum))                                                       \
                                       ,FLOT(ADD2(SOUS(BLANC,niveau_maximum),SOUS(BLANC,niveau_minimum)))                               \
                                        )                                                                                               \
                                   );                                                                                                   \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                                                                                                                                        \
                         Test(IFEQ(niveau_ROUGE,niveau_maximum))                                                                        \
                              Bblock                                                                                                    \
                              EGAL(Hue,ADD2(SOUS(Luminance_BLEUE,Luminance_VERTE),TRANSLATION_HUE_ROUGE));                              \
                                        /* Et la Hue est une couleur comprise entre le jaune et le magenta.                          */ \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              Test(IFEQ(niveau_VERTE,niveau_maximum))                                                                   \
                                   Bblock                                                                                               \
                                   EGAL(Hue,ADD2(SOUS(Luminance_ROUGE,Luminance_BLEUE),TRANSLATION_HUE_VERTE));                         \
                                        /* Et la Hue est une couleur comprise entre le cyan et le jaune.                             */ \
                                   Eblock                                                                                               \
                              ATes                                                                                                      \
                                   Bblock                                                                                               \
                                   Test(IFEQ(niveau_BLEUE,niveau_maximum))                                                              \
                                        Bblock                                                                                          \
                                        EGAL(Hue,ADD2(SOUS(Luminance_VERTE,Luminance_ROUGE),TRANSLATION_HUE_BLEUE));                    \
                                        /* Et la Hue est une couleur comprise entre le magenta et le cyan.                           */ \
                                        Eblock                                                                                          \
                                   ATes                                                                                                 \
                                        Bblock                                                                                          \
                                        PRINT_ERREUR("aucun des trois niveaux (R,V,B) n'egale leur maximum");                           \
                                        Eblock                                                                                          \
                                   ETes                                                                                                 \
                                   Eblock                                                                                               \
                              ETes                                                                                                      \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                                                                                                                                        \
                         Test(IZLT(Hue))                                                                                                \
                              Bblock                                                                                                    \
                              INCR(Hue,TRANSLATION_HUE_ROUGE_REPLIEE);                                                                  \
                                        /* Afin de n'avoir que des valeurs positives sur le cercle...                                */ \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                                                                                                                                        \
                         EGAL(Hue                                                                                                       \
                             ,SCAL(Hue                                                                                                  \
                                  ,NOMBRE_DE_COULEURS_HLS                                                                               \
                                  ,ECHELLE_DES_HUES                                                                                     \
                                   )                                                                                                    \
                              );                                                                                                        \
                                        /* Enfin, on se ramene au cercle trigonometrique...                                          */ \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                                                                                                                                        \
                    EGAL(Hue                                                                                                            \
                        ,SCAL(Hue                                                                                                       \
                             ,ECHELLE_DES_HUES                                                                                          \
                             ,ECHELLE_GENERALE_HLS                                                                                      \
                              )                                                                                                         \
                         );                                                                                                             \
                    EGAL(Luminance                                                                                                      \
                        ,SCAL(Luminance                                                                                                 \
                             ,BLANC                                                                                                     \
                             ,ECHELLE_GENERALE_HLS                                                                                      \
                              )                                                                                                         \
                         );                                                                                                             \
                    EGAL(Saturation                                                                                                     \
                        ,SCAL(Saturation                                                                                                \
                             ,SATURATION_MAXIMALE                                                                                       \
                             ,ECHELLE_GENERALE_HLS                                                                                      \
                              )                                                                                                         \
                         );                                                                                                             \
                                        /* Puis tout le monde se retrouve dans [NOIR,BLANC] ('L' y etant deja).                      */ \
                    Eblock                                                                                                              \
                                        /* Procedure de passage du systeme 'RVB' au systeme 'HLS' : (nR,nV,nB) --> (H,L,S) tel que : */ \
                                        /*                                                                                           */ \
                                        /*                  nR E [NOIR,BLANC],                                                       */ \
                                        /*                  nV E [NOIR,BLANC],                                                       */ \
                                        /*                  nB E [NOIR,BLANC],                                                       */ \
                                        /*                                                                                           */ \
                                        /* puis :                                                                                    */ \
                                        /*                                                                                           */ \
                                        /*                  H  E [0,2.PI] sauf pour S=0, auquel cas : H=HUE_UNDEF.                   */ \
                                        /*                  L  E [NOIR,BLANC],                                                       */ \
                                        /*                  S  E [0,1].                                                              */ \
                                        /*                                                                                           */ \
                                        /* et enfin (afin que les trois composantes 'H', 'L' et 'S' aient le meme "poids" ) :        */ \
                                        /*                                                                                           */ \
                                        /*                  H  E [NOIR,BLANC] sauf pour S=NOIR, auquel cas : H=HUE_UNDEF.            */ \
                                        /*                  L  E [NOIR,BLANC],                                                       */ \
                                        /*                  S  E [NOIR,BLANC].                                                       */ \
                                        /*                                                                                           */ \
                                        /* mais ATTENTION : 'Hue', 'Luminance' et 'Saturation' sont malgre tout des variables        */ \
                                        /* declarees 'Float'...                                                                      */ \
                                        /*                                                                                           */ \
                                        /* On notera que la 'Saturation' est aussi appelee 'G' pour "Grisee" (cela est defini        */ \
                                        /* dans 'v $FpostfixesG SATUR').                                                             */

#define   PASSAGE_ELEMENTAIRE_HLS_RVB(niveau1,niveau2,Hue)                                                                              \
                    COND(IFLT(Hue,GRO1(PAS_DES_COULEURS_HLS))                                                                           \
                        ,BARY(niveau1,niveau2,DIVI(Hue,GRO1(PAS_DES_COULEURS_HLS)))                                                     \
                        ,COND(IFLT(Hue,GRO3(PAS_DES_COULEURS_HLS))                                                                      \
                             ,niveau2                                                                                                   \
                             ,COND(IFLT(Hue,GRO4(PAS_DES_COULEURS_HLS))                                                                 \
                                  ,BARY(niveau1,niveau2,DIVI(SOUS(GRO4(PAS_DES_COULEURS_HLS),Hue),GRO1(PAS_DES_COULEURS_HLS)))          \
                                  ,niveau1                                                                                              \
                                   )                                                                                                    \
                              )                                                                                                         \
                         )                                                                                                              \
                                        /* Fonction elementaire de transformation des 'Hue's, a partir de 'niveau1' et 'niveau2'     */ \
                                        /* qui sont deux grandeurs calculees a partir de la 'Luminance' et de la 'Saturation',       */ \
                                        /* suivant le principe suivant :                                                             */ \
                                        /*                                                                                           */ \
                                        /*                                                                                           */ \
                                        /*                                  ^                                                        */ \
                                        /*                      niveau2     |                                                        */ \
                                        /*                             + + +|+ +/.                                                   */ \
                                        /*                            +     |  /  . BARY(...)                                        */ \
                                        /*                           +      | /    .                                                 */ \
                                        /*                          +       |/pi/6  .                                                */ \
                                        /*                  ----------------|---------------->                                       */ \
                                        /*                          .      /|       +                                                */ \
                                        /*                           .    / |      +                                                 */ \
                                        /*                  BARY(...) .  /  |     +                                                  */ \
                                        /*                             ./+ +|+ + +                                                   */ \
                                        /*                                  |     niveau1                                            */ \
                                        /*                                                                                           */ \
                                        /*                                                                                           */ \
                                        /* ATTENTION donc au decoupage non regulier du cercle ci-dessus...                           */

#define   PASSAGE_HLS_RVB(niveau_ROUGE,niveau_VERTE,niveau_BLEUE,Hue,Luminance,Saturation)                                              \
                    Bblock                                                                                                              \
                                        /* ATTENTION : 'Hue', 'Luminance' et 'Saturation' sont malgre tout des variables             */ \
                                        /* declarees 'Float'...                                                                      */ \
                                        /*                                                                                           */ \
                                        /* On notera le 20111206112139 que 'PASSAGE_HLS_RVB' peut etre aussi bien referencee         */ \
                                        /* pour des 'genere_p's ('v $xiii/conversion$FON Iconversion_HLS_en_RVB') que pour des       */ \
                                        /* 'genere_Float's ('v $xiii/conversion$FON IFconversion_HLS_en_RVB' ou encore               */ \
                                        /* 'v $xrv/HLS_RVB.01$K PASSAGE_HLS_RVB')...                                                 */ \
                    DEFV(Float                                                                                                          \
                        ,INIT(Hue_normalisee                                                                                            \
                             ,SCAL(FLOT(Hue)                                                                                            \
                                  ,ECHELLE_GENERALE_HLS                                                                                 \
                                  ,ECHELLE_DES_HUES                                                                                     \
                                   )                                                                                                    \
                              )                                                                                                         \
                         );                                                                                                             \
                    DEFV(Float                                                                                                          \
                        ,INIT(Luminance_normalisee                                                                                      \
                             ,SCAL(FLOT(Luminance)                                                                                      \
                                  ,ECHELLE_GENERALE_HLS                                                                                 \
                                  ,FLOT(______________BLANC_NORMALISE)                                                                  \
                                   )                                                                                                    \
                              )                                                                                                         \
                         );                                                                                                             \
                    DEFV(Float                                                                                                          \
                        ,INIT(Saturation_normalisee                                                                                     \
                             ,SCAL(FLOT(Saturation)                                                                                     \
                                  ,ECHELLE_GENERALE_HLS                                                                                 \
                                  ,SATURATION_MAXIMALE                                                                                  \
                                   )                                                                                                    \
                              )                                                                                                         \
                         );                                                                                                             \
                                        /* On normalise les quantites (H,L,S), ce qui fait que l'on quitte l'echelle [NOIR,BLANC],   */ \
                                        /* soit :                                                                                    */ \
                                        /*                                                                                           */ \
                                        /*                  H  E [0,2.PI] sauf pour S=0, auquel cas : H=HUE_UNDEF.                   */ \
                                        /*                  L  E [0,1],                                                              */ \
                                        /*                  S  E [0,1].                                                              */ \
                                        /*                                                                                           */ \
                                        /* on notera avec ATTENTION que contrairement a 'PASSAGE_RVB_HLS', ou l'on a                 */ \
                                        /* L E [NOIR,BLANC], ici la luminance normalisee est dans [0,1]...                           */ \
                                                                                                                                        \
                    DEFV(Float,INIT(Niveau_ROUGE,FLOT(______NORMALISE_NIVEAU(NIVEAU_UNDEF))));                                          \
                    DEFV(Float,INIT(Niveau_VERTE,FLOT(______NORMALISE_NIVEAU(NIVEAU_UNDEF))));                                          \
                    DEFV(Float,INIT(Niveau_BLEUE,FLOT(______NORMALISE_NIVEAU(NIVEAU_UNDEF))));                                          \
                                        /* Niveaux {R,V,B} avant 'NORMALISATION'...                                                  */ \
                                                                                                                                        \
                    EGAL(Hue_normalisee                                                                                                 \
                        ,SOUS(Hue_normalisee                                                                                            \
                             ,MUL2(fENTE(DIVI(Hue_normalisee,ECHELLE_DES_HUES))                                                         \
                                  ,ECHELLE_DES_HUES                                                                                     \
                                   )                                                                                                    \
                              )                                                                                                         \
                         );                                                                                                             \
                                        /* Ainsi, on interdit de faire plusieurs tours du cercle trigonometrique...                  */ \
                                        /*                                                                                           */ \
                                        /* Le 20241214102931, ceci a ete sorti de 'PASSAGE_HLS_RVB_____compatibilite_20240327' car   */ \
                                        /* en effet cela doit etre systematique. Cela s'est vu a en regenerant 'v $xiak/REFM.k2$R16' */ \
                                        /* ('v $xivP/disk.000000009/face.2/.REFL.c.62.$U TeinteCyan....=..GRIS_4.+..GRIS_8').        */ \
                                                                                                                                        \
                    Test(IL_FAUT(PASSAGE_HLS_RVB_____compatibilite_20240327))                                                           \
                                        /* Choix introduit le 20240327171125...                                                      */ \
                         Bblock                                                                                                         \
                         DEFV(Float,INIT(Niveau1,FLOT(______NORMALISE_NIVEAU(NIVEAU_UNDEF))));                                          \
                         DEFV(Float,INIT(Niveau2,FLOT(______NORMALISE_NIVEAU(NIVEAU_UNDEF))));                                          \
                                        /* Deux niveaux "bizarres" dont le sens physique m'echappe un peu...                         */ \
                         DEFV(Float,INIT(Hue_ROUGE,HUE_UNDEF));                                                                         \
                         DEFV(Float,INIT(Hue_VERTE,HUE_UNDEF));                                                                         \
                         DEFV(Float,INIT(Hue_BLEUE,HUE_UNDEF));                                                                         \
                                        /* Et on definit trois 'Hue's fictive associee aux trois niveaux {R,V,B} a calculer...       */ \
                         EGAL(Hue_ROUGE                                                                                                 \
                             ,COND(IFLT(ADD2(Hue_normalisee,PAS_DES_COMPOSANTES_CHROMATIQUES_HLS),ECHELLE_DES_HUES)                     \
                                  ,ADD2(Hue_normalisee,PAS_DES_COMPOSANTES_CHROMATIQUES_HLS)                                            \
                                  ,SOUS(Hue_normalisee,SOUS(ECHELLE_DES_HUES,PAS_DES_COMPOSANTES_CHROMATIQUES_HLS))                     \
                                   )                                                                                                    \
                              );                                                                                                        \
                         EGAL(Hue_VERTE                                                                                                 \
                             ,NEUT(Hue_normalisee)                                                                                      \
                              );                                                                                                        \
                         EGAL(Hue_BLEUE                                                                                                 \
                             ,COND(IZGE(SOUS(Hue_normalisee,PAS_DES_COMPOSANTES_CHROMATIQUES_HLS))                                      \
                                  ,SOUS(Hue_normalisee,PAS_DES_COMPOSANTES_CHROMATIQUES_HLS)                                            \
                                  ,ADD2(Hue_normalisee,SOUS(ECHELLE_DES_HUES,PAS_DES_COMPOSANTES_CHROMATIQUES_HLS))                     \
                                   )                                                                                                    \
                              );                                                                                                        \
                                        /* Les trois 'Hue's fictives sont equitablement reparties sur le cercle trigonometrique...   */ \
                                                                                                                                        \
                         Test(IFLE(Luminance_normalisee,MOIT(______NORMALISE_NIVEAU(NIVA(ECHELLE_GENERALE_HLS)))))                      \
                              Bblock                                                                                                    \
                              EGAL(Niveau2                                                                                              \
                                  ,ADD2(Luminance_normalisee                                                                            \
                                       ,MUL2(Luminance_normalisee,Saturation_normalisee)                                                \
                                        )                                                                                               \
                                   );                                                                                                   \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              EGAL(Niveau2                                                                                              \
                                  ,SOUS(ADD2(Luminance_normalisee,Saturation_normalisee)                                                \
                                       ,MUL2(Luminance_normalisee,Saturation_normalisee)                                                \
                                        )                                                                                               \
                                   );                                                                                                   \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                                                                                                                                        \
                         EGAL(Niveau1                                                                                                   \
                             ,SOUS(DOUB(Luminance_normalisee)                                                                           \
                                  ,Niveau2                                                                                              \
                                   )                                                                                                    \
                              );                                                                                                        \
                                                                                                                                        \
                         Test(IZEQ(Saturation_normalisee))                                                                              \
                              Bblock                                                                                                    \
                                        /* Cas dit "achromatique" (il n'y a pas de 'Hue') :                                          */ \
                              EGAL(Niveau_ROUGE,Luminance_normalisee);                                                                  \
                              EGAL(Niveau_VERTE,Luminance_normalisee);                                                                  \
                              EGAL(Niveau_BLEUE,Luminance_normalisee);                                                                  \
                                        /* Niveaux {R,V,B} avant 'NORMALISATION' dans le cas achromatique ; on notera que cette      */ \
                                        /* valeur est donnee meme si une erreur est detectee juste apres, et ce afin d'eviter des    */ \
                                        /* erreurs lors de '__DENORMALISE_NIVEAU()'...                                               */ \
                                                                                                                                        \
                              Test(IFEQ(Hue_normalisee,HUE_UNDEF))                                                                      \
                                   Bblock                                                                                               \
                                   Eblock                                                                                               \
                              ATes                                                                                                      \
                                   Bblock                                                                                               \
                                   Test(IL_FAUT(PASSAGE_HLS_RVB_____editer_les_messages_d_erreur))                                      \
                                        /* Test introduit le 20111206112139...                                                       */ \
                                        Bblock                                                                                          \
                                        PRINT_ERREUR("dans le cas achromatique (saturation=0), il faut hue=HUE_UNDEF");                 \
                                        Eblock                                                                                          \
                                   ATes                                                                                                 \
                                        Bblock                                                                                          \
                                        Eblock                                                                                          \
                                   ETes                                                                                                 \
                                   Eblock                                                                                               \
                              ETes                                                                                                      \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                                        /* Cas dit "chromatique" :                                                                   */ \
                              EGAL(Niveau_ROUGE,PASSAGE_ELEMENTAIRE_HLS_RVB(Niveau1,Niveau2,Hue_ROUGE));                                \
                              EGAL(Niveau_VERTE,PASSAGE_ELEMENTAIRE_HLS_RVB(Niveau1,Niveau2,Hue_VERTE));                                \
                              EGAL(Niveau_BLEUE,PASSAGE_ELEMENTAIRE_HLS_RVB(Niveau1,Niveau2,Hue_BLEUE));                                \
                                        /* Niveaux {R,V,B} avant 'NORMALISATION' dans le cas chromatique...                          */ \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                         Eblock                                                                                                         \
                    ATes                                                                                                                \
                         Bblock                                                                                                         \
                         DEFV(Float,INIT(Valeur_Hp,FLOT__UNDEF));                                                                       \
                         DEFV(Float,INIT(Valeur_C,FLOT__UNDEF));                                                                        \
                         DEFV(Float,INIT(Valeur_X,FLOT__UNDEF));                                                                        \
                         DEFV(Float,INIT(Valeur_m,FLOT__UNDEF));                                                                        \
                                                                                                                                        \
                         EGAL(Valeur_C,MUL2(COMP(ABSO(aCOMP(DOUB(Luminance_normalisee)))),Saturation_normalisee));                      \
                         EGAL(Valeur_Hp,DIVI(CONVERSION_RADIANS_EN_DEGRES(Hue_normalisee),CONVERSION_RADIANS_EN_DEGRES(PI_SUR_3)));     \
                         EGAL(Valeur_X,MUL2(Valeur_C,COMP(ABSO(aCOMP(MODF(Valeur_Hp,FZERO,FDEUX))))));                                  \
                         EGAL(Valeur_m,SOUS(Luminance_normalisee,MOIT(Valeur_C)));                                                      \
                                                                                                                                        \
                         Test(IFINfo(Valeur_Hp,FZERO,FU))                                                                               \
                              Bblock                                                                                                    \
                              EGAL(Niveau_ROUGE,Valeur_C);                                                                              \
                              EGAL(Niveau_VERTE,Valeur_X);                                                                              \
                              EGAL(Niveau_BLEUE,FZERO);                                                                                 \
                              Eblock                                                                                                    \
                         ATes                                                                                                           \
                              Bblock                                                                                                    \
                              Test(IFINfo(Valeur_Hp,FU,FDEUX))                                                                          \
                                   Bblock                                                                                               \
                                   EGAL(Niveau_ROUGE,Valeur_X);                                                                         \
                                   EGAL(Niveau_VERTE,Valeur_C);                                                                         \
                                   EGAL(Niveau_BLEUE,FZERO);                                                                            \
                                   Eblock                                                                                               \
                              ATes                                                                                                      \
                                   Bblock                                                                                               \
                                   Test(IFINfo(Valeur_Hp,FDEUX,FTROIS))                                                                 \
                                        Bblock                                                                                          \
                                        EGAL(Niveau_ROUGE,FZERO);                                                                       \
                                        EGAL(Niveau_VERTE,Valeur_C);                                                                    \
                                        EGAL(Niveau_BLEUE,Valeur_X);                                                                    \
                                        Eblock                                                                                          \
                                   ATes                                                                                                 \
                                        Bblock                                                                                          \
                                        Test(IFINfo(Valeur_Hp,FTROIS,FQUATRE))                                                          \
                                             Bblock                                                                                     \
                                             EGAL(Niveau_ROUGE,FZERO);                                                                  \
                                             EGAL(Niveau_VERTE,Valeur_X);                                                               \
                                             EGAL(Niveau_BLEUE,Valeur_C);                                                               \
                                             Eblock                                                                                     \
                                        ATes                                                                                            \
                                             Bblock                                                                                     \
                                             Test(IFINfo(Valeur_Hp,FQUATRE,FCINQ))                                                      \
                                                  Bblock                                                                                \
                                                  EGAL(Niveau_ROUGE,Valeur_X);                                                          \
                                                  EGAL(Niveau_VERTE,FZERO);                                                             \
                                                  EGAL(Niveau_BLEUE,Valeur_C);                                                          \
                                                  Eblock                                                                                \
                                             ATes                                                                                       \
                                                  Bblock                                                                                \
                                                  Test(IFINff(Valeur_Hp,FCINQ,FSIX))                                                    \
                                                       Bblock                                                                           \
                                                       EGAL(Niveau_ROUGE,Valeur_C);                                                     \
                                                       EGAL(Niveau_VERTE,FZERO);                                                        \
                                                       EGAL(Niveau_BLEUE,Valeur_X);                                                     \
                                                       Eblock                                                                           \
                                                  ATes                                                                                  \
                                                       Bblock                                                                           \
                                                       PRINT_ERREUR("La valeur de 'Valeur_Hp' est mauvaise");                           \
                                                       CAL1(Prer1("(elle vaut %f)\n",Valeur_Hp));                                       \
                                                       Eblock                                                                           \
                                                  ETes                                                                                  \
                                                  Eblock                                                                                \
                                             ETes                                                                                       \
                                             Eblock                                                                                     \
                                        ETes                                                                                            \
                                        Eblock                                                                                          \
                                   ETes                                                                                                 \
                                   Eblock                                                                                               \
                              ETes                                                                                                      \
                              Eblock                                                                                                    \
                         ETes                                                                                                           \
                                                                                                                                        \
                         INCR(Niveau_ROUGE,Valeur_m);                                                                                   \
                         INCR(Niveau_VERTE,Valeur_m);                                                                                   \
                         INCR(Niveau_BLEUE,Valeur_m);                                                                                   \
                         Eblock                                                                                                         \
                    ETes                                                                                                                \
                                                                                                                                        \
                    EGAL(niveau_ROUGE,__DENORMALISE_NIVEAU(Niveau_ROUGE));                                                              \
                    EGAL(niveau_VERTE,__DENORMALISE_NIVEAU(Niveau_VERTE));                                                              \
                    EGAL(niveau_BLEUE,__DENORMALISE_NIVEAU(Niveau_BLEUE));                                                              \
                                        /* Niveaux {R,V,B} apres 'NORMALISATION' dans [NOIR,BLANC].                                  */ \
                    Eblock                                                                                                              \
                                        /* Procedure de passage du systeme 'HLS' au systeme 'RVB' : (H,L,S) --> (nR,nV,nB) tel que : */ \
                                        /*                                                                                           */ \
                                        /*                  H  E [NOIR,BLANC] sauf pour S=NOIR, auquel cas : H=HUE_UNDEF.            */ \
                                        /*                  L  E [NOIR,BLANC],                                                       */ \
                                        /*                  S  E [NOIR,BLANC].                                                       */ \
                                        /*                                                                                           */ \
                                        /* puis :                                                                                    */ \
                                        /*                                                                                           */ \
                                        /*                  nR E [NOIR,BLANC],                                                       */ \
                                        /*                  nV E [NOIR,BLANC],                                                       */ \
                                        /*                  nB E [NOIR,BLANC],                                                       */ \
                                        /*                                                                                           */ \
                                        /* mais ATTENTION : 'Hue', 'Luminance' et 'Saturation' sont malgre tout des variables        */ \
                                        /* declarees 'Float'...                                                                      */ \
                                        /*                                                                                           */ \
                                        /* On notera que la 'Saturation' est aussi appelee 'G' pour "Grisee" (cela est defini        */ \
                                        /* dans 'v $FpostfixesG SATUR').                                                             */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D E S   T R O I S   C O M P O S A N T E S  :                                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   COMP1_RVB_HLS(composante1,composante2,composante3)                                                                            \
                    SE13(composante1,composante2,composante3)                                                                           \
                                        /* Definition de la premiere composante d'un triplet {R,V,B} ou (H,L,S).                     */
#define   COMP2_RVB_HLS(composante1,composante2,composante3)                                                                            \
                    SE23(composante1,composante2,composante3)                                                                           \
                                        /* Definition de la deuxieme composante d'un triplet {R,V,B} ou (H,L,S).                     */
#define   COMP3_RVB_HLS(composante1,composante2,composante3)                                                                            \
                    SE33(composante1,composante2,composante3)                                                                           \
                                        /* Definition de la troisieme composante d'un triplet {R,V,B} ou (H,L,S).                    */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        " P A R A L L E L E "   E N T R E   L E S   S Y S T E M E S   ( R , V , B )   E T   ( H , L , S )  :                       */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition :                                                                                                               */
/*                                                                                                                                   */
/*                    Les deux systemes 'RVB' et 'HLS' sont                                                                          */
/*                  places en "recouvrement" ; les procedures                                                                        */
/*                  suivantes definissent ce dernier. En                                                                             */
/*                  standard les associations suivantes                                                                              */
/*                  sont faites :                                                                                                    */
/*                                                                                                                                   */
/*                  ROUGE     <-->      Hue,                                                                                         */
/*                  VERTE     <-->      Luminance,                                                                                   */
/*                  BLEUE     <-->      Saturation.                                                                                  */
/*                                                                                                                                   */
/*                    Il ne faudra jamais utiliser directement                                                                       */
/*                  un niveau 'ROUGE', par exemple, a la place                                                                       */
/*                  de la teinte ('Hue'), mais bien plutot la                                                                        */
/*                  fonction :                                                                                                       */
/*                                                                                                                                   */
/*                  TEINT_RVB(niveau_ROUGE,niveau_VERTE,niveau_BLEUE)...                                                             */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   TEINT_RVB(niveau_ROUGE,niveau_VERTE,niveau_BLEUE)                                                                             \
                    COMP1_RVB_HLS(niveau_ROUGE,niveau_VERTE,niveau_BLEUE)                                                               \
                                        /* La teinte ('HUE') est associee a la composante 'ROUGE'. Etant en 'RVB',                   */ \
                                        /* l'acces a 'Hue' (ou 'teinte') se fera a l'aide de la fonction 'TEINT_RVB()'               */ \
                                        /* qui permet de faire prendre un niveau 'RVB' pour une grandeur 'HLS'.                      */
#define   LUMIN_RVB(niveau_ROUGE,niveau_VERTE,niveau_BLEUE)                                                                             \
                    COMP2_RVB_HLS(niveau_ROUGE,niveau_VERTE,niveau_BLEUE)                                                               \
                                        /* La luminance ('LUMINANCE') est associee a la composante 'VERTE'. Etant en 'RVB',          */ \
                                        /* l'acces a 'Luminance' (ou 'luminance') se fera a l'aide de la fonction 'TEINT_RVB()'      */ \
                                        /* qui permet de faire prendre un niveau 'RVB' pour une grandeur 'HLS'.                      */
#define   SATUR_RVB(niveau_ROUGE,niveau_VERTE,niveau_BLEUE)                                                                             \
                    COMP3_RVB_HLS(niveau_ROUGE,niveau_VERTE,niveau_BLEUE)                                                               \
                                        /* La saturation ('SATURATION') est associee a la composante 'BLEUE'. Etant en 'RVB',        */ \
                                        /* l'acces a 'Saturation' (ou 'saturation') se fera a l'aide de la fonction 'TEINT_RVB()'    */ \
                                        /* qui permet de faire prendre un niveau 'RVB' pour une grandeur 'HLS'.                      */
#define   ROUGE_HLS(Hue,Luminance,Saturation)                                                                                           \
                    COMP1_RVB_HLS(Hue,Luminance,Saturation)                                                                             \
                                        /* La composante 'ROUGE' est associee a la teinte ('HUE'). Etant en 'HLS',                   */ \
                                        /* l'acces au niveau de 'ROUGE' se fera a l'aide de la fonction 'ROUGE_HLS()' qui            */ \
                                        /* permet de faire prendre une grandeur 'HLS' pour une composante 'RVB'.                     */
#define   VERTE_HLS(Hue,Luminance,Saturation)                                                                                           \
                    COMP2_RVB_HLS(Hue,Luminance,Saturation)                                                                             \
                                        /* La composante 'VERTE' est associee a la luminance ('LUMINANCE'). Etant en 'HLS',          */ \
                                        /* l'acces au niveau de 'ROUGE' se fera a l'aide de la fonction 'ROUGE_HLS()' qui            */ \
                                        /* permet de faire prendre une grandeur 'HLS' pour une composante 'RVB'.                     */
#define   BLEUE_HLS(Hue,Luminance,Saturation)                                                                                           \
                    COMP3_RVB_HLS(Hue,Luminance,Saturation)                                                                             \
                                        /* La composante 'BLEUE' est associee a la saturation ('SATURATION'). Etant en 'HLS',        */ \
                                        /* l'acces au niveau de 'ROUGE' se fera a l'aide de la fonction 'ROUGE_HLS()' qui            */ \
                                        /* permet de faire prendre une grandeur 'HLS' pour une composante 'RVB'.                     */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        C H O I X   E N T R E   L E S   D E U X   S Y S T E M E S   ( R , V , B )   E T   ( H , L , S )  :                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
                                        /* ATTENTION : 'c_COMP1(...)', 'c_COMP2(...)' et 'c_COMP3(...)' sont definies par "%define"  */
                                        /* et non par "#define" afin de pouvoir utiliser le nouvel operateur de concatenation "`" du */
                                        /* pre-processeur : il faut que leur substitution ait lieu apres la gestion de cet operateur */
                                        /* de concatenation...                                                                       */

%define   c_COMP1(espace_de_couleurs)                                                                                                   \
                    COND(IFEQ_chaine(espace_de_couleurs,ESPACE_DE_COULEURS_RVB)                                                         \
                        ,TEINT_RVB(c_ROUGE,c_VERTE,c_BLEUE)                                                                             \
                        ,COND(IFEQ_chaine(espace_de_couleurs,ESPACE_DE_COULEURS_HLS)                                                    \
                             ,ROUGE_HLS(c_TEINT,c_LUMIN,c_SATUR)                                                                        \
                             ,NOM_UNDEF                                                                                                 \
                              )                                                                                                         \
                         )
                                        /* Choix du nom de la premiere composante.                                                   */
%define   c_COMP2(espace_de_couleurs)                                                                                                   \
                    COND(IFEQ_chaine(espace_de_couleurs,ESPACE_DE_COULEURS_RVB)                                                         \
                        ,LUMIN_RVB(c_ROUGE,c_VERTE,c_BLEUE)                                                                             \
                        ,COND(IFEQ_chaine(espace_de_couleurs,ESPACE_DE_COULEURS_HLS)                                                    \
                             ,VERTE_HLS(c_TEINT,c_LUMIN,c_SATUR)                                                                        \
                             ,NOM_UNDEF                                                                                                 \
                              )                                                                                                         \
                         )
                                        /* Choix du nom de la deuxieme composante.                                                   */
%define   c_COMP3(espace_de_couleurs)                                                                                                   \
                    COND(IFEQ_chaine(espace_de_couleurs,ESPACE_DE_COULEURS_RVB)                                                         \
                        ,SATUR_RVB(c_ROUGE,c_VERTE,c_BLEUE)                                                                             \
                        ,COND(IFEQ_chaine(espace_de_couleurs,ESPACE_DE_COULEURS_HLS)                                                    \
                             ,BLEUE_HLS(c_TEINT,c_LUMIN,c_SATUR)                                                                        \
                             ,NOM_UNDEF                                                                                                 \
                              )                                                                                                         \
                         )
                                        /* Choix du nom de la troisieme composante.                                                  */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        E X T E N S I O N   D E S   L I S T E S   D E   S U B S T I T U T I O N  :                                                 */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
                                        /* ATTENTION : 'L_SUBSTITUTION_COMP1', 'L_SUBSTITUTION_COMP2' et 'L_SUBSTITUTION_COMP3' sont */
                                        /* definis par "%define" et non par "#define" afin de pouvoir utiliser le nouvel operateur   */
                                        /* de concatenation "`" du pre-processeur : il faut que leur substitution ait lieu apres la  */
                                        /* gestion de cet operateur de concatenation...                                              */

%define   L_SUBSTITUTION_COMP1                                                                                                          \
                    COMP1_RVB_HLS(L_SUBSTITUTION_ROUGE,L_SUBSTITUTION_VERTE,L_SUBSTITUTION_BLEUE)
                                        /* Definition de la premiere composante de substitution.                                     */
%define   L_SUBSTITUTION_COMP2                                                                                                          \
                    COMP2_RVB_HLS(L_SUBSTITUTION_ROUGE,L_SUBSTITUTION_VERTE,L_SUBSTITUTION_BLEUE)
                                        /* Definition de la deuxieme composante de substitution.                                     */
%define   L_SUBSTITUTION_COMP3                                                                                                          \
                    COMP3_RVB_HLS(L_SUBSTITUTION_ROUGE,L_SUBSTITUTION_VERTE,L_SUBSTITUTION_BLEUE)
                                        /* Definition de la troisieme composante de substitution.                                    */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        G E N E R A T I O N   D ' U N   A U T O S T E R E O G R A M M E  :                                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   gIautostereogramme(les_images_sont_standards,imageR,trameR,trameA,facteur,cote,Fcote,periodh_f,periodh_i,permut,inter,repar)  \
                    gCALC(EST_VRAI(les_images_sont_standards)                                                                           \
                         ,Iautostereogramme(imageR,trameR,trameA,facteur,cote,periodh_f,periodh_i,permut,inter,repar)                   \
                         ,IFautostereogramme(imageR,trameR,trameA,facteur,Fcote,periodh_f,periodh_i,permut,inter,repar)                 \
                          )                                                                                                             \
                                        /* Generation d'un autostereogramme introduite le 20110601190205.                            */ \
                                        /*                                                                                           */ \
                                        /* L'argument 'repar' a ete introduit le 20110607165758...                                   */



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