/*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S O P E R A T I O N S D E R E D U C T I O N : */ /* */ /* */ /* Author of '$xci/reduction.02$I' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 1996??????????). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M A C R O S U T I L E S : */ /* */ /*************************************************************************************************************************************/ #include xci/reduction.12.I" #define NUMERO_D_IMAGE \ INTE(numero_d_image) \ /* Numero d'image utilise pour generer les noms d'image... */ #define VERITABLE_PAS_DES_IMAGES \ COND(IL_NE_FAUT_PAS(calculer_le_pas_des_images) \ ,pas_des_images \ ,COND(IL_NE_FAUT_PAS(aller_de_la_premiere_a_la_derniere_image_lors_du_calcul_du_pas_des_images) \ ,DIVI(FLOT(NBRE(premiere_image,derniere_image)) \ ,FLOT(NEUT(NOMBRE_D_IMAGES_REDUITES)) \ ) \ ,DIVI(FLOT(COND(IL_FAUT(compatibilite_20070824) \ ,SOUS(derniere_image,premiere_image) \ ,NBRE(premiere_image,derniere_image) \ ) \ ) \ ,FLOT(TRMU(NOMBRE_D_IMAGES_REDUITES)) \ ) \ ) \ ) \ /* Pas de passage d'un numero d'image a une autre veritablement utilise. */ \ /* */ \ /* Le 20120306150823, le 'NEUT(...)' a ete introduit par symetrie avec 'TRMU(...)'... */ #define GENERE_REDUCTION_NOM_IMAGE \ Bblock \ EGAL(nom_image \ ,COND(IFEQ_chaine(nom_postfixe,NOM_UNDEF_VIDE) \ ,chain_Aconcaten2_sauf_nom_pipe(nom_imageA \ ,chain_numero(NUMERO_D_IMAGE,nombre_de_chiffres) \ ) \ ,chain_Aconcaten3_sauf_nom_pipe(nom_imageA \ ,COND(IL_NE_FAUT_PAS(permuter_l_eventuel_postfixe_et_le_numero) \ ,chain_numero(NUMERO_D_IMAGE,nombre_de_chiffres) \ ,nom_postfixe \ ) \ ,COND(IL_NE_FAUT_PAS(permuter_l_eventuel_postfixe_et_le_numero) \ ,nom_postfixe \ ,chain_numero_avec_separateur(NUMERO_D_IMAGE,nombre_de_chiffres) \ ) \ ) \ ) \ ); \ Eblock \ /* Generation du nom de l'image... */ #define GENERE_REDUCTION_PROGRESSION_DU_NUMERO_D_IMAGE \ Bblock \ CALZ_FreCC(nom_image); \ \ INCR(numero_d_image,VERITABLE_PAS_DES_IMAGES); \ \ Test(IL_NE_FAUT_PAS(compatibilite_20070824)) \ /* Test introduit le 20070824150555... */ \ Bblock \ Test(IFET(IFGE(VERITABLE_PAS_DES_IMAGES,FDEUX) \ ,IFEQ(SOUA(INTE(numero_d_image),derniere_image),UN) \ ) \ ) \ Bblock \ EGAL(numero_d_image,derniere_image); \ /* Lorsque le numero courant d'image est voisin (a une unite pres) du numero de la */ \ /* derniere image, on se positionne arbitrairement sur cette derniere image (dispositif */ \ /* introduit le 20070824150555...). */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Test(IFET(IFOU(IFET(IFGE(derniere_image,premiere_image),IFGT(numero_d_image,derniere_image)) \ ,IFET(IFLT(derniere_image,premiere_image),IFLT(numero_d_image,derniere_image)) \ ) \ ,IL_FAUT(gerer_modulo_les_numeros_des_images) \ ) \ ) \ /* ATTENTION, avant le 20000720163946, il y avait ici : */ \ /* */ \ /* Test(IFET(IFGT(numero_d_image,derniere_image) */ \ /* ,IL_FAUT(gerer_modulo_les_numeros_des_images) */ \ /* ) */ \ /* ) */ \ /* */ \ /* La nouvelle formulation permet d'inverser l'ordre des images en choisissant l'ordre */ \ /* inverse des numeros (premiere_image > derniere_image). Ceci a ete principalement */ \ /* introduit pour generer l'autostereogramme 'v $xiak/REFM.72.1$R16' qui, pour restituer */ \ /* le relief dans le "bon sens", demande a ce que l'angle de rotation vraie par valeurs */ \ /* decroissantes ('v $xiak/$Fnota Debut_listG_REFM_72_1'). */ \ Bblock \ EGAL(numero_d_image,premiere_image); \ /* Le 20000421105653 j'ai ajoute cette gestion "modulo" des numeros d'image. Ceci est */ \ /* a priori destine a generer des matrices 4x4 stereoscopiques ; ainsi, on generera les */ \ /* 4 images suivantes (par exemple avec '$xrk/lorenz.11$X') : */ \ /* */ \ /* IMAGE.0001 ROTATION_OZ=0.0 */ \ /* IMAGE.0002 ROTATION_OZ=0.1 */ \ /* IMAGE.0003 ROTATION_OZ=0.2 */ \ /* IMAGE.0004 ROTATION_OZ=0.3 */ \ /* */ \ /* puis on fera : */ \ /* */ \ /* $xci/reduction_16$Z IMAGE. IMAGE_RESULTAT 1 4 */ \ /* */ \ /* et ainsi les 4 bandes horizontales seront faites des memes 4 images... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Progression du numero d'image... */ #define EDITION_FACULTATIVE_DE_L_IMAGE_COURANTE \ Bblock \ Test(IL_FAUT(editer_le_nom_des_images_reduites)) \ Bblock \ Test(IFEQ(NUMERO_D_IMAGE,premiere_image)) \ Bblock \ CALS(Fsauts_de_lignes(UN)); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Test(IL_FAUT(editer_seulement_le_numero_des_images_reduites)) \ Bblock \ CAL3(Prme1("%s\n",chain_numero(NUMERO_D_IMAGE,nombre_de_chiffres))); \ Eblock \ ATes \ Bblock \ CAL3(Prme1("%s\n",nom_image)); \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Edition facultative du nom ou du numero (introduit le 20030626091750) de l'image */ \ /* courante... */ #define GENERE_REDUCTION(FENETRE,imageR,MULTIPLICITE_nxn_POUR_LES_DEMI_FENETRES,mettre_un_fond,dimension_du_pave) \ Bblock \ DEFV(CHAR,INIC(POINTERc(nom_image_dilatee),NOM_UNDEF)); \ /* Au cas ou il serait necessaire de dilater l'image courante... */ \ \ GENERE_REDUCTION_NOM_IMAGE; \ \ DILATATION_D_UNE_IMAGE_AVANT_REDUCTION(nom_image_dilatee,nom_image,dimension_du_pave); \ \ Test(PAS_D_ERREUR(CODE_ERROR(Iload_image(ImageA \ ,COND(IL_NE_FAUT_PAS(dilater_les_images) \ ,nom_image \ ,nom_image_dilatee \ ) \ ) \ ) \ ) \ ) \ /* A = image courante (de numero 'NUMERO_D_IMAGE'). */ \ Bblock \ EDITION_FACULTATIVE_DE_L_IMAGE_COURANTE; \ \ FENETRE(imageR \ ,ImageA \ ,MULTIPLICITE_nxn_POUR_LES_DEMI_FENETRES \ ,MULTIPLICITE_nxn_POUR_LES_DEMI_FENETRES \ ,moyennage \ ,calculer_le_maximum \ ); \ /* R = image courante (de numero 'NUMERO_D_IMAGE') reduite la ou il faut ; on notera */ \ /* que la reduction de moitie est faite par extraction du 'MAXI' (voir 'moyennage') */ \ /* et ce afin d'eviter des artefacts dans les images "multi-palettes"... */ \ Eblock \ ATes \ Bblock \ Test(IL_NE_FAUT_PAS(mettre_un_fond)) \ Bblock \ Test(IL_FAUT(files_____editer_les_messages_d_erreur_de_lecture_des_fichiers)) \ Bblock \ Test__CODE_ERREUR__ERREUR07; \ Eblock \ ATes \ Bblock \ /* Lorsqu'il faut mettre un fond, les images inexistantes ne constituent pas une erreur, */ \ /* car on utilise cette option ("fond") pour permettre le remplacement d'une ou plusieurs */ \ /* sous-image de l'image de fond par la serie d'image Argument... */ \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ETes \ \ Test(IL_FAUT(dilater_les_images)) \ Bblock \ CALS(Idelete_image(nom_image_dilatee)); \ /* Destruction de l'image dilatee. */ \ \ CALZ_FreCC(nom_image_dilatee); \ /* Liberation de l'espace contenant le nom de l'image dilatee. */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ GENERE_REDUCTION_PROGRESSION_DU_NUMERO_D_IMAGE; \ Eblock \ /* Procedure d'insertion de l'image courante dans une fenetre. */ #define F_GENERE_REDUCTION(FENETRE,imageR,MULTIPLICITE_nxn_POUR_LES_DEMI_FENETRES) \ Bblock \ GENERE_REDUCTION_NOM_IMAGE; \ \ Test(PAS_D_ERREUR(CODE_ERROR(IloadF_image(IFmageA,nom_image)))) \ /* A = image courante (de numero 'NUMERO_D_IMAGE'). */ \ Bblock \ EDITION_FACULTATIVE_DE_L_IMAGE_COURANTE; \ \ FENETRE(imageR \ ,IFmageA \ ,MULTIPLICITE_nxn_POUR_LES_DEMI_FENETRES \ ,MULTIPLICITE_nxn_POUR_LES_DEMI_FENETRES \ ,moyennage \ ,calculer_le_maximum \ ); \ /* R = image courante (de numero 'NUMERO_D_IMAGE') reduite la ou il faut ; on notera */ \ /* que la reduction de moitie est faite par extraction du 'MAXI' (voir 'moyennage') */ \ /* et ce afin d'eviter des artefacts dans les images "multi-palettes"... */ \ Eblock \ ATes \ Bblock \ Test(IL_FAUT(files_____editer_les_messages_d_erreur_de_lecture_des_fichiers)) \ Bblock \ Test__CODE_ERREUR__ERREUR07; \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ETes \ \ GENERE_REDUCTION_PROGRESSION_DU_NUMERO_D_IMAGE; \ Eblock \ /* Procedure d'insertion de l'image courante dans une fenetre en mode "non standard" */ \ /* (introduit le 20020116142836). */