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