_______________________________________________________________________________________________________________________________________
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F O N C T I O N S   D E   B A S E   D ' E D I T I O N   D E S   I M A G E S                                                */
/*        S U R   L E   B I T - M A P   C O U L E U R   D P X 5 0 0 0  :                                                             */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition :                                                                                                               */
/*                                                                                                                                   */
/*                    Ce fichier contient toutes les fonctions                                                                       */
/*                  de base d'edition graphique des images raster,                                                                   */
/*                  quelle que soit la definition.                                                                                   */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xiidd/fonction$FON' :                                                                                          */
/*                                                                                                                                   */
/*                    Jean-Francois COLONNA (LACTAMME, 19880000000000).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        O P P O R T U N I T E   D E   C O M P I L E R   C E   M O D U L E  :                                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

#ifdef    __VERSION__COMPILER_LE_GRAPHIQUE_SPIX                                 /* Common,DEFV(Fonction,) : indicateur de VERSION.   */
DEFV(Common,DEFV(Logical,_______VERSION__COMPILER_LE_GRAPHIQUE_SPIX));
#Aifdef   __VERSION__COMPILER_LE_GRAPHIQUE_SPIX                                 /* Common,DEFV(Fonction,) : indicateur de VERSION.   */
#Eifdef   __VERSION__COMPILER_LE_GRAPHIQUE_SPIX                                 /* Common,DEFV(Fonction,) : indicateur de VERSION.   */

#ifdef    __VERSION__COMPILER_LE_GRAPHIQUE_SPIX             /* Common,DEFV(Fonction,) : la bibliotheque est conditionnelle.          */
/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N S   D E S   " B U G S "   P R E S E N T S  :                                                           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

#    ifdef     BUG_SYSTEME_DPX5000_GRAPHIQUE_spxa_1                             /* Common,DEFV(Fonction,) : bug...                   */
DEFV(Common,DEFV(Logical,_____BUG_SYSTEME_DPX5000_GRAPHIQUE_spxa_1));
#    Aifdef    BUG_SYSTEME_DPX5000_GRAPHIQUE_spxa_1                             /* Common,DEFV(Fonction,) : bug...                   */
#    Eifdef    BUG_SYSTEME_DPX5000_GRAPHIQUE_spxa_1                             /* Common,DEFV(Fonction,) : bug...                   */

#    ifdef     BUG_SYSTEME_DPX5000_GRAPHIQUE_spxa_2                             /* Common,DEFV(Fonction,) : bug...                   */
DEFV(Common,DEFV(Logical,_____BUG_SYSTEME_DPX5000_GRAPHIQUE_spxa_2));
#    Aifdef    BUG_SYSTEME_DPX5000_GRAPHIQUE_spxa_2                             /* Common,DEFV(Fonction,) : bug...                   */
#    Eifdef    BUG_SYSTEME_DPX5000_GRAPHIQUE_spxa_2                             /* Common,DEFV(Fonction,) : bug...                   */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        R E F E R E N C E S   E X T E R N E S  :                                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
DEFV(Extern,DEFV(vrai_Int_de_base,kopwk()));
                                        /* Ouverture standard d'une fenetre.                                                         */
DEFV(Extern,DEFV(vrai_Int_de_base,sclwk()));
                                        /* Fermeture standard d'une fenetre.                                                         */
DEFV(Extern,DEFV(vrai_Int_de_base,sscr()));
                                        /* Chargement des tables de couleurs.                                                        */
DEFV(Extern,DEFV(vrai_Int_de_base,spxa()));
                                        /* Envoi d'une matrice de pixels dans une fenetre.                                           */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N S   L O C A L E S  :                                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#    define    TRANSLATION_OX_1                                                                                                         \
                         UN                                                                                                             \
                                        /* Les coordonnees a manipuler en mode pixel commencent a 1...                               */
#    define    TRANSLATION_OY_1                                                                                                         \
                         UN                                                                                                             \
                                        /* Les coordonnees a manipuler en mode pixel commencent a 1...                               */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        E N V O I   D ' U N E   P A L E T T E   D E   C O U L E U R S   ( L I S T E S   D E   S U B S T I T U T I O N )  :         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

