/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        E G A L I S A T I O N   D E   L A   L U M I N A N C E   D ' U N E   P A L E T T E  :                                       */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition :                                                                                                               */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*                    Cette commande prend une palette                                                                               */
/*                  et en cree une deuxieme par egalisation.                                                                         */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xciP/EGALISE$K' :                                                                                              */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 20131206104116).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        I N T E R F A C E   ' listG '  :                                                                                           */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        :Debut_listG:                                                                                                              */
/*        :Fin_listG:                                                                                                                */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D I R E C T I V E S   S P E C I F I Q U E S   D E   C O M P I L A T I O N  :                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F I C H I E R S   D ' I N C L U D E S  :                                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#include  INCLUDES_BASE

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        P A R A M E T R E S  :                                                                                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   NOMBRE_D_ITERATIONS                                                                                                           \
                    UN                                                                                                                  \
                                        /* Faut-il editer le travail effectue ?                                                      */

#define   PONDERATION_LUMINANCE_MINIMALE                                                                                                \
                    FZERO
#define   PONDERATION_LUMINANCE_MOYENNE_                                                                                                \
                    FU
#define   PONDERATION_LUMINANCE_MAXIMALE                                                                                                \
                    FZERO
                                        /* Ponderations de selection de la luminance a utiliser (introduites le 20131210152313)...   */

#define   EDITER_LE_TRAVAIL_EFFECTUE                                                                                                    \
                    FAUX                                                                                                                \
                                        /* Faut-il editer le travail effectue ?                                                      */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        M A C R O S   U T I L E S  :                                                                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   EGALISATION_D_UN_NIVEAU(niveau)                                                                                               \
                    GENP(TRNF(ADD2(FLOT(NIVR(niveau))                                                                                   \
                                  ,MEME_SIGNE_QUE(correction_de_la_luminance                                                            \
                                                 ,SCAL(FLOT(NIVR(MAX2(niveau,NOIR_PLANCHER)))                                           \
                                                      ,luminance_a_corriger                                                             \
                                                      ,correction_de_la_luminance                                                       \
                                                       )                                                                                \
                                                  )                                                                                     \
                                   )                                                                                                    \
                              )                                                                                                         \
                         )                                                                                                              \
                                        /* Egalisation d'un niveau dont le principe est le suivant :                                 */ \
                                        /*                                                                                           */ \
                                        /* Soit donc un triplet {R,V,B} de luminance L :                                             */ \
                                        /*                                                                                           */ \
                                        /*                  L = pR.R + pV.V + pB.B                                                   */ \
                                        /*                                                                                           */ \
                                        /* dont on souhaite corriger la luminance de 'dL'. On suppose que les corrections            */ \
                                        /* {dR,dV,dB} des trois niveaux respectent :                                                 */ \
                                        /*                                                                                           */ \
                                        /*                  pR.dR + pV.dV + pB.dB = dL                                               */ \
                                        /*                                                                                           */ \
                                        /* et :                                                                                      */ \
                                        /*                                                                                           */ \
                                        /*                  dR = SCAL(R,L,dL)                                                        */ \
                                        /*                  dV = SCAL(V,L,dL)                                                        */ \
                                        /*                  dB = SCAL(B,L,dL)                                                        */ \
                                        /*                                                                                           */ \
                                        /* d'ou le nouveau triplet {R+dR,V+dV,B+dB}.                                                 */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        E G A L I S A T I O N   D E   L A   L U M I N A N C E   D ' U N E   P A L E T T E  :                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
