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