#    define    POURCENTAGE_DES_COULEURS(niveau)                                                                                         \
                         INTE(SCAL(NIVR(niveau)                                                                                         \
                                  ,NIVR(BLANC)                                                                                          \
                                  ,CENT                                                                                                 \
                                   )                                                                                                    \
                              )                                                                                                         \
                                        /* Pour convertir un niveau dans [NOIR,BLANC] en un pourcentage.                             */
DEFV(Common,DEFV(FonctionI,IDpalette(increment_des_niveaux)))
DEFV(Argument,DEFV(Int,increment_des_niveaux));
                                        /* Increment du niveau courant dans [NOIR,BLANC] afin de pouvoir decaler la palette...       */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;
                                        /* ATTENTION : 'INIT_ERROR' est mis en tete des variables locales au cas ou des couples      */
                                        /* ('BDEFV','EDEFV') suivraient...                                                           */
     DEFV(genere_p,INIT(valeur_ROUGE,NIVEAU_UNDEF));
     DEFV(genere_p,INIT(valeur_VERTE,NIVEAU_UNDEF));
     DEFV(genere_p,INIT(valeur_BLEUE,NIVEAU_UNDEF));
                                        /* Pour recuperer l'entree courante des listes de substitution {R,V,B}.                      */
     /*..............................................................................................................................*/
     PUSH_FILTRAGE;
                                        /* Sauvegarde de l'etat courant du filtrage des niveaux.                                     */
     SET_FILTRAGE(ACTIF);
                                        /* On autorise tous les filtrages afin d'avoir la 'SUBSTITUTION'.                            */
     PUSH_SUBSTITUTION;
                                        /* Sauvegarde de la substitution courante.                                                   */
     BoIn(niveau,NOIR,BLANC,PAS_COULEURS)
          Bblock
          SUBSTITUTION(L_SUBSTITUTION_ROUGE);
          EGAL(valeur_ROUGE,Nsubstitution(GENP(NIVA(MODS(NIVR(ADD2(niveau,increment_des_niveaux)),NIVR(NOIR),NIVR(BLANC))))));
                                        /* Recuperation de la composante 'ROUGE',                                                    */
          SUBSTITUTION(L_SUBSTITUTION_VERTE);
          EGAL(valeur_VERTE,Nsubstitution(GENP(NIVA(MODS(NIVR(ADD2(niveau,increment_des_niveaux)),NIVR(NOIR),NIVR(BLANC))))));
                                        /* Recuperation de la composante 'VERTE',                                                    */
          SUBSTITUTION(L_SUBSTITUTION_BLEUE);
          EGAL(valeur_BLEUE,Nsubstitution(GENP(NIVA(MODS(NIVR(ADD2(niveau,increment_des_niveaux)),NIVR(NOIR),NIVR(BLANC))))));
                                        /* Recuperation de la composante 'BLEUE',                                                    */
          Test(IL_Y_A_ERRORS(CODE_ERROR(sscr(INDX(niveau,NOIR)
                                            ,POURCENTAGE_DES_COULEURS(valeur_ROUGE)
                                            ,POURCENTAGE_DES_COULEURS(valeur_VERTE)
                                            ,POURCENTAGE_DES_COULEURS(valeur_BLEUE)
                                             )
                                        )
                             )
               )
                                        /* Et chargement de l'entree de rang 'niveau' par le triplet {R,V,B}.                        */
               Bblock
               PRINT_ERREUR("le chargement des registres de coloriage est impossible");
               Eblock
          ATes
               Bblock
               Eblock
          ETes
          Eblock
     EBoI
     PULL_SUBSTITUTION;
     PULL_FILTRAGE;
                                        /* Et restauration des conditions initiales...                                               */
     RETU_ERROR;
     Eblock

#    undef     POURCENTAGE_DES_COULEURS

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        O U V E R T U R E   D ' U N E   F E N E T R E  :                                                                           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

#    define    PAS_DE_TRANSLATION_DE_LA_PALETTE                                                                                         \
                         ZERO                                                                                                           \
                                        /* Afin que la palette soit transmise telle qu'elle...                                       */
DEFV(Common,DEFV(FonctionI,IDopen(nom_de_la_fenetreA
                                 ,ARGUMENT_POINTERs(dimension_de_la_fenetre)
                                 ,ARGUMENT_POINTERs(coin_haut_gauche)
                                  )
                 )
     )
