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



Copyright © Jean-François COLONNA, 2019-2024.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / École polytechnique, Institut Polytechnique de Paris, 2019-2024.