BCommande(nombre_d_arguments,arguments)
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     DEFV(CHAR,INIC(POINTERc(nom_paletteA),NOM_PIPE));
                                        /* Nom de la palette Argument a utiliser.                                                    */
     DEFV(CHAR,INIC(POINTERc(nom_paletteR),NOM_PIPE));
                                        /* Nom de la palette Resultat a generer.                                                     */

     DEFV(Positive,INIT(nombre_d_iterations,NOMBRE_D_ITERATIONS));
                                        /* Nombre d'iterations d'egalisation (introduit le 20131210153053)...                        */
     DEFV(Float,INIT(ponderation_luminance_minimale,PONDERATION_LUMINANCE_MINIMALE));
     DEFV(Float,INIT(ponderation_luminance_moyenne_,PONDERATION_LUMINANCE_MOYENNE_));
     DEFV(Float,INIT(ponderation_luminance_maximale,PONDERATION_LUMINANCE_MAXIMALE));
                                        /* Ponderations de selection de la luminance a utiliser (introduites le 20131210152313)...   */

     DEFV(Logical,INIT(editer_le_travail_effectue,EDITER_LE_TRAVAIL_EFFECTUE));
                                        /* Faut-il editer le travail effectue ?                                                      */

     DEFV(Float,INIT(luminance_minimale,F_INFINI));
     DEFV(Float,INIT(luminance_moyenne_,FLOT__UNDEF));
     DEFV(Float,INIT(luminance_maximale,F_MOINS_L_INFINI));
                                        /* Valeur des extrema de la luminance...                                                     */
     /*..............................................................................................................................*/
     GET_ARGUMENTSf(nombre_d_arguments
                   ,BLOC(GET_ARGUMENT_C("paletteA=""pA=",nom_paletteA);
                         GET_ARGUMENT_C("paletteR=""pR=",nom_paletteR);

                         GET_ARGUMENT_I("nombre=""iterations=""n=",nombre_d_iterations);
                                        /* Arguments introduits le 20131210153053...                                                 */

                         GET_ARGUMENT_F("Pluminance_minimale=""Plmin=",ponderation_luminance_minimale);
                         GET_ARGUMENT_F("Pluminance_moyenne=""Plmoy=",ponderation_luminance_moyenne_);
                         GET_ARGUMENT_F("Pluminance_maximale=""Plmax=",ponderation_luminance_maximale);
                                        /* Arguments introduits le 20131210152313...                                                 */

                         GET_ARGUMENT_L("editer=",editer_le_travail_effectue);
                         )
                    );

     CALS(Iload_palette_de_couleurs(nom_paletteA,ESPACE_DE_COULEURS_RVB));
                                        /* Chargement de la palette de couleurs...                                                   */

     Repe(nombre_d_iterations)
                                        /* Possibilite introduite le 20131210153053...                                               */
          Bblock
          BoIn(niveau,NOIR,BLANC,PAS_COULEURS)
               Bblock
               DEFV(Float,INIT(luminance
                              ,CALCUL_DE_LA_LUMINANCE(ACCES_listes_de_substitution(L_SUBSTITUTION_ROUGE,niveau)
                                                     ,ACCES_listes_de_substitution(L_SUBSTITUTION_VERTE,niveau)
                                                     ,ACCES_listes_de_substitution(L_SUBSTITUTION_BLEUE,niveau)
                                                      )
                               )
                    );

               EGAL(luminance_minimale,MIN2(luminance,luminance_minimale));
               EGAL(luminance_maximale,MAX2(luminance,luminance_maximale));
                                        /* Calcul des extrma de la luminance de la palette de couleurs...                            */
               Eblock
          EBoI

          EGAL(luminance_moyenne_,MOYE(luminance_minimale,luminance_maximale));

          Test(IL_FAUT(editer_le_travail_effectue))
               Bblock
               CALS(Fsauts_de_lignes(UN));
               CAL3(Prme1("LuminanceMinimale=%f\n",luminance_minimale));
               CAL3(Prme1("LuminanceMoyenne.=%f\n",luminance_moyenne_));
               CAL3(Prme1("LuminanceMaximale=%f\n",luminance_maximale));
               CALS(Fsauts_de_lignes(UN));
               Eblock
          ATes
               Bblock
               Eblock
          ETes

          BoIn(niveau,NOIR,BLANC,PAS_COULEURS)
               Bblock
               DEFV(genere_p,INIT(niveau_ROUGE,ACCES_listes_de_substitution(L_SUBSTITUTION_ROUGE,niveau)));
               DEFV(genere_p,INIT(niveau_VERTE,ACCES_listes_de_substitution(L_SUBSTITUTION_VERTE,niveau)));
               DEFV(genere_p,INIT(niveau_BLEUE,ACCES_listes_de_substitution(L_SUBSTITUTION_BLEUE,niveau)));
                                        /* Niveaux chromatiques dans le systeme {R,V,B}. On notera les 'Float's destines au          */
                                        /* bon fonctionnement du 'TRON(...)' de 'EGALISATION_D_UN_NIVEAU(...)'...                    */
               DEFV(genere_p,INIT(niveau_ROUGE_corrige,NIVEAU_UNDEF));
               DEFV(genere_p,INIT(niveau_VERTE_corrige,NIVEAU_UNDEF));
               DEFV(genere_p,INIT(niveau_BLEUE_corrige,NIVEAU_UNDEF));
                                        /* Niveaux chromatiques dans le systeme {R,V,B apres correction...                           */
               DEFV(Float,INIT(luminance_a_corriger,FLOT__UNDEF));
               DEFV(Float,INIT(correction_de_la_luminance,FLOT__UNDEF));

               EGAL(luminance_a_corriger,CALCUL_DE_LA_LUMINANCE(niveau_ROUGE,niveau_VERTE,niveau_BLEUE));
               EGAL(correction_de_la_luminance
                   ,SOUS(LIZ3(ponderation_luminance_minimale,luminance_minimale
                             ,ponderation_luminance_moyenne_,luminance_moyenne_
                             ,ponderation_luminance_maximale,luminance_maximale
                              )
                        ,luminance_a_corriger
                         )
                    );

               Test(IL_FAUT(editer_le_travail_effectue))
                    Bblock
                    CAL3(Prme9("niveau=%0*d RVB=(%0*d,%0*d,%0*d) Luminance=%f"
                              ,NOMBRE_DE_CHIFFRES_DECIMAUX_D_EDITION_DES_NIVEAUX,niveau
                              ,NOMBRE_DE_CHIFFRES_DECIMAUX_D_EDITION_DES_NIVEAUX,INTE(niveau_ROUGE)
                              ,NOMBRE_DE_CHIFFRES_DECIMAUX_D_EDITION_DES_NIVEAUX,INTE(niveau_VERTE)
                              ,NOMBRE_DE_CHIFFRES_DECIMAUX_D_EDITION_DES_NIVEAUX,INTE(niveau_BLEUE)
                                        /* Pour 'v $xig/fonct$vv$FON chain_Acopie_avec_gestion_des_formats_des_editions_entieres'    */
                                        /* il a fallu introduire des 'INTE(...)'s car les niveaux 'niveau_*' sont des 'genere_p'     */
                                        /* (et donc des "petits entiers") et non pas des 'Int's...                                   */
                              ,luminance_a_corriger
                               )
                         );
                    CAL3(Prme1(" --> CorrectionLuminance=%f",correction_de_la_luminance));
                                        /* Edition introduite le 20131210151431...                                                   */
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes

               EGAL(niveau_ROUGE_corrige,EGALISATION_D_UN_NIVEAU(niveau_ROUGE));
               EGAL(niveau_VERTE_corrige,EGALISATION_D_UN_NIVEAU(niveau_VERTE));
               EGAL(niveau_BLEUE_corrige,EGALISATION_D_UN_NIVEAU(niveau_BLEUE));

               MODIFICATION_LISTE_DE_COLORIAGE(niveau
                                              ,niveau_ROUGE_corrige
                                              ,niveau_VERTE_corrige
                                              ,niveau_BLEUE_corrige
                                               );
                                        /* Egalisation du niveau courant...                                                          */

               Test(IL_FAUT(editer_le_travail_effectue))
                    Bblock
                    CAL3(Prme7(" --> RVB=(%0*d,%0*d,%0*d) Luminance=%f"
                              ,NOMBRE_DE_CHIFFRES_DECIMAUX_D_EDITION_DES_NIVEAUX,INTE(niveau_ROUGE_corrige)
                              ,NOMBRE_DE_CHIFFRES_DECIMAUX_D_EDITION_DES_NIVEAUX,INTE(niveau_VERTE_corrige)
                              ,NOMBRE_DE_CHIFFRES_DECIMAUX_D_EDITION_DES_NIVEAUX,INTE(niveau_BLEUE_corrige)
                                        /* Pour 'v $xig/fonct$vv$FON chain_Acopie_avec_gestion_des_formats_des_editions_entieres'    */
                                        /* il a fallu introduire des 'INTE(...)'s car les niveaux 'niveau_*' sont des 'genere_p'     */
                                        /* (et donc des "petits entiers") et non pas des 'Int's...                                   */
                              ,CALCUL_DE_LA_LUMINANCE(niveau_ROUGE_corrige
                                                     ,niveau_VERTE_corrige
                                                     ,niveau_BLEUE_corrige
                                                      )
                               )
                         );
                    CALS(Fsauts_de_lignes(UN));
                    Eblock
               ATes
                    Bblock
                    Eblock
               ETes
               Eblock
          EBoI
          Eblock
     ERep

     CALS(Iupdate_palette_de_couleurs(nom_paletteR,ESPACE_DE_COULEURS_RVB));
                                        /* Mise a jour de la palette de couleurs...                                                  */

     RETU_Commande;
     Eblock
ECommande



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