DEFV(Argument,DEFV(CHAR,DTb0(nom_de_la_fenetreA)));
                                        /* Nom de la fenetre a ouvrir.                                                               */
DEFV(Argument,DEFV(deltaF_2D,POINTERs(dimension_de_la_fenetre)));
                                        /* Dimension horizontale de la fenetre,                                                      */
DEFV(Argument,DEFV(pointF_2D,POINTERs(coin_haut_gauche)));
                                        /* Abscisse du point de reference,                                                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;
                                        /* ATTENTION : 'INIT_ERROR' est mis en tete des variables locales au cas ou des couples      */
                                        /* ('BDEFV','EDEFV') suivraient...                                                           */
     DEFV(Int,INIT(numero_de_la_fenetre,UNDEF));
                                        /* Contient le numero de la fenetre ou un code d'erreur en cas d'anomalie...                 */
     DEFV(K_definition_d_une_fenetre,fenetre_a_ouvrir);
                                        /* Donnees de definition de la fenetre a ouvrir.                                             */
     /*..............................................................................................................................*/
     EGAL(numero_de_la_fenetre
         ,kopwk(ADRESSE(fenetre_a_ouvrir)
               ,_lDENORMALISE_OX5(ASI1(dimension_de_la_fenetre,dx)),_lDENORMALISE_OY5(ASI1(dimension_de_la_fenetre,dy))
               ,_cDENORMALISE_OX5(ASI1(coin_haut_gauche,x)),_cDENORMALISE_OY5(ASI1(coin_haut_gauche,y))
               ,nom_de_la_fenetreA
               ,SBIT(SBIT(SBIT(SBIT(SBIT(MASQUE_VIDE
                                        ,B_fonction_de_bordure
                                         )
                                   ,B_fonction_d_iconisation
                                    )
                              ,B_fonction_de_deplacement
                               )
                         ,B_fonction_de_redimensionnement
                          )
                    ,B_fonction_de_frame_input
                     )
                )
          );
                                        /* Tentative d'ouverture de la fenetre...                                                    */
     Test(IL_Y_A_ERRORS(numero_de_la_fenetre))
          Bblock
          CODE_ERROR(numero_de_la_fenetre);
                                        /* Renvoi du code d'erreur...                                                                */
          PRINT_ERREUR("l'ouverture de la fenetre est impossible");
          Eblock
     ATes
          Bblock
          Eblock
     ETes
     CALS(IDpalette(PAS_DE_TRANSLATION_DE_LA_PALETTE));
                                        /* Et envoi des listes de COLORIAGE courante...                                              */
     RETU_ERROR;
     Eblock

