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