/*************************************************************************************************************************************/ /* */ /* 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(...)'. */