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