_______________________________________________________________________________________________________________________________________ /*************************************************************************************************************************************/ /* */ /* 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 I V A N T L A B I B L I O T H E Q U E ' F R A M E - B U F F E R U l t r a N e t ' : */ /* */ /* */ /* Definition : */ /* */ /* Ce fichier contient toutes les fonctions */ /* de base d'edition graphique des images raster, */ /* suivant la bibliotheque d'acces au frame-buffer */ /* 'UltraNet' connecte aux CRAYs YMP. */ /* */ /* */ /* Nota important : */ /* */ /* Je me permets de rappeler le scandale */ /* du frame-buffer UltraNet : l'axe 'OY' */ /* descend, alors que partout ailleurs */ /* (sauf sous 'X-Window'), logiquement, */ /* il monte... */ /* */ /* */ /* Author of '$xiidU/fonction$FON' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 19910000000000). */ /* */ /*************************************************************************************************************************************/ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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_ULTRANET_FRAME_BUFFER /* Common,DEFV(Fonction,) : indicateur de VERSION. */ DEFV(Common,DEFV(Logical,_______VERSION__COMPILER_LE_GRAPHIQUE_ULTRANET_FRAME_BUFFER)); #Aifdef __VERSION__COMPILER_LE_GRAPHIQUE_ULTRANET_FRAME_BUFFER /* Common,DEFV(Fonction,) : indicateur de VERSION. */ #Eifdef __VERSION__COMPILER_LE_GRAPHIQUE_ULTRANET_FRAME_BUFFER /* Common,DEFV(Fonction,) : indicateur de VERSION. */ #ifdef __VERSION__COMPILER_LE_GRAPHIQUE_ULTRANET_FRAME_BUFFER /* Common,DEFV(Fonction,) : compiler sur 'UltFB'. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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_ULTRANET_FRAME_BUFFER_include_1 /* Common,DEFV(Fonction,) : bug... */ DEFV(Common,DEFV(Logical,_____BUG_SYSTEME_ULTRANET_FRAME_BUFFER_include_1)); # Aifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_include_1 /* Common,DEFV(Fonction,) : bug... */ # Eifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_include_1 /* Common,DEFV(Fonction,) : bug... */ # ifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_status_1 /* Common,DEFV(Fonction,) : bug... */ DEFV(Common,DEFV(Logical,_____BUG_SYSTEME_ULTRANET_FRAME_BUFFER_status_1)); # Aifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_status_1 /* Common,DEFV(Fonction,) : bug... */ # Eifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_status_1 /* Common,DEFV(Fonction,) : bug... */ # ifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_DIMENSION_DE_L_IMAGE_1 /* Common,DEFV(Fonction,) : bug... */ DEFV(Common,DEFV(Logical,_____BUG_SYSTEME_ULTRANET_FRAME_BUFFER_DIMENSION_DE_L_IMAGE_1)); # Aifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_DIMENSION_DE_L_IMAGE_1 /* Common,DEFV(Fonction,) : bug... */ # Eifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_DIMENSION_DE_L_IMAGE_1 /* Common,DEFV(Fonction,) : bug... */ # ifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_UFLIP_1 /* Common,DEFV(Fonction,) : bug... */ DEFV(Common,DEFV(Logical,_____BUG_SYSTEME_ULTRANET_FRAME_BUFFER_UFLIP_1)); # Aifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_UFLIP_1 /* Common,DEFV(Fonction,) : bug... */ # Eifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_UFLIP_1 /* Common,DEFV(Fonction,) : bug... */ # ifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_UPAN_1 /* Common,DEFV(Fonction,) : bug... */ DEFV(Common,DEFV(Logical,_____BUG_SYSTEME_ULTRANET_FRAME_BUFFER_UPAN_1)); # Aifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_UPAN_1 /* Common,DEFV(Fonction,) : bug... */ # Eifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_UPAN_1 /* Common,DEFV(Fonction,) : bug... */ # ifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_FORMAT_DES_NIVEAUX_1 /* Common,DEFV(Fonction,) : bug... */ DEFV(Common,DEFV(Logical,_____BUG_SYSTEME_ULTRANET_FRAME_BUFFER_FORMAT_DES_NIVEAUX_1)); # Aifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_FORMAT_DES_NIVEAUX_1 /* Common,DEFV(Fonction,) : bug... */ # Eifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_FORMAT_DES_NIVEAUX_1 /* Common,DEFV(Fonction,) : bug... */ # ifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_ORIGINE_DES_LIGNES_1 /* Common,DEFV(Fonction,) : bug... */ DEFV(Common,DEFV(Logical,_____BUG_SYSTEME_ULTRANET_FRAME_BUFFER_ORIGINE_DES_LIGNES_1)); # Aifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_ORIGINE_DES_LIGNES_1 /* Common,DEFV(Fonction,) : bug... */ # Eifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_ORIGINE_DES_LIGNES_1 /* Common,DEFV(Fonction,) : bug... */ # ifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_IMAGE_1 /* Common,DEFV(Fonction,) : bug... */ DEFV(Common,DEFV(Logical,_____BUG_SYSTEME_ULTRANET_FRAME_BUFFER_IMAGE_1)); # Aifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_IMAGE_1 /* Common,DEFV(Fonction,) : bug... */ # Eifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_IMAGE_1 /* Common,DEFV(Fonction,) : bug... */ # ifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_UNE_SEULE_IMAGE_1 /* Common,DEFV(Fonction,) : bug... */ DEFV(Common,DEFV(Logical,_____BUG_SYSTEME_ULTRANET_FRAME_BUFFER_UNE_SEULE_IMAGE_1)); # Aifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_UNE_SEULE_IMAGE_1 /* Common,DEFV(Fonction,) : bug... */ # Eifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_UNE_SEULE_IMAGE_1 /* Common,DEFV(Fonction,) : bug... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I N C L U D E S S P E C I F I Q U E S D E ' S I L I C O N - G R A P H I C S ' : */ /* */ /*************************************************************************************************************************************/ # ifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_include_1 # Aifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_include_1 @ include <ultra/ugraf.h> /* Dans ces fichier se trouvent la plupart des definitions de type '#define' ainsi que */ /* les references externes (actuellement inutilise...). */ # Eifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_include_1 /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S T Y P E S N E C E S S A I R E S : */ /* */ /*************************************************************************************************************************************/ # ifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_include_1 # Aifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_include_1 TypedefP(U_UG_PARAM,UG_PARAM) /* Structure definissant les parametres generaux (actuellement inutilisee...). */ TypedefP(U_UG_TBLK,UG_TBLK) /* Structure definissant le format de l'image a manipuler (actuellement inutilisee...). */ # Eifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_include_1 /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* R E F E R E N C E S E X T E R N E S : */ /* */ /*************************************************************************************************************************************/ # ifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_include_1 # Aifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_include_1 DEFV(Extern,DEFV(vrai_Int_de_base,ugraf())); /* Fonction unique d'acces au frame-buffer (actuellement inutilisee...). */ # Eifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_include_1 DEFV(Extern,DEFV(Void,UINIT())); /* Fonction d'initialisation des parametres generaux. */ DEFV(Extern,DEFV(Void,UOPEN())); /* Fonction d'ouverture et d'allocation des buffers necessaires ; on peut se demander */ /* pourquoi 'UINIT(...)' et 'UOPEN(...)' ne sont pas regroupees en une seule et meme */ /* fonction... */ DEFV(Extern,DEFV(Void,UCLOSE())); /* Fonction de fermeture, symetrique de 'UOPEN(...)'. */ # ifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_UFLIP_1 # Aifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_UFLIP_1 DEFV(Extern,DEFV(Void,UFLIP())); /* Fonction definissant le mode de synchronisation des operations, deux possibilites etant */ /* offertes ; horizontale (plus rapide, mais avec effet de "rouleau"), et verticale. On */ /* verra a ce propos les definitions 'modes_de_synchronisation'. */ # Eifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_UFLIP_1 DEFV(Extern,DEFV(Void,UZOOM())); /* Fonction definissant le rapport de zoom entier. */ # ifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_UPAN_1 # Aifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_UPAN_1 DEFV(Extern,DEFV(Void,UPAN())); /* Fonction definissant un "pan"... */ # Eifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_UPAN_1 DEFV(Extern,DEFV(Void,USCWRT())); /* Fonction d'ecriture des trois composantes d'une image dans le frame-buffer... */ DEFV(Extern,DEFV(Void,UFLUSH())); /* Fonction d'affichage d'une image precedemment transmise par 'USCWRT(...)'. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N S L O C A L E S : */ /* */ /*************************************************************************************************************************************/ # ifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_UFLIP_1 # Aifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_UFLIP_1 Denumer02(INIS(_SYNCHRONISATION_VERTICALE,ZERO) ,_SYNCHRONISATION_HORIZONTALE ,modes_de_synchronisation ); # define SYNCHRONISATION_VERTICALE \ ENUM(_SYNCHRONISATION_VERTICALE) # define SYNCHRONISATION_HORIZONTALE \ ENUM(_SYNCHRONISATION_HORIZONTALE) /* Definition des differents mode de synchronisation des operations avec le frame-buffer. */ /* Voir a ce propos la fonction 'UFLIP(...)'. ATTENTION : on notera l'utilisation de */ /* 'Denumer02(...);' et non pas de 'DenumeT02(...)' a cause du 'INIS(...)' qu'il contient. */ # Eifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_UFLIP_1 Denumer02(INIS(_ABSENCE_DE_COMPRESSION,ZERO) ,_PRESENCE_DE_COMPRESSION ,modes_de_compression ); # define ABSENCE_DE_COMPRESSION \ ENUM(_ABSENCE_DE_COMPRESSION) # define PRESENCE_DE_COMPRESSION \ ENUM(_PRESENCE_DE_COMPRESSION) /* Definition des differents mode de compression des operations avec le frame-buffer. */ /* Voir a ce propos la fonction 'UOPEN(...)'. ATTENTION : on notera l'utilisation de */ /* 'Denumer02(...);' et non pas de 'DenumeT02(...)' a cause du 'INIS(...)' qu'il contient. */ # ifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_status_1 # define ENVOI_D_UNE_FONCTION_AU_FRAME_BUFFER(fonction,action_si_OK,action_si_ERREUR) \ Bblock \ BLOC(CALS(fonction)); \ /* Execution de la fonction demandee... */ \ BLOC(action_si_OK); \ /* Execution systematique de la sequence de traitement des cas "normaux" puisque le code */ \ /* de compte-rendu 'compte_rendu_des_operations' n'est pas renvoye... */ \ Eblock \ /* Fonction generale d'acces au frame-buffer avec test des conditions de retour... */ # Aifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_status_1 # define ENVOI_D_UNE_FONCTION_AU_FRAME_BUFFER(fonction,action_si_OK,action_si_ERREUR) \ Bblock \ BLOC(CALS(fonction)); \ /* Execution de la fonction demandee... */ \ Test(PAS_D_ERREUR(compte_rendu_des_operations)) \ Bblock \ BLOC(action_si_OK); \ /* Execution de la sequence de traitement des cas "normaux"... */ \ Eblock \ ATes \ Bblock \ PRINT_ERREUR("l'acces au frame-buffer par 'fonction' s'est mal deroule"); \ CAL1(Prer1(" erreur=%d\n",compte_rendu_des_operations)); \ BLOC(action_si_ERREUR); \ /* Execution de la sequence de traitement des erreurs... */ \ Eblock \ ETes \ Eblock \ /* Fonction generale d'acces au frame-buffer avec test des conditions de retour... */ # Eifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_status_1 /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* E T A T D E L A F E N E T R E : */ /* */ /*************************************************************************************************************************************/ DEFV(Local,DEFV(Logical,INIT(liaison_avec_le_frame_buffer,INACTIF))); /* Indicateur logique precisant si la liaison est active (entre un 'open' et un 'close'), */ /* ou inactive (pas encore ouverte, ou fermee). */ # ifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_include_1 # Aifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_include_1 DEFV(Local,DEFV(U_UG_PARAM,parametres_d_acces_au_frame_buffer)); /* Parametres de la fonction 'ugraf(...)' (actuellement inutilises...). */ DEFV(Local,DEFV(U_UG_TBLK,definition_d_une_image_dans_le_frame_buffer)); /* Parametres necessaires a la description de l'image courante (actuellement inutilises...). */ # Eifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_include_1 DEFV(Local,DEFV(vrai_Int_de_base,INIT(compte_rendu_des_operations,UNDEF))); /* Donne en general le compte-rendu d'une operation relative au frame-buffer. ATTENTION : */ /* on notera le 'BUG_SYSTEME_ULTRANET_FRAME_BUFFER_status_1' ; mais la variable */ /* 'compte_rendu_des_operations' etant utilise dans toutes les fonctions, il doit etre */ /* malgre tout etre defini bien qu'inutile. */ DEFV(Local,DEFV(vrai_Int_de_base,INIT(mode_de_compression,ABSENCE_DE_COMPRESSION))); /* Precise le mode de compression demandee ; voir a ce propos les definitions donnees par */ /* la "structure" 'modes_de_compression'. */ /* ATTENTION : cet 'Int' n'est la que parce que les fonctions du type 'U...(...)' ne */ /* recoivent comme arguments que leurs adresses (afin d'assurer la compabilite avec le */ /* 'FORTRAN'...). */ # ifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_UFLIP_1 # Aifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_UFLIP_1 DEFV(Local,DEFV(vrai_Int_de_base,INIT(mode_de_synchronisation,SYNCHRONISATION_VERTICALE))); /* Precise le type de synchronisation demandee ; voir a ce propos les definitions donnees */ /* par la "structure" 'modes_de_synchronisation'. */ /* ATTENTION : cet 'Int' n'est la que parce que les fonctions du type 'U...(...)' ne */ /* recoivent comme arguments que leurs adresses (afin d'assurer la compabilite avec le */ /* 'FORTRAN'...). */ # Eifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_UFLIP_1 DEFV(Local,DEFV(vrai_Int_de_base,INIT(mot_inutile,UNDEF))); /* Argument necessaire a certaines fonctions 'U...(...)' mais inutilise malgre tout... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* O U V E R T U R E D ' U N E F E N E T R E : */ /* */ /*************************************************************************************************************************************/ BFonctionI # define MULTIPLICITE_DE_dimX_EN_ABSENCE_DE_COMPRESSION \ QUATRE # define MULTIPLICITE_DE_dimX_EN_PRESENCE_DE_COMPRESSION \ HUIT /* Suivant le mode de compression 'mode_de_compression', 'dimX' doit etre un multiple d'un */ /* certain entier... */ DEFV(Common,DEFV(FonctionI,IUopen(nom_de_la_fenetreA ,ARGUMENT_POINTERs(coin_bas_droite) ) ) ) DEFV(Argument,DEFV(CHAR,DTb0(nom_de_la_fenetreA))); /* Nom de la fenetre a ouvrir (inutilise en fait, mais present par compatibilite avec les */ /* autres drivers...). */ DEFV(Argument,DEFV(pointF_2D,POINTERs(coin_bas_droite))); /* Abscisse du point de reference. ATTENTION : cet argument est inutilise, mais conserve */ /* par raison de compabilite avec d'autres drivers... */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(vrai_Int_de_base,INIT(Xmin_d_UINIT,NEUT(XminU))); DEFV(vrai_Int_de_base,INIT(Ymin_d_UINIT,NEUT(YminU))); /* Origine de l'image pour la fonction 'UINIT(...)'. */ # ifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_DIMENSION_DE_L_IMAGE_1 DEFV(vrai_Int_de_base,INIT(Xmax_d_UINIT,NEUT(ADD2(XminU,dimX)))); DEFV(vrai_Int_de_base,INIT(Ymax_d_UINIT,NEUT(ADD2(YminU,dimY)))); /* Extremite de l'image pour la fonction 'UINIT(...)'. */ # Aifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_DIMENSION_DE_L_IMAGE_1 DEFV(vrai_Int_de_base,INIT(Xmax_d_UINIT,TRMU(ADD2(XminU,dimX)))); DEFV(vrai_Int_de_base,INIT(Ymax_d_UINIT,TRMU(ADD2(YminU,dimY)))); /* Extremite de l'image pour la fonction 'UINIT(...)'. */ # Eifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_DIMENSION_DE_L_IMAGE_1 INIT_ERROR; /*..............................................................................................................................*/ Test(EST_INACTIF(liaison_avec_le_frame_buffer)) Bblock Test(IFOU(IFET(IFEQ(mode_de_compression,ABSENCE_DE_COMPRESSION) ,I3ET(EST_VRAI(DIVISIBLE(XminU,MULTIPLICITE_DE_dimX_EN_ABSENCE_DE_COMPRESSION)) ,EST_VRAI(DIVISIBLE(Xmin,MULTIPLICITE_DE_dimX_EN_ABSENCE_DE_COMPRESSION)) ,EST_VRAI(DIVISIBLE(dimX,MULTIPLICITE_DE_dimX_EN_ABSENCE_DE_COMPRESSION)) ) ) ,IFET(IFEQ(mode_de_compression,PRESENCE_DE_COMPRESSION) ,I3ET(EST_VRAI(DIVISIBLE(XminU,MULTIPLICITE_DE_dimX_EN_PRESENCE_DE_COMPRESSION)) ,EST_VRAI(DIVISIBLE(Xmin,MULTIPLICITE_DE_dimX_EN_PRESENCE_DE_COMPRESSION)) ,EST_VRAI(DIVISIBLE(dimX,MULTIPLICITE_DE_dimX_EN_PRESENCE_DE_COMPRESSION)) ) ) ) ) Bblock ENVOI_D_UNE_FONCTION_AU_FRAME_BUFFER(UINIT(ADRESSE(Xmin_d_UINIT),ADRESSE(Xmax_d_UINIT) ,ADRESSE(Ymin_d_UINIT),ADRESSE(Ymax_d_UINIT) ,ADRESSE(mode_de_compression) ,ADRESSE(compte_rendu_des_operations) ,ADRESSE(mot_inutile) ) ,BLOC(VIDE;) ,BLOC(VIDE;) ); ENVOI_D_UNE_FONCTION_AU_FRAME_BUFFER(UOPEN(ADRESSE(compte_rendu_des_operations) ,ADRESSE(mot_inutile) ) ,BLOC(EGAL(liaison_avec_le_frame_buffer,ACTIF);) ,BLOC(EGAL(liaison_avec_le_frame_buffer,INACTIF);) ); /* Tentative d'ouverture de la fenetre avec memorisation de l'etat final... */ # ifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_UFLIP_1 # Aifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_UFLIP_1 ENVOI_D_UNE_FONCTION_AU_FRAME_BUFFER(UFLIP(ADRESSE(mode_de_synchronisation) ,ADRESSE(compte_rendu_des_operations) ) ,BLOC(VIDE;) ,BLOC(VIDE;) ); /* Et enfin, choix du mode de synchronisation (actuellement 'SYNCHRONISATION_VERTICALE'). */ # Eifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_UFLIP_1 Eblock ATes Bblock PRINT_ERREUR("la dimension horizontale est incompatible avec le mode de compression"); CAL1(Prer1(" dimX = %d\n",dimX)); CAL1(Prer1(" multiplicite = %d\n",COND(IFEQ(mode_de_compression,ABSENCE_DE_COMPRESSION) ,MULTIPLICITE_DE_dimX_EN_ABSENCE_DE_COMPRESSION ,COND(IFEQ(mode_de_compression,PRESENCE_DE_COMPRESSION) ,MULTIPLICITE_DE_dimX_EN_PRESENCE_DE_COMPRESSION ,UNDEF ) ) ) ); Eblock ETes Eblock ATes Bblock PRINT_ERREUR("la fenetre est deja ouverte"); Eblock ETes RETU_ERROR; Eblock EFonctionI # ifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_UFLIP_1 # Aifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_UFLIP_1 # undef SYNCHRONISATION_HORIZONTALE # undef SYNCHRONISATION_VERTICALE # Eifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_UFLIP_1 # undef PRESENCE_DE_COMPRESSION # undef ABSENCE_DE_COMPRESSION # undef MULTIPLICITE_DE_dimX_EN_PRESENCE_DE_COMPRESSION # undef MULTIPLICITE_DE_dimX_EN_ABSENCE_DE_COMPRESSION /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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,IUclose())) /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /*..............................................................................................................................*/ Test(EST_ACTIF(liaison_avec_le_frame_buffer)) Bblock ENVOI_D_UNE_FONCTION_AU_FRAME_BUFFER(UCLOSE(ADRESSE(compte_rendu_des_operations) ) ,BLOC(VIDE;) ,BLOC(EGAL(liaison_avec_le_frame_buffer,INACTIF);) ); /* Tentative de fermeture de la fenetre, et memorisation de l'etat final... */ Eblock ATes Bblock PRINT_ERREUR("la fenetre n'est pas ouverte"); 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 " V R A I E S C O U L E U R S " : */ /* */ /*************************************************************************************************************************************/ BFonctionI # define RAPPORT_MAXIMAL_DU_ZOOM \ HUIT \ /* Rapport maximal du zoom entier... */ # ifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_ORIGINE_DES_LIGNES_1 # define U_TRANSLATION_HORIZONTALE_DE_L_IMAGE \ ZERO \ /* Translation horizontale de l'image dans le plan de travail, */ # define U_TRANSLATION_VERTICALE_DE_L_IMAGE \ ZERO \ /* Translation verticale de l'image dans le plan de travail. */ # Aifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_ORIGINE_DES_LIGNES_1 # define U_TRANSLATION_HORIZONTALE_DE_L_IMAGE \ COND(IL_FAUT(centrer_l_image_dans_la_fenetre) \ ,MOYS(dimXU \ MUL2(facteur_de_zoom_effectif,dimX) \ ) \ ,_lDENORMALISE_OXU(ASI1(translation_de_l_image_dans_la_fenetre,dx)) \ ) \ /* Translation horizontale de l'image dans le plan de travail, */ # define U_TRANSLATION_VERTICALE_DE_L_IMAGE \ COND(IL_FAUT(centrer_l_image_dans_la_fenetre) \ ,MOYS(dimYU \ MUL2(facteur_de_zoom_effectif,dimY) \ ) \ ,_lDENORMALISE_OYU(ASI1(translation_de_l_image_dans_la_fenetre,dy)) \ ) \ /* Translation verticale de l'image dans le plan de travail. */ # Eifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_ORIGINE_DES_LIGNES_1 DEFV(Common,DEFV(FonctionI,IUdisplay(imageA_ROUGE,imageA_VERTE,imageA_BLEUE ,facteur_de_zoom ,centrer_l_image_dans_la_fenetre ,ARGUMENT_POINTERs(translation_de_l_image_dans_la_fenetre) ) ) ) DEFV(Argument,DEFV(image,imageA_ROUGE)); /* Premiere image Argument (representant la composante ROUGE), */ DEFV(Argument,DEFV(image,imageA_VERTE)); /* Premiere image Argument (representant la composante VERTE), */ DEFV(Argument,DEFV(image,imageA_BLEUE)); /* Premiere image Argument (representant la composante BLEUE). */ DEFV(Argument,DEFV(Int,facteur_de_zoom)); /* Facteur de zoom horizontal et vertical de l'image... */ DEFV(Argument,DEFV(Logical,centrer_l_image_dans_la_fenetre)); /* Indicateur precisant s'il faut un centrage automatique de l'image dans la fenetre */ /* ('VRAI') ou si la translation est definie en tant que l'argument suivant ('FAUX'). */ /* ATTENTION : suivant la valeur de 'BUG_SYSTEME_ULTRANET_FRAME_BUFFER_ORIGINE_DES_LIGNES_1' */ /* cette demande de centrage peut etre en fait ineffective... */ DEFV(Argument,DEFV(deltaF_2D,POINTERs(translation_de_l_image_dans_la_fenetre))); /* Translation explicite de l'image dans la fenetre lorsque le centrage automatique n'est */ /* pas demande ('centrer_l_image_dans_la_fenetre'='FAUX'). Dans le cas ou le centrage */ /* automatique est demande, cet argument (qui doit etre present a cause de la validation */ /* du nombre des arguments) n'est pas utilise. ATTENTION : suivant la valeur du symbole */ /* 'BUG_SYSTEME_ULTRANET_FRAME_BUFFER_ORIGINE_DES_LIGNES_1', cette translation peut etre en */ /* fait ineffective... */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; # ifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_FORMAT_DES_NIVEAUX_1 DEFV(imageI,IimageA_ROUGE); DEFV(imageI,IimageA_VERTE); DEFV(imageI,IimageA_BLEUE); /* Ces trois images intermediaires sont destinees a "compenser" le fait que la fonction */ /* 'USCWRT(...)' travaille en entiers et non pas en caracteres... */ # Aifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_FORMAT_DES_NIVEAUX_1 # define IimageA_ROUGE \ imageA_ROUGE # define IimageA_VERTE \ imageA_VERTE # define IimageA_BLEUE \ imageA_BLEUE /* Ca y est, la fonction 'USCWRT(...)' travaille en caracteres... */ # Eifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_FORMAT_DES_NIVEAUX_1 DEFV(vrai_Int_de_base,INIT(facteur_de_zoom_effectif,RAPPORT_DE_ZOOM_STANDARD_DU_FRAME_BUFFER_ULTRANET)); /* Facteur de zoom horizontal et vertical de l'image effectivement utilise... */ # ifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_UPAN_1 # Aifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_UPAN_1 DEFV(vrai_Int_de_base,INIT(abscisse_du_PAN,XminU)); DEFV(vrai_Int_de_base,INIT(ordonnee_du_PAN,YminU)); /* Coordonnees de la fonction 'UPAN(...)'. */ /* ATTENTION : ces 'Int's n'est la que parce que les fonctions du type 'U...(...)' ne */ /* recoivent comme arguments que leurs adresses (afin d'assurer la compabilite avec le */ /* 'FORTRAN'...). */ # Eifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_UPAN_1 DEFV(vrai_Int_de_base,INIT(abscisse_en_bas_a_gauche,ADD2(Xmin,U_TRANSLATION_HORIZONTALE_DE_L_IMAGE))); DEFV(vrai_Int_de_base,INIT(ordonnee_en_bas_a_gauche,ADD2(Ymin,U_TRANSLATION_VERTICALE_DE_L_IMAGE))); DEFV(vrai_Int_de_base,INIT(abscisse_en_haut_a_droite,ADD2(Xmax,U_TRANSLATION_HORIZONTALE_DE_L_IMAGE))); DEFV(vrai_Int_de_base,INIT(ordonnee_en_haut_a_droite,ADD2(Ymax,U_TRANSLATION_VERTICALE_DE_L_IMAGE))); /* Definition de l'emplacement de l'image. Mais ATTENTION : cette initialisation est */ /* eventuellement mauvaise, car en effet 'facteur_de_zoom_effectif' n'est pas encore */ /* connu... */ # ifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_IMAGE_1 DEFV(vrai_Int_de_base,INIT(longueur_des_lignes_de_chaque_imageA,dimX)); /* Longueur des lignes de chacune des trois composantes de l'image a transmettre au */ /* frame-buffer. */ /* ATTENTION : cet 'Int' n'est la que parce que les fonctions du type 'U...(...)' ne */ /* recoivent comme arguments que leurs adresses (afin d'assurer la compabilite avec le */ /* 'FORTRAN'...). */ DEFV(vrai_Int_de_base,INIT(ordonnee_de_la_ligne_courante,UNDEF)); /* Ordonnee de la ligne courante lorsque l'on transmet ligne a ligne afin de renverser */ /* l'axe des 'OY'... */ # Aifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_IMAGE_1 DEFV(vrai_Int_de_base,INIT(longueur_de_chaque_imageA,dimXY)); /* Longueur de chacune des trois composantes de l'image a transmettre au frame-buffer. */ /* ATTENTION : cet 'Int' n'est la que parce que les fonctions du type 'U...(...)' ne */ /* recoivent comme arguments que leurs adresses (afin d'assurer la compabilite avec le */ /* 'FORTRAN'...). */ # Eifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_IMAGE_1 /*..............................................................................................................................*/ Test(EST_ACTIF(liaison_avec_le_frame_buffer)) Bblock Test(IFGT(facteur_de_zoom,RAPPORT_MAXIMAL_DU_ZOOM)) Bblock PRINT_ATTENTION("le rapport de zoom ne peut etre superieur a 4, la valeur standard est conservee"); Eblock ATes Bblock Test(IZLE(facteur_de_zoom)) Bblock PRINT_ATTENTION("le rapport de zoom ne peut etre negatif ou nul, la valeur standard est conservee"); Eblock ATes Bblock EGAL(facteur_de_zoom_effectif,facteur_de_zoom); /* Mise en place du facteur de zoom effectif (c'est-a-dire inchange au cas ou l'argument */ /* serait errone). */ Eblock ETes Eblock ETes # ifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_FORMAT_DES_NIVEAUX_1 CALS(Istd_int(IimageA_ROUGE,Istd_int_____LAISSER_INTACT_LES_NIVEAUX,imageA_ROUGE)); CALS(Istd_int(IimageA_VERTE,Istd_int_____LAISSER_INTACT_LES_NIVEAUX,imageA_VERTE)); CALS(Istd_int(IimageA_BLEUE,Istd_int_____LAISSER_INTACT_LES_NIVEAUX,imageA_BLEUE)); /* Conversion des images Arguments en un format compatible avec ce qu'attend la fonction */ /* 'USCWRT(...)' qui travaille en entiers et non pas en caracteres... */ # Aifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_FORMAT_DES_NIVEAUX_1 # Eifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_FORMAT_DES_NIVEAUX_1 EGAL(abscisse_en_bas_a_gauche,ADD2(Xmin,U_TRANSLATION_HORIZONTALE_DE_L_IMAGE)); EGAL(ordonnee_en_bas_a_gauche,ADD2(Ymin,U_TRANSLATION_VERTICALE_DE_L_IMAGE)); EGAL(abscisse_en_haut_a_droite,ADD2(Xmax,U_TRANSLATION_HORIZONTALE_DE_L_IMAGE)); EGAL(ordonnee_en_haut_a_droite,ADD2(Ymax,U_TRANSLATION_VERTICALE_DE_L_IMAGE)); /* Definition de l'emplacement de l'image lorsque 'facteur_de_zoom_effectif' est connu... */ ENVOI_D_UNE_FONCTION_AU_FRAME_BUFFER(UZOOM(ADRESSE(facteur_de_zoom_effectif),ADRESSE(facteur_de_zoom_effectif) ,ADRESSE(compte_rendu_des_operations) ,ADRESSE(mot_inutile) ) ,BLOC(VIDE;) ,BLOC(VIDE;) ); /* Selection du rapport de zoom (identique sur les deux axes...). */ # ifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_UPAN_1 # Aifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_UPAN_1 ENVOI_D_UNE_FONCTION_AU_FRAME_BUFFER(UPAN(ADRESSE(abscisse_du_PAN),ADRESSE(ordonnee_du_PAN) ,ADRESSE(compte_rendu_des_operations) ,ADRESSE(mot_inutile) ) ,BLOC(VIDE;) ,BLOC(VIDE;) ); /* Selection de la position de l'image dans le frame-buffer. On notera l'utilisation du */ /* coin en bas a gauche (alors que le frame-buffer attend le coin en haut a gauche) due */ /* au fait que l'axe des 'OY' descend... */ # Eifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_UPAN_1 # ifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_IMAGE_1 EGAL(ordonnee_de_la_ligne_courante,ADD2(XminU,U_TRANSLATION_HORIZONTALE_DE_L_IMAGE)); /* Ordonnee sur l'ecran de la premiere ligne a transmettre... */ begin_colonne_back Bblock ENVOI_D_UNE_FONCTION_AU_FRAME_BUFFER(USCWRT(ADRESSE(IMAGE(IimageA_ROUGE,Xmin,Y)) ,ADRESSE(IMAGE(IimageA_VERTE,Xmin,Y)) ,ADRESSE(IMAGE(IimageA_BLEUE,Xmin,Y)) ,ADRESSE(longueur_des_lignes_de_chaque_imageA) ,ADRESSE(abscisse_en_bas_a_gauche),ADRESSE(ordonnee_de_la_ligne_courante) ,ADRESSE(compte_rendu_des_operations) ,ADRESSE(mot_inutile) ) ,BLOC(VIDE;) ,BLOC(VIDE;) ); /* Transmission de l'image au frame-buffer. On notera deux choses : d'une part, on fait */ /* l'hypothese que les images sont rangees ligne apres ligne (et non pas en colonne), ce */ /* qui permet d'extraire une ligne avec le calcul de l'adresse de son premier element (soit */ /* 'ADRESSE(IMAGE(...,Xmin,Y)') et non pas en deplacant les points les uns apres les autres. */ /* D'autre part, on aurait pu faire 'Iy_symetrie(...)' pour renverser successivement chacune */ /* des trois composantes, nous ramenant ainsi au cas "normal", mais une fois n'est pas */ /* coutume, je pense aux performances... */ INCR(ordonnee_de_la_ligne_courante,pasY); /* Ordonnee sur l'ecran de la prochaine ligne a transmettre... */ Eblock end_colonne_back # Aifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_IMAGE_1 ENVOI_D_UNE_FONCTION_AU_FRAME_BUFFER(USCWRT(IimageA_ROUGE ,IimageA_VERTE ,IimageA_BLEUE ,ADRESSE(longueur_de_chaque_imageA) ,ADRESSE(abscisse_en_bas_a_gauche),ADRESSE(ordonnee_en_bas_a_gauche) ,ADRESSE(compte_rendu_des_operations) ,ADRESSE(mot_inutile) ) ,BLOC(VIDE;) ,BLOC(VIDE;) ); /* Transmission de l'image au frame-buffer... */ # Eifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_IMAGE_1 ENVOI_D_UNE_FONCTION_AU_FRAME_BUFFER(UFLUSH(ADRESSE(compte_rendu_des_operations) ,ADRESSE(mot_inutile) ) ,BLOC(VIDE;) ,BLOC(VIDE;) ); /* Et enfin, visualisation... */ Eblock ATes Bblock PRINT_ERREUR("la fenetre n'est pas ouverte"); Eblock ETes RETU_ERROR; Eblock # ifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_FORMAT_DES_NIVEAUX_1 # Aifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_FORMAT_DES_NIVEAUX_1 # undef IimageA_BLEUE # undef IimageA_VERTE # undef IimageA_ROUGE # Eifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_FORMAT_DES_NIVEAUX_1 # ifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_ORIGINE_DES_LIGNES_1 # undef U_TRANSLATION_VERTICALE_DE_L_IMAGE # undef U_TRANSLATION_HORIZONTALE_DE_L_IMAGE # Aifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_ORIGINE_DES_LIGNES_1 # undef U_TRANSLATION_VERTICALE_DE_L_IMAGE # undef U_TRANSLATION_HORIZONTALE_DE_L_IMAGE # Eifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_ORIGINE_DES_LIGNES_1 # undef RAPPORT_MAXIMAL_DU_ZOOM EFonctionI # ifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_status_1 # undef ENVOI_D_UNE_FONCTION_AU_FRAME_BUFFER # Aifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_status_1 # undef ENVOI_D_UNE_FONCTION_AU_FRAME_BUFFER # Eifdef BUG_SYSTEME_ULTRANET_FRAME_BUFFER_status_1 #Aifdef __VERSION__COMPILER_LE_GRAPHIQUE_ULTRANET_FRAME_BUFFER /* Common,DEFV(Fonction,) : compiler sur 'UltFB'. */ #Eifdef __VERSION__COMPILER_LE_GRAPHIQUE_ULTRANET_FRAME_BUFFER /* Common,DEFV(Fonction,) : compiler sur 'UltFB'. */ _______________________________________________________________________________________________________________________________________