#    undef     PAS_DE_TRANSLATION_DE_LA_PALETTE

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F E R M E T U R E   D ' U N E   F E N E T R E  :                                                                           */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,DEFV(FonctionI,IDclose()))
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;
                                        /* ATTENTION : 'INIT_ERROR' est mis en tete des variables locales au cas ou des couples      */
                                        /* ('BDEFV','EDEFV') suivraient...                                                           */
     /*..............................................................................................................................*/
     Test(IL_Y_A_ERREUR(CODE_ERROR(sclwk())))
                                        /* Tentative de fermeture de la fenetre...                                                   */
          Bblock
          PRINT_ERREUR("la fermeture de la fenetre est impossible");
          Eblock
     ATes
          Bblock
          Eblock
     ETes
     RETU_ERROR;
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D I S P L A Y   G R A P H I Q U E   D ' U N E   I M A G E  :                                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,DEFV(FonctionI,IDdisplay(imageA)))
DEFV(Argument,DEFV(image,imageA));
                                        /* Image Argument que l'on veut visualiser sur le bit-map couleur.                           */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;
                                        /* ATTENTION : 'INIT_ERROR' est mis en tete des variables locales au cas ou des couples      */
                                        /* ('BDEFV','EDEFV') suivraient...                                                           */
     DEFV(S_matrice_de_pixels,image_dans_la_fenetre);
                                        /* Definition de la matrice de pixels dans la fenetre.                                       */
     /*..............................................................................................................................*/
     EGAL(ASD1(image_dans_la_fenetre,nombre_de_points_le_long_de_OX),dimX);
     EGAL(ASD1(image_dans_la_fenetre,valeur_minimale_de_X),ADD2(COXR(Xmin),TRANSLATION_OX_1));
     EGAL(ASD1(image_dans_la_fenetre,valeur_maximale_de_X),ADD2(COXR(Xmax),TRANSLATION_OX_1));
                                        /* Definition de l'axe des 'X' de l'image.                                                   */
     EGAL(ASD1(image_dans_la_fenetre,nombre_de_points_le_long_de_OY),NEGA(dimY));
     EGAL(ASD1(image_dans_la_fenetre,valeur_minimale_de_Y),ADD2(COYR(Ymin),TRANSLATION_OY_1));
     EGAL(ASD1(image_dans_la_fenetre,valeur_maximale_de_Y),ADD2(COYR(Ymax),TRANSLATION_OY_1));
                                        /* Definition de l'axe des 'Y' de l'image (axe descendant : de haut en bas, d'ou             */
                                        /* le 'NEGA' qui precede 'dimY').                                                            */
     EGAL(ASD3(image_dans_la_fenetre,point_de_reference,S_coordonnees,S_coordonnee_X),Xmin5);
     EGAL(ASD3(image_dans_la_fenetre,point_de_reference,S_coordonnees,S_coordonnee_Y),Ymax5);
                                        /* Definition de l'origine de l'image dans la fenetre (nota : on prend 'Ymax5' car           */
                                        /* l'axe des 'Y' est inverse...                                                              */
     EGAL(ASD1(image_dans_la_fenetre,matrice_de_pixels),imageA);
                                        /* Definition de la matrice proprement dite...                                               */
     Test(IL_Y_A_ERREUR(CODE_ERROR(spxa(ADRESSE(image_dans_la_fenetre)))))
                                        /* Et affichage de l'image...                                                                */
          Bblock
          PRINT_ERREUR("l'affichage de l'image est impossible");
          Eblock
     ATes
          Bblock
          Eblock
     ETes
     RETU_ERROR;
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        A N I M A T I O N   G R A P H I Q U E   D ' U N E   I M A G E  :                                                           */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Fonction :                                                                                                                 */
/*                                                                                                                                   */
/*                    Il est possible de multiplexer                                                                                 */
/*                  matriciellement plusieurs images                                                                                 */
/*                  (et non pas a l'aide de (pasX,pasY))                                                                             */
/*                  sous la forme d'un tableau carre                                                                                 */
/*                  de sous-images. La fonction ci-dessous                                                                           */
/*                  permet de visualiser l'animation                                                                                 */
/*                  correspondante.                                                                                                  */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Exemple 2x2 :                                                                                                              */
/*                                                                                                                                   */
/*                    Supposons un tableau carre                                                                                     */
/*                  de 2x2=4 (carre) images ; celles-ci                                                                              */
/*                  seront disposees ainsi (les numeros                                                                              */
/*                  de 01 a 04 donnant l'ordre d'appa-                                                                               */
/*                  rition temporelle des images) :                                                                                  */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*                Y ^                                                                                                                */
/*                  |                                                                                                                */
/*             Ymax |----------                                                                                                      */
/*                  | 03 | 04 |                                                                                                      */
/*                  |----------                                                                                                      */
/*                  | 01 | 02 |                                                                                                      */
/*             Ymin |------------->                                                                                                  */
/*                 Xmin     Xmax  X                                                                                                  */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Exemple 4x4 :                                                                                                              */
/*                                                                                                                                   */
/*                    Supposons un tableau carre                                                                                     */
/*                  de 4x4=16 (carre) images ; celles-ci                                                                             */
/*                  seront disposees ainsi (les numeros                                                                              */
/*                  de 01 a 16 donnant l'ordre d'appa-                                                                               */
/*                  rition temporelle des images) :                                                                                  */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*                Y ^                                                                                                                */
/*                  |                                                                                                                */
/*             Ymax |--------------------                                                                                            */
/*                  | 13 | 14 | 15 | 16 |                                                                                            */
/*                  |--------------------                                                                                            */
/*                  | 09 | 10 | 11 | 12 |                                                                                            */
/*                  |--------------------                                                                                            */
/*                  | 05 | 06 | 07 | 08 |                                                                                            */
/*                  |--------------------                                                                                            */
/*                  | 01 | 02 | 03 | 04 |                                                                                            */
/*             Ymin |----------------------->                                                                                        */
/*                 Xmin               Xmax  X                                                                                        */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Exemple 8x8 :                                                                                                              */
/*                                                                                                                                   */
/*                    Supposons un tableau carre                                                                                     */
/*                  de 8x8=64 (carre) images ; celles-ci                                                                             */
/*                  seront disposees ainsi (les numeros                                                                              */
/*                  de 01 a 64 donnant l'ordre d'appa-                                                                               */
/*                  rition temporelle des images) :                                                                                  */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*                Y ^                                                                                                                */
/*                  |                                                                                                                */
/*             Ymax |----------------------------------------                                                                        */
/*                  | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 |                                                                        */
/*                  |----------------------------------------                                                                        */
/*                  | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 |                                                                        */
/*                  |----------------------------------------                                                                        */
/*                  | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 |                                                                        */
/*                  |----------------------------------------                                                                        */
/*                  | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 |                                                                        */
/*                  |----------------------------------------                                                                        */
/*                  | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 |                                                                        */
/*                  |----------------------------------------                                                                        */
/*                  | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 |                                                                        */
/*                  |----------------------------------------                                                                        */
/*                  | 09 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |                                                                        */
/*                  |----------------------------------------                                                                        */
/*                  | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 |                                                                        */
/*             Ymin |------------------------------------------->                                                                    */
/*                 Xmin                                   Xmax  X                                                                    */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*                    Enfin, si l'animation est periodique                                                                           */
/*                  il est possible de la diffuser plusieurs                                                                         */
/*                  fois de suite, la derniere image etant                                                                           */
/*                  immediatement suivie de la premiere...                                                                           */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,DEFV(FonctionI,IDanimation(imageA
                                      ,nombre_de_trames
                                      ,temporisation_inter_trames
                                      ,temporisation_inter_animations
                                      ,nombre_de_repetitions
                                      ,centrage_de_l_animation
                                      ,mettre_un_fond,ARGUMENT_FACULTATIF(fond_de_la_fenetre)
                                       )
                 )
     )
