/*************************************************************************************************************************************/
/* */
/* P R I M I T I V E S D E C O M B I N A I S O N D E P I X E L S */
/* S O U S F O R M E D E " F O N C T I O N S " : */
/* */
/* */
/* Definition : */
/* */
/* Dans ce fichier se trouvent toutes les */
/* primitives de combinaisons des pixels d'une */
/* image raster ; elles sont exprimees */
/* sous forme de fonctions ce qui fait */
/* que la duree d'execution par rapport */
/* aux "defines" est tres allongee... */
/* Mais l'avantage, c'est qu'elle */
/* peuvent etre referencees comme argument */
/* 'Vf' des operations de 'store_point' */
/* sous la forme : */
/* */
/* Vf(ancien_niveau,nouveau_niveau); */
/* */
/* */
/* Ainsi, on pourra combiner la valeur */
/* anterieure d'un point, avec la nouvelle */
/* que l'on vient de calculer, pour les */
/* fonctions 'Vf' autre que 'NEUTRE2'. */
/* */
/* */
/* N O T A T I O N S : */
/* */
/* */
/* On notera 'imageA' les images Arguments, */
/* et 'imageR' les images Resultats ; 'arg' */
/* designera des arguments, et 'Vf' une */
/* fonction "variable"... */
/* */
/* */
/* Author of '$xiipf/fonction.2$DEF' : */
/* */
/* Jean-Francois Colonna (LACTAMME, 19870000000000). */
/* */
/*************************************************************************************************************************************/
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* R E L A I V E R S L A F O N C T I O N D E C O M B I N A I S O N C O U R A N T E : */
/* */
/* */
/* Definition : */
/* */
/* Les fonctions du type "VNEUTRE", qui */
/* permettent de combiner les niveaux a */
/* ecrire et ne niveau anterieur, peuvent */
/* etre referencees indirectement, via */
/* le relai que l'on definit ici. */
/* */
/*************************************************************************************************************************************/
#define FVARIABLE \
Fcombinaison_universelle_de_deux_niveaux \
/* Definition de la variable d'acces au pointeur des fonctions */ \
/* variables de combinaison des points entre eux ; on passe par */ \
/* define intermediaire, afin de permettre une definition du */ \
/* type : */ \
/* */ \
/* #define FVARIABLE FNEUTRE, */ \
/* */ \
/* nous ramenant ainsi a la version anterieure des fichiers. */ \
/* */ \
/* Le 20170715081454, 'Fcombinaison_universelle_de_deux_niveaux' a remplace 'Fvariable' */ \
/* parce que 'v $xiipf/fonction.2$FON Fvariable' n'etait pas vraiment utilisable dans */ \
/* 'v $xiipf/fonction.2$DEF VALIDE_Fvariable'... */
Denumer18(INIS(_code_ZERO,ZERO)
,_code_FNEUTRE1
,_code_FNEUTRE2
,_code_FNEUTRE
,_code_FADD
,_code_FBARY
,_code_FMOYENNE
,_code_FSUB
,_code_FMUL
,_code_FMULF
,_code_FDIV
,_code_FMAX
,_code_FMIN
,_code_FMINMAX
,_code_FOR
,_code_FAND
,_code_FEOR
,DERNIER_code_F
,code_FVARIABLE
);
#define code_ZERO \
ENUM(_code_ZERO)
#define code_FNEUTRE1 \
ENUM(_code_FNEUTRE1)
#define code_FNEUTRE2 \
ENUM(_code_FNEUTRE2)
#define code_FNEUTRE \
ENUM(_code_FNEUTRE)
#define code_FADD \
ENUM(_code_FADD)
#define code_FBARY \
ENUM(_code_FBARY)
#define code_FMOYENNE \
ENUM(_code_FMOYENNE)
#define code_FSUB \
ENUM(_code_FSUB)
#define code_FMUL \
ENUM(_code_FMUL)
#define code_FMULF \
ENUM(_code_FMULF)
#define code_FDIV \
ENUM(_code_FDIV)
#define code_FMAX \
ENUM(_code_FMAX)
#define code_FMIN \
ENUM(_code_FMIN)
#define code_FMINMAX \
ENUM(_code_FMINMAX)
#define code_FOR \
ENUM(_code_FOR)
#define code_FAND \
ENUM(_code_FAND)
#define code_FEOR \
ENUM(_code_FEOR)
#define VALIDE_Fvariable(code_fonction,fonction) \
Ca1e(code_fonction) \
Bblock \
EGAL(Fvariable,aFONCTION(fonction)); \
Eblock \
ECa1
#define CHANGE_Fvariable(code_fonction) \
Bblock \
Choi(code_fonction) \
Bblock \
VALIDE_Fvariable(code_FNEUTRE1,FNEUTRE1) \
VALIDE_Fvariable(code_FNEUTRE2,FNEUTRE2) \
VALIDE_Fvariable(code_FNEUTRE,FNEUTRE) \
VALIDE_Fvariable(code_FADD,FADD) \
VALIDE_Fvariable(code_FBARY,FBARY) \
VALIDE_Fvariable(code_FMOYENNE,FMOYENNE) \
VALIDE_Fvariable(code_FSUB,FSUB) \
VALIDE_Fvariable(code_FMUL,FMUL) \
VALIDE_Fvariable(code_FMULF,FMULF) \
VALIDE_Fvariable(code_FDIV,FDIV) \
VALIDE_Fvariable(code_FMAX,FMAX) \
VALIDE_Fvariable(code_FMIN,FMIN) \
VALIDE_Fvariable(code_FMINMAX,FMINMAX) \
VALIDE_Fvariable(code_FOR,FOR) \
VALIDE_Fvariable(code_FAND,FAND) \
VALIDE_Fvariable(code_FEOR,FEOR) \
Defo \
Bblock \
PRINT_ERREUR("la fonction de combinaison des points n'existe pas"); \
Eblock \
EDef \
Eblock \
ECho \
Eblock \
/* Cette macro permet de changer la fonction courante de combinaison des points, */ \
/* tout en validant la fonction demandee. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* P A R A M E T R I S A T I O N D E L A F O N C T I O N ' FBARY ' : */
/* */
/*************************************************************************************************************************************/
#define PARAMETRISATION_DE_LA_FONCTION_FBARY(lambda) \
Bblock \
Test(IFINff(lambda \
,COORDONNEE_BARYCENTRIQUE_MINIMALE \
,COORDONNEE_BARYCENTRIQUE_MAXIMALE \
) \
) \
Bblock \
EGAL(FBARY_____ponderation_de_la_fonction,lambda); \
/* Lorsque l'argument est valide (dans [0,1]), il devient le nouveau parametre de controle */ \
/* de la fonction 'FBARY'. */ \
Eblock \
ATes \
Bblock \
PRINT_ERREUR("le parametre d'interpolation de la fonction 'FBARY' n'est pas dans [0,1]"); \
CAL1(Prer1("il vaut %g\n",lambda)); \
Eblock \
ETes \
Eblock \
/* Cette macro permet de changer le parametrage de la fonction 'FBARY', rappelant que son */ \
/* resultat est : */ \
/* */ \
/* FBARY(arg1,arg2) = (1-lambda).arg1+lambda.arg2 */ \
/* */ \
/* ou 'arg1' designe le niveau anterieur, et 'arg2' le nouveau niveau... */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* C H A R G E M E N T D ' U N P O I N T " F L O T T A N T " D ' U N E I M A G E */
/* A V E C C O O R D O N N E E S F L O T T A N T E S : */
/* */
/*************************************************************************************************************************************/
#define CHANGER_LA_MATRICE_DE_FFload_point_coordonnees_01 \
VRAI
#define CONSERVER_LA_MATRICE_DE_FFload_point_coordonnees_01 \
NOTL(CHANGER_LA_MATRICE_DE_FFload_point_coordonnees_01)
/* Definitions introduites le 20081030091912... */
#define FFload_point_coordonnees_01_matrice(valeur,imageA,Xf,Yf,perX,perY,symX,symY,proX,proY,nHors,ChangerMatrice,appliquer,matrice) \
/* Le parametre 'ChangerMatrice' fut introduit le 20081030091912... */ \
Bblock \
Test(IL_FAUT(ChangerMatrice)) \
Bblock \
/* Cas ou la matrice de 'FFload_point_coordonnees_01(...)' doit etre changee : */ \
BSaveModifyVariable(Logical \
,FFload_point_coordonnees_01_____appliquer_une_matrice_de_transformation \
,appliquer \
); \
\
begin_nouveau_block \
Bblock \
DEFV(matrixF_3D,EnTete_de_sauvegardM ## FFload_point_coordonnees_01_____matrice_de_transformation); \
\
TRANSFERT_MATRICE_3D(EnTete_de_sauvegardM ## FFload_point_coordonnees_01_____matrice_de_transformation \
,FFload_point_coordonnees_01_____matrice_de_transformation \
); \
/* Sauvegarde de la transformation courante... */ \
TRANSFERT_MATRICE_3D(FFload_point_coordonnees_01_____matrice_de_transformation \
,matrice \
); \
/* Changement de la transformation courante... */ \
\
EGAL(valeur \
,FFload_point_coordonnees_01(imageA \
,Xf,Yf \
,perX,perY \
,symX,symY \
,proX,proY \
,nHors \
) \
); \
/* Recuperation de la valeur via la transformation courante {appliquer,matrice}. */ \
\
TRANSFERT_MATRICE_3D(FFload_point_coordonnees_01_____matrice_de_transformation \
,EnTete_de_sauvegardM ## FFload_point_coordonnees_01_____matrice_de_transformation \
); \
Eblock \
end_nouveau_block \
\
ESaveModifyVariable(Logical \
,FFload_point_coordonnees_01_____appliquer_une_matrice_de_transformation \
); \
/* Restauration de la transformation courante... */ \
Eblock \
ATes \
Bblock \
/* Cas ou la matrice de 'FFload_point_coordonnees_01(...)' doit etre conservee : */ \
EGAL(valeur \
,FFload_point_coordonnees_01(imageA \
,Xf,Yf \
,perX,perY \
,symX,symY \
,proX,proY \
,nHors \
) \
); \
/* Recuperation de la valeur via la transformation anterieure... */ \
Eblock \
ETes \
Eblock \
/* Procedure introduite le 20081029112229 pour faciliter le changement de la matrice */ \
/* 'FFload_point_coordonnees_01_____matrice_de_transformation' et appeler ensuite la */ \
/* fonction 'FFload_point_coordonnees_01(...)'. */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/* */
/* C H A R G E M E N T D ' U N P O I N T " F L O T T A N T " D ' U N E I M A G E */
/* A V E C C O O R D O N N E E S F L O T T A N T E S I N D I R E C T E S : */
/* */
/*************************************************************************************************************************************/
#define CHANGER_LA_MATRICE_DE_FFload_point_coordonnees_01_indirectes \
VRAI
#define CONSERVER_LA_MATRICE_DE_FFload_point_coordonnees_01_indirectes \
NOTL(CHANGER_LA_MATRICE_DE_FFload_point_coordonnees_01_indirectes)
/* Definitions introduites le 20081030091912... */
#define FFload_point_coordonnees_01_indirectes_matrice(valeur,iA,Xf,Yf,iAX,iAY,perX,perY,symX,symY,proX,proY,nHors,ChMa,appl,matrice) \
Bblock \
Test(IL_FAUT(ChMa)) \
Bblock \
/* Cas ou la matrice de 'FFload_point_coordonnees_01_indirectes(...)' doit etre changee : */ \
BSaveModifyVariable(Logical \
,FFload_point_coordonnees_01_indirectes_____appliquer_une_matrice_de_transformation_ \
,appl \
); \
\
begin_nouveau_block \
Bblock \
DEFV(matrixF_3D \
,EnTete_de_sauvegardM ## FFload_point_coordonnees_01_indirectes_____matrice_de_transformation_ \
); \
\
TRANSFERT_MATRICE_3D \
(EnTete_de_sauvegardM ## FFload_point_coordonnees_01_indirectes_____matrice_de_transformation_ \
,FFload_point_coordonnees_01_indirectes_____matrice_de_transformation_ \
); \
/* Sauvegarde de la transformation courante... */ \
TRANSFERT_MATRICE_3D(FFload_point_coordonnees_01_indirectes_____matrice_de_transformation_ \
,matrice \
); \
/* Changement de la transformation courante... */ \
\
EGAL(valeur \
,FFload_point_coordonnees_01_indirectes(iA \
,Xf,Yf \
,iAX,iAY \
,perX,perY \
,symX,symY \
,proX,proY \
,nHors \
) \
); \
/* Recuperation de la valeur via la transformation courante {appl,matrice}. */ \
\
TRANSFERT_MATRICE_3D \
(FFload_point_coordonnees_01_indirectes_____matrice_de_transformation_ \
,EnTete_de_sauvegardM ## FFload_point_coordonnees_01_indirectes_____matrice_de_transformation_ \
); \
Eblock \
end_nouveau_block \
\
ESaveModifyVariable(Logical \
,FFload_point_coordonnees_01_indirectes_____appliquer_une_matrice_de_transformation_ \
); \
/* Restauration de la transformation courante... */ \
Eblock \
ATes \
Bblock \
/* Cas ou la matrice de 'FFload_point_coordonnees_01_indirectes(...)' doit etre conservee : */ \
EGAL(valeur \
,FFload_point_coordonnees_01_indirectes(iA \
,Xf,Yf \
,iAX,iAY \
,perX,perY \
,symX,symY \
,proX,proY \
,nHors \
) \
); \
/* Recuperation de la valeur via la transformation anterieure... */ \
Eblock \
ETes \
Eblock \
/* Procedure introduite le 20090507102158 pour faciliter le changement de la matrice */ \
/* 'FFload_point_coordonnees_01_indirectes_____matrice_de_transformation_' et appeler */ \
/* ensuite la fonction 'FFload_point_coordonnees_01_indirectes(...)'. */