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