DEFV(Argument,DEFV(image,imageA));
                                        /* Image Argument que l'on veut visualiser sur le bit-map couleur ; celle-ci                 */
                                        /* contient matriciellement un certain nombre de sous-images encore                          */
                                        /* appelees "trames" (elles sont rangees de gauche a droite, puis de haut en                 */
                                        /* bas).                                                                                     */
DEFV(Argument,DEFV(Positive,nombre_de_trames));
                                        /* Nombre de trames composant l'animation ; cette valeur, pour faciliter                     */
                                        /* les choses doit etre un carre...                                                          */
DEFV(Argument,DEFV(Positive,temporisation_inter_trames));
                                        /* Donne la temporisation entre chaque trame de l'animation ; si celle-ci est                */
                                        /* nulle, il n'y pas d'attente...                                                            */
DEFV(Argument,DEFV(Positive,temporisation_inter_animations));
                                        /* Donne la temporisation entre chaque animation ; si celle-ci est                           */
                                        /* nulle, il n'y pas d'attente...                                                            */
DEFV(Argument,DEFV(Positive,nombre_de_repetitions));
                                        /* Nombre de fois que l'animation sera repetee.                                              */
DEFV(Argument,DEFV(Logical,centrage_de_l_animation));
                                        /* Indique s'il faut centrer ('VRAI') ou mettre dans le coin inferieur gauche ('FAUX')       */
                                        /* les images de l'animation...                                                              */
DEFV(Argument,DEFV(Logical,mettre_un_fond));
                                        /* Indique s'il faut mettre ('VRAI') ou pas ('FAUX') un fond derriere l'animation.           */
