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