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