DEFV(Argument,DEFV(image,fond_de_la_fenetre));
                                        /* Image de Fond mise en arriere plan de l'animation.                                        */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;
                                        /* ATTENTION : 'INIT_ERROR' est mis en tete des variables locales au cas ou des couples      */
                                        /* ('BDEFV','EDEFV') suivraient...                                                           */
     DEFV(S_matrice_de_pixels,trame_dans_la_fenetre);
                                        /* Definition de la matrice de pixels dans la fenetre.                                       */
     DEFV(Positive,INIT(dimension_lineaire,INTE(RACX(nombre_de_trames))));
                                        /* Definition de la dimension lineaire, c'est-a-dire du nombre de sous-                      */
                                        /* images contenues dans 'imageA'.                                                           */
     DEFV(Positive,INIT(dimX_des_trames,UNDEF));
                                        /* Dimension horizontale des sous-images (ou trames),                                        */
     DEFV(Positive,INIT(dimY_des_trames,UNDEF));
                                        /* Dimension verticale des sous-images (ou trames),                                          */

#    ifdef     BUG_SYSTEME_DPX5000_GRAPHIQUE_spxa_1
     BDEFV(image,trame_de_manoeuvre);
                                        /* Cette image intermediaire est destinee a stocker temporairement la sous-image             */
                                        /* que l'on veut visualiser, et ce avant l'appel de 'spxa'.                                  */
     DEFV(pointF_2D,coin_de_la_trame_de_manoeuvre);
                                        /* Donne le coin "bas-gauche" dans la trame de maneouvre ; ces donnees sont normalisees      */
                                        /* telle que l'unite represente la taille de l'image.                                        */
     DEFV(pointF_2D,coin_de_l_imageA);
                                        /* Donne le coin "bas-gauche" dans l'image Argument ; ces donnees sont normalisees           */
                                        /* telles que l'unite represente la taille de l'image.                                       */
     DEFV(deltaF_2D,dimensions_de_la_trame);
                                        /* Dimensions horizontale et verticale du bloc de points ; ces donnees sont                  */
                                        /* normalisee telles que l'unite represente la taille de l'image.                            */
#    Aifdef    BUG_SYSTEME_DPX5000_GRAPHIQUE_spxa_1
#    Eifdef    BUG_SYSTEME_DPX5000_GRAPHIQUE_spxa_1

     /*..............................................................................................................................*/
     Test(IFNE(nombre_de_trames,EXP2(dimension_lineaire)))
          Bblock
          PRINT_ERREUR("le nombre de trames n'est pas un carre");
          Eblock
     ATes
          Bblock
          Eblock
     ETes
     EGAL(dimX_des_trames,QUOD(dimX,dimension_lineaire));
                                        /* Dimension horizontale des sous-images (ou trames),                                        */
     EGAL(dimY_des_trames,QUOD(dimY,dimension_lineaire));
                                        /* Dimension verticale des sous-images (ou trames),                                          */
     Test(IL_FAUT(mettre_un_fond))
          Bblock
          CALS(IDdisplay(fond_de_la_fenetre));
                                        /* Mise en place du decor...                                                                 */
          Eblock
     ATes
          Bblock
          Eblock
     ETes
     EGAL(ASD1(trame_dans_la_fenetre,nombre_de_points_le_long_de_OX),dimX);
                                        /* Definition de l'axe des 'X' des images contenant l'animation.                             */
     EGAL(ASD1(trame_dans_la_fenetre,nombre_de_points_le_long_de_OY),NEGA(dimY));
                                        /* Definition de l'axe des 'Y' des images contenant l'animation (axe                         */
                                        /* descendant : de haut en bas, d'ou le 'NEGA' qui precede 'dimY').                          */
     Test(IL_FAUT(centrage_de_l_animation))
          Bblock
          EGAL(ASD3(trame_dans_la_fenetre,point_de_reference,S_coordonnees,S_coordonnee_X),SOUS(Xcentre5,MOIT(dimX_des_trames)));
          EGAL(ASD3(trame_dans_la_fenetre,point_de_reference,S_coordonnees,S_coordonnee_Y),LSTX(Ycentre5,MOIT(dimY_des_trames)));
                                        /* Definition de l'origine de la trame dans la fenetre en son centre (nota : on              */
                                        /* prend 'LSTX(Ycentre5,MOIT(dimY_des_trames))' car l'axe des 'Y' est inverse...             */
          Eblock
     ATes
          Bblock
          EGAL(ASD3(trame_dans_la_fenetre,point_de_reference,S_coordonnees,S_coordonnee_X),Xmin5);
          EGAL(ASD3(trame_dans_la_fenetre,point_de_reference,S_coordonnees,S_coordonnee_Y),Ymax5);
                                        /* Definition de l'origine de la trame dans la fenetre en utilisant le coin                  */
                                        /* en bas a gauche de celle-ci.                                                              */
                                        /* Nota : en prenant 'LSTX(Ymin5,dimY_des_trames)' (en se souvenant que l'axe des 'Y' est    */
                                        /* inverse et pointe vers le bas), on placerait l'animation dans le coin en haut a gauche... */
          Eblock
     ETes

#    ifdef     BUG_SYSTEME_DPX5000_GRAPHIQUE_spxa_1
     CALS(Inoir(trame_de_manoeuvre));
     EGAL(ASD1(trame_dans_la_fenetre,matrice_de_pixels),trame_de_manoeuvre);
                                        /* Definition de la trame intermediaire d'animation proprement dite, et                      */
                                        /* et initialisation...                                                                      */
     EGAL(ASD1(trame_dans_la_fenetre,valeur_minimale_de_X)
         ,ADD2(COXR(Xmin),TRANSLATION_OX_1)
          );
     EGAL(ASD1(trame_dans_la_fenetre,valeur_maximale_de_X)
         ,LSTX(ASD1(trame_dans_la_fenetre,valeur_minimale_de_X),dimX_des_trames)
          );
                                        /* Definition de l'axe des 'X' des trames (le 'ADD2' est la parce que les                    */
                                        /* indices attendus par 'spxa' commencent a 1).                                              */
     EGAL(ASD1(trame_dans_la_fenetre,valeur_minimale_de_Y)
         ,ADD2(COYR(Ymin),TRANSLATION_OY_1)
          );
     EGAL(ASD1(trame_dans_la_fenetre,valeur_maximale_de_Y)
         ,LSTX(ASD1(trame_dans_la_fenetre,valeur_minimale_de_Y),dimY_des_trames)
          );
                                        /* Definition de l'axe des 'Y' des trames (axe descendant : de haut en bas, d'ou             */
                                        /* le 'NEGA' qui precede 'dimY' ; de plus le 'ADD2' est la parce que les                     */
                                        /* indices attendus par 'spxa' commencent a 1).                                              */
     INITIALISATION_ACCROISSEMENT_2D(dimensions_de_la_trame
                                    ,_____lNORMALISE_OX(dimX_des_trames)
                                    ,_____lNORMALISE_OY(dimY_des_trames)
                                     );
     INITIALISATION_POINT_2D(coin_de_la_trame_de_manoeuvre
                            ,FXorigine
                            ,FYorigine
                             );
                                        /* Preparation de 'Imove_points'.                                                            */
#    Aifdef    BUG_SYSTEME_DPX5000_GRAPHIQUE_spxa_1
#    Eifdef    BUG_SYSTEME_DPX5000_GRAPHIQUE_spxa_1

#    ifndef    BUG_SYSTEME_DPX5000_GRAPHIQUE_spxa_1
     EGAL(ASD1(trame_dans_la_fenetre,matrice_de_pixels),imageA);
                                        /* Definition de la matrice d'animation proprement dite...                                   */
#    Aifndef   BUG_SYSTEME_DPX5000_GRAPHIQUE_spxa_1
#    Eifndef   BUG_SYSTEME_DPX5000_GRAPHIQUE_spxa_1

     Repe(nombre_de_repetitions)
          Bblock
          begin_colonneQ(DoIn,Ymin,Ymax,dimY_des_trames)
               Bblock
               begin_ligneQ(DoIn,Xmin,Xmax,dimX_des_trames)
                    Bblock

#    ifdef     BUG_SYSTEME_DPX5000_GRAPHIQUE_spxa_1
                    INITIALISATION_POINT_2D(coin_de_l_imageA
                                           ,_____cNORMALISE_OX(X)
                                           ,_____cNORMALISE_OY(Y)
                                            );
                    CALS(Imove_points(trame_de_manoeuvre,ADRESSE(coin_de_la_trame_de_manoeuvre),FAUX,FAUX
                                     ,imageA,ADRESSE(coin_de_l_imageA),FAUX,FAUX
                                     ,ADRESSE(dimensions_de_la_trame)
                                      )
                         );
#    Aifdef    BUG_SYSTEME_DPX5000_GRAPHIQUE_spxa_1
#    Eifdef    BUG_SYSTEME_DPX5000_GRAPHIQUE_spxa_1

#    ifndef    BUG_SYSTEME_DPX5000_GRAPHIQUE_spxa_1
                    EGAL(ASD1(trame_dans_la_fenetre,valeur_minimale_de_X),ADD2(COXR(X),TRANSLATION_OX_1));
                    EGAL(ASD1(trame_dans_la_fenetre,valeur_maximale_de_X),ADD2(COXR(LSTX(X,dimX_des_trames)),TRANSLATION_OX_1));
                                        /* Definition de l'axe des 'X' des trames (le 'ADD2' est la parce que les                    */
                                        /* indices attendus par 'spxa' commencent a 1).                                              */
                    EGAL(ASD1(trame_dans_la_fenetre,valeur_minimale_de_Y),ADD2(COYR(Y),TRANSLATION_OY_1));
                    EGAL(ASD1(trame_dans_la_fenetre,valeur_maximale_de_Y),ADD2(COYR(LSTX(Y,dimY_des_trames)),TRANSLATION_OY_1));
                                        /* Definition de l'axe des 'Y' des trames (axe descendant : de haut en bas, d'ou             */
                                        /* le 'NEGA' qui precede 'dimY' ; de plus le 'ADD2' est la parce que les                     */
                                        /* indices attendus par 'spxa' commencent a 1).                                              */
#    Aifndef   BUG_SYSTEME_DPX5000_GRAPHIQUE_spxa_1
#    Eifndef   BUG_SYSTEME_DPX5000_GRAPHIQUE_spxa_1

                    Test(IL_Y_A_ERREUR(CODE_ERROR(spxa(ADRESSE(trame_dans_la_fenetre)))))
                                        /* Et affichage de la trame...                                                               */
                         Bblock
                         PRINT_ERREUR("l'affichage de la trame est impossible");
                         Eblock
                    ATes
                         Bblock

#    ifdef     BUG_SYSTEME_DPX5000_GRAPHIQUE_spxa_2
                         Test(IL_Y_A_ERREUR(CODE_ERROR(spxa(ADRESSE(trame_dans_la_fenetre)))))
                                        /* Et re-affichage de la trame afin que l'image soit entiere (c'est-a-dire qu'il n'en        */
                                        /* manque pas une bande superieure)...                                                       */
                              Bblock
                              PRINT_ERREUR("le re-affichage de la trame est impossible");
                              Eblock
                         ATes
                              Bblock
                              Eblock
                         ETes
#    Aifdef    BUG_SYSTEME_DPX5000_GRAPHIQUE_spxa_2
#    Eifdef    BUG_SYSTEME_DPX5000_GRAPHIQUE_spxa_2

                         Eblock
                    ETes
                    DODO(temporisation_inter_trames);
                    Eblock
               end_ligneQ(EDoI)
               Eblock
          end_colonneQ(EDoI)
          DODO(temporisation_inter_animations);
          Eblock
     ERep

#    ifdef     BUG_SYSTEME_DPX5000_GRAPHIQUE_spxa_1
     EDEFV(image,trame_de_manoeuvre);
                                        /* Cette image intermediaire est destinee a stocker temporairement la sous-image             */
                                        /* que l'on veut visualiser, et ce avant l'appel de 'spxa'.                                  */
#    Aifdef    BUG_SYSTEME_DPX5000_GRAPHIQUE_spxa_1
#    Eifdef    BUG_SYSTEME_DPX5000_GRAPHIQUE_spxa_1

     RETU_ERROR;
     Eblock

EFonctionI

#    undef     TRANSLATION_OY_1
#    undef     TRANSLATION_OX_1
#Aifdef   __VERSION__COMPILER_LE_GRAPHIQUE_SPIX             /* Common,DEFV(Fonction,) : la bibliotheque est conditionnelle.          */
#Eifdef   __VERSION__COMPILER_LE_GRAPHIQUE_SPIX             /* Common,DEFV(Fonction,) : la bibliotheque est conditionnelle.          */

_______________________________________________________________________________________________________________________________________



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.