_______________________________________________________________________________________________________________________________________ /*************************************************************************************************************************************/ /* */ /* 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 O U S ' X - W I N D O W ' ( O U ' X 1 1 ' ) : */ /* */ /* */ /* Definition : */ /* */ /* Ce fichier contient toutes les fonctions */ /* de base d'edition des images raster sous 'X-Window', */ /* quelle que soit la definition. */ /* */ /* */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* * * * ** * * * * * ** * */ /* * * * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * */ /* * * * * * * * * * * * * * * * */ /* * * * * ** * * * * * ** */ /* * * * * * * * * * * * * * * * * * * * * * * */ /* */ /* */ /* ATTENTION : */ /* */ /* Les fichiers de '$xiidX' peuvent demander */ /* un "parametrage" specifique lie aux serveurs */ /* utilises. Cela peut se manifester dans le */ /* fichier '$xiidX/fonct$vv$FON' avec la */ /* definition des couples de procedures suivants : */ /* */ /* ACCES_AUX_PALETTES_DE_COULEURS_VERSION_01 */ /* ACCES_AUX_PALETTES_DE_COULEURS_VERSION_02 */ /* ACCES_AUX_PALETTES_DE_COULEURS_VERSION_03 */ /* */ /* (ce mode a ete etudie grace a 'v $xtc/Xwindow.43$c') */ /* */ /* et : */ /* */ /* LAISSER_LES_NIVEAUX_DE_L_IMAGE_EN_L_ETAT */ /* INVERSER_LES_NIVEAUX_DE_L_IMAGE */ /* */ /* dans lesquels, les identites des serveurs sont testees */ /* physiquement par 'LE_SERVEUR_X_WINDOW_EST_CELUI_DE(...)' */ /* en faisant ensuite donc des tests sur leurs caracteristiques */ /* physiques (ce qui n'est pas tres elegant...). */ /* */ /* */ /* Nota important : */ /* */ /* Je me permets de rappeler le scandale */ /* de 'X-Window' : l'axe 'OY' descend, alors */ /* que partout ailleurs, logiquement, il */ /* monte... */ /* */ /* */ /* Author of '$xiidX/fonct$vv$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_X_WINDOW /* Common,DEFV(Fonction,) : indicateur de VERSION. */ DEFV(Common,DEFV(Logical,_______VERSION__COMPILER_LE_GRAPHIQUE_X_WINDOW)); #Aifdef __VERSION__COMPILER_LE_GRAPHIQUE_X_WINDOW /* Common,DEFV(Fonction,) : indicateur de VERSION. */ #Eifdef __VERSION__COMPILER_LE_GRAPHIQUE_X_WINDOW /* Common,DEFV(Fonction,) : indicateur de VERSION. */ #ifdef __VERSION__COMPILER_LE_GRAPHIQUE_X_WINDOW /* Common,DEFV(Fonction,) : sous X-Window compiler la bibliotheque. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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_X_WINDOW_IMAGE_2 /* Common,DEFV(Fonction,) : bug... */ DEFV(Common,DEFV(Logical,_____BUG_SYSTEME_X_WINDOW_IMAGE_2)); # Aifdef BUG_SYSTEME_X_WINDOW_IMAGE_2 /* Common,DEFV(Fonction,) : bug... */ # Eifdef BUG_SYSTEME_X_WINDOW_IMAGE_2 /* Common,DEFV(Fonction,) : bug... */ # ifdef BUG_SYSTEME_X_WINDOW_IMAGE_3 /* Common,DEFV(Fonction,) : bug... */ DEFV(Common,DEFV(Logical,_____BUG_SYSTEME_X_WINDOW_IMAGE_3)); # Aifdef BUG_SYSTEME_X_WINDOW_IMAGE_3 /* Common,DEFV(Fonction,) : bug... */ # Eifdef BUG_SYSTEME_X_WINDOW_IMAGE_3 /* Common,DEFV(Fonction,) : bug... */ # ifdef BUG_SYSTEME_X_WINDOW_STRUCTURES_1 /* Common,DEFV(Fonction,) : bug... */ DEFV(Common,DEFV(Logical,_____BUG_SYSTEME_X_WINDOW_STRUCTURES_1)); # Aifdef BUG_SYSTEME_X_WINDOW_STRUCTURES_1 /* Common,DEFV(Fonction,) : bug... */ # Eifdef BUG_SYSTEME_X_WINDOW_STRUCTURES_1 /* Common,DEFV(Fonction,) : bug... */ # ifdef BUG_SYSTEME_X_WINDOW_EVENEMENTS_1 /* Common,DEFV(Fonction,) : bug... */ DEFV(Common,DEFV(Logical,_____BUG_SYSTEME_X_WINDOW_EVENEMENTS_1)); # Aifdef BUG_SYSTEME_X_WINDOW_EVENEMENTS_1 /* Common,DEFV(Fonction,) : bug... */ # Eifdef BUG_SYSTEME_X_WINDOW_EVENEMENTS_1 /* Common,DEFV(Fonction,) : bug... */ # ifdef BUG_SYSTEME_X_WINDOW_EVENEMENTS_2 /* Common,DEFV(Fonction,) : bug... */ DEFV(Common,DEFV(Logical,_____BUG_SYSTEME_X_WINDOW_EVENEMENTS_2)); # Aifdef BUG_SYSTEME_X_WINDOW_EVENEMENTS_2 /* Common,DEFV(Fonction,) : bug... */ # Eifdef BUG_SYSTEME_X_WINDOW_EVENEMENTS_2 /* Common,DEFV(Fonction,) : bug... */ # ifdef BUG_SYSTEME_X_WINDOW_EVENEMENTS_3 /* Common,DEFV(Fonction,) : bug... */ DEFV(Common,DEFV(Logical,_____BUG_SYSTEME_X_WINDOW_EVENEMENTS_3)); # Aifdef BUG_SYSTEME_X_WINDOW_EVENEMENTS_3 /* Common,DEFV(Fonction,) : bug... */ # Eifdef BUG_SYSTEME_X_WINDOW_EVENEMENTS_3 /* Common,DEFV(Fonction,) : bug... */ # ifdef BUG_SYSTEME_SG_X_WINDOW_BORDER_1 /* Common,DEFV(Fonction,) : bug... */ DEFV(Common,DEFV(Logical,_____BUG_SYSTEME_SG_X_WINDOW_BORDER_1)); # Aifdef BUG_SYSTEME_SG_X_WINDOW_BORDER_1 /* Common,DEFV(Fonction,) : bug... */ # Eifdef BUG_SYSTEME_SG_X_WINDOW_BORDER_1 /* Common,DEFV(Fonction,) : bug... */ # ifdef BUG_SYSTEME_SG_X_WINDOW_BACKINGSTORE_1 /* Common,DEFV(Fonction,) : bug... */ DEFV(Common,DEFV(Logical,_____BUG_SYSTEME_SG_X_WINDOW_BACKINGSTORE_1)); # Aifdef BUG_SYSTEME_SG_X_WINDOW_BACKINGSTORE_1 /* Common,DEFV(Fonction,) : bug... */ # Eifdef BUG_SYSTEME_SG_X_WINDOW_BACKINGSTORE_1 /* Common,DEFV(Fonction,) : bug... */ # ifdef BUG_SYSTEME_APC_LinuxRedHat_X_WINDOW_XCreateImage_1 /* Common,DEFV(Fonction,) : bug... */ DEFV(Common,DEFV(Logical,_____BUG_SYSTEME_APC_LinuxRedHat_X_WINDOW_XCreateImage_1)); /* Introduit le 20170619162745... */ # Aifdef BUG_SYSTEME_APC_LinuxRedHat_X_WINDOW_XCreateImage_1 /* Common,DEFV(Fonction,) : bug... */ # Eifdef BUG_SYSTEME_APC_LinuxRedHat_X_WINDOW_XCreateImage_1 /* Common,DEFV(Fonction,) : bug... */ # ifdef BUG_SYSTEME_APC_LinuxRedHat_X_WINDOW_XCreateImage_2 /* Common,DEFV(Fonction,) : bug... */ DEFV(Common,DEFV(Logical,_____BUG_SYSTEME_APC_LinuxRedHat_X_WINDOW_XCreateImage_2)); /* Introduit le 20170619162745... */ # Aifdef BUG_SYSTEME_APC_LinuxRedHat_X_WINDOW_XCreateImage_2 /* Common,DEFV(Fonction,) : bug... */ # Eifdef BUG_SYSTEME_APC_LinuxRedHat_X_WINDOW_XCreateImage_2 /* Common,DEFV(Fonction,) : bug... */ # ifdef BUG_SYSTEME_APC_LinuxUbuntu_X_WINDOW_XCreateImage_1 /* Common,DEFV(Fonction,) : bug... */ DEFV(Common,DEFV(Logical,_____BUG_SYSTEME_APC_LinuxUbuntu_X_WINDOW_XCreateImage_1)); # Aifdef BUG_SYSTEME_APC_LinuxUbuntu_X_WINDOW_XCreateImage_1 /* Common,DEFV(Fonction,) : bug... */ # Eifdef BUG_SYSTEME_APC_LinuxUbuntu_X_WINDOW_XCreateImage_1 /* Common,DEFV(Fonction,) : bug... */ # ifdef BUG_SYSTEME_APC_LinuxUbuntu_X_WINDOW_XCreateImage_2 /* Common,DEFV(Fonction,) : bug... */ DEFV(Common,DEFV(Logical,_____BUG_SYSTEME_APC_LinuxUbuntu_X_WINDOW_XCreateImage_2)); # Aifdef BUG_SYSTEME_APC_LinuxUbuntu_X_WINDOW_XCreateImage_2 /* Common,DEFV(Fonction,) : bug... */ # Eifdef BUG_SYSTEME_APC_LinuxUbuntu_X_WINDOW_XCreateImage_2 /* Common,DEFV(Fonction,) : bug... */ # ifdef BUG_SYSTEME_APC_LinuxUbuntu_X_WINDOW_XCreateImage_3 /* Common,DEFV(Fonction,) : bug... */ DEFV(Common,DEFV(Logical,_____BUG_SYSTEME_APC_LinuxUbuntu_X_WINDOW_XCreateImage_3)); # Aifdef BUG_SYSTEME_APC_LinuxUbuntu_X_WINDOW_XCreateImage_3 /* Common,DEFV(Fonction,) : bug... */ # Eifdef BUG_SYSTEME_APC_LinuxUbuntu_X_WINDOW_XCreateImage_3 /* Common,DEFV(Fonction,) : bug... */ # ifdef BUG_SYSTEME_APC_LinuxUlmint_X_WINDOW_XCreateImage_1 /* Common,DEFV(Fonction,) : bug... */ DEFV(Common,DEFV(Logical,_____BUG_SYSTEME_APC_LinuxUlmint_X_WINDOW_XCreateImage_1)); # Aifdef BUG_SYSTEME_APC_LinuxUlmint_X_WINDOW_XCreateImage_1 /* Common,DEFV(Fonction,) : bug... */ # Eifdef BUG_SYSTEME_APC_LinuxUlmint_X_WINDOW_XCreateImage_1 /* Common,DEFV(Fonction,) : bug... */ # ifdef BUG_SYSTEME_APC_LinuxUlmint_X_WINDOW_XCreateImage_2 /* Common,DEFV(Fonction,) : bug... */ DEFV(Common,DEFV(Logical,_____BUG_SYSTEME_APC_LinuxUlmint_X_WINDOW_XCreateImage_2)); # Aifdef BUG_SYSTEME_APC_LinuxUlmint_X_WINDOW_XCreateImage_2 /* Common,DEFV(Fonction,) : bug... */ # Eifdef BUG_SYSTEME_APC_LinuxUlmint_X_WINDOW_XCreateImage_2 /* Common,DEFV(Fonction,) : bug... */ # ifdef BUG_SYSTEME_APC_LinuxUlmint_X_WINDOW_XCreateImage_3 /* Common,DEFV(Fonction,) : bug... */ DEFV(Common,DEFV(Logical,_____BUG_SYSTEME_APC_LinuxUlmint_X_WINDOW_XCreateImage_3)); # Aifdef BUG_SYSTEME_APC_LinuxUlmint_X_WINDOW_XCreateImage_3 /* Common,DEFV(Fonction,) : bug... */ # Eifdef BUG_SYSTEME_APC_LinuxUlmint_X_WINDOW_XCreateImage_3 /* Common,DEFV(Fonction,) : bug... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N S D E S V E R S I O N S : */ /* */ /*************************************************************************************************************************************/ # ifdef ALLOCATION_DES_COULEURS_VERSION_01 /* Common,DEFV(Fonction,) : avec 'VERSION_01'. */ DEFV(Common,DEFV(Logical,_____ALLOCATION_DES_COULEURS_VERSION_01)); # Aifdef ALLOCATION_DES_COULEURS_VERSION_01 /* Common,DEFV(Fonction,) : avec 'VERSION_01'. */ # Eifdef ALLOCATION_DES_COULEURS_VERSION_01 /* Common,DEFV(Fonction,) : avec 'VERSION_01'. */ # ifdef ALLOCATION_DES_COULEURS_VERSION_02 /* Common,DEFV(Fonction,) : avec 'VERSION_02'. */ DEFV(Common,DEFV(Logical,_____ALLOCATION_DES_COULEURS_VERSION_02)); # Aifdef ALLOCATION_DES_COULEURS_VERSION_02 /* Common,DEFV(Fonction,) : avec 'VERSION_02'. */ # Eifdef ALLOCATION_DES_COULEURS_VERSION_02 /* Common,DEFV(Fonction,) : avec 'VERSION_02'. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M U L T I P L I C I T E D E S L I G N E S D E S " B I T M A P " S : */ /* */ /*************************************************************************************************************************************/ # define LONGUEUR_EN_OCTETS_DES_LIGNES_D_IMAGES \ MUL2(INTE(SCAL(dimX,NBITOC,MULTIPLICITE_DES_LIGNES_DES_BITMAPS)) \ ,COND(EST_VRAI(IXopen_____X_Window_a_ete_mis_en_mode_fausses_couleurs) \ ,UN \ ,NOMBRE_DE_COMPOSANTES_CHROMATIQUES \ ) \ ) \ /* Nombre d'octets occupes par une ligne d'image. */ # define MULTIPLICITE_DES_LIGNES_DES_BITMAPS \ NOMBRE_DE_BITS_POUR_LE_BLANC(size_p) \ /* L'Argument dit 'bitmap_pad' de 'XCreateImage(...)' ne peut valoir que 8, 16 ou 32... */ # if ( (defined(BUG_SYSTEME_APC_LinuxRedHat_X_WINDOW_XCreateImage_1)) \ || (defined(BUG_SYSTEME_APC_LinuxUbuntu_X_WINDOW_XCreateImage_1)) \ || (defined(BUG_SYSTEME_APC_LinuxUlmint_X_WINDOW_XCreateImage_1)) \ ) # define BYTES_PER_LINE_XCreateImage(longueur_en_octets_des_lignes_d_images) \ ZERO \ /* Introduit le 20071127112910. En effet, sur ce SYSTEME, le dernier argument de la fonction */ \ /* 'XCreateImage(...)' (soit "bytes_per_line") ne signifie pas exactement ce que je crois. */ \ /* Il est donc suggere de lui donner une valeur nulle, ce qui permettra son calcul correct */ \ /* a l'interieur de 'XCreateImage(...)' et evitera le message : */ \ /* */ \ /* Segmentation fault (core dumped) */ \ /* */ \ /* bien rare fort heureusement... */ # Aif ( (defined(BUG_SYSTEME_APC_LinuxRedHat_X_WINDOW_XCreateImage_1)) \ || (defined(BUG_SYSTEME_APC_LinuxUbuntu_X_WINDOW_XCreateImage_1)) \ || (defined(BUG_SYSTEME_APC_LinuxUlmint_X_WINDOW_XCreateImage_1)) \ ) # define BYTES_PER_LINE_XCreateImage(longueur_en_octets_des_lignes_d_images) \ longueur_en_octets_des_lignes_d_images # Eif ( (defined(BUG_SYSTEME_APC_LinuxRedHat_X_WINDOW_XCreateImage_1)) \ || (defined(BUG_SYSTEME_APC_LinuxUbuntu_X_WINDOW_XCreateImage_1)) \ || (defined(BUG_SYSTEME_APC_LinuxUlmint_X_WINDOW_XCreateImage_1)) \ ) /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C R E A T I O N E T D E S T R U C T I O N D E S S T R U C T U R E S " I M A G E " : */ /* */ /*************************************************************************************************************************************/ # if ( (defined(BUG_SYSTEME_APC_LinuxUbuntu_X_WINDOW_XCreateImage_3)) \ || (defined(BUG_SYSTEME_APC_LinuxUlmint_X_WINDOW_XCreateImage_3)) \ ) # define AMELIORATION_XCreateImage_3 \ Bblock \ CALS(XSync(description_du_serveur_et_de_l_ecran,False)); \ /* N'importe quoi (meme un simple 'fprintf(...)' fait l'affaire et fait disparaitre le */ \ /* probleme suivant : */ \ /* */ \ /* Sud */ \ /* $xci/sequence$X A=... premiere=1 derniere=128 \ */ \ /* p=$xiP/masque \ */ \ /* D=-1 \ */ \ /* editer=VRAI \ */ \ /* $formatI */ \ /* */ \ /* les images {17,18,19,29,34,45,46,47,96,111} au lieu d'etre blanc sur fond noir etaient */ \ /* plutot jaune sur une fond melange de noir et de structures bleues. */ \ Eblock \ /* Amelioration de la fonction 'XCreateImage(...)' (introduit le 20120226073832). */ # Aif ( (defined(BUG_SYSTEME_APC_LinuxUbuntu_X_WINDOW_XCreateImage_3)) \ || (defined(BUG_SYSTEME_APC_LinuxUlmint_X_WINDOW_XCreateImage_3)) \ ) # define AMELIORATION_XCreateImage_3 \ Bblock \ BLOC(VIDE;); \ Eblock \ /* Amelioration de la fonction 'XCreateImage(...)' (introduit le 20120226073832). */ # Eif ( (defined(BUG_SYSTEME_APC_LinuxUbuntu_X_WINDOW_XCreateImage_3)) \ || (defined(BUG_SYSTEME_APC_LinuxUlmint_X_WINDOW_XCreateImage_3)) \ ) # if ( (defined(BUG_SYSTEME_APC_LinuxRedHat_X_WINDOW_XCreateImage_2)) \ || (defined(BUG_SYSTEME_APC_LinuxUbuntu_X_WINDOW_XCreateImage_2)) \ || (defined(BUG_SYSTEME_APC_LinuxUlmint_X_WINDOW_XCreateImage_2)) \ ) DEFV(Local,DEFV(CHAR,INIT(POINTERc(sauvegarde_de_la_memoire_pointee_par__XCreateImage),ADRESSE_NON_ENCORE_DEFINIE))); /* Introduit le 20071128111702... */ DEFV(Local,DEFV(CHAR,INIT(POINTERc(memoire_allouee_pour__XCreateImage),ADRESSE_NON_ENCORE_DEFINIE))); /* Introduit le 20170722112507... */ # define CALS_XCreateImage(_ximage,_display,_visual,_depth,_format,_offset,_data,_width,_height,_bitmap_pad,_bytes_per_line) \ Bblock \ AMELIORATION_XCreateImage_3; \ \ EGAL(_ximage \ ,XCreateImage(_display \ ,_visual \ ,_depth \ ,_format \ ,_offset \ ,_data \ ,_width \ ,_height \ ,_bitmap_pad \ ,BYTES_PER_LINE_XCreateImage(_bytes_per_line) \ ) \ ); \ /* Rappelons le 20170722112507 que 'XCreateImage(...)' n'alloue pas la memoire necessaire */ \ /* a l'image '_data'... */ \ \ EGAL(sauvegarde_de_la_memoire_pointee_par__XCreateImage,ASI1(_ximage,data)); \ EGAL(memoire_allouee_pour__XCreateImage \ ,kMalo(MUL2(MAX2(SIZP(KONC(_long,_int)),NOMBRE_DE_COMPOSANTES_CHROMATIQUES),dimXY)) \ ); \ EGAL(ASI1(_ximage,data),memoire_allouee_pour__XCreateImage); \ /* Introduit le 20071127134734. En effet, sur ce SYSTEME, la fonction 'XPutPixel(...)' ne */ \ /* fonctionne pas bien en ce qui concerne la coordonnee 'Y' et ce lorsqu'elle s'approche */ \ /* de 'Ymax'. A titre d'exemple, lors de l'affichage d'une image 'Std', il manque environ */ \ /* le quart inferieur de cette image ; d'autre part, le reaffichage d'une image suite a un */ \ /* evenement ('v $xiidX/fonct$vv$FON REAFFICHAGE_D_UNE_IMAGE_PAR_IXdisplay') provoque alors */ \ /* le message : */ \ /* */ \ /* Segmentation fault (core dumped) */ \ /* */ \ /* Il semble que l'espace alloue a l'image ('ASI1(imageR,data)') soit insuffisant, d'ou */ \ /* cette reallocation... */ \ /* */ \ /* On notera le 'SIZP(KONC(_long,_int))' car, en effet, 'LongInt' est le type des niveaux */ \ /* des points qui sont traites par 'XPutPixel(...)'. */ \ Eblock \ /* Acces a la fonction 'XCreateImage(...)' (introduit le 20071128111702). */ # define CALS_XDestroyImage(_ximage) \ Bblock \ Test(IFEQ(ptCARA(ASI1(_ximage,data)),memoire_allouee_pour__XCreateImage)) \ /* Test mis en place le 20170722112507 pour eviter un : */ \ /* */ \ /* Segmentation fault */ \ /* */ \ /* dans le 'XDestroyImage(...)' qui suit... */ \ Bblock \ EGAL(ASI1(_ximage,data),sauvegarde_de_la_memoire_pointee_par__XCreateImage); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ /* Restauration de l'allocation memoire faite par 'XCreateImage(...)'... */ \ \ CALS(XDestroyImage(_ximage)); \ \ CALZ_FreSS(memoire_allouee_pour__XCreateImage); \ Eblock \ /* Acces a la fonction 'XDestroyImage(...)' (introduit le 20071128111702). */ # Aif ( (defined(BUG_SYSTEME_APC_LinuxRedHat_X_WINDOW_XCreateImage_2)) \ || (defined(BUG_SYSTEME_APC_LinuxUbuntu_X_WINDOW_XCreateImage_2)) \ || (defined(BUG_SYSTEME_APC_LinuxUlmint_X_WINDOW_XCreateImage_2)) \ ) # define CALS_XCreateImage(_ximage,_display,_visual,_depth,_format,_offset,_data,_width,_height,_bitmap_pad,_bytes_per_line) \ Bblock \ EGAL(_ximage \ ,XCreateImage(_display \ ,_visual \ ,_depth \ ,_format \ ,_offset \ ,_data \ ,_width \ ,_height \ ,_bitmap_pad \ ,_bytes_per_line \ ) \ ); \ Eblock \ /* Acces a la fonction 'XCreateImage(...)' (introduit le 20071128111702). */ # define CALS_XDestroyImage(_ximage) \ Bblock \ CALS(XDestroyImage(_ximage)); \ Eblock \ /* Acces a la fonction 'XDestroyImage(...)' (introduit le 20071128111702). */ # Eif ( (defined(BUG_SYSTEME_APC_LinuxRedHat_X_WINDOW_XCreateImage_2)) \ || (defined(BUG_SYSTEME_APC_LinuxUbuntu_X_WINDOW_XCreateImage_2)) \ || (defined(BUG_SYSTEME_APC_LinuxUlmint_X_WINDOW_XCreateImage_2)) \ ) /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C O N V E R S I O N D ' U N E I M A G E E N U N E N S E M B L E */ /* D E " B I T M A P " S P A R A L L E L E S S A N S I N V E R S I O N D E L ' A X E ' O Y ' : */ /* */ /*************************************************************************************************************************************/ # define IL_FAUT_UNE_CONVERSION_EN_UN_BIT_MAP \ IFNE(NOMBRE_DE_BITS_PAR_POINT,Bsize_p) \ /* Test permettant de savoir si une conversion en un bit-map est necessaire... */ # define REDUCTION_HORIZONTALE(longueur,pas_horizontal) \ QUOD(longueur,pas_horizontal) \ /* Reduction d'une longueur horizontale. */ # define REDUCTION_VERTICALE(hauteur,pas_vertical) \ QUOD(hauteur,pas_vertical) \ /* Reduction d'une longueur verticale. */ # define DIMENSION_HORIZONTALE_DU_BIT_MAP(pas_horizontal) \ MULE(REDUCTION_HORIZONTALE(dimX,pas_horizontal),MULTIPLICITE_DES_LIGNES_DES_BITMAPS) \ /* Bien que le "bit-map" soit un vecteur, on definit une pseudo-dimension horizontale ; on */ \ /* notera que l'on utilise 'pasX_global' et non pas 'pasX' a cause de la boucle effectuee */ \ /* dans 'IXanimation()' : 'begin_ligneQ(DoIn,Xmin,Xmax,dimX_des_trames)' et qui redefinit */ \ /* le pas horizontal... */ # define DIMENSION_VERTICALE_DU_BIT_MAP(pas_vertical) \ REDUCTION_VERTICALE(dimY,pas_vertical) \ /* Bien que le "bit-map" soit un vecteur, on definit une pseudo-dimension verticale ; on */ \ /* notera que l'on utilise 'pasY_global' et non pas 'pasY' a cause de la boucle effectuee */ \ /* dans 'IXanimation()' : 'begin_colonneQ(DoIn,Ymin,Ymax,dimY_des_trames)' et qui redefinit */ \ /* le pas vertical... */ # define DIMENSION_DU_BIT_MAP \ INTE(SCAL(MUL2(DIMENSION_HORIZONTALE_DU_BIT_MAP(pasX) \ ,DIMENSION_VERTICALE_DU_BIT_MAP(pasY) \ ) \ ,NBITOC \ ,MULTIPLICITE_DES_LIGNES_DES_BITMAPS \ ) \ ) \ /* Nombre d'octets necessaires pour memoriser le "bit-map" etant donne le fait que les */ \ /* lignes doivent debuter a des multiples de 'MULTIPLICITE_DES_LIGNES_DES_BITMAPS'... */ BFonctionC # define PREMIER_ELEMENT_DU_BIT_MAP \ INDEX0 \ /* Indice du premier element du "bit-map". */ DEFV(Local,DEFV(FonctionC,POINTERc(Igeneration_d_un_bitmap(bitmapR,imageA)))) DEFV(Argument,DEFV(CHAR,DTb0(bitmapR))); /* Vecteur Resultat, telle que : au debut de bitmapR[i] on trouve les poids faibles de */ /* imageA[X][Y], et a la fin, les poids forts. */ DEFV(Argument,DEFV(image,imageA)); /* Image Argument. */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(CHAR,INIT(element_courant_du_bit_map,CARA(ZERO))); /* Element courant du "bit-map" (en cours de construction). */ DEFV(Int,INIT(old_X,Xmin)); DEFV(Int,INIT(old_Y,Ymin)); /* Coordonnees courantes dans 'imageA'. */ DEFV(Int,INIT(extracteur_de_bits,SOUS(NOMBRE_DE_BITS_POUR_LE_BLANC(size_p),LBIT))); /* Extracteur des bits de 'imageA' des poids les plus forts vers les poids les */ /* plus faibles... */ /*..............................................................................................................................*/ IDoIn(index_du_bit_map,PREMIER_ELEMENT_DU_BIT_MAP,LSTX(PREMIER_ELEMENT_DU_BIT_MAP,DIMENSION_DU_BIT_MAP),I) /* Le 20060603174608, 'IDoIn(...)' a remplace 'DoIn(...)'... */ Bblock EGAL(element_courant_du_bit_map,CARA(ZERO)); /* Initialisation de l'element courant du "bitmap"... */ Komp(compteur_des_bits_d_un_point,NBITOC) Bblock EGAL(element_courant_du_bit_map ,OUIN(SLLS(element_courant_du_bit_map,LBIT) ,ETLO(SLRS(load_point_valide(imageA,old_X,old_Y) ,extracteur_de_bits ) ,BIT ) ) ); /* Recuperation des bits de meme poids dans des points successifs de 'imageA', et */ /* concatenation dans 'bitmapR'. Mais ATTENTION, on ne peut optimiser d'avantage, par */ /* exemple en ne decalant qu'apres la boucle 'Komp(...)' 'element_courant_du_bit_map', car */ /* en effet, en toute generalite, 'extracteur_de_bits' peut changer a l'interieur de cette */ /* meme boucle... */ INCR(old_X,pasX); /* Parcours horizontal de 'imageA'. */ Test(IFGT(old_X,XYZmax(Xmin,MULE(dimX,MULTIPLICITE_DES_LIGNES_DES_BITMAPS)))) /* Nota important : c'est la conjonction du 'load_point_valide(...)' ci-dessus, et du */ /* test de 'old_X' par rapport a 'Xmax' (ramene a 'MULTIPLICITE_DES_LIGNES_DES_BITMAPS' */ /* par exces), qui permet de gerer correctement le cas ou le nombre de points par ligne */ /* n'est pas un multiple de 'MULTIPLICITE_DES_LIGNES_DES_BITMAPS'. Ainsi, on complete les */ /* lignes eventuellement avec des points qui n'existent pas. */ Bblock EGAL(old_X,Xmin); INCR(old_Y,pasY); /* Lorsqu'on est en bout de ligne, on passe au debut (Xmin) de la ligne suivante... */ Test(IFGT(old_Y,Ymax)) Bblock EGAL(old_Y,Ymin); /* Lorsqu'on est en bas de l'image, on revient en haut (Xmin,Ymin), et ce pour le poids */ /* precedent des bits extraits... */ Test(IZLT(extracteur_de_bits)) Bblock PRINT_ERREUR("le poids des bits extraits est trop faible"); Eblock ATes Bblock DECR(extracteur_de_bits,LBIT); /* Lorsqu'on est en bas de l'image, on revient en haut (Xmin,Ymin), et ce pour le poids */ /* precedent des bits extraits... */ Eblock ETes Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes Eblock EKom EGAL(ITb0(bitmapR,INDX(index_du_bit_map,PREMIER_ELEMENT_DU_BIT_MAP)),element_courant_du_bit_map); /* Mise en place de l'element courant du "bitmap" apres sa construction... */ Eblock EIDoI RETI(bitmapR); Eblock # undef PREMIER_ELEMENT_DU_BIT_MAP EFonctionC # define DIMENSION_HORIZONTALE_DE_L_IMAGE(pas_horizontal) \ dimX \ /* Dimension horizontale du "bit-map" vu comme une image "standard"... */ # define DIMENSION_VERTICALE_DE_L_IMAGE(pas_vertical) \ dimY \ /* Dimension verticale du "bit-map" vu comme une image "standard"... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E S T R U C T U R E S " D U M M Y " D E S T I N E E S */ /* A C O M P L E T E R L E S R E F E R E N C E S D E S I N C L U D E S S T A N D A R D S : */ /* */ /*************************************************************************************************************************************/ # ifdef BUG_SYSTEME_X_WINDOW_STRUCTURES_1 Dstruct00(_XRegion ,NOM_VIDE ); /* Pour : INCLUDE : REFERENCES : */ /* */ /* <X11/Xutil.h> "typedef struct _XRegion *Region;" */ Dstruct00(_XrmHashBucketRec ,NOM_VIDE ); /* Pour : INCLUDE : REFERENCES : */ /* */ /* <X11/Xlib.h> "struct _XrmHashBucketRec *db;" */ /* <X11/Xresource.h> "typedef struct _XrmHashBucketRec *XrmHashBucket;" */ /* "typedef struct _XrmHashBucketRec *XrmDatabase;" */ Dstruct00(XKeytrans ,NOM_VIDE ); /* Pour : INCLUDE : REFERENCES : */ /* */ /* <X11/Xlib.h> "struct XKeytrans *key_bindings;" */ # Aifdef BUG_SYSTEME_X_WINDOW_STRUCTURES_1 # Eifdef BUG_SYSTEME_X_WINDOW_STRUCTURES_1 /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* I N C L U D E S S P E C I F I Q U E S D E ' X - W I N D O W S ' : */ /* */ /*************************************************************************************************************************************/ /* ATTENTION, il y avait ici autrefois (ce qui etait plus logique) : */ /* */ /* @ include <X11/X.h> */ /* */ /* Mais, depuis que l'on trouve dans 'v $xiidX/fonct$vv$FON' : */ /* */ /* DEFV(Common,DEFV(X_Window,X11_____fenetre_courante)); */ /* */ /* sur toute machine sur laquelle on compile 'X-Window' cette directive se retrouve donc */ /* dans 'v $xiidX/fonct$vv$EXT', et demande donc que le type 'Window' soit defini avant, */ /* ce qui est fait maintenant dans 'v $xiidX/fonct$vv$DEF'... */ # ifdef __VERSION__UTILISER_LA_BIBLIOTHEQUE_OpenGL @ include <GL/glx.h> /* Dans ce fichier se trouvent la liste des fichiers utiles... */ # Aifdef __VERSION__UTILISER_LA_BIBLIOTHEQUE_OpenGL @ include <X11/Xlib.h> /* Dans ce fichier se trouvent la plupart des structures (defines en tant que 'typedef'), */ /* ainsi que des defines du type 'RootWindow()'... */ @ include <X11/Xutil.h> /* Dans ce fichier se trouvent des choses diverses et variees, et par exemple des */ /* defines du type 'XGetPixel()', ainsi que des "objets" relatifs aux 'hints'. */ # Eifdef __VERSION__UTILISER_LA_BIBLIOTHEQUE_OpenGL /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 E T I N T E R N E S : */ /* */ /*************************************************************************************************************************************/ TypedefS(X_Void,Void) /* Structure definissant un type "vide". Son introduction a ete faite le 19970214093401 */ /* lors de la mise en route de '$LACT29', certaines fonction ayant change de type (voir */ /* le type 'X_Int_Void' qui est defini ci-apres...). */ /* */ /* ATTENTION, le 19990226161158, lors du passage a la version '702010000' de '$Cc', il */ /* a fallu revenir au type 'Int' pour les suivantes qui etaient donc passees a 'Void' : */ /* */ /* XChangeWindowAttributes */ /* XDestroyWindow */ /* XFree */ /* XFreeColormap */ /* XFreeGC */ /* XInstallColormap */ /* XMapWindow */ /* XSelectInput */ /* XSetCloseDownMode */ /* XSetWindowBackground */ /* XSetWindowBorder */ /* XSetWindowColormap */ /* XStoreColors */ /* XSync */ /* XUnmapWindow */ /* */ /* Amusant, non ? */ # if ( ((defined(SYSTEME_SGO200A1_IRIX_CC)) && ((nC_RELEASE >= 701000000) && (nC_RELEASE < 702010000))) \ || ((defined(SYSTEME_SGO200A2_IRIX_CC)) && ((nC_RELEASE >= 701000000) && (nC_RELEASE < 702010000))) \ || ((defined(SYSTEME_SGO200A4_IRIX_CC)) && ((nC_RELEASE >= 701000000) && (nC_RELEASE < 702010000))) \ || ((defined(SYSTEME_SGO25224_IRIX_CC)) && ((nC_RELEASE >= 701000000) && (nC_RELEASE < 702010000))) \ || ((defined(SYSTEME_SGO252VA_IRIX_CC)) && ((nC_RELEASE >= 701000000) && (nC_RELEASE < 702010000))) \ || ((defined(SYSTEME_SGO252VN_IRIX_CC)) && ((nC_RELEASE >= 701000000) && (nC_RELEASE < 702010000))) \ || ((defined(SYSTEME_SGO25224_IRIX_CC)) && ((nC_RELEASE >= 701000000) && (nC_RELEASE < 702010000))) \ || ((defined(SYSTEME_SGO252VA_IRIX_CC)) && ((nC_RELEASE >= 701000000) && (nC_RELEASE < 702010000))) \ || ((defined(SYSTEME_SGO252VN_IRIX_CC)) && ((nC_RELEASE >= 701000000) && (nC_RELEASE < 702010000))) \ ) TypedefS(X_Int_Void,X_Void) # Aif ( ((defined(SYSTEME_SGO200A1_IRIX_CC)) && ((nC_RELEASE >= 701000000) && (nC_RELEASE < 702010000))) \ || ((defined(SYSTEME_SGO200A2_IRIX_CC)) && ((nC_RELEASE >= 701000000) && (nC_RELEASE < 702010000))) \ || ((defined(SYSTEME_SGO200A4_IRIX_CC)) && ((nC_RELEASE >= 701000000) && (nC_RELEASE < 702010000))) \ || ((defined(SYSTEME_SGO25224_IRIX_CC)) && ((nC_RELEASE >= 701000000) && (nC_RELEASE < 702010000))) \ || ((defined(SYSTEME_SGO252VA_IRIX_CC)) && ((nC_RELEASE >= 701000000) && (nC_RELEASE < 702010000))) \ || ((defined(SYSTEME_SGO252VN_IRIX_CC)) && ((nC_RELEASE >= 701000000) && (nC_RELEASE < 702010000))) \ || ((defined(SYSTEME_SGO25224_IRIX_CC)) && ((nC_RELEASE >= 701000000) && (nC_RELEASE < 702010000))) \ || ((defined(SYSTEME_SGO252VA_IRIX_CC)) && ((nC_RELEASE >= 701000000) && (nC_RELEASE < 702010000))) \ || ((defined(SYSTEME_SGO252VN_IRIX_CC)) && ((nC_RELEASE >= 701000000) && (nC_RELEASE < 702010000))) \ ) TypedefS(X_Int_Void,X_Int) # Eif ( ((defined(SYSTEME_SGO200A1_IRIX_CC)) && ((nC_RELEASE >= 701000000) && (nC_RELEASE < 702010000))) \ || ((defined(SYSTEME_SGO200A2_IRIX_CC)) && ((nC_RELEASE >= 701000000) && (nC_RELEASE < 702010000))) \ || ((defined(SYSTEME_SGO200A4_IRIX_CC)) && ((nC_RELEASE >= 701000000) && (nC_RELEASE < 702010000))) \ || ((defined(SYSTEME_SGO25224_IRIX_CC)) && ((nC_RELEASE >= 701000000) && (nC_RELEASE < 702010000))) \ || ((defined(SYSTEME_SGO252VA_IRIX_CC)) && ((nC_RELEASE >= 701000000) && (nC_RELEASE < 702010000))) \ || ((defined(SYSTEME_SGO252VN_IRIX_CC)) && ((nC_RELEASE >= 701000000) && (nC_RELEASE < 702010000))) \ || ((defined(SYSTEME_SGO25224_IRIX_CC)) && ((nC_RELEASE >= 701000000) && (nC_RELEASE < 702010000))) \ || ((defined(SYSTEME_SGO252VA_IRIX_CC)) && ((nC_RELEASE >= 701000000) && (nC_RELEASE < 702010000))) \ || ((defined(SYSTEME_SGO252VN_IRIX_CC)) && ((nC_RELEASE >= 701000000) && (nC_RELEASE < 702010000))) \ ) /* Structure definissant un entier de base... */ /* */ /* A cause de 'DECLARATIONS_DES_FONCTIONS_ET_DE_LEURS_ARGUMENTS_VERSION_02', il a ete */ /* necessaire le 20040617181037 de mettre dans le fichier '$DEF' associe le definitions */ /* suivantes : */ /* */ /* TypedefS(X_Int,vrai_Int_de_base) */ /* TypedefS(A___X_Int,X_Int) */ /* */ /* car, en effet, avec cette nouvelle VERSION, les fichiers de type '$EXT' contiendront */ /* en general des 'Argument's et il est donc necessaire que les 'A___...' correspondant */ /* soient disponibles avant ces declarations 'Argument's... */ # if ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (defined(SYSTEME_APC_LinuxRedHat_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_ICC)) \ || (defined(SYSTEME_APC_LinuxUlmint_GCC)) \ || (defined(SYSTEME_APC_LinuxUlmint_ICC)) \ || (defined(SYSTEME_CRAYC98_UNICOS)) \ || (defined(SYSTEME_CRAYC916_UNICOS)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS)) \ || (defined(SYSTEME_SGIND308_IRIX)) \ || (defined(SYSTEME_SGIND324_IRIX)) \ || (defined(SYSTEME_SGIND3GA_IRIX)) \ || (defined(SYSTEME_SGIND408_IRIX)) \ || (defined(SYSTEME_SGIND424_IRIX)) \ || (defined(SYSTEME_SGIND4GA_IRIX)) \ || (defined(SYSTEME_SGIND508_IRIX)) \ || (defined(SYSTEME_SGIND524_IRIX)) \ || (defined(SYSTEME_SGIND5GA_IRIX)) \ || (defined(SYSTEME_SGIND808_IRIX)) \ || (defined(SYSTEME_SGIND824_IRIX)) \ || (defined(SYSTEME_SGIND8GA_IRIX)) \ || (defined(SYSTEME_SGINDA08_IRIX)) \ || (defined(SYSTEME_SGINDA24_IRIX)) \ || (defined(SYSTEME_SGINDAGA_IRIX)) \ || (defined(SYSTEME_SGO200A1_IRIX)) \ || (defined(SYSTEME_SGO200A2_IRIX)) \ || (defined(SYSTEME_SGO200A4_IRIX)) \ || (defined(SYSTEME_SGO25224_IRIX)) \ || (defined(SYSTEME_SGO252VA_IRIX)) \ || (defined(SYSTEME_SGO252VN_IRIX)) \ || (defined(SYSTEME_SGPCM801_IRIX)) \ || (defined(SYSTEME_SGPCMA01_IRIX)) \ || (defined(SYSTEME_VAX9000_ULTRIX)) \ ) # TestADef BUG_SYSTEME_X_WINDOW_X_Positive \ /* Ce type, a cause des verifications des types des fonctions doit etre obligatoirement */ \ /* de type 'unsigned long int'... */ # Aif ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (defined(SYSTEME_APC_LinuxRedHat_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_ICC)) \ || (defined(SYSTEME_APC_LinuxUlmint_GCC)) \ || (defined(SYSTEME_APC_LinuxUlmint_ICC)) \ || (defined(SYSTEME_CRAYC98_UNICOS)) \ || (defined(SYSTEME_CRAYC916_UNICOS)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS)) \ || (defined(SYSTEME_SGIND308_IRIX)) \ || (defined(SYSTEME_SGIND324_IRIX)) \ || (defined(SYSTEME_SGIND3GA_IRIX)) \ || (defined(SYSTEME_SGIND408_IRIX)) \ || (defined(SYSTEME_SGIND424_IRIX)) \ || (defined(SYSTEME_SGIND4GA_IRIX)) \ || (defined(SYSTEME_SGIND508_IRIX)) \ || (defined(SYSTEME_SGIND524_IRIX)) \ || (defined(SYSTEME_SGIND5GA_IRIX)) \ || (defined(SYSTEME_SGIND808_IRIX)) \ || (defined(SYSTEME_SGIND824_IRIX)) \ || (defined(SYSTEME_SGIND8GA_IRIX)) \ || (defined(SYSTEME_SGINDA08_IRIX)) \ || (defined(SYSTEME_SGINDA24_IRIX)) \ || (defined(SYSTEME_SGINDAGA_IRIX)) \ || (defined(SYSTEME_SGO200A1_IRIX)) \ || (defined(SYSTEME_SGO200A2_IRIX)) \ || (defined(SYSTEME_SGO200A4_IRIX)) \ || (defined(SYSTEME_SGO25224_IRIX)) \ || (defined(SYSTEME_SGO252VA_IRIX)) \ || (defined(SYSTEME_SGO252VN_IRIX)) \ || (defined(SYSTEME_SGPCM801_IRIX)) \ || (defined(SYSTEME_SGPCMA01_IRIX)) \ || (defined(SYSTEME_VAX9000_ULTRIX)) \ ) # Eif ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (defined(SYSTEME_APC_LinuxRedHat_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_ICC)) \ || (defined(SYSTEME_APC_LinuxUlmint_GCC)) \ || (defined(SYSTEME_APC_LinuxUlmint_ICC)) \ || (defined(SYSTEME_CRAYC98_UNICOS)) \ || (defined(SYSTEME_CRAYC916_UNICOS)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS)) \ || (defined(SYSTEME_SGIND308_IRIX)) \ || (defined(SYSTEME_SGIND324_IRIX)) \ || (defined(SYSTEME_SGIND3GA_IRIX)) \ || (defined(SYSTEME_SGIND408_IRIX)) \ || (defined(SYSTEME_SGIND424_IRIX)) \ || (defined(SYSTEME_SGIND4GA_IRIX)) \ || (defined(SYSTEME_SGIND508_IRIX)) \ || (defined(SYSTEME_SGIND524_IRIX)) \ || (defined(SYSTEME_SGIND5GA_IRIX)) \ || (defined(SYSTEME_SGIND808_IRIX)) \ || (defined(SYSTEME_SGIND824_IRIX)) \ || (defined(SYSTEME_SGIND8GA_IRIX)) \ || (defined(SYSTEME_SGINDA08_IRIX)) \ || (defined(SYSTEME_SGINDA24_IRIX)) \ || (defined(SYSTEME_SGINDAGA_IRIX)) \ || (defined(SYSTEME_SGO200A1_IRIX)) \ || (defined(SYSTEME_SGO200A2_IRIX)) \ || (defined(SYSTEME_SGO200A4_IRIX)) \ || (defined(SYSTEME_SGO25224_IRIX)) \ || (defined(SYSTEME_SGO252VA_IRIX)) \ || (defined(SYSTEME_SGO252VN_IRIX)) \ || (defined(SYSTEME_SGPCM801_IRIX)) \ || (defined(SYSTEME_SGPCMA01_IRIX)) \ || (defined(SYSTEME_VAX9000_ULTRIX)) \ ) # ifdef BUG_SYSTEME_X_WINDOW_X_Positive /* Common,DEFV(Fonction,) : bug... */ DEFV(Common,DEFV(Logical,_____BUG_SYSTEME_X_WINDOW_X_Positive)); # Aifdef BUG_SYSTEME_X_WINDOW_X_Positive /* Common,DEFV(Fonction,) : bug... */ # Eifdef BUG_SYSTEME_X_WINDOW_X_Positive /* Common,DEFV(Fonction,) : bug... */ # if ( (! defined(BUG_SYSTEME_X_WINDOW_X_Positive)) \ ) TypedefS(X_Positive,CONC(Unsigned,vrai_Int_de_base)) /* Structure definissant un entier non signe de base... */ # Aif ( (! defined(BUG_SYSTEME_X_WINDOW_X_Positive)) \ ) TypedefS(X_Positive,CONC(Unsigned,LongInt)) /* Structure definissant un entier non signe de base... */ # Eif ( (! defined(BUG_SYSTEME_X_WINDOW_X_Positive)) \ ) /* Structure definissant un "display" (voir <X11/lib.h>). */ /* */ /* A cause de 'DECLARATIONS_DES_FONCTIONS_ET_DE_LEURS_ARGUMENTS_VERSION_02', il a ete */ /* necessaire le 20040617181037 de mettre dans le fichier '$DEF' associe le definitions */ /* suivantes : */ /* */ /* TypedefP(X_Display,Display) */ /* TypedefS(A___X_Display,X_Display) */ /* */ /* car, en effet, avec cette nouvelle VERSION, les fichiers de type '$EXT' contiendront */ /* en general des 'Argument's et il est donc necessaire que les 'A___...' correspondant */ /* soient disponibles avant ces declarations 'Argument's... */ TypedefP(X_Status,Status) /* Structure definissant un etat au retour d'une fonction (voir <X11/Xlib.h>). */ /* Structure definissant le format descriptif d'une image raster (voir <X11/Xlib.h>). */ /* */ /* A cause de 'DECLARATIONS_DES_FONCTIONS_ET_DE_LEURS_ARGUMENTS_VERSION_02', il a ete */ /* necessaire le 20040617181037 de mettre dans le fichier '$DEF' associe le definitions */ /* suivantes : */ /* */ /* TypedefP(X_XImage,XImage) */ /* TypedefS(A___X_XImage,X_XImage) */ /* */ /* car, en effet, avec cette nouvelle VERSION, les fichiers de type '$EXT' contiendront */ /* en general des 'Argument's et il est donc necessaire que les 'A___...' correspondant */ /* soient disponibles avant ces declarations 'Argument's... */ /* Structure definissant un contexte graphique (voir <X11/Xlib.h>). */ /* */ /* A cause de 'DECLARATIONS_DES_FONCTIONS_ET_DE_LEURS_ARGUMENTS_VERSION_02', il a ete */ /* necessaire le 20040617181037 de mettre dans le fichier '$DEF' associe le definitions */ /* suivantes : */ /* */ /* TypedefP(X_GC,GC) */ /* TypedefS(A___X_GC,X_GC) */ /* */ /* car, en effet, avec cette nouvelle VERSION, les fichiers de type '$EXT' contiendront */ /* en general des 'Argument's et il est donc necessaire que les 'A___...' correspondant */ /* soient disponibles avant ces declarations 'Argument's... */ TypedefP(X_XEvent,XEvent) /* Structure definissant la liste des evenements en attente (voir <X11/Xlib.h>). */ /* Structure definissant les attributs d'une fenetre, et par exemple la gravite, ainsi */ /* que la palette de couleurs associee (voir <X11/Xlib.h>). */ /* */ /* A cause de 'DECLARATIONS_DES_FONCTIONS_ET_DE_LEURS_ARGUMENTS_VERSION_02', il a ete */ /* necessaire le 20040617181037 de mettre dans le fichier '$DEF' associe le definitions */ /* suivantes : */ /* */ /* TypedefP(X_XSetWindowAttributes,XSetWindowAttributes) */ /* TypedefS(A___X_XSetWindowAttributes,X_XSetWindowAttributes) */ /* */ /* car, en effet, avec cette nouvelle VERSION, les fichiers de type '$EXT' contiendront */ /* en general des 'Argument's et il est donc necessaire que les 'A___...' correspondant */ /* soient disponibles avant ces declarations 'Argument's... */ TypedefP(X_XSizeHints,XSizeHints) /* Structure definissant les parametres geometriques d'une fenetre, et en particulier */ /* ses dimensions et sa position (voir <X11/Xutil.h>). */ /* Structure definissant un visual, c'est-a-dire le nombre de couleurs disponibles, */ /* */ /* A cause de 'DECLARATIONS_DES_FONCTIONS_ET_DE_LEURS_ARGUMENTS_VERSION_02', il a ete */ /* necessaire le 20040617181037 de mettre dans le fichier '$DEF' associe le definitions */ /* suivantes : */ /* */ /* TypedefP(X_Visual,Visual) */ /* */ /* car, en effet, avec cette nouvelle VERSION, les fichiers de type '$EXT' contiendront */ /* en general des 'Argument's et il est donc necessaire que les 'A___...' correspondant */ /* soient disponibles avant ces declarations 'Argument's... */ /* ainsi que la nature 'pseudo' ou 'vraies' couleurs (voir <X11/Xlib.h>). */ /* Structure definissant les parametres de recherche d'un "visual" correspondant */ /* a un type donne (voir <X11/Xutil.h>). */ /* */ /* A cause de 'DECLARATIONS_DES_FONCTIONS_ET_DE_LEURS_ARGUMENTS_VERSION_02', il a ete */ /* necessaire le 20040617181037 de mettre dans le fichier '$DEF' associe le definitions */ /* suivantes : */ /* */ /* TypedefP(X_XVisualInfo,XVisualInfo) */ /* TypedefS(A___X_XVisualInfo,X_XVisualInfo) */ /* */ /* car, en effet, avec cette nouvelle VERSION, les fichiers de type '$EXT' contiendront */ /* en general des 'Argument's et il est donc necessaire que les 'A___...' correspondant */ /* soient disponibles avant ces declarations 'Argument's... */ /* Structure definissant un identificateur de palette de couleurs (voir <X11/X.h>). */ /* */ /* A cause de 'DECLARATIONS_DES_FONCTIONS_ET_DE_LEURS_ARGUMENTS_VERSION_02', il a ete */ /* necessaire le 20040617181037 de mettre dans le fichier '$DEF' associe le definitions */ /* suivantes : */ /* */ /* TypedefP(X_Colormap,Colormap) */ /* TypedefS(A___X_Colormap,X_Colormap) */ /* */ /* car, en effet, avec cette nouvelle VERSION, les fichiers de type '$EXT' contiendront */ /* en general des 'Argument's et il est donc necessaire que les 'A___...' correspondant */ /* soient disponibles avant ces declarations 'Argument's... */ TypedefP(X_XColor,XColor) /* Structure definissant le format d'une entree de palette de couleurs (voir <X11/Xlib.h>). */ TypedefP(X_XGCValues,XGCValues) /* Structure definissant les valeurs d'un contexte graphique, et par exemple la */ /* fonction d'ecriture des points des images (voir <X11/Xlib.h>). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* R E F E R E N C E S E X T E R N E S : */ /* */ /*************************************************************************************************************************************/ DEFV(Extern,DEFV(X_Display,POINTERs(XOpenDisplay()))); /* Fonction permettant d'etablir la connexion entre un client (le programme courant) */ /* et le serveur 'X-Window' argument. */ # if ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (defined(SYSTEME_APC_LinuxRedHat_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_ICC)) \ || (defined(SYSTEME_APC_LinuxUlmint_GCC)) \ || (defined(SYSTEME_APC_LinuxUlmint_ICC)) \ ) /* Cette conditionnalite a ete introduite le 20050707100152 suite a un "upgrade" */ /* de '$LACT17'... */ DEFV(Extern,DEFV(X_Int,XCloseDisplay())); # Aif ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (defined(SYSTEME_APC_LinuxRedHat_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_ICC)) \ || (defined(SYSTEME_APC_LinuxUlmint_GCC)) \ || (defined(SYSTEME_APC_LinuxUlmint_ICC)) \ ) DEFV(Extern,DEFV(X_Display,POINTERs(XCloseDisplay()))); # Eif ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (defined(SYSTEME_APC_LinuxRedHat_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_ICC)) \ || (defined(SYSTEME_APC_LinuxUlmint_GCC)) \ || (defined(SYSTEME_APC_LinuxUlmint_ICC)) \ ) /* Fonction permettant de rompre la connexion entre un client (le programme courant) */ /* et le serveur 'X-Window' argument. */ /* ATTENTION, avant l'introduction de la 'PASSE 6', cette 'Extern' etait encadre par : */ /* */ /* # if ( (! defined(SYSTEME_CRAYYMP1_UNICOS)) \ */ /* && (! defined(SYSTEME_CRAYYMP2_UNICOS)) \ */ /* && (! defined(SYSTEME_CRAYYMP4_UNICOS)) \ */ /* && (! defined(SYSTEME_FX2800_CONCENTRIX)) \ */ /* && (! defined(SYSTEME_FX40_CONCENTRIX)) \ */ /* && (! defined(SYSTEME_HP705_HPUX)) \ */ /* && (! defined(SYSTEME_HP710_HPUX)) \ */ /* && (! defined(SYSTEME_HP720_HPUX)) \ */ /* && (! defined(SYSTEME_HP750_HPUX)) \ */ /* && (! defined(SYSTEME_HP755_HPUX)) \ */ /* && (! defined(SYSTEME_HP819_HPUX)) \ */ /* && (! defined(SYSTEME_NWS3000_NEWSOS)) \ */ /* && (! defined(SYSTEME_RS6000_AIX)) \ */ /* && (! defined(SYSTEME_SG4D20G_IRIX)) \ */ /* && (! defined(SYSTEME_SG4D25TG_IRIX)) \ */ /* && (! defined(SYSTEME_SG4D310VGX_IRIX)) \ */ /* && (! defined(SYSTEME_SG4D35TG_IRIX)) \ */ /* && (! defined(SYSTEME_SG4D85GT_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND308_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND324_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND3GA_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND408_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND424_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND4GA_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND508_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND524_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND5GA_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND808_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND824_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND8GA_IRIX)) \ */ /* && (! defined(SYSTEME_SGINDA08_IRIX)) \ */ /* && (! defined(SYSTEME_SGINDA24_IRIX)) \ */ /* && (! defined(SYSTEME_SGINDAGA_IRIX)) \ */ /* && (! defined(SYSTEME_SGO200A1_IRIX)) \ */ /* && (! defined(SYSTEME_SGO200A2_IRIX)) \ */ /* && (! defined(SYSTEME_SGO200A4_IRIX)) \ */ /* && (! defined(SYSTEME_SGO25224_IRIX)) \ */ /* && (! defined(SYSTEME_SGO252VA_IRIX)) \ */ /* && (! defined(SYSTEME_SGO252VN_IRIX)) \ */ /* && (! defined(SYSTEME_SGPCM801_IRIX)) \ */ /* && (! defined(SYSTEME_SGPCMA01_IRIX)) \ */ /* && (! defined(SYSTEME_SUN3_SUNOS)) \ */ /* && (! defined(SYSTEME_SUN4_SUNOS)) \ */ /* && (! defined(SYSTEME_VAX8600_ULTRIX)) \ */ /* && (! defined(SYSTEME_VAX9000_ULTRIX)) \ */ /* ) */ /* DEFV(Extern,DEFV(X_Display,POINTERs(XCloseDisplay()))); */ /* # Aif ( (! defined(SYSTEME_CRAYYMP1_UNICOS)) \ */ /* && (! defined(SYSTEME_CRAYYMP2_UNICOS)) \ */ /* && (! defined(SYSTEME_CRAYYMP4_UNICOS)) \ */ /* && (! defined(SYSTEME_FX2800_CONCENTRIX)) \ */ /* && (! defined(SYSTEME_FX40_CONCENTRIX)) \ */ /* && (! defined(SYSTEME_HP705_HPUX)) \ */ /* && (! defined(SYSTEME_HP710_HPUX)) \ */ /* && (! defined(SYSTEME_HP720_HPUX)) \ */ /* && (! defined(SYSTEME_HP750_HPUX)) \ */ /* && (! defined(SYSTEME_HP755_HPUX)) \ */ /* && (! defined(SYSTEME_HP819_HPUX)) \ */ /* && (! defined(SYSTEME_NWS3000_NEWSOS)) \ */ /* && (! defined(SYSTEME_RS6000_AIX)) \ */ /* && (! defined(SYSTEME_SG4D20G_IRIX)) \ */ /* && (! defined(SYSTEME_SG4D25TG_IRIX)) \ */ /* && (! defined(SYSTEME_SG4D310VGX_IRIX)) \ */ /* && (! defined(SYSTEME_SG4D35TG_IRIX)) \ */ /* && (! defined(SYSTEME_SG4D85GT_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND308_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND324_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND3GA_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND408_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND424_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND4GA_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND508_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND524_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND5GA_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND808_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND824_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND8GA_IRIX)) \ */ /* && (! defined(SYSTEME_SGINDA08_IRIX)) \ */ /* && (! defined(SYSTEME_SGINDA24_IRIX)) \ */ /* && (! defined(SYSTEME_SGINDAGA_IRIX)) \ */ /* && (! defined(SYSTEME_SGO200A1_IRIX)) \ */ /* && (! defined(SYSTEME_SGO200A2_IRIX)) \ */ /* && (! defined(SYSTEME_SGO200A4_IRIX)) \ */ /* && (! defined(SYSTEME_SGO25224_IRIX)) \ */ /* && (! defined(SYSTEME_SGO252VA_IRIX)) \ */ /* && (! defined(SYSTEME_SGO252VN_IRIX)) \ */ /* && (! defined(SYSTEME_SGPCM801_IRIX)) \ */ /* && (! defined(SYSTEME_SGPCMA01_IRIX)) \ */ /* && (! defined(SYSTEME_SUN3_SUNOS)) \ */ /* && (! defined(SYSTEME_SUN4_SUNOS)) \ */ /* && (! defined(SYSTEME_VAX8600_ULTRIX)) \ */ /* && (! defined(SYSTEME_VAX9000_ULTRIX)) \ */ /* ) */ /* # Eif ( (! defined(SYSTEME_CRAYYMP1_UNICOS)) \ */ /* && (! defined(SYSTEME_CRAYYMP2_UNICOS)) \ */ /* && (! defined(SYSTEME_CRAYYMP4_UNICOS)) \ */ /* && (! defined(SYSTEME_FX2800_CONCENTRIX)) \ */ /* && (! defined(SYSTEME_FX40_CONCENTRIX)) \ */ /* && (! defined(SYSTEME_HP705_HPUX)) \ */ /* && (! defined(SYSTEME_HP710_HPUX)) \ */ /* && (! defined(SYSTEME_HP720_HPUX)) \ */ /* && (! defined(SYSTEME_HP750_HPUX)) \ */ /* && (! defined(SYSTEME_HP755_HPUX)) \ */ /* && (! defined(SYSTEME_HP819_HPUX)) \ */ /* && (! defined(SYSTEME_NWS3000_NEWSOS)) \ */ /* && (! defined(SYSTEME_RS6000_AIX)) \ */ /* && (! defined(SYSTEME_SG4D20G_IRIX)) \ */ /* && (! defined(SYSTEME_SG4D25TG_IRIX)) \ */ /* && (! defined(SYSTEME_SG4D310VGX_IRIX)) \ */ /* && (! defined(SYSTEME_SG4D35TG_IRIX)) \ */ /* && (! defined(SYSTEME_SG4D85GT_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND308_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND324_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND3GA_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND408_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND424_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND4GA_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND508_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND524_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND5GA_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND808_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND824_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND8GA_IRIX)) \ */ /* && (! defined(SYSTEME_SGINDA08_IRIX)) \ */ /* && (! defined(SYSTEME_SGINDA24_IRIX)) \ */ /* && (! defined(SYSTEME_SGINDAGA_IRIX)) \ */ /* && (! defined(SYSTEME_SGO200A1_IRIX)) \ */ /* && (! defined(SYSTEME_SGO200A2_IRIX)) \ */ /* && (! defined(SYSTEME_SGO200A4_IRIX)) \ */ /* && (! defined(SYSTEME_SGO25224_IRIX)) \ */ /* && (! defined(SYSTEME_SGO252VA_IRIX)) \ */ /* && (! defined(SYSTEME_SGO252VN_IRIX)) \ */ /* && (! defined(SYSTEME_SGPCM801_IRIX)) \ */ /* && (! defined(SYSTEME_SGPCMA01_IRIX)) \ */ /* && (! defined(SYSTEME_SUN3_SUNOS)) \ */ /* && (! defined(SYSTEME_SUN4_SUNOS)) \ */ /* && (! defined(SYSTEME_VAX8600_ULTRIX)) \ */ /* && (! defined(SYSTEME_VAX9000_ULTRIX)) \ */ /* ) */ /* */ DEFV(Extern,DEFV(X_Int_Void,XSetCloseDownMode())); /* Fonction permettant de rendre permanent ou temporaire (ce qui signifie qu'elles sont */ /* detruites lors du 'IXclose(...)') tout ce que l'on cree (et les palettes de couleurs */ /* en particulier... */ DEFV(Extern,DEFV(X_Window,XCreateWindow())); /* Fonction creant une fenetre et mettant en place certains de ses attributs, mais */ /* sans la faire apparaitre (voir l'operation 'map'). */ DEFV(Extern,DEFV(X_Int_Void,XDestroyWindow())); /* Fonction fermant une fenetre. */ DEFV(Extern,DEFV(X_Int_Void,XSelectInput())); /* Fonction indiquant quels sont les evenements qui seront transmis a la fenetre. */ DEFV(Extern,DEFV(X_Int,XNextEvent())); /* Fonction renvoyant l'evenement "interessant" suivant relatif a la fenetre. */ DEFV(Extern,DEFV(X_Int_Void,XSync())); /* Fonction "purgeant" la liste des evenements en attente... */ DEFV(Extern,DEFV(X_Int,XSetStandardProperties())); /* Fonction fixant les proprietes standards de la fenetre. */ DEFV(Extern,DEFV(X_Status,XGetWindowAttributes())); /* Fonction recuperant les proprietes effectives d'une fenetre... */ DEFV(Extern,DEFV(X_Int_Void,XSetWindowBackground())); /* Fonction fixant le niveau du fond de la fenetre. */ DEFV(Extern,DEFV(X_Int_Void,XSetWindowBorder())); /* Fonction fixant le niveau de la bordure de la fenetre. */ DEFV(Extern,DEFV(X_Int_Void,XChangeWindowAttributes())); /* Fonction permettant de changer les attributs d'une fenetre. */ # if ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (defined(SYSTEME_APC_LinuxRedHat_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_ICC)) \ || (defined(SYSTEME_APC_LinuxUlmint_GCC)) \ || (defined(SYSTEME_APC_LinuxUlmint_ICC)) \ ) DEFV(Extern,DEFV(X_XVisualInfo,POINTERs(XGetVisualInfo()))); # Aif ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (defined(SYSTEME_APC_LinuxRedHat_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_ICC)) \ || (defined(SYSTEME_APC_LinuxUlmint_GCC)) \ || (defined(SYSTEME_APC_LinuxUlmint_ICC)) \ ) DEFV(Extern,DEFV(X_XVisualInfo,POINTERbp(XGetVisualInfo()))); # Eif ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (defined(SYSTEME_APC_LinuxRedHat_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_ICC)) \ || (defined(SYSTEME_APC_LinuxUlmint_GCC)) \ || (defined(SYSTEME_APC_LinuxUlmint_ICC)) \ ) /* Fonction permettant de recuperer les differents types de visuels supportes physiquement, */ /* et correspondant a certaines specifications donnees en argument. */ /* ATTENTION, avant l'introduction de la 'PASSE 6', cette 'Extern' etait encadre par : */ /* */ /* # if ( (! defined(SYSTEME_CRAYYMP1_UNICOS)) \ */ /* && (! defined(SYSTEME_CRAYYMP2_UNICOS)) \ */ /* && (! defined(SYSTEME_CRAYYMP4_UNICOS)) \ */ /* && (! defined(SYSTEME_ES9000_AIX)) \ */ /* && (! defined(SYSTEME_FX2800_CONCENTRIX)) \ */ /* && (! defined(SYSTEME_FX40_CONCENTRIX)) \ */ /* && (! defined(SYSTEME_HP705_HPUX)) \ */ /* && (! defined(SYSTEME_HP710_HPUX)) \ */ /* && (! defined(SYSTEME_HP720_HPUX)) \ */ /* && (! defined(SYSTEME_HP750_HPUX)) \ */ /* && (! defined(SYSTEME_HP755_HPUX)) \ */ /* && (! defined(SYSTEME_HP819_HPUX)) \ */ /* && (! defined(SYSTEME_NWS3000_NEWSOS)) \ */ /* && (! defined(SYSTEME_RS6000_AIX)) \ */ /* && (! defined(SYSTEME_SG4D20G_IRIX)) \ */ /* && (! defined(SYSTEME_SG4D25TG_IRIX)) \ */ /* && (! defined(SYSTEME_SG4D310VGX_IRIX)) \ */ /* && (! defined(SYSTEME_SG4D35TG_IRIX)) \ */ /* && (! defined(SYSTEME_SG4D85GT_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND308_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND324_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND3GA_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND408_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND424_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND4GA_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND508_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND524_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND5GA_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND808_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND824_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND8GA_IRIX)) \ */ /* && (! defined(SYSTEME_SGINDA08_IRIX)) \ */ /* && (! defined(SYSTEME_SGINDA24_IRIX)) \ */ /* && (! defined(SYSTEME_SGINDAGA_IRIX)) \ */ /* && (! defined(SYSTEME_SGO200A1_IRIX)) \ */ /* && (! defined(SYSTEME_SGO200A2_IRIX)) \ */ /* && (! defined(SYSTEME_SGO200A4_IRIX)) \ */ /* && (! defined(SYSTEME_SGO25224_IRIX)) \ */ /* && (! defined(SYSTEME_SGO252VA_IRIX)) \ */ /* && (! defined(SYSTEME_SGO252VN_IRIX)) \ */ /* && (! defined(SYSTEME_SGPCM801_IRIX)) \ */ /* && (! defined(SYSTEME_SGPCMA01_IRIX)) \ */ /* && (! defined(SYSTEME_VAX8600_ULTRIX)) \ */ /* && (! defined(SYSTEME_VAX9000_ULTRIX)) \ */ /* ) */ /* DEFV(Extern,DEFV(X_XVisualInfo,POINTERbp(XGetVisualInfo()))); */ /* # Aif ( (! defined(SYSTEME_CRAYYMP1_UNICOS)) \ */ /* && (! defined(SYSTEME_CRAYYMP2_UNICOS)) \ */ /* && (! defined(SYSTEME_CRAYYMP4_UNICOS)) \ */ /* && (! defined(SYSTEME_ES9000_AIX)) \ */ /* && (! defined(SYSTEME_FX2800_CONCENTRIX)) \ */ /* && (! defined(SYSTEME_FX40_CONCENTRIX)) \ */ /* && (! defined(SYSTEME_HP705_HPUX)) \ */ /* && (! defined(SYSTEME_HP710_HPUX)) \ */ /* && (! defined(SYSTEME_HP720_HPUX)) \ */ /* && (! defined(SYSTEME_HP750_HPUX)) \ */ /* && (! defined(SYSTEME_HP755_HPUX)) \ */ /* && (! defined(SYSTEME_HP819_HPUX)) \ */ /* && (! defined(SYSTEME_NWS3000_NEWSOS)) \ */ /* && (! defined(SYSTEME_RS6000_AIX)) \ */ /* && (! defined(SYSTEME_SG4D20G_IRIX)) \ */ /* && (! defined(SYSTEME_SG4D25TG_IRIX)) \ */ /* && (! defined(SYSTEME_SG4D310VGX_IRIX)) \ */ /* && (! defined(SYSTEME_SG4D35TG_IRIX)) \ */ /* && (! defined(SYSTEME_SG4D85GT_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND308_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND324_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND3GA_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND408_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND424_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND4GA_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND508_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND524_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND5GA_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND808_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND824_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND8GA_IRIX)) \ */ /* && (! defined(SYSTEME_SGINDA08_IRIX)) \ */ /* && (! defined(SYSTEME_SGINDA24_IRIX)) \ */ /* && (! defined(SYSTEME_SGINDAGA_IRIX)) \ */ /* && (! defined(SYSTEME_SGO200A1_IRIX)) \ */ /* && (! defined(SYSTEME_SGO200A2_IRIX)) \ */ /* && (! defined(SYSTEME_SGO200A4_IRIX)) \ */ /* && (! defined(SYSTEME_SGO25224_IRIX)) \ */ /* && (! defined(SYSTEME_SGO252VA_IRIX)) \ */ /* && (! defined(SYSTEME_SGO252VN_IRIX)) \ */ /* && (! defined(SYSTEME_SGPCM801_IRIX)) \ */ /* && (! defined(SYSTEME_SGPCMA01_IRIX)) \ */ /* && (! defined(SYSTEME_VAX8600_ULTRIX)) \ */ /* && (! defined(SYSTEME_VAX9000_ULTRIX)) \ */ /* ) */ /* # Eif ( (! defined(SYSTEME_CRAYYMP1_UNICOS)) \ */ /* && (! defined(SYSTEME_CRAYYMP2_UNICOS)) \ */ /* && (! defined(SYSTEME_CRAYYMP4_UNICOS)) \ */ /* && (! defined(SYSTEME_ES9000_AIX)) \ */ /* && (! defined(SYSTEME_FX2800_CONCENTRIX)) \ */ /* && (! defined(SYSTEME_FX40_CONCENTRIX)) \ */ /* && (! defined(SYSTEME_HP705_HPUX)) \ */ /* && (! defined(SYSTEME_HP710_HPUX)) \ */ /* && (! defined(SYSTEME_HP720_HPUX)) \ */ /* && (! defined(SYSTEME_HP750_HPUX)) \ */ /* && (! defined(SYSTEME_HP755_HPUX)) \ */ /* && (! defined(SYSTEME_HP819_HPUX)) \ */ /* && (! defined(SYSTEME_NWS3000_NEWSOS)) \ */ /* && (! defined(SYSTEME_RS6000_AIX)) \ */ /* && (! defined(SYSTEME_SG4D20G_IRIX)) \ */ /* && (! defined(SYSTEME_SG4D25TG_IRIX)) \ */ /* && (! defined(SYSTEME_SG4D310VGX_IRIX)) \ */ /* && (! defined(SYSTEME_SG4D35TG_IRIX)) \ */ /* && (! defined(SYSTEME_SG4D85GT_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND308_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND324_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND3GA_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND408_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND424_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND4GA_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND508_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND524_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND5GA_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND808_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND824_IRIX)) \ */ /* && (! defined(SYSTEME_SGIND8GA_IRIX)) \ */ /* && (! defined(SYSTEME_SGINDA08_IRIX)) \ */ /* && (! defined(SYSTEME_SGINDA24_IRIX)) \ */ /* && (! defined(SYSTEME_SGINDAGA_IRIX)) \ */ /* && (! defined(SYSTEME_SGO200A1_IRIX)) \ */ /* && (! defined(SYSTEME_SGO200A2_IRIX)) \ */ /* && (! defined(SYSTEME_SGO200A4_IRIX)) \ */ /* && (! defined(SYSTEME_SGO25224_IRIX)) \ */ /* && (! defined(SYSTEME_SGO252VA_IRIX)) \ */ /* && (! defined(SYSTEME_SGO252VN_IRIX)) \ */ /* && (! defined(SYSTEME_SGPCM801_IRIX)) \ */ /* && (! defined(SYSTEME_SGPCMA01_IRIX)) \ */ /* && (! defined(SYSTEME_VAX8600_ULTRIX)) \ */ /* && (! defined(SYSTEME_VAX9000_ULTRIX)) \ */ /* ) */ /* */ DEFV(Extern,DEFV(X_Colormap,XCreateColormap())); /* Fonction permettant de creer une palette de couleurs. */ DEFV(Extern,DEFV(X_Int_Void,XInstallColormap())); /* Fonction d'installation physique (au niveau hardware) d'une palette de couleur. */ DEFV(Extern,DEFV(X_Int_Void,XFreeColormap())); /* Fonction de desinstallation physique (au niveau hardware) d'une palette de couleur et */ /* de liberation des ressources correspondantes (elle inclue 'XUninstallColormap(...)')... */ DEFV(Extern,DEFV(X_Status,XAllocColorCells())); /* Fonction d'allocation de plusieurs entrees d'une palette de couleurs en mode */ /* 'read-write', c'est-a-dire que l'on peut faire des mises a jour... */ DEFV(Extern,DEFV(X_Int_Void,XStoreColors())); /* Fonction de positionnement de plusieurs entrees d'une palette de couleurs en mode */ /* 'read-write', c'est-a-dire que l'on peut faire des mises a jour... */ DEFV(Extern,DEFV(X_Int_Void,XSetWindowColormap())); /* Fonction de "connexion" d'une fenetre a la fenetre a laquelle elle est destinee. */ DEFV(Extern,DEFV(X_Int_Void,XMapWindow())); /* Fonction de visualisation d'une fenetre. */ DEFV(Extern,DEFV(X_Int_Void,XUnmapWindow())); /* Fonction faisant disparaitre une fenetre ("de-visualisation"). */ DEFV(Extern,DEFV(X_XImage,POINTERs(XCreateImage()))); /* Fonction permettant de definir une image au sens 'X-Window' a partir d'une */ /* image raster. */ /* ATTENTION : 'XDestroyImage()' (fonction faisant disparaitre la structure d'une image */ /* raster), n'est pas une fonction, mais un '#define'... */ DEFV(Extern,DEFV(X_GC,XCreateGC())); /* Fonction de creation d'un contexte graphique. */ DEFV(Extern,DEFV(X_Int_Void,XFreeGC())); /* Fonction de liberation d'un contexte graphique. */ DEFV(Extern,DEFV(X_Int,XPutImage())); /* Fonction d'envoi d'une image raster (ou d'une sous-image) dans une fenetre (ou une */ /* partie d'une fenetre). */ DEFV(Extern,DEFV(X_Int_Void,XFree())); /* Fonction de liberation d'a peu pres n'importe quoi... */ /* ATTENTION, avant l'introduction de la 'PASSE 6', cette 'Extern' etait encadre par : */ /* */ /* # if ( (! defined(SYSTEME_CRAYYMP1_UNICOS)) \ */ /* && (! defined(SYSTEME_CRAYYMP2_UNICOS)) \ */ /* && (! defined(SYSTEME_CRAYYMP4_UNICOS)) \ */ /* ) */ /* DEFV(Extern,DEFV(X_Int,XFree())); */ /* # Aif ( (! defined(SYSTEME_CRAYYMP1_UNICOS)) \ */ /* && (! defined(SYSTEME_CRAYYMP2_UNICOS)) \ */ /* && (! defined(SYSTEME_CRAYYMP4_UNICOS)) \ */ /* ) */ /* # Eif ( (! defined(SYSTEME_CRAYYMP1_UNICOS)) \ */ /* && (! defined(SYSTEME_CRAYYMP2_UNICOS)) \ */ /* && (! defined(SYSTEME_CRAYYMP4_UNICOS)) \ */ /* ) */ /* */ # define Xliberation(pointeur) \ XFree(Cara(pointeur)) \ /* Numero de l'ecran utilise sur le serveur courant. */ /* Le 20170711170134 je note l'absence apparente des declarations suivantes : */ /* */ /* */ /* :Debut_listMN_FauxExterns_11: */ /* */ /* DEFV(Extern,DEFV(X_Window,RootWindow())); */ /* DEFV(Extern,DEFV(X_Int,ScreenCount())); */ /* DEFV(Extern,DEFV(X_Int,VendorRelease())); */ /* DEFV(Extern,DEFV(X_UnsignedLongInt,WhitePixel())); */ /* DEFV(Extern,DEFV(X_Int_Void,XDefaultScreenOfDisplay())); */ /* DEFV(Extern,DEFV(X_Int,XDestroyImage())); */ /* DEFV(Extern,DEFV(X_Int,XPutPixel())); */ /* DEFV(Extern,DEFV(X_Int,BitmapBitOrder())); */ /* DEFV(Extern,DEFV(X_UnsignedLongInt,BlackPixel())); */ /* DEFV(Extern,DEFV(X_Colormap,DefaultColormap())); */ /* DEFV(Extern,DEFV(X_Int,DefaultDepth())); */ /* DEFV(Extern,DEFV(X_Int,DefaultScreen())); */ /* DEFV(Extern,DEFV(X_Int,DisplayHeight())); */ /* DEFV(Extern,DEFV(X_Int,DisplayWidth())); */ /* DEFV(Extern,DEFV(X_Int,DoesBackingStore())); */ /* DEFV(Extern,DEFV(X_Bool,DoesSaveUnders())); */ /* DEFV(Extern,DEFV(X_Visual,POINTERs(DefaultVisual()))); */ /* */ /* :Fin_listMN_FauxExterns_11: */ /* */ /* */ /* Mais en fait, elles ne manquent pas : ce sont des macro-procedures qui sont definies */ /* dans 'v /usr/include/Xlib$h RootWindow'... */ /* */ /* Cela s'est vu a cette date lors de tests de 'v $xcc/LFonctions$vv$Z CaTaLoGuE_FS'... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C H O I X D E L A F A C O N D ' A C C E D E R A U X P A L E T T E S D E C O U L E U R S : */ /* */ /*************************************************************************************************************************************/ DEFV(Common,DEFV(Logical,ZINT(IXopen_____X_Window_accepter_le_serveur_sans_verification,VRAI))); /* Introduit le 20100109111637 afin de faciliter le serveur 'Xming' sur MACHINE sous */ /* Windows Vista. Le 20100109113931 cet indicateur est passe de 'FAUX' a 'VRAI' de facon */ /* a se faciliter la vie... */ DEFV(Common,DEFV(Logical,ZINT(IXopen_____mettre_X_Window_en_mode_fausses_couleurs,VRAI))); DEFV(Local,DEFV(Logical,INIT(IXopen_____tenter_X_Window_en_mode_fausses_couleurs,LUNDEF))); /* Afin de forcer (si possible...) le mode de coloriage de 'IXopen(...)' (introduit le */ /* 20021231091605). L'indicateur "Local" a ete introduit le 20030109154236 lors de */ /* problemes rencontres en essayant de visualiser des images vraies couleurs sur les */ /* MACHINEs '$LACT12' et '$LACT27' depuis '$LACT15'... */ DEFV(Common,DEFV(Logical,INIT(IXopen_____X_Window_a_ete_mis_en_mode_fausses_couleurs,VRAI))); /* Nombre d'octets par point (introduit le 20021228133142 en vue d'une utilisation future */ /* de 'TrueColor' et modifie le 20021228182439 afin de donner un indicateur logique de */ /* l'utilisation qui est faite...). Le 20030101233411, cet indicateur est passe de */ /* 'Local' a 'Common' de facon a pouvoir etre teste au retour de 'IXopen(...)', par */ /* exemple dans 'v $xci/display$K IXopen_____X_Window_a_ete_mis_en_mode_fausses_couleurs'. */ % define ACCES_AUX_PALETTES_DE_COULEURS_VERSION_01 \ IFET(EST_VRAI(IXopen_____X_Window_a_ete_mis_en_mode_fausses_couleurs) \ ,NOTL(ACCES_AUX_PALETTES_DE_COULEURS_VERSION_02_TEST_DU_SERVEUR_X_WINDOW) \ ) /* Cette facon d'acceder aux palettes de couleurs utilise la palette de couleur definie */ /* par defaut, et definie par 'DefaultColormap(...)'. */ # define LE_SERVEUR_X_WINDOW_EST(nom_presume_du_serveur_et_de_l_ecran) \ LE_SERVEUR_X_WINDOW_EST_CELUI_DE(nom_presume_du_serveur_et_de_l_ecran) \ /* Pour raccourcir les lignes qui suivent... */ % define ACCES_AUX_PALETTES_DE_COULEURS_VERSION_02_TEST_DU_SERVEUR_X_WINDOW \ IFOU(EST_VRAI(IXopen_____X_Window_accepter_le_serveur_sans_verification) \ ,IFET(EST_FAUX(IXopen_____X_Window_accepter_le_serveur_sans_verification) \ ,I10OU(LE_SERVEUR_X_WINDOW_EST("X_LACT14") \ ,LE_SERVEUR_X_WINDOW_EST("X_LACT15") \ ,LE_SERVEUR_X_WINDOW_EST("X_LACT16") \ ,LE_SERVEUR_X_WINDOW_EST("X_LACT17") \ ,LE_SERVEUR_X_WINDOW_EST("X_LACT18") \ ,LE_SERVEUR_X_WINDOW_EST("X_LACT19") \ ,LE_SERVEUR_X_WINDOW_EST("X_LACT1A") \ ,LE_SERVEUR_X_WINDOW_EST("X_LACT1B") \ ,LE_SERVEUR_X_WINDOW_EST("X_SHM") \ ,TOUJOURS_FAUX \ ) \ ) \ ) \ /* L'operateur 'I9OU(...)' a ete introduit le 20170612114514 afin de simplifier... */ # undef LE_SERVEUR_X_WINDOW_EST % define ACCES_AUX_PALETTES_DE_COULEURS_VERSION_02 \ IFET(EST_VRAI(IXopen_____X_Window_a_ete_mis_en_mode_fausses_couleurs) \ ,NEUL(ACCES_AUX_PALETTES_DE_COULEURS_VERSION_02_TEST_DU_SERVEUR_X_WINDOW) \ ) /* Cette facon d'acceder aux palettes de couleurs utilise une palette specifique, allouee */ /* a l'aide de 'XCreateColormap(...)'. On notera que le test de 'X_SHM' a ete ajoute le */ /* 1995111400 afin de tenter de contourner le fameux probleme du 'vswap' (voir l'appel */ /* 30628 dans le fichier d'anomalie 'v $Dbugs/SGIND4GA$D/IRIX$D/$Fnota'). On notera que l'on */ /* teste 'X_SHM' et non pas 'X_LOCAL' afin de bien etre sur que l'on est sur un SYSTEME qui */ /* connait 'X_SHM' (et donc de type 'SYSTEME_SG...') ; en effet, 'X_LOCAL' est defini */ /* sur tous les SYSTEMEs, ce qui n'est pas le cas de 'X_SHM' (voir '$Fmachines'). */ /* */ /* ATTENTION, j'ai note le 20001016112859 qu'il ne fallait pas mettre '$LACT14' dans cette */ /* liste... */ /* */ /* Le 20030328115912, '$LACT14' etant passe en vraies couleurs, j'ai pu l'introduire dans */ /* cette liste... */ /* */ /* On notera que les MACHINEs ayant acces a 'X-Window' en vraies couleurs (a savoir */ /* {$LACT14,$LACT15,$LACT16}) doivent etre declarees aussi dans 'v $Falias_v 20021231104914' */ /* et dans 'v $xE/.divers$D/anim3$vv$Y 20030102123734'. La MACHINE '$LACT16' a ete */ /* introduite le 20031020161556. */ % define ACCES_AUX_PALETTES_DE_COULEURS_VERSION_03 \ EST_FAUX(IXopen_____X_Window_a_ete_mis_en_mode_fausses_couleurs) /* Ceci a ete introduit "preventivement" le 20021228182439... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N S L O C A L E S : */ /* */ /*************************************************************************************************************************************/ # define ECRAN_UTILISE \ DefaultScreen(description_du_serveur_et_de_l_ecran) \ /* Numero de l'ecran utilise sur le serveur courant. */ # define NOMBRE_DE_BITS_PAR_POINT \ DefaultDepth(description_du_serveur_et_de_l_ecran,ECRAN_UTILISE) \ /* Nombre de bits utilises pour coder un point. */ # define NOMBRE_EFFECTIF_DE_BITS_PAR_POINT(X_Window_est_en_mode_fausses_couleurs) \ MUL2(COND(EST_VRAI(X_Window_est_en_mode_fausses_couleurs) \ ,UN \ ,NOMBRE_DE_COMPOSANTES_CHROMATIQUES \ ) \ ,NBITOC \ ) \ /* Nombre effectif de bits utilises pour coder un point. */ \ /* */ \ /* Le 20030110092548, j'ai ajoute l'argument 'X_Window_est_en_mode_fausses_couleurs' qui */ \ /* permet d'utiliser 'IXopen_____X_Window_a_ete_mis_en_mode_fausses_couleurs' lors de */ \ /* l'appel de cette procedure apres un 'IXopen(...)', ce qui permet alors de vraiment */ \ /* connaitre le nombre effectif de bits... */ # define MASQUE_D_UN_POINT \ gMASQUE(NOMBRE_DE_BITS_PAR_POINT) \ /* Masque binaire du niveau d'un point. */ # define NIVEAU_DU_NOIR_DE_L_ECRAN \ BlackPixel(description_du_serveur_et_de_l_ecran,ECRAN_UTILISE) \ /* Niveau de gris definissant le noir de l'ecran utilise. */ # define NIVEAU_DU_BLANC_DE_L_ECRAN \ WhitePixel(description_du_serveur_et_de_l_ecran,ECRAN_UTILISE) \ /* Niveau de gris definissant le blanc de l'ecran utilise. */ # define VRAI_NIVEAU_DE_NOIR_DE_L_ECRAN \ NOIR \ /* Niveau de gris servant de reference aux autres niveaux. */ # define VRAI_NIVEAU_DE_BLANC_DE_L_ECRAN \ MASQUE_D_UN_POINT \ /* Niveau de gris definissant le niveau maximal des niveaux. */ # define EPAISSEUR_DES_BORDURES_DE_FENETRES \ GvalDefaut("BorderWidth",DEUX) \ /* Epaisseur des bordures de toutes les fenetres. Son utilisation se fera en general via */ \ /* un DOUB(...)' du evidemment au fait qu'il y a deux bordures : une en bas et une en haut, */ \ /* et, une a gauche et une a droite respectivement... */ \ /* */ \ /* Le 20121121091543, la valeur par defaut est passee de 'CINQ' a 'DEUX' a cause de */ \ /* l'utilisation qui en est faite dans 'CENTRAGE_EVENTUEL_DE_LA_FENETRE(...)' et etre */ \ /* aussi compatible avec 'v $FXWindow BorderWidth'... */ # define HAUTEUR_DE_L_ECRAN \ SOUS(DisplayHeight(description_du_serveur_et_de_l_ecran,ECRAN_UTILISE) \ ,DOUB(EPAISSEUR_DES_BORDURES_DE_FENETRES) \ ) \ /* Hauteur (en pixels) de l'ecran utilise. */ # define LARGEUR_DE_L_ECRAN \ SOUS(DisplayWidth(description_du_serveur_et_de_l_ecran,ECRAN_UTILISE) \ ,DOUB(EPAISSEUR_DES_BORDURES_DE_FENETRES) \ ) \ /* Largeur (en pixels) de l'ecran utilise. */ # define RACINE_DU_SYSTEME_HIERARCHIQUE_DE_FENETRES \ RootWindow(description_du_serveur_et_de_l_ecran,ECRAN_UTILISE) \ /* Apparence visuelle de l'ecran, c'est-a-dire facon de passer des valeurs des pixels a */ \ /* une representation visuelle en couleurs sur l'ecran. */ # if ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (defined(SYSTEME_APC_LinuxRedHat_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_ICC)) \ || (defined(SYSTEME_APC_LinuxUlmint_GCC)) \ || (defined(SYSTEME_APC_LinuxUlmint_ICC)) \ || (defined(SYSTEME_CRAYC98_UNICOS)) \ || (defined(SYSTEME_CRAYC916_UNICOS)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS)) \ || (defined(SYSTEME_DECALPHA340_OSF1)) \ || (defined(SYSTEME_DECALPHA350_OSF1)) \ || (defined(SYSTEME_DECALPHA464_OSF1)) \ || (defined(SYSTEME_ES9000_AIX)) \ || (defined(SYSTEME_FX2800_CONCENTRIX)) \ || (defined(SYSTEME_FX40_CONCENTRIX)) \ || (defined(SYSTEME_NWS3000_NEWSOS)) \ || (defined(SYSTEME_RS6000_AIX)) \ || (defined(SYSTEME_SG4D20G_IRIX)) \ || (defined(SYSTEME_SG4D25TG_IRIX)) \ || (defined(SYSTEME_SG4D310VGX_IRIX)) \ || (defined(SYSTEME_SG4D35TG_IRIX)) \ || (defined(SYSTEME_SG4D85GT_IRIX)) \ || (defined(SYSTEME_SGIND308_IRIX)) \ || (defined(SYSTEME_SGIND324_IRIX)) \ || (defined(SYSTEME_SGIND3GA_IRIX)) \ || (defined(SYSTEME_SGIND408_IRIX)) \ || (defined(SYSTEME_SGIND424_IRIX)) \ || (defined(SYSTEME_SGIND4GA_IRIX)) \ || (defined(SYSTEME_SGIND508_IRIX)) \ || (defined(SYSTEME_SGIND524_IRIX)) \ || (defined(SYSTEME_SGIND5GA_IRIX)) \ || (defined(SYSTEME_SGIND808_IRIX)) \ || (defined(SYSTEME_SGIND824_IRIX)) \ || (defined(SYSTEME_SGIND8GA_IRIX)) \ || (defined(SYSTEME_SGINDA08_IRIX)) \ || (defined(SYSTEME_SGINDA24_IRIX)) \ || (defined(SYSTEME_SGINDAGA_IRIX)) \ || (defined(SYSTEME_SGO200A1_IRIX)) \ || (defined(SYSTEME_SGO200A2_IRIX)) \ || (defined(SYSTEME_SGO200A4_IRIX)) \ || (defined(SYSTEME_SGO25224_IRIX)) \ || (defined(SYSTEME_SGO252VA_IRIX)) \ || (defined(SYSTEME_SGO252VN_IRIX)) \ || (defined(SYSTEME_SGPCM801_IRIX)) \ || (defined(SYSTEME_SGPCMA01_IRIX)) \ || (defined(SYSTEME_SUN3_SUNOS)) \ || (defined(SYSTEME_SUN4_SUNOS)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS)) \ || (defined(SYSTEME_VAX8600_ULTRIX)) \ || (defined(SYSTEME_VAX9000_ULTRIX)) \ ) # define APPARENCE_VISUELLE_DE_LA_FENETRE \ COND(ACCES_AUX_PALETTES_DE_COULEURS_VERSION_01 \ ,DefaultVisual(description_du_serveur_et_de_l_ecran,ECRAN_UTILISE) \ ,COND(IFOU(ACCES_AUX_PALETTES_DE_COULEURS_VERSION_02 \ ,ACCES_AUX_PALETTES_DE_COULEURS_VERSION_03 \ ) \ ,ASI1(liste_des_visuals_supportes_et_satisfaisants \ ,visual \ ) \ ,ASI1(liste_des_visuals_supportes_et_satisfaisants \ ,visual \ ) \ ) \ ) \ /* Apparence visuelle de l'ecran, c'est-a-dire facon de passer des valeurs des pixels a */ \ /* une representation visuelle en couleurs sur l'ecran. ATTENTION : cette subtilite est */ \ /* due au traitement particulier de la fonction 'XGetVisualInfo(...)' sur ce SYSTEME : en */ \ /* effet, c'est la definition de '@ include <X11/Xutil.h>' que l'on utilise, et qui */ \ /* paradoxalement ne declare par correctement cette fonction, alors qu'elle devrait etre */ \ /* declaree 'DEFV(X_XVisualInfo,POINTERbp(...))'... */ # Aif ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (defined(SYSTEME_APC_LinuxRedHat_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_ICC)) \ || (defined(SYSTEME_APC_LinuxUlmint_GCC)) \ || (defined(SYSTEME_APC_LinuxUlmint_ICC)) \ || (defined(SYSTEME_CRAYC98_UNICOS)) \ || (defined(SYSTEME_CRAYC916_UNICOS)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS)) \ || (defined(SYSTEME_DECALPHA340_OSF1)) \ || (defined(SYSTEME_DECALPHA350_OSF1)) \ || (defined(SYSTEME_DECALPHA464_OSF1)) \ || (defined(SYSTEME_ES9000_AIX)) \ || (defined(SYSTEME_FX2800_CONCENTRIX)) \ || (defined(SYSTEME_FX40_CONCENTRIX)) \ || (defined(SYSTEME_NWS3000_NEWSOS)) \ || (defined(SYSTEME_RS6000_AIX)) \ || (defined(SYSTEME_SG4D20G_IRIX)) \ || (defined(SYSTEME_SG4D25TG_IRIX)) \ || (defined(SYSTEME_SG4D310VGX_IRIX)) \ || (defined(SYSTEME_SG4D35TG_IRIX)) \ || (defined(SYSTEME_SG4D85GT_IRIX)) \ || (defined(SYSTEME_SGIND308_IRIX)) \ || (defined(SYSTEME_SGIND324_IRIX)) \ || (defined(SYSTEME_SGIND3GA_IRIX)) \ || (defined(SYSTEME_SGIND408_IRIX)) \ || (defined(SYSTEME_SGIND424_IRIX)) \ || (defined(SYSTEME_SGIND4GA_IRIX)) \ || (defined(SYSTEME_SGIND508_IRIX)) \ || (defined(SYSTEME_SGIND524_IRIX)) \ || (defined(SYSTEME_SGIND5GA_IRIX)) \ || (defined(SYSTEME_SGIND808_IRIX)) \ || (defined(SYSTEME_SGIND824_IRIX)) \ || (defined(SYSTEME_SGIND8GA_IRIX)) \ || (defined(SYSTEME_SGINDA08_IRIX)) \ || (defined(SYSTEME_SGINDA24_IRIX)) \ || (defined(SYSTEME_SGINDAGA_IRIX)) \ || (defined(SYSTEME_SGO200A1_IRIX)) \ || (defined(SYSTEME_SGO200A2_IRIX)) \ || (defined(SYSTEME_SGO200A4_IRIX)) \ || (defined(SYSTEME_SGO25224_IRIX)) \ || (defined(SYSTEME_SGO252VA_IRIX)) \ || (defined(SYSTEME_SGO252VN_IRIX)) \ || (defined(SYSTEME_SGPCM801_IRIX)) \ || (defined(SYSTEME_SGPCMA01_IRIX)) \ || (defined(SYSTEME_SUN3_SUNOS)) \ || (defined(SYSTEME_SUN4_SUNOS)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS)) \ || (defined(SYSTEME_VAX8600_ULTRIX)) \ || (defined(SYSTEME_VAX9000_ULTRIX)) \ ) # define APPARENCE_VISUELLE_DE_LA_FENETRE \ COND(ACCES_AUX_PALETTES_DE_COULEURS_VERSION_01 \ ,DefaultVisual(description_du_serveur_et_de_l_ecran,ECRAN_UTILISE) \ ,COND(IFOU(ACCES_AUX_PALETTES_DE_COULEURS_VERSION_02 \ ,ACCES_AUX_PALETTES_DE_COULEURS_VERSION_03 \ ) \ ,ASD1(ITbp(liste_des_visuals_supportes_et_satisfaisants \ ,VISUAL_SATISFAISANT_A_UTILISER \ ) \ ,visual \ ) \ ,ASD1(ITbp(liste_des_visuals_supportes_et_satisfaisants \ ,VISUAL_SATISFAISANT_A_UTILISER \ ) \ ,visual \ ) \ ) \ ) \ /* Apparence visuelle de l'ecran, c'est-a-dire facon de passer des valeurs des pixels a */ \ /* une representation visuelle en couleurs sur l'ecran. */ # Eif ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (defined(SYSTEME_APC_LinuxRedHat_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_ICC)) \ || (defined(SYSTEME_APC_LinuxUlmint_GCC)) \ || (defined(SYSTEME_APC_LinuxUlmint_ICC)) \ || (defined(SYSTEME_CRAYC98_UNICOS)) \ || (defined(SYSTEME_CRAYC916_UNICOS)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS)) \ || (defined(SYSTEME_DECALPHA340_OSF1)) \ || (defined(SYSTEME_DECALPHA350_OSF1)) \ || (defined(SYSTEME_DECALPHA464_OSF1)) \ || (defined(SYSTEME_ES9000_AIX)) \ || (defined(SYSTEME_FX2800_CONCENTRIX)) \ || (defined(SYSTEME_FX40_CONCENTRIX)) \ || (defined(SYSTEME_NWS3000_NEWSOS)) \ || (defined(SYSTEME_RS6000_AIX)) \ || (defined(SYSTEME_SG4D20G_IRIX)) \ || (defined(SYSTEME_SG4D25TG_IRIX)) \ || (defined(SYSTEME_SG4D310VGX_IRIX)) \ || (defined(SYSTEME_SG4D35TG_IRIX)) \ || (defined(SYSTEME_SG4D85GT_IRIX)) \ || (defined(SYSTEME_SGIND308_IRIX)) \ || (defined(SYSTEME_SGIND324_IRIX)) \ || (defined(SYSTEME_SGIND3GA_IRIX)) \ || (defined(SYSTEME_SGIND408_IRIX)) \ || (defined(SYSTEME_SGIND424_IRIX)) \ || (defined(SYSTEME_SGIND4GA_IRIX)) \ || (defined(SYSTEME_SGIND508_IRIX)) \ || (defined(SYSTEME_SGIND524_IRIX)) \ || (defined(SYSTEME_SGIND5GA_IRIX)) \ || (defined(SYSTEME_SGIND808_IRIX)) \ || (defined(SYSTEME_SGIND824_IRIX)) \ || (defined(SYSTEME_SGIND8GA_IRIX)) \ || (defined(SYSTEME_SGINDA08_IRIX)) \ || (defined(SYSTEME_SGINDA24_IRIX)) \ || (defined(SYSTEME_SGINDAGA_IRIX)) \ || (defined(SYSTEME_SGO200A1_IRIX)) \ || (defined(SYSTEME_SGO200A2_IRIX)) \ || (defined(SYSTEME_SGO200A4_IRIX)) \ || (defined(SYSTEME_SGO25224_IRIX)) \ || (defined(SYSTEME_SGO252VA_IRIX)) \ || (defined(SYSTEME_SGO252VN_IRIX)) \ || (defined(SYSTEME_SGPCM801_IRIX)) \ || (defined(SYSTEME_SGPCMA01_IRIX)) \ || (defined(SYSTEME_SUN3_SUNOS)) \ || (defined(SYSTEME_SUN4_SUNOS)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS)) \ || (defined(SYSTEME_VAX8600_ULTRIX)) \ || (defined(SYSTEME_VAX9000_ULTRIX)) \ ) # define TYPE_DU_COLORIAGE_COURANT \ ASI1(APPARENCE_VISUELLE_DE_LA_FENETRE,class) \ /* Type du mode de coloriage accessible ('PseudoColor',...). */ # define NOMBRE_MAXIMAL_DE_COULEURS_ACCESSIBLES \ ASI1(APPARENCE_VISUELLE_DE_LA_FENETRE,map_entries) \ /* Nombre maximal de couleurs accessibles. */ # define PALETTE_DE_COULEURS_PAR_DEFAUT \ DefaultColormap(description_du_serveur_et_de_l_ecran,ECRAN_UTILISE) \ /* Palette de couleur par defaut... */ # define PALETTE_DE_COULEURS_UTILISEE \ COND(ACCES_AUX_PALETTES_DE_COULEURS_VERSION_01 \ ,PALETTE_DE_COULEURS_PAR_DEFAUT \ ,COND(ACCES_AUX_PALETTES_DE_COULEURS_VERSION_02 \ ,palette_de_couleurs_creee \ ,palette_de_couleurs_creee \ ) \ ) \ /* Palette de couleurs utilisee pour ranger la palette argument de visualisation. */ # define VISUAL_SATISFAISANT_A_UTILISER \ INDEX0 \ /* Lorsque plusieurs "visual"s correspondent aux besoins exprimes, c'est le premier */ \ /* renvoye qui est utilise... */ # if ( (defined(BUG_SYSTEME_SG_X_WINDOW_BORDER_1)) \ ) # define EPAISSEUR_DU_BORD_DES_FENETRES \ ZERO \ /* Sur 'SYSTEME_SG...._IRIX', un bug tout a fait etonnant est apparu. Lors des appels */ \ /* a 'XPutImage(...)', l'image est visualisee decoupee en environ quatre bandes separees */ \ /* par une bande noire de largeur proportionnelle a 'EPAISSEUR_DU_BORD_DES_FENETRES'. */ \ /* La solution est donc de faire que la bordure des fenetres soit de largeur nulle. Mais */ \ /* ATTENTION : etant donne que l'on peut, par exemple, faire executer un programme sur */ \ /* 'SYSTEME_DPX5000_SPIX' tout en utilisant le serveur 'X-Window' de la machine */ \ /* 'SYSTEME_SG...._IRIX', 'BUG_SYSTEME_SG...._IRIX_X_WINDOW_BORDER_1' ne peut */ \ /* etre conditionnel et soumis a '# ifdef SYSTEME_SG...._IRIX'... */ # Aif ( (defined(BUG_SYSTEME_SG_X_WINDOW_BORDER_1)) \ ) # define EPAISSEUR_DU_BORD_DES_FENETRES \ UN \ /* Epaisseur (en points) de la bordure des fenetres. */ # Eif ( (defined(BUG_SYSTEME_SG_X_WINDOW_BORDER_1)) \ ) # define DECALAGE_DES_POINTS_SUR_LES_LIGNES \ ZERO \ /* Ainsi, le premier point visualisable est le premier point de chaque ligne... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* T E S T T R E S P A R T I C U L I E R D E S E R R E U R S ' X - W I N D O W S ' : */ /* */ /*************************************************************************************************************************************/ # define X_IL_Y_A_ERREUR(f) \ IZEQ(f) \ /* Test d'un retour en erreur d'une fonction 'f' ; on notera les conventions inversees */ \ /* pour 'X-Window', puisqu'on teste la nullite (et non pas la non-nullite)... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 ( D E B U T ) : */ /* */ /*************************************************************************************************************************************/ DEFV(Local,DEFV(deltaI_2D,dimension_non_normalisee_de_la_fenetre)); /* Dimensions de la fenetre non normalisee. */ DEFV(Local,DEFV(vrai_Int_de_base,INIT(X_position_centree_de_l_image_dans_la_fenetre,UNDEF))); DEFV(Local,DEFV(vrai_Int_de_base,INIT(Y_position_centree_de_l_image_dans_la_fenetre,UNDEF))); /* Position de l'image dans la fenetre de facon a ce qu'elle soit centree. Cela a ete */ /* introduit le 20030401161443 pour 'v $xci/display$K 20030401153145'. */ /* Les definitions {L_IMAGE_N_EST_PAS_DECOUPEE_EN_MORCEAUX,...,INVERSION_AXE_OY} ont ete */ /* deplacees le 20000323104448. */ # define L_IMAGE_N_EST_PAS_DECOUPEE_EN_MORCEAUX \ UN \ /* Afin de faire la distinction entre 'IXdisplay(...)' et 'IXanimation(...)' pour lequel */ \ /* l'image est decoupee en morceaux (leur nombre etant un carre...). */ # define LIMITATION_HORIZONTALE(x,nombre_de_morceaux) \ SOUS(x,REST(dimX,nombre_de_morceaux)) \ /* Afin de limiter l'axe 'OX' a un nombre de points multiple de quelque chose... */ # define LIMITATION_VERTICALE(y,nombre_de_morceaux) \ SOUS(y,REST(dimY,nombre_de_morceaux)) \ /* Afin de limiter l'axe 'OY' a un nombre de points multiple de quelque chose... */ # ifdef BUG_SYSTEME_X_WINDOW_IMAGE_2 # define _INVERSION_AXE_OY(y,hauteur,nombre_de_morceaux,dimension) \ COYA(SOUS(SOUS(dimension \ ,COYR(y) \ ) \ ,hauteur \ ) \ ) \ /* Fonction inversant les coordonnees 'y' pour tenir compte du fait que l'axe 'OY' de */ \ /* 'X-Window' descend. On notera l'introduction de 'nombre_de_morceaux' destine a prendre */ \ /* compte les cas ou 'dimY' n'est pas un multiple de 'nombre_de_morceaux' ; c'est le cas, */ \ /* par exemple, ou l'on est en mode 'Pal' avec 'IXanimation(...)' (575 n'est pas divisible */ \ /* par 8...). */ # Aifdef BUG_SYSTEME_X_WINDOW_IMAGE_2 # define _INVERSION_AXE_OY(y,hauteur,nombre_de_morceaux,dimension) \ NEUT(y) \ /* Fonction neutre laissant 'y' inchange le jour ou l'axe 'OY' de 'X-Window' montera... */ # Eifdef BUG_SYSTEME_X_WINDOW_IMAGE_2 # define fINVERSION_AXE_OY(y,hauteur,nombre_de_morceaux) \ _INVERSION_AXE_OY(y,hauteur,nombre_de_morceaux,ASD1(dimension_non_normalisee_de_la_fenetre,dy)) # define iINVERSION_AXE_OY(y,hauteur,nombre_de_morceaux) \ _INVERSION_AXE_OY(y,hauteur,nombre_de_morceaux,dimY) /* Fonctions inversant si besoin est l'axe 'OY' des images et des fenetres respectivement... */ /* */ /* Ceci a ete introduit le 20030401162836 et modifie le 20030402091740 en faisant alors la */ /* difference entre les images et les fenetres qui n'ont pas necessairement la meme */ /* dimension... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A F I N D E P E R M E T T R E D E S R E F E R E N C E S " E N A V A N T " D E ' IXdisplay(...) ' : */ /* */ /*************************************************************************************************************************************/ DEFV(Local,DEFV(vrai_Int_de_base ,INIT(fPOINTEUR(pointeur_de_IXdisplay)(DEFV(Argument,DEFV(image,imageA)) ,DEFV(Argument,DEFV(image,imageA_ROUGE)) ,DEFV(Argument,DEFV(image,imageA_VERTE)) ,DEFV(Argument,DEFV(image,imageA_BLEUE)) ,DEFV(Argument,DEFV(Int,increment_des_niveaux)) ,DEFV(Argument,DEFV(Logical,translater_le_NOIR)) ) ,ADRESSE_NON_ENCORE_DEFINIE ) ) ); /* La fonction 'IXdisplay(...)' est referencee "en avant" ce qui n'est pas tres correct. */ /* Etant donne qu'il est pratiquement impossible de la deplacer, la seule solution semble */ /* etre de creer un pointeur initialise tout la fin. Ceci a ete introduit le 20160815105000. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* G E S T I O N T R E S S I M P L I F I E E D E S E V E N E M E N T S : */ /* */ /*************************************************************************************************************************************/ DEFV(Common,DEFV(Logical,ZINT(IXdisplay_____on_peut_revisualiser_l_imageA_courante,VRAI))); /* Indicateur logique precisant si l'on doit ('VRAI') ou pas ('FAUX') revisualiser l'image */ /* courante 'imageA' sur certains evenements. ATTENTION, la methode ici utilisee est tres */ /* simpliste car, en effet, l'attente des evenements est faite de facon synchrone ; cela */ /* signifie en particulier que lorsque l'on fait autre chose (par exemple changer les */ /* tables de coloriage) les evenements ne sont pas attendus et donc l'image courante */ /* 'imageA' ne peut pas etre revisualisee. Ainsi, elle ne peut etre revisualisee que si */ /* l'on est dans une fonction du type 'IXattente_d_un_evenement_quelconque(...)'. */ #pragma xcc__cpp_Z__liste_utiles $xiidX/fonct$vv$EXT IXdisplay_____imageA_courante $xbidX/fonction DEFV(Common,DEFV(Statique,DEFV(image,IXdisplay_____imageA_courante))); #pragma xcc__cpp_Z__liste_utiles $xiidX/fonct$vv$EXT IXdisplay_____imageA_ROUGE_courante $xbidX/fonction DEFV(Common,DEFV(Statique,DEFV(image,IXdisplay_____imageA_ROUGE_courante))); #pragma xcc__cpp_Z__liste_utiles $xiidX/fonct$vv$EXT IXdisplay_____imageA_VERTE_courante $xbidX/fonction DEFV(Common,DEFV(Statique,DEFV(image,IXdisplay_____imageA_VERTE_courante))); #pragma xcc__cpp_Z__liste_utiles $xiidX/fonct$vv$EXT IXdisplay_____imageA_BLEUE_courante $xbidX/fonction DEFV(Common,DEFV(Statique,DEFV(image,IXdisplay_____imageA_BLEUE_courante))); /* Afin de pouvoir memoriser la derniere image visualisee par 'IXdisplay(...)'. L'image */ /* en vraies couleurs {ROUGE,VERTE,BLEUE} a ete introduite le 20030102101041. */ /* */ /* ATTENTION, l'image 'IXdisplay_____imageA_courante' est referencee dans la commande */ /* 'v $xcc/cpp$Z IXdisplay_____imageA_courante'. Le 20040521091345, le '#pragma' relatif */ /* a 'xcc__cpp_Z__liste_utiles' a ete introduit pour supprimer cette dependance... */ DEFV(Local,DEFV(Logical,INIT(IXdisplay_____imageA_courante_revisualisable,FAUX))); /* Indicateur logique controlant l'opportunite de revisualiser la derniere image visualise */ /* par 'IXdisplay(...)'. En effet, ceci se fait via les evenements, et ceux-ci surviennent */ /* avant que la chose ne soit possible, et apres lorsqu'elle ne l'est plus... */ /* */ /* Le 20101011113943 le nom 'IXdisplay_____imageA_courante_visualisable' a ete remplace */ /* par 'IXdisplay_____imageA_courante_revisualisable' plus logique et passe de 'Local' */ /* a 'Common' pour 'v $xci/album$K IXdisplay_____imageA_courante_revisualisable'... */ /* */ /* Avec l'introduction de 'IXdisplay_avec_reinitialisation_du_reaffichage(....)' le */ /* 20101118092254, cet indicateur est redevenu un 'Local' ce qui est plus logique... */ # ifdef __VERSION__UTILISER_LA_BIBLIOTHEQUE_OpenGL /* Common,DEFV(Fonction,) : avec 'OpenGL'... */ DEFV(Common,DEFV(Logical,ZINT(IGdisplay_____on_peut_revisualiser_l_imageA_courante,VRAI))); /* Indicateur logique precisant si l'on doit ('VRAI') ou pas ('FAUX') revisualiser l'image */ /* courante 'imageA' sur certains evenements. ATTENTION, la methode ici utilisee est tres */ /* simpliste car, en effet, l'attente des evenements est faite de facon synchrone ; cela */ /* signifie en particulier que lorsque l'on fait autre chose (par exemple changer les */ /* tables de coloriage) les evenements ne sont pas attendus et donc l'image courante */ /* 'imageA' ne peut pas etre revisualisee. Ainsi, elle ne peut etre revisualisee que si */ /* l'on est dans une fonction du type 'IGattente_de_l_evenement_ButtonPress(...)'. */ # pragma xcc__cpp_Z__liste_utiles $xiidG/fonction.1$EXT IGdisplay_____imageA_courante $xbidX/fonction DEFV(Common,DEFV(Statique,DEFV(imageU,IGdisplay_____imageA_courante))); /* Afin de pouvoir memoriser la derniere image visualisee par 'IGdisplay(...)'. */ /* ATTENTION, l'image 'IGdisplay_____imageA_courante' est referencee dans la commande */ /* 'v $xcc/cpp$Z IGdisplay_____imageA_courante'. Le 20040521092046, le '#pragma' relatif */ /* a 'xcc__cpp_Z__liste_utiles' a ete introduit pour supprimer cette dependance. On notera */ /* que le 20040521131426, il a ete deplace dans '$xiidG/fonction.1$FON 20040521130935' car, */ /* en effet, c'est la qu'il est utile ('v $xcc/cpp$Z SiliG_EXT'). Le 20040523111109, grace */ /* au dispositif 'v $xcc/cpp$Z 20040522102819', ce '#pragma' a pu etre remis ici... */ DEFV(Common,DEFV(Logical,INIT(IGdisplay_____imageA_courante_visualisable,FAUX))); /* Indicateur logique controlant l'opportunite de revisualiser la derniere image visualise */ /* par 'IGdisplay(...)'. En effet, ceci se fait via les evenements, et ceux-ci surviennent */ /* avant que la chose ne soit possible, et apres lorsqu'elle ne l'est plus... */ DEFV(Common,DEFV(Logical,INIT(IGdisplay_____imageA_courante_premiere_fois,VRAI))); /* Indicateur logique permet de faire la difference entre la premiere fois que l'on passe */ /* 'REAFFICHAGE_D_UNE_IMAGE_PAR_IGdisplay' et les fois suivantes... */ # Aifdef __VERSION__UTILISER_LA_BIBLIOTHEQUE_OpenGL /* Common,DEFV(Fonction,) : avec 'OpenGL'... */ # Eifdef __VERSION__UTILISER_LA_BIBLIOTHEQUE_OpenGL /* Common,DEFV(Fonction,) : avec 'OpenGL'... */ # ifdef BUG_SYSTEME_X_WINDOW_EVENEMENTS_2 # define LISTE_DES_EVENEMENTS_A_ATTENDRE \ OUI07(ExposureMask \ ,StructureNotifyMask \ ,VisibilityChangeMask \ ,PropertyChangeMask \ ,ColormapChangeMask \ ,ButtonPressMask \ ,KeyPressMask \ ) \ /* Liste des evenements qu'il est utile d'attendre. L'evenement 'KeyPressMask' a ete */ \ /* ajoute le 20000323104448. */ # Aifdef BUG_SYSTEME_X_WINDOW_EVENEMENTS_2 # define LISTE_DES_EVENEMENTS_A_ATTENDRE \ OUI07(ExposureMask \ ,StructureNotifyMask \ ,VisibilityChangeMask \ ,PropertyChangeMask \ ,ColormapChangeMask \ ,ButtonPressMask \ ,KeyPressMask \ ) \ /* Liste des evenements qu'il est utile d'attendre. L'evenement 'KeyPressMask' a ete */ \ /* ajoute le 20000323104448. */ # Eifdef BUG_SYSTEME_X_WINDOW_EVENEMENTS_2 DEFV(Common,DEFV(Logical,ZINT(X11_____signaler_les_evenements_inattendus ,NE_PAS_SIGNALER_LES_EVENEMENTS_INATTENDUS_DE_X_WINDOW ) ) ); /* Cet indicateur logique permet de savoir s'il faut signaler (par un message) les */ /* les evenements inattendus, qui rappelons-le dependent fortement du SYSTEME... */ # define ATTENTE_DE_N_IMPORTE_LEQUEL_DES_EVENEMENTS_POSSIBLES(evenement_arrive) \ Bblock \ DEFV(X_XEvent,bloc_d_attente_des_evenements); \ /* Pour attendre les evenements, et se synchroniser... */ \ EGAL(ASD1(bloc_d_attente_des_evenements,type),LASTEvent); \ /* On initialise le bloc d'attente sur un evenement inexistant, */ \ \ CALS(XNextEvent(description_du_serveur_et_de_l_ecran,ADRESSE(bloc_d_attente_des_evenements))); \ /* Ainsi, on n'attend n'importe quel evenement... */ \ \ EGAL(evenement_arrive,ASD1(bloc_d_attente_des_evenements,type)); \ /* Et on renvoie le type d'evenement qui est arrive... */ \ Eblock \ /* Ainsi, on n'attend n'importe quel evenement... */ # define TRAITEMENT_D_UN_EVENEMENT_ARRIVE(evenement_arrive,action_de_traitement_de_l_evenement_arrive) \ Ca1e(evenement_arrive) \ Bblock \ BLOC(action_de_traitement_de_l_evenement_arrive); \ Eblock \ ECa1 \ /* Traitement d'un evenement arrive... */ # define RECEPTION_D_UN_EVENEMENT_INATTENDU(nom_de_l_evenement_attendu,evenement_inattendu) \ /* ATTENTION, il est impossible d'encadrer ce qui suit par : */ \ /* */ \ /* Bblock */ \ /* TRAITEMENT_D_UN_EVENEMENT_ARRIVE(...); */ \ /* Eblock */ \ /* */ \ /* car, en effet, 'TRAITEMENT_D_UN_EVENEMENT_ARRIVE(...)' est en fait un 'Ca1e(...)', et */ \ /* dans ces conditions, cela perturberait le compilateur... */ \ TRAITEMENT_D_UN_EVENEMENT_ARRIVE(evenement_inattendu \ ,BLOC(CAL1(Prer1("[ATTENDU : %s --> INATTENDU : evenement_inattendu]\n" \ ,nom_de_l_evenement_attendu \ ) \ ); \ ) \ ); \ /* Edition d'un evenement inattendu... */ # define ATTENTE_D_UN_EVENEMENT_CONNU(evenement_attendu_connu,action_a_la_reception) \ Bblock \ DEFV(Schar,INIS(DTb0(nom_de_l_evenement_attendu_connu),"evenement_attendu_connu")); \ /* Nom de l'evenement attendu et connu. ATTENTION : autrefois, il y avait : */ \ /* */ \ /* DEFV(CHAR,INIT(POINTERc(nom_de_l_evenement_attendu_connu),"evenement_attendu_connu")); */ \ /* */ \ /* mais cela ne plaisait pas a 'SYSTEME_FX2800_CONCENTRIX_SCC', d'ou cette nouvelle forme. */ \ ATTENTE_D_UN_EVENEMENT_INCONNU(nom_de_l_evenement_attendu_connu \ ,evenement_attendu_connu \ ,BLOC(action_a_la_reception) \ ); \ /* Et on attend... */ \ Eblock \ /* Ainsi, on n'attend que l'evenement attendu et connu... */ # define NE_PAS_SE_REMETTRE_EN_ATTENTE_D_UN_NOUVEL_EVENEMENT_DE_MEME_TYPE \ Bblock \ EGAL(boucler_sur_l_attente_des_evenements,FAUX); \ Eblock \ /* Ainsi, on va attendre de nouveau l'evenement attendu et connu... */ # define SE_REMETTRE_EN_ATTENTE_D_UN_NOUVEL_EVENEMENT_DE_MEME_TYPE \ Bblock \ EGAL(boucler_sur_l_attente_des_evenements,VRAI); \ Eblock \ /* Ainsi, on va attendre de nouveau l'evenement attendu et connu... */ DEFV(Local,DEFV(Int,INIT(IXdisplay_____increment_des_niveaux,INCREMENT_DES_NIVEAUX_PAR_DEFAUT_DE_IXdisplay))); DEFV(Local,DEFV(Logical,INIT(IXdisplay_____translater_le_NOIR,TRANSLATER_LE_NOIR_PAR_DEFAUT_DE_IXdisplay))); /* Dispositif introduit le 20070713103714 (et donc avec quelques annees de retard) afin de */ /* permettre de rafraichir correctement une image lorsqu'elle a ete masque par quelque chose */ /* et que son affichage avait ete demande avec incrementation des niveaux de la palette... */ # define REAFFICHAGE_D_UNE_IMAGE_PAR_IXdisplay \ Bblock \ Test(EST_VRAI(IXdisplay_____imageA_courante_revisualisable)) \ Bblock \ CALS(fPOINTEUR(pointeur_de_IXdisplay)(IXdisplay_____imageA_courante \ ,IXdisplay_____imageA_ROUGE_courante \ ,IXdisplay_____imageA_VERTE_courante \ ,IXdisplay_____imageA_BLEUE_courante \ ,IXdisplay_____increment_des_niveaux \ ,IXdisplay_____translater_le_NOIR \ ) \ ); \ /* Si il existe une derniere image visualisee, on la reaffiche a priori. On notera que */ \ /* le 20030101172647 j'ai ajoute un triplet necessaire a la visualisation en vraies */ \ /* couleurs et qui est fait de trois images identiques (ce qui fera du noir et blanc...) */ \ /* car, en effet, je ne sais pas quoi faire d'autre... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock # ifdef __VERSION__UTILISER_LA_BIBLIOTHEQUE_OpenGL DEFV(Local,DEFV(Float,INIT(instant_du_dernier_REAFFICHAGE_D_UNE_IMAGE_PAR_IGdisplay,FZERO))); /* Memorisation de l'instant precis du dernier 'REAFFICHAGE_D_UNE_IMAGE_PAR_IGdisplay' */ /* sous la forme {secondes,micro-secondes} depuis le 01/01/1970 a 00:00:00. */ DEFV(Common,DEFV(Float,ZINT(X11_____duree_minimale_entre_deux_REAFFICHAGE_D_UNE_IMAGE_PAR_IGdisplay,FDU))); /* Memorisation de l'instant precis du dernier 'REAFFICHAGE_D_UNE_IMAGE_PAR_IGdisplay' qui */ /* fut effectif... */ # define CENTRER_L_IMAGE_DANS_LA_FENETRE_LORS_DU_REAFFICHAGE \ VRAI # define REAFFICHAGE_D_UNE_IMAGE_PAR_IGdisplay \ Bblock \ Test(EST_FAUX(IGdisplay_____imageA_courante_premiere_fois)) \ Bblock \ Test(EST_VRAI(IGdisplay_____imageA_courante_visualisable)) \ Bblock \ DEFV(Positive,INIT(Secondes,UNDEF)); \ DEFV(Positive,INIT(MicroSecondes,UNDEF)); \ DEFV(Float,INIT(instant_courant,FLOT__UNDEF)); \ /* Duree en {secondes,micro-secondes} ecoulee depuis le 19700101000000. */ \ \ DUREE_ECOULEE_DEPUIS_LE_01_01_1970_A_00_00_00(Secondes,MicroSecondes); \ EGAL(instant_courant,ADD2(FLOT(Secondes),DIVI(FLOT(MicroSecondes),FLOT(MILLION)))); \ /* Calcul de la duree en {secondes,micro-secondes} ecoulee depuis le 19700101000000. */ \ \ Test(IFGE(SOUS(instant_courant,instant_du_dernier_REAFFICHAGE_D_UNE_IMAGE_PAR_IGdisplay) \ ,X11_____duree_minimale_entre_deux_REAFFICHAGE_D_UNE_IMAGE_PAR_IGdisplay \ ) \ ) \ Bblock \ DEFV(deltaF_2D,translation_inutile_de_IGdisplay_____imageA_courante); \ \ EGAL(ASD1(translation_inutile_de_IGdisplay_____imageA_courante,dx),FLOT__UNDEF); \ EGAL(ASD1(translation_inutile_de_IGdisplay_____imageA_courante,dy),FLOT__UNDEF); \ /* La translation est inutile puisque l'on centre, mais on ne sait jamais... */ \ \ CALS(IGclear()); \ /* Nettoyage peralable de la fenetre... */ \ \ CALS(IGdisplay(IGdisplay_____imageA_courante \ ,RAPPORT_DE_ZOOM_STANDARD_DE_rectzoom \ ,CENTRER_L_IMAGE_DANS_LA_FENETRE_LORS_DU_REAFFICHAGE \ ,ADRESSE(translation_inutile_de_IGdisplay_____imageA_courante) \ ) \ ); \ /* Si il existe une derniere image visualisee, on la reaffiche a priori en centrant a priori */ \ /* ce qui signifie que l'on ignore les parametres lors du premier appel de 'IGdisplay(...)'. */ \ \ EGAL(instant_du_dernier_REAFFICHAGE_D_UNE_IMAGE_PAR_IGdisplay,instant_courant); \ /* Memorisation de l'instant precis du dernier 'REAFFICHAGE_D_UNE_IMAGE_PAR_IGdisplay' qui */ \ /* fut effectif... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ EGAL(IGdisplay_____imageA_courante_premiere_fois,FAUX); \ /* Ce test et cet indicateur ont ete ajoute le 19990310141501 a la suite de l'introduction */ \ /* de la fonction 'IGclear(...)' destinee a assurer le nettoyage du fond d'une fenetre apres */ \ /* son retour au premier-plan. Or il semblerait que l'on passerait ici, aussi, au moment de */ \ /* l'ouverture de la fenetre. D'ou ce traitement particulier (on ne fait rien...) du premier */ \ /* passage ici... */ \ Eblock \ ETes \ Eblock # Aifdef __VERSION__UTILISER_LA_BIBLIOTHEQUE_OpenGL # define REAFFICHAGE_D_UNE_IMAGE_PAR_IGdisplay \ Bblock \ BLOC(VIDE;); \ Eblock # Eifdef __VERSION__UTILISER_LA_BIBLIOTHEQUE_OpenGL DEFV(Common,DEFV(Logical,ZINT(X11_____KeyPress_____editer_XY_curseur,FAUX))); /* Indicateur logique precisant si l'on doit ('VRAI') ou pas ('FAUX') editer les coordonnees */ /* {X,Y} du curseur (la souris) lors de l'appui sur une touche quelconque du clavier. Ceci */ /* a ete introduit le 20000323104448. Un test de bon fonctionnement consistera a faire : */ /* */ /* Std */ /* */ /* $xci/S_point$X A=$xiio/NOIR x=XXXX y=YYYY $formatI | \ */ /* $xci/display$X p=$xiP/cercle.35 XY=VRAI $formatI */ /* */ /* et verifier que cela donne bien : */ /* */ /* curseur=(+XXXX,+YYYY) */ /* */ /* en mettant la pointe de la fleche du curseur sur le point de coordonnees {XXXX,YYYY} */ /* marque. */ DEFV(Common,DEFV(Logical,ZINT(X11_____KeyPress_____editer_XY_curseur_message_fenetre_incompatible,VRAI))); /* Indicateur logique precisant si le message indiquant que la taille de l'image est */ /* incompatible avec l'edition du curseur (introduit le 20091212212950)... */ DEFV(Common,DEFV(Logical,ZINT(X11_____KeyPress_____norm_XY_curseur,FAUX))); /* Faut-il normaliser ('VRAI') ou pas ('FAUX') les coordonnees {X,Y} du curseur. ATTENTION, */ /* cette "renormalisation" n'utilise pas les procedures '_____?NORMALISE_OX11(...)' et */ /* '_____?NORMALISE_OY11(...)' afin d'etre quelconque, c'est-a-dire d'etre capable de */ /* fournir des resultats dans [0,1] comme dans [a,b]... */ DEFV(Common,DEFV(Logical,ZINT(X11_____KeyPress_____norm_XY_avec_origine_et_extremite_curseur,VRAI))); /* Lorsque 'IL_FAUT(X11_____KeyPress_____norm_XY_curseur)' doit-on utiliser les origine et */ /* extremite des axes 'OX' et 'OY' ('VRAI') ou bien les origine et longueur ('FAUX') ? Ceci */ /* fut introduit le 20091123093212 afin de faciliter la definition des zooms sur les objets */ /* fractals produits dans '$xrc' (par exemple 'v $xrc/mandel.01$K'). Alors, on choisira : */ /* */ /* OX_curseur = X_COIN_BAS_GAUCHE */ /* EX_curseur = X_COIN_HAUT_DROITE */ /* */ /* OY_curseur = Y_COIN_BAS_GAUCHE */ /* EY_curseur = Y_COIN_HAUT_DROITE */ /* */ /* tels qu'ils sont edites par 'v $ximcf/iterations$FON VALIDATION_DE_LA_FENETRE_DE_CAL...', */ /* c'est-a-dire apres prise en compte du format de l'image. */ DEFV(Common,DEFV(Float,ZINT(X11_____KeyPress_____OX_curseur,COORDONNEE_BARYCENTRIQUE_MINIMALE))); DEFV(Common,DEFV(Float,ZINT(X11_____KeyPress_____EX_curseur,COORDONNEE_BARYCENTRIQUE_MAXIMALE))); DEFV(Common,DEFV(Float,ZINT(X11_____KeyPress_____LX_curseur,AMPLITUDE_DES_COORDONNEES_BARYCENTRIQUES))); DEFV(Common,DEFV(Float,ZINT(X11_____KeyPress_____DX_curseur,COORDONNEE_BARYCENTRIQUE_CENTRALE))); DEFV(Common,DEFV(Float,ZINT(X11_____KeyPress_____OY_curseur,COORDONNEE_BARYCENTRIQUE_MINIMALE))); DEFV(Common,DEFV(Float,ZINT(X11_____KeyPress_____EY_curseur,COORDONNEE_BARYCENTRIQUE_MAXIMALE))); DEFV(Common,DEFV(Float,ZINT(X11_____KeyPress_____LY_curseur,AMPLITUDE_DES_COORDONNEES_BARYCENTRIQUES))); DEFV(Common,DEFV(Float,ZINT(X11_____KeyPress_____DY_curseur,COORDONNEE_BARYCENTRIQUE_CENTRALE))); # define OX_curseur_KeyPress \ NEUT(X11_____KeyPress_____OX_curseur) # define EX_curseur_KeyPress \ COND(IL_FAUT(X11_____KeyPress_____norm_XY_avec_origine_et_extremite_curseur) \ ,X11_____KeyPress_____EX_curseur \ ,ADD2(X11_____KeyPress_____OX_curseur,X11_____KeyPress_____LX_curseur) \ ) # define OY_curseur_KeyPress \ NEUT(X11_____KeyPress_____OY_curseur) # define EY_curseur_KeyPress \ COND(IL_FAUT(X11_____KeyPress_____norm_XY_avec_origine_et_extremite_curseur) \ ,X11_____KeyPress_____EY_curseur \ ,ADD2(X11_____KeyPress_____OY_curseur,X11_____KeyPress_____LY_curseur) \ ) /* {Origine,Longueur} des axes 'OX' et 'OY' respectivement lorsque la "renormalisation" */ /* des axes est demandees par 'IL_FAUT(X11_____KeyPress_____norm_XY_curseur)'. On */ /* notera qu'il serait possible d'utiliser {Origine,Extremite} mais la solution choisie est */ /* certainement plus simple d'emploi, par exemple, lorsque l'on choisit une fenetre de */ /* de calcul (dite a l'Arrivee) dans un objet fractal (Mandelbrot ou iteration sur */ /* 'zeta'...). */ /* */ /* ATTENTION, les definitions de 'X11_____KeyPress_____LX_curseur' et de */ /* 'X11_____KeyPress_____LY_curseur' doivent imperativement etre sur plusieurs lignes a */ /* cause de '$xcg/gen.ext$Z' qui dans le cas ou tout est sur une meme ligne n'arrive pas a */ /* se debarasser de 'SOUS(...)'. */ /* */ /* Le 20100116103147 furent intrdouits {DX_curseur,DY_curseur} qui definissent les demi */ /* dimensions en 'X' et en 'Y' d'une fenetre centree sur le curseur. Cela est destine a */ /* faciliter l'usage de programmes tel 'v $xrc/mandel.41$K xbg=' lors de la recherche de */ /* zones interessantes sur lesquelles zoomer... */ DEFV(Common,DEFV(Int,ZINT(fenetre_X_Window_____deplacement_horizontal_en_haut_a_gauche_d_une_image,ZERO))); DEFV(Common,DEFV(Int,ZINT(fenetre_X_Window_____deplacement_vertical_en_haut_a_gauche_d_une_image,ZERO))); /* Deplacement en {X,Y} permettant de definir le coin en haut et a gauche d'une image par */ /* rapport au coin en haut et a gauche d'une fenetre. Le 20000327093959 ces deplacements */ /* sont devenus inutiles, mais pour assurer la coherence de certains commentaires */ /* '(v $xiidG/fonction.1$FON en_haut_a_gauche_d_une_image_dans_une_fenetre_X_Window') il */ /* plus simple de les conserver en leur donnant une valeur "neutre"... */ # define TrX_CURSEUR_KeyPress \ NEUT(UN) # define TrY_CURSEUR_KeyPress \ NEUT(UN) /* Pour obtenir des {X,Y} compatibles avec mes propres definitions. */ # define X_CURSEUR_KeyPress \ COXA(SOUS(SOUS(ASD2(bloc_d_attente_des_evenements,xkey,x) \ ,TrX_CURSEUR_KeyPress \ ) \ ,fenetre_X_Window_____deplacement_horizontal_en_haut_a_gauche_d_une_image \ ) \ ) # define Y_CURSEUR_KeyPress \ COYA(fINVERSION_AXE_OY(SOUS(SOUS(ASD2(bloc_d_attente_des_evenements,xkey,y) \ ,TrY_CURSEUR_KeyPress \ ) \ ,fenetre_X_Window_____deplacement_vertical_en_haut_a_gauche_d_une_image \ ) \ ,ZERO \ ,L_IMAGE_N_EST_PAS_DECOUPEE_EN_MORCEAUX \ ) \ ) /* Coordonnees {X,Y} du curseur apres les translations necessaires. ATTENTION, ces formules */ /* n'ont de sens que si la taille de la fenetre est egale excatement a celle de l'image. De */ /* plus cette fenetre ne doit pas deborder de l'ecran. Ces contraintes expliquent les tests */ /* effectues dans 'VALIDATION_PRELIMINAIRE_DES_DIMENSIONS_D_UNE_FENETRE'. J'ai reussi a */ /* a utiliser ce dispositif avec des images 'OPenGL' dans des fenetres plus grandes ; mais */ /* cela n'a pas marche avec 'X-Window' ; pour simplifier donc, j'ai impose les memes */ /* contraintes partout le 20000327093959. ATTENTION, a compter du 20030402091740 avec */ /* la "differenciation" de 'fINVERSION_AXE_OY(...)' et de 'iINVERSION_AXE_OY(...)' le */ /* probleme precedent est resolu... */ # define ATTENTE_D_UN_EVENEMENT_INCONNU(nom_de_l_evenement_attendu_inconnu,evenement_attendu_inconnu,action_a_la_reception) \ Bblock \ DEFV(X_XEvent,bloc_d_attente_des_evenements); \ /* Pour attendre les evenements, et se synchroniser... */ \ DEFV(Logical,INIT(boucler_sur_l_attente_des_evenements,LUNDEF)); \ /* Cet indicateur 'VRAI' a priori, est mis a 'FAUX' des que l'evenement attendu est arrive. */ \ /* Il peut alors etre immediatement mis a 'VRAI' par la sequence de code specifique de nom */ \ /* 'action_a_la_reception', ce qui lui permet apres le traitement specifique, de se remettre */ \ /* alors en attente... */ \ \ SE_REMETTRE_EN_ATTENTE_D_UN_NOUVEL_EVENEMENT_DE_MEME_TYPE; \ /* Afin de boucler au moins une fois... */ \ EGAL(ASD1(bloc_d_attente_des_evenements,type),LASTEvent); \ /* On initialise le bloc d'attente sur un evenement inexistant, */ \ \ Tant(IL_FAUT(boucler_sur_l_attente_des_evenements)) \ /* Boucle sur plusieurs evenements de meme type... */ \ Bblock \ Tant(IFNE(ASD1(bloc_d_attente_des_evenements,type),evenement_attendu_inconnu)) \ /* Boucle d'attente d'un certain evenement... */ \ Bblock \ CALS(XNextEvent(description_du_serveur_et_de_l_ecran,ADRESSE(bloc_d_attente_des_evenements))); \ /* Ainsi, on n'attend que l'evenement attendu... */ \ \ Test(IFET(IFNE(ASD1(bloc_d_attente_des_evenements,type),evenement_attendu_inconnu) \ ,IL_FAUT(X11_____signaler_les_evenements_inattendus) \ ) \ ) \ Bblock \ PRINT_ATTENTION("un evenement inattendu est arrive"); \ \ Choi(ASD1(bloc_d_attente_des_evenements,type)) \ Bblock \ RECEPTION_D_UN_EVENEMENT_INATTENDU(nom_de_l_evenement_attendu_inconnu,KeyPress); \ RECEPTION_D_UN_EVENEMENT_INATTENDU(nom_de_l_evenement_attendu_inconnu,KeyRelease); \ RECEPTION_D_UN_EVENEMENT_INATTENDU(nom_de_l_evenement_attendu_inconnu,ButtonPress); \ RECEPTION_D_UN_EVENEMENT_INATTENDU(nom_de_l_evenement_attendu_inconnu,ButtonRelease); \ RECEPTION_D_UN_EVENEMENT_INATTENDU(nom_de_l_evenement_attendu_inconnu,MotionNotify); \ RECEPTION_D_UN_EVENEMENT_INATTENDU(nom_de_l_evenement_attendu_inconnu,EnterNotify); \ RECEPTION_D_UN_EVENEMENT_INATTENDU(nom_de_l_evenement_attendu_inconnu,LeaveNotify); \ RECEPTION_D_UN_EVENEMENT_INATTENDU(nom_de_l_evenement_attendu_inconnu,FocusIn); \ RECEPTION_D_UN_EVENEMENT_INATTENDU(nom_de_l_evenement_attendu_inconnu,FocusOut); \ RECEPTION_D_UN_EVENEMENT_INATTENDU(nom_de_l_evenement_attendu_inconnu,KeymapNotify); \ RECEPTION_D_UN_EVENEMENT_INATTENDU(nom_de_l_evenement_attendu_inconnu,Expose); \ RECEPTION_D_UN_EVENEMENT_INATTENDU(nom_de_l_evenement_attendu_inconnu,GraphicsExpose); \ RECEPTION_D_UN_EVENEMENT_INATTENDU(nom_de_l_evenement_attendu_inconnu,NoExpose); \ RECEPTION_D_UN_EVENEMENT_INATTENDU(nom_de_l_evenement_attendu_inconnu,VisibilityNotify); \ RECEPTION_D_UN_EVENEMENT_INATTENDU(nom_de_l_evenement_attendu_inconnu,CreateNotify); \ RECEPTION_D_UN_EVENEMENT_INATTENDU(nom_de_l_evenement_attendu_inconnu,DestroyNotify); \ RECEPTION_D_UN_EVENEMENT_INATTENDU(nom_de_l_evenement_attendu_inconnu,UnmapNotify); \ RECEPTION_D_UN_EVENEMENT_INATTENDU(nom_de_l_evenement_attendu_inconnu,MapNotify); \ RECEPTION_D_UN_EVENEMENT_INATTENDU(nom_de_l_evenement_attendu_inconnu,MapRequest); \ RECEPTION_D_UN_EVENEMENT_INATTENDU(nom_de_l_evenement_attendu_inconnu,ReparentNotify); \ RECEPTION_D_UN_EVENEMENT_INATTENDU(nom_de_l_evenement_attendu_inconnu,ConfigureNotify); \ RECEPTION_D_UN_EVENEMENT_INATTENDU(nom_de_l_evenement_attendu_inconnu,ConfigureRequest); \ RECEPTION_D_UN_EVENEMENT_INATTENDU(nom_de_l_evenement_attendu_inconnu,GravityNotify); \ RECEPTION_D_UN_EVENEMENT_INATTENDU(nom_de_l_evenement_attendu_inconnu,ResizeRequest); \ RECEPTION_D_UN_EVENEMENT_INATTENDU(nom_de_l_evenement_attendu_inconnu,CirculateNotify); \ RECEPTION_D_UN_EVENEMENT_INATTENDU(nom_de_l_evenement_attendu_inconnu,CirculateRequest); \ RECEPTION_D_UN_EVENEMENT_INATTENDU(nom_de_l_evenement_attendu_inconnu,PropertyNotify); \ RECEPTION_D_UN_EVENEMENT_INATTENDU(nom_de_l_evenement_attendu_inconnu,SelectionClear); \ RECEPTION_D_UN_EVENEMENT_INATTENDU(nom_de_l_evenement_attendu_inconnu,SelectionRequest); \ RECEPTION_D_UN_EVENEMENT_INATTENDU(nom_de_l_evenement_attendu_inconnu,SelectionNotify); \ RECEPTION_D_UN_EVENEMENT_INATTENDU(nom_de_l_evenement_attendu_inconnu,ColormapNotify); \ RECEPTION_D_UN_EVENEMENT_INATTENDU(nom_de_l_evenement_attendu_inconnu,ClientMessage); \ RECEPTION_D_UN_EVENEMENT_INATTENDU(nom_de_l_evenement_attendu_inconnu,MappingNotify); \ Defo \ Bblock \ PRINT_ATTENTION("un evenement non reconnu est arrive (1)"); \ CAL1(Prer1("(numero=%d)\n",ASD1(bloc_d_attente_des_evenements,type))); \ Eblock \ EDef \ Eblock \ ECho \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Choi(ASD1(bloc_d_attente_des_evenements,type)) \ Bblock \ TRAITEMENT_D_UN_EVENEMENT_ARRIVE(KeyPress \ ,BLOC(Bblock \ Test(IL_FAUT(X11_____KeyPress_____editer_XY_curseur)) \ Bblock \ DEFV(Float,INIT(X_curseur_KeyPress \ ,FLOT(X_CURSEUR_KeyPress) \ ) \ ); \ DEFV(Float,INIT(Y_curseur_KeyPress \ ,FLOT(Y_CURSEUR_KeyPress) \ ) \ ); \ /* Coordonnees {X,Y} exprimee en "entier" du curseur courant... */ \ \ Test(IL_FAUT(X11_____KeyPress_____norm_XY_curseur)) \ Bblock \ CAL3(Prme2(" curseur=(%+.^^^,%+.^^^)\n" \ ,HOMO(X_curseur_KeyPress \ ,FLOT(Xmin) \ ,FLOT(Xmax) \ ,OX_curseur_KeyPress \ ,EX_curseur_KeyPress \ ) \ ,HOMO(Y_curseur_KeyPress \ ,FLOT(Ymin) \ ,FLOT(Ymax) \ ,OY_curseur_KeyPress \ ,EY_curseur_KeyPress \ ) \ ) \ ); \ /* Edition flottante des coordonnees {X,Y} (introduite sous cette forme le 20240402095711). */ \ Eblock \ ATes \ Bblock \ CAL3(Prme2(" curseur=(%d,%d)\n" \ ,INTE(X_curseur_KeyPress) \ ,INTE(Y_curseur_KeyPress) \ ) \ ); \ Eblock \ ETes \ /* Edition entiere des coordonnees {X,Y} (introduite sous cette forme le 20240402095711). */ \ /* */ \ /* Le 20060105090907, le format "16g" est passe a "^^g" pour plus de souplesse... */ \ /* */ \ /* Le 20091123122916, le format "^^g" est passe a "^^^" pour plus de souplesse... */ \ \ Test(IL_FAUT(X11_____KeyPress_____norm_XY_curseur)) \ Bblock \ CAL3(Prme2("xbg=%+.^^^ ybg=%+.^^^ " \ ,SOUS(X_curseur_KeyPress \ ,X11_____KeyPress_____DX_curseur \ ) \ ,SOUS(Y_curseur_KeyPress \ ,X11_____KeyPress_____DY_curseur \ ) \ ) \ ); \ CAL3(Prme2("xhd=%+.^^^ yhd=%+.^^^\n" \ ,ADD2(X_curseur_KeyPress \ ,X11_____KeyPress_____DX_curseur \ ) \ ,ADD2(Y_curseur_KeyPress \ ,X11_____KeyPress_____DY_curseur \ ) \ ) \ ); \ CALS(Fsauts_de_lignes(UN)); \ /* Edition introduite le 20100116103147... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ) \ ); \ /* Cette edition a ete introduite le 20000323104448... */ \ TRAITEMENT_D_UN_EVENEMENT_ARRIVE(KeyRelease,BLOC(VIDE;)); \ TRAITEMENT_D_UN_EVENEMENT_ARRIVE(ButtonPress,BLOC(VIDE;)); \ TRAITEMENT_D_UN_EVENEMENT_ARRIVE(ButtonRelease,BLOC(VIDE;)); \ TRAITEMENT_D_UN_EVENEMENT_ARRIVE(MotionNotify,BLOC(VIDE;)); \ TRAITEMENT_D_UN_EVENEMENT_ARRIVE(EnterNotify,BLOC(VIDE;)); \ TRAITEMENT_D_UN_EVENEMENT_ARRIVE(LeaveNotify,BLOC(VIDE;)); \ TRAITEMENT_D_UN_EVENEMENT_ARRIVE(FocusIn,BLOC(VIDE;)); \ TRAITEMENT_D_UN_EVENEMENT_ARRIVE(FocusOut,BLOC(VIDE;)); \ TRAITEMENT_D_UN_EVENEMENT_ARRIVE(KeymapNotify,BLOC(VIDE;)); \ TRAITEMENT_D_UN_EVENEMENT_ARRIVE(Expose \ /* Le 1996061400, a l'evenement 'VisibilityNotify' j'ai ete oblige de substituer 'Expose' */ \ /* car dans certaines circonstances (par exemple deux telles fenetres simultanees et se */ \ /* se recouvrant) l'une d'elles (ici, celle du dessous) n'etait pas rafraichie lorsqu'une */ \ /* troisieme leur venait devant, puis repartait derriere... */ \ ,BLOC(REAFFICHAGE_D_UNE_IMAGE_PAR_IXdisplay; \ REAFFICHAGE_D_UNE_IMAGE_PAR_IGdisplay; \ ) \ ); \ /* Le 19991110171631, j'ai identifie un probleme avec 'Expose'. Soit 'FD' deux fenetres */ \ /* initialement au-dessus d'une fenetre de type "image" qui a ete affichee precedemmment */ \ /* par 'v $xci/Sdisplay_RVB$K'. Lorsque le retour de l'image 'Im' au premier plan est */ \ /* demande (en cliquant dessus), on distingue deux cas, suivant que les deux fenetres 'FD' */ \ /* sont jointives ou pas ('FD' signifiant "Fenetre Dessus") ; d'une part : */ \ /* */ \ /* */ \ /* -------------------- */ \ /* |FD | */ \ /* | .......... | */ \ /* | . . | */ \ /* | . . | */ \ /* -------------------- */ \ /* -------------------- */ \ /* |FD . . | */ \ /* | . . | */ \ /* | . . | */ \ /* | . . | */ \ /* -------------------- */ \ /* |////////| */ \ /* |// Im //| 'FD' jointives : 1 evenement 'Expose'. */ \ /* |////////| */ \ /* -------- */ \ /* */ \ /* */ \ /* et d'autre part : */ \ /* */ \ /* */ \ /* -------------------- */ \ /* |FD | */ \ /* | .......... | */ \ /* | . . | */ \ /* | . . | */ \ /* -------------------- */ \ /* |////////| */ \ /* |// Im //| 'FD' non jointives : 2 evenements 'Expose', */ \ /* |////////| */ \ /* -------------------- */ \ /* |FD . . | */ \ /* | .......... | */ \ /* | | */ \ /* | | */ \ /* -------------------- */ \ /* */ \ /* */ \ /* Comment expliquer ce mystere et eviter donc le double re-affichage de l'image 'Im' */ \ /* dans le premier cas ? Au passage, il s'ecoule un peu plus de 0.3 seconde entre les */ \ /* 2 evenements 'Expose'. Le 19991112090000, j'ai donc applique une solution "heuristique" */ \ /* consistant a ne pas faire 'REAFFICHAGE_D_UNE_IMAGE_PAR_IGdisplay' suite a un 'Expose' */ \ /* si ce dernier apparait trop proche du precedent 'Expose' (la duree actuellement */ \ /* utilisee est de 0.5 seconde, ce qui est un peu trop, mais soyons prudents...). */ \ TRAITEMENT_D_UN_EVENEMENT_ARRIVE(GraphicsExpose,BLOC(VIDE;)); \ TRAITEMENT_D_UN_EVENEMENT_ARRIVE(NoExpose,BLOC(VIDE;)); \ TRAITEMENT_D_UN_EVENEMENT_ARRIVE(VisibilityNotify,BLOC(VIDE;)); \ /* Le 1996061400, a l'evenement 'VisibilityNotify' j'ai ete oblige de substituer 'Expose' */ \ /* car dans certaines circonstances (par exemple deux telles fenetres simultanees et se */ \ /* se recouvrant) l'une d'elles (ici, celle du dessous) n'etait pas rafraichie lorsqu'une */ \ /* troisieme leur venait devant, puis repartait derriere... */ \ TRAITEMENT_D_UN_EVENEMENT_ARRIVE(CreateNotify,BLOC(VIDE;)); \ TRAITEMENT_D_UN_EVENEMENT_ARRIVE(DestroyNotify,BLOC(VIDE;)); \ TRAITEMENT_D_UN_EVENEMENT_ARRIVE(UnmapNotify,BLOC(VIDE;)); \ TRAITEMENT_D_UN_EVENEMENT_ARRIVE(MapNotify,BLOC(VIDE;)); \ TRAITEMENT_D_UN_EVENEMENT_ARRIVE(MapRequest,BLOC(VIDE;)); \ TRAITEMENT_D_UN_EVENEMENT_ARRIVE(ReparentNotify,BLOC(VIDE;)); \ TRAITEMENT_D_UN_EVENEMENT_ARRIVE(ConfigureNotify,BLOC(VIDE;)); \ TRAITEMENT_D_UN_EVENEMENT_ARRIVE(ConfigureRequest,BLOC(VIDE;)); \ TRAITEMENT_D_UN_EVENEMENT_ARRIVE(GravityNotify,BLOC(VIDE;)); \ TRAITEMENT_D_UN_EVENEMENT_ARRIVE(ResizeRequest,BLOC(VIDE;)); \ TRAITEMENT_D_UN_EVENEMENT_ARRIVE(CirculateNotify,BLOC(VIDE;)); \ TRAITEMENT_D_UN_EVENEMENT_ARRIVE(CirculateRequest,BLOC(VIDE;)); \ TRAITEMENT_D_UN_EVENEMENT_ARRIVE(PropertyNotify,BLOC(VIDE;)); \ TRAITEMENT_D_UN_EVENEMENT_ARRIVE(SelectionClear,BLOC(VIDE;)); \ TRAITEMENT_D_UN_EVENEMENT_ARRIVE(SelectionRequest,BLOC(VIDE;)); \ TRAITEMENT_D_UN_EVENEMENT_ARRIVE(SelectionNotify,BLOC(VIDE;)); \ TRAITEMENT_D_UN_EVENEMENT_ARRIVE(ColormapNotify,BLOC(VIDE;)); \ TRAITEMENT_D_UN_EVENEMENT_ARRIVE(ClientMessage,BLOC(VIDE;)); \ TRAITEMENT_D_UN_EVENEMENT_ARRIVE(MappingNotify,BLOC(VIDE;)); \ Defo \ Bblock \ PRINT_ATTENTION("un evenement non reconnu est arrive (2)"); \ CAL1(Prer1("(numero=%d)\n",ASD1(bloc_d_attente_des_evenements,type))); \ Eblock \ EDef \ Eblock \ ECho \ Eblock \ ETan \ \ Test(IFEQ(ASD1(bloc_d_attente_des_evenements,type),evenement_attendu_inconnu)) \ /* Ce test en apparence inutile (a cause du 'Tant(...)' qui precede), est mis ici malgre */ \ /* tout afin de valider finement tout cette programmation... */ \ Bblock \ NE_PAS_SE_REMETTRE_EN_ATTENTE_D_UN_NOUVEL_EVENEMENT_DE_MEME_TYPE; \ /* Afin de ne pas se remettre en attente, sauf avis contraire ci-dessous... */ \ BLOC(action_a_la_reception); \ /* Apres l'arrivee de l'evenement attendu, on effectue eventuellement quelque chose de */ \ /* specifique. Rappelons que l'on peut trouver ici le code suivant : */ \ /* */ \ /* EGAL(boucler_sur_l_attente_des_evenements,VRAI); */ \ /* */ \ /* qui permettra de se remettre en attente d'un nouvel evenement de meme type ; ceci se */ \ /* fera grace a la procedure 'SE_REMETTRE_EN_ATTENTE_D_UN_NOUVEL_EVENEMENT_DE_MEME_TYPE'. */ \ Eblock \ ATes \ Bblock \ PRINT_ERREUR("incoherence dans l'evenement arrive"); \ /* En effet, l'instruction : */ \ /* */ \ /* Tant(IFNE(ASD1(bloc_d_attente_des_evenements,type),evenement_attendu_inconnu)) */ \ /* */ \ /* qui figure ci-dessus, a du detecter l'evenement attendu... */ \ Eblock \ ETes \ Eblock \ ETan \ \ Eblock \ /* Ainsi, on n'attend que l'evenement attendu et inconnu... */ # define ATTENTE_DE_L_EVENEMENT_ColormapNotify \ Bblock \ Test(IFNE(PALETTE_DE_COULEURS_UTILISEE,PALETTE_DE_COULEURS_PAR_DEFAUT)) \ Bblock \ ATTENTE_D_UN_EVENEMENT_CONNU(ColormapNotify,BLOC(VIDE;)); \ /* Attente de notification... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Ainsi, on attend l'evenement 'ColormapNotify' uniquement si l'on n'est pas sur la */ \ /* palette par defaut... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D O N N E S D E C O N T R O L E E T D ' I N F O R M A T I O N G L O B A L E S : */ /* */ /*************************************************************************************************************************************/ DEFV(Common,DEFV(CHAR,POINTERc(X11_____nom_du_serveur_et_de_l_ecran))); /* Nom du serveur et de l'ecran, ce qui correspond en fait a la variable 'DISPLAY' */ /* du shell... */ DEFV(Common,DEFV(Logical,INIT(X11_____liaison_avec_le_serveur,INACTIF))); /* Indicateur logique precisant si la liaison est active (entre un 'open' et un 'close'), */ /* ou inactive (pas encore ouverte, ou fermee). ATTENTION, il s'agit d'une variable externe. */ DEFV(Local,DEFV(X_Display,POINTERs(description_du_serveur_et_de_l_ecran))); /* Structure definissant les caracteristiques du serveur 'X-Window' et de l'ecran */ /* utilise pour la visualisation presente. */ DEFV(Local,DEFV(X_Int,INIT(nombre_de_visuals_satisfaisants_recuperes,UNDEF))); /* Nombre de "visual"s recuperes, et que l'on trouve dans la liste qui suit, */ DEFV(Local,DEFV(X_Int,INIT(POINTERi(Anombre_de_visuals_satisfaisants_recuperes) ,ADRESSE(nombre_de_visuals_satisfaisants_recuperes) ) ) ); /* Et son pointeur justifie uniquement pour les SYSTEMEs du type 'SYSTEME_CRAYYMP...' et qui */ /* valident les arguments de 'XGetVisualInfo(...)'... */ # if ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (defined(SYSTEME_APC_LinuxRedHat_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_ICC)) \ || (defined(SYSTEME_APC_LinuxUlmint_GCC)) \ || (defined(SYSTEME_APC_LinuxUlmint_ICC)) \ || (defined(SYSTEME_CRAYC98_UNICOS)) \ || (defined(SYSTEME_CRAYC916_UNICOS)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS)) \ || (defined(SYSTEME_DECALPHA340_OSF1)) \ || (defined(SYSTEME_DECALPHA350_OSF1)) \ || (defined(SYSTEME_DECALPHA464_OSF1)) \ || (defined(SYSTEME_ES9000_AIX)) \ || (defined(SYSTEME_FX2800_CONCENTRIX)) \ || (defined(SYSTEME_FX40_CONCENTRIX)) \ || (defined(SYSTEME_NWS3000_NEWSOS)) \ || (defined(SYSTEME_RS6000_AIX)) \ || (defined(SYSTEME_SG4D20G_IRIX)) \ || (defined(SYSTEME_SG4D25TG_IRIX)) \ || (defined(SYSTEME_SG4D310VGX_IRIX)) \ || (defined(SYSTEME_SG4D35TG_IRIX)) \ || (defined(SYSTEME_SG4D85GT_IRIX)) \ || (defined(SYSTEME_SGIND308_IRIX)) \ || (defined(SYSTEME_SGIND324_IRIX)) \ || (defined(SYSTEME_SGIND3GA_IRIX)) \ || (defined(SYSTEME_SGIND408_IRIX)) \ || (defined(SYSTEME_SGIND424_IRIX)) \ || (defined(SYSTEME_SGIND4GA_IRIX)) \ || (defined(SYSTEME_SGIND508_IRIX)) \ || (defined(SYSTEME_SGIND524_IRIX)) \ || (defined(SYSTEME_SGIND5GA_IRIX)) \ || (defined(SYSTEME_SGIND808_IRIX)) \ || (defined(SYSTEME_SGIND824_IRIX)) \ || (defined(SYSTEME_SGIND8GA_IRIX)) \ || (defined(SYSTEME_SGINDA08_IRIX)) \ || (defined(SYSTEME_SGINDA24_IRIX)) \ || (defined(SYSTEME_SGINDAGA_IRIX)) \ || (defined(SYSTEME_SGO200A1_IRIX)) \ || (defined(SYSTEME_SGO200A2_IRIX)) \ || (defined(SYSTEME_SGO200A4_IRIX)) \ || (defined(SYSTEME_SGO25224_IRIX)) \ || (defined(SYSTEME_SGO252VA_IRIX)) \ || (defined(SYSTEME_SGO252VN_IRIX)) \ || (defined(SYSTEME_SGPCM801_IRIX)) \ || (defined(SYSTEME_SGPCMA01_IRIX)) \ || (defined(SYSTEME_SUN3_SUNOS)) \ || (defined(SYSTEME_SUN4_SUNOS)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS)) \ || (defined(SYSTEME_VAX8600_ULTRIX)) \ || (defined(SYSTEME_VAX9000_ULTRIX)) \ ) DEFV(Local,DEFV(X_XVisualInfo,POINTERs(liste_des_visuals_supportes_et_satisfaisants))); /* Liste des differents types de "visual"s supportes physiquement par le systeme, et */ /* correspondant aux specifications exprimees dans 'type_de_visual_recherche'. */ /* ATTENTION : cette subtilite est due au traitement particulier de la fonction */ /* 'XGetVisualInfo(...)' sur ce SYSTEME, et qui renvoie un pointeur sur la structure */ /* 'X_XVisualInfo' et non pas un pointeur sur un tableau de telles structures... */ # Aif ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (defined(SYSTEME_APC_LinuxRedHat_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_ICC)) \ || (defined(SYSTEME_APC_LinuxUlmint_GCC)) \ || (defined(SYSTEME_APC_LinuxUlmint_ICC)) \ || (defined(SYSTEME_CRAYC98_UNICOS)) \ || (defined(SYSTEME_CRAYC916_UNICOS)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS)) \ || (defined(SYSTEME_DECALPHA340_OSF1)) \ || (defined(SYSTEME_DECALPHA350_OSF1)) \ || (defined(SYSTEME_DECALPHA464_OSF1)) \ || (defined(SYSTEME_ES9000_AIX)) \ || (defined(SYSTEME_FX2800_CONCENTRIX)) \ || (defined(SYSTEME_FX40_CONCENTRIX)) \ || (defined(SYSTEME_NWS3000_NEWSOS)) \ || (defined(SYSTEME_RS6000_AIX)) \ || (defined(SYSTEME_SG4D20G_IRIX)) \ || (defined(SYSTEME_SG4D25TG_IRIX)) \ || (defined(SYSTEME_SG4D310VGX_IRIX)) \ || (defined(SYSTEME_SG4D35TG_IRIX)) \ || (defined(SYSTEME_SG4D85GT_IRIX)) \ || (defined(SYSTEME_SGIND308_IRIX)) \ || (defined(SYSTEME_SGIND324_IRIX)) \ || (defined(SYSTEME_SGIND3GA_IRIX)) \ || (defined(SYSTEME_SGIND408_IRIX)) \ || (defined(SYSTEME_SGIND424_IRIX)) \ || (defined(SYSTEME_SGIND4GA_IRIX)) \ || (defined(SYSTEME_SGIND508_IRIX)) \ || (defined(SYSTEME_SGIND524_IRIX)) \ || (defined(SYSTEME_SGIND5GA_IRIX)) \ || (defined(SYSTEME_SGIND808_IRIX)) \ || (defined(SYSTEME_SGIND824_IRIX)) \ || (defined(SYSTEME_SGIND8GA_IRIX)) \ || (defined(SYSTEME_SGINDA08_IRIX)) \ || (defined(SYSTEME_SGINDA24_IRIX)) \ || (defined(SYSTEME_SGINDAGA_IRIX)) \ || (defined(SYSTEME_SGO200A1_IRIX)) \ || (defined(SYSTEME_SGO200A2_IRIX)) \ || (defined(SYSTEME_SGO200A4_IRIX)) \ || (defined(SYSTEME_SGO25224_IRIX)) \ || (defined(SYSTEME_SGO252VA_IRIX)) \ || (defined(SYSTEME_SGO252VN_IRIX)) \ || (defined(SYSTEME_SGPCM801_IRIX)) \ || (defined(SYSTEME_SGPCMA01_IRIX)) \ || (defined(SYSTEME_SUN3_SUNOS)) \ || (defined(SYSTEME_SUN4_SUNOS)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS)) \ || (defined(SYSTEME_VAX8600_ULTRIX)) \ || (defined(SYSTEME_VAX9000_ULTRIX)) \ ) DEFV(Local,DEFV(X_XVisualInfo,DTbp(liste_des_visuals_supportes_et_satisfaisants))); /* Liste des differents types de "visual"s supportes physiquement par le systeme, et */ /* correspondant aux specifications exprimees dans 'type_de_visual_recherche'. */ # Eif ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (defined(SYSTEME_APC_LinuxRedHat_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_ICC)) \ || (defined(SYSTEME_APC_LinuxUlmint_GCC)) \ || (defined(SYSTEME_APC_LinuxUlmint_ICC)) \ || (defined(SYSTEME_CRAYC98_UNICOS)) \ || (defined(SYSTEME_CRAYC916_UNICOS)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS)) \ || (defined(SYSTEME_DECALPHA340_OSF1)) \ || (defined(SYSTEME_DECALPHA350_OSF1)) \ || (defined(SYSTEME_DECALPHA464_OSF1)) \ || (defined(SYSTEME_ES9000_AIX)) \ || (defined(SYSTEME_FX2800_CONCENTRIX)) \ || (defined(SYSTEME_FX40_CONCENTRIX)) \ || (defined(SYSTEME_NWS3000_NEWSOS)) \ || (defined(SYSTEME_RS6000_AIX)) \ || (defined(SYSTEME_SG4D20G_IRIX)) \ || (defined(SYSTEME_SG4D25TG_IRIX)) \ || (defined(SYSTEME_SG4D310VGX_IRIX)) \ || (defined(SYSTEME_SG4D35TG_IRIX)) \ || (defined(SYSTEME_SG4D85GT_IRIX)) \ || (defined(SYSTEME_SGIND308_IRIX)) \ || (defined(SYSTEME_SGIND324_IRIX)) \ || (defined(SYSTEME_SGIND3GA_IRIX)) \ || (defined(SYSTEME_SGIND408_IRIX)) \ || (defined(SYSTEME_SGIND424_IRIX)) \ || (defined(SYSTEME_SGIND4GA_IRIX)) \ || (defined(SYSTEME_SGIND508_IRIX)) \ || (defined(SYSTEME_SGIND524_IRIX)) \ || (defined(SYSTEME_SGIND5GA_IRIX)) \ || (defined(SYSTEME_SGIND808_IRIX)) \ || (defined(SYSTEME_SGIND824_IRIX)) \ || (defined(SYSTEME_SGIND8GA_IRIX)) \ || (defined(SYSTEME_SGINDA08_IRIX)) \ || (defined(SYSTEME_SGINDA24_IRIX)) \ || (defined(SYSTEME_SGINDAGA_IRIX)) \ || (defined(SYSTEME_SGO200A1_IRIX)) \ || (defined(SYSTEME_SGO200A2_IRIX)) \ || (defined(SYSTEME_SGO200A4_IRIX)) \ || (defined(SYSTEME_SGO25224_IRIX)) \ || (defined(SYSTEME_SGO252VA_IRIX)) \ || (defined(SYSTEME_SGO252VN_IRIX)) \ || (defined(SYSTEME_SGPCM801_IRIX)) \ || (defined(SYSTEME_SGPCMA01_IRIX)) \ || (defined(SYSTEME_SUN3_SUNOS)) \ || (defined(SYSTEME_SUN4_SUNOS)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS)) \ || (defined(SYSTEME_VAX8600_ULTRIX)) \ || (defined(SYSTEME_VAX9000_ULTRIX)) \ ) DEFV(Common,DEFV(X_Window,X11_____fenetre_courante)); /* Structure definissant la fenetre courante, c'est-a-dire celle que l'on ouvre, et */ /* dans laquelle on visualise. ATTENTION, il s'agit d'une variable externe. */ DEFV(Local,DEFV(X_XSetWindowAttributes,attributs_de_la_fenetre)); /* Parametre definissant les attributs de la fenetre. */ DEFV(Local,DEFV(X_GC,contexte_graphique_de_visualisation)); /* Definition du contexte graphique par lequel visualiser l'image, et qui precise par */ /* exemple la facon d'ecrire les points... */ DEFV(Local,DEFV(Logical,INIT(utiliser_L_SUBSTITUTION_X_WINDOW,FAUX))); /* Indicateur logique precisant si 'L_SUBSTITUTION_X_WINDOW' est necessaire ('VRAI') ou */ /* pas ('FAUX'), ce qui se produit lorsqu'il y a correspondance un pour un des niveaux (cas */ /* sur 'SYSTEME_SG4D..._IRIX' lorsque l'on demande la liste de substitution */ /* 'L_SUBSTITUTION_NEUTRE'...). */ DEFV(Local,DEFV(Logical,INIT(creer_une_palette,VRAI))); /* Indicateur logique precisant si la palette a ete deja ete creee ou pas... */ DEFV(Local,DEFV(X_Colormap,palette_de_couleurs_creee)); /* Identificateur de la palette creee specifiquement pour la visualisation... */ DEFV(Local,DEFV(Logical,INIT(c_est_le_premier_XInstallColormap,VRAI))); /* Indicateur logique precisant si le premier 'XInstallColormap(...)' a ete fait ou pas, */ /* car en effet, pour le premier il faut un 'ColormapNotify', alors que pour les eventuels */ /* suivants, il n'en faut pas... */ DEFV(Local,DEFV(Logical,INIT(contenu_de_la_palette,INVALIDE))); /* Indicateur logique precisant si la palette a ete initialisee (dans un 'open'), ou pas */ /* encore (ou fermee apres un 'close'). */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 NOMBRE_DE_COULEURS_ALLOUEES_EN_UNE_FOIS \ UN \ /* Nombre d'entrees allouees a chaque appel de 'XAllocColorCells()', et nombre d'entrees */ \ /* initialisees a chaque appel de 'XStoreColors()'. */ # define COULEUR_UNIQUE_ALLOUEE \ INDEX0 \ /* Donne l'index de l'entree allouee par 'XAllocColorCells()' dans le vecteur */ \ /* 'entree_courante_de_la_palette'. */ # define NOMBRE_DE_PLANS_MASQUES_ALLOUES_EN_UNE_FOIS \ ZERO \ /* Nombre de plans "masque" alloues a chaque appel de 'XAllocColorCells()'. */ # define CONTIGUITE_DES_ENTREES \ False \ /* Indique si les plans alloues doivent etre contigus ('True') ou pas ('False'). */ # define NIVEAU_DE_L_entree_courante_de_la_palette \ ASD1(ITb1(entree_courante_de_la_palette,INDX(COULEUR_UNIQUE_ALLOUEE,COULEUR_UNIQUE_ALLOUEE)),pixel) \ /* Pour alleger l'ecriture... */ # define ACCES_LA_PALETTE_ET_TRANSLATION(substitution,composante) \ Bblock \ SUBSTITUTION(L_SUBSTITUTION`substitution); \ EGAL(ASD1(ITb1(entree_courante_de_la_palette,INDX(COULEUR_UNIQUE_ALLOUEE,COULEUR_UNIQUE_ALLOUEE)) \ ,composante \ ) \ ,POURCENTAGE_DES_COULEURS(Nsubstitution(ROTATION_NIVEAU(niveau \ ,increment_des_niveaux \ ,translater_le_NOIR \ ) \ ) \ ) \ ); \ Eblock \ /* Acces a une entree d'une liste de substitution et translation... */ # define X_FACTEUR_MULTIPLICATIF_DES_NIVEAUX \ FLOT(TRMU(EXP2(COULEURS))) \ /* Facteur par lequel il faut multiplier des niveaux normalises (dans [0,1]) pour */ \ /* obtenir des niveaux de gris compatible avec 'X-Window'... */ # define POURCENTAGE_DES_COULEURS(niveau) \ INTE(MUL2(______NORMALISE_NIVEAU(niveau) \ ,X_FACTEUR_MULTIPLICATIF_DES_NIVEAUX \ ) \ ) \ /* Pour convertir un niveau dans [NOIR,BLANC] en un pourcentage. */ # define PAS_D_ENTREE_PRECEDENTE_DE_LA_PALETTE \ UNDEF \ /* Pour initialiser 'entree_precedente_de_la_palette'... */ # define PAS_D_ENTREE_ALLOUEE_DE_LA_PALETTE \ UNDEF \ /* Pour initialiser 'entree_allouee_de_la_palette'... */ DEFV(Common,DEFV(FonctionI,IXpalette(increment_des_niveaux,translater_le_NOIR))) DEFV(Argument,DEFV(Int,increment_des_niveaux)); /* Increment du niveau courant dans [NOIR,BLANC] afin de pouvoir decaler la palette (ce */ /* qui signifie aussi la faire "tourner"). */ DEFV(Argument,DEFV(Logical,translater_le_NOIR)); /* Indique si le niveau 'NOIR' est translatable ('LE_NOIR_EST_TRANSLATABLE') dans */ /* 'ACCES_LA_PALETTE_ET_TRANSLATION(...)' ou pas ('LE_NOIR_N_EST_PAS_TRANSLATABLE')... */ /* */ /* ATTENTION, cet Argument n'a de sens que pour 'ALLOCATION_DES_COULEURS_VERSION_02', mais */ /* vu que l'appel a la procedure 'ACCES_LA_PALETTE_ET_TRANSLATION(...)' n'est pas soumis */ /* a cette condition, cet Argument est toujours present. Enfin, cela simplifie les choses */ /* puisque l'on valide le nombre d'arguments des fonctions... */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /* ATTENTION : 'INIT_ERROR' est mis en tete des variables locales au cas ou des couples */ /* ('BDEFV','EDEFV') suivraient... */ DEFV(Positive,INIT(nombre_d_entrees_utilisees,ZERO)); DEFV(X_XColor,DTb1(entree_courante_de_la_palette,NOMBRE_DE_COULEURS_ALLOUEES_EN_UNE_FOIS)); /* Donnees necessaires a definir l'entree courante de la palette lors de son initialisation. */ DEFV(X_Positive,DTb1(entrees_allouees_dans_la_palette,NOMBRE_DE_COULEURS_ALLOUEES_EN_UNE_FOIS)); /* Donne l'entree courante allouee dans la palette de couleurs, */ DEFV(X_Positive,INIT(POINTERi(Aentrees_allouees_dans_la_palette),ATb1(entrees_allouees_dans_la_palette))); /* Et son pointeur pour faire plaisir a 'XAllocColorCells(...)' sur les SYSTEMEs qui */ /* valident les arguments... */ DEFV(X_Positive,DTb1(masques_alloues_dans_la_palette,NOMBRE_DE_PLANS_MASQUES_ALLOUES_EN_UNE_FOIS)); /* Donne le plan de masque alloue dans la palette de couleur, mais ceci est inutilise, */ DEFV(X_Positive,INIT(POINTERi(Amasques_alloues_dans_la_palette),ATb1(masques_alloues_dans_la_palette))); /* Et son pointeur pour faire plaisir a 'XAllocColorCells(...)' sur les SYSTEMEs qui */ /* valident les arguments... */ DEFV(Positive,INIT(entree_precedente_de_la_palette,PAS_D_ENTREE_PRECEDENTE_DE_LA_PALETTE)); /* Donnees necessaires a eviter d'allouer deux fois de suite la meme entree... */ DEFV(Positive,INIT(entree_allouee_de_la_palette,PAS_D_ENTREE_ALLOUEE_DE_LA_PALETTE)); /* Entree reellement allouee lors d'un 'XallocColor()'. */ DEFV(Logical,INIT(faire_le_XStoreColors,VRAI)); /* Indicateur permettant, en cas d'erreur, d'inhiber les 'XStoreColors()'. */ /*..............................................................................................................................*/ Test(EST_ACTIF(X11_____liaison_avec_le_serveur)) Bblock Test(EST_VRAI(IXopen_____X_Window_a_ete_mis_en_mode_fausses_couleurs)) /* Cas des fausses couleurs : */ Bblock Test(ACCES_AUX_PALETTES_DE_COULEURS_VERSION_02) Bblock Test(IL_FAUT(creer_une_palette)) Bblock Test(IZGT(nombre_de_visuals_satisfaisants_recuperes)) Bblock EGAL(palette_de_couleurs_creee ,XCreateColormap(description_du_serveur_et_de_l_ecran ,X11_____fenetre_courante ,APPARENCE_VISUELLE_DE_LA_FENETRE ,AllocNone ) ); /* Creation de la palette en utilisant le premier "visual" satisfaisant... */ /* ATTENTION : on devrait, par raison d'homogeneite, ecrire : */ /* */ /* EGAL(PALETTE_DE_COULEURS_UTILISEE */ /* ,... */ /* ); */ /* */ /* mais malheureusement, le compilateur des SYSTEMEs 'SYSTEME_SG4D..._IRIX_CC' n'accepte */ /* pas cette syntaxe audacieuse... */ EGAL(creer_une_palette,FAUX); /* Ainsi, l'on sait pour les eventuels appels suivants de 'IXpalette(...)' que la palette */ /* a deja ete creee (jusqu'a 'IXclose(...)'). */ Eblock ATes Bblock /* ATTENTION : 'creer_une_palette' conserve sa valeur 'VRAI', et ainsi, on saura par la */ /* suite que rien de satisfaisant n'a ete trouve... */ EGAL(palette_de_couleurs_creee ,PALETTE_DE_COULEURS_PAR_DEFAUT ); /* Et on prend la palette par defaut... */ /* ATTENTION : on devrait, par raison d'homogeneite, ecrire : */ /* */ /* EGAL(PALETTE_DE_COULEURS_UTILISEE */ /* ,... */ /* ); */ /* */ /* mais malheureusement, le compilateur des SYSTEMEs 'SYSTEME_SG4D..._IRIX_CC' n'accepte */ /* pas cette syntaxe audacieuse... */ Eblock ETes Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes Test(IFOU(IFET(ACCES_AUX_PALETTES_DE_COULEURS_VERSION_01 ,IFNE(TYPE_DU_COLORIAGE_COURANT,PseudoColor) ) ,IFET(ACCES_AUX_PALETTES_DE_COULEURS_VERSION_02 ,IL_FAUT(creer_une_palette) ) ) ) Bblock PRINT_ERREUR("le mode demande n'est pas disponible"); # define GENERE_ACCES_AUX_PALETTES_DE_COULEURS_VERSION_XX(numero) \ COND(ACCES_AUX_PALETTES_DE_COULEURS_VERSION`numero,"numero",C_VIDE) begin_nouveau_block Bblock DEFV(CHAR,INIC(POINTERc(format_EGAq____IXpalette) ,chain_Aconcaten2(GENERE_ACCES_AUX_PALETTES_DE_COULEURS_VERSION_XX(01) ,GENERE_ACCES_AUX_PALETTES_DE_COULEURS_VERSION_XX(02) ) ) ); CAL1(Prer1("(ACCES_AUX_PALETTES_DE_COULEURS_VERSION_%s)\n",format_EGAq____IXpalette)); CALZ_FreCC(format_EGAq____IXpalette); Eblock end_nouveau_block # undef GENERE_ACCES_AUX_PALETTES_DE_COULEURS_VERSION_XX CODE_ERROR(ERREUR28); /* Introduit le 20021223104745 pour '$LACT15'... */ Eblock ATes Bblock EGAL(utiliser_L_SUBSTITUTION_X_WINDOW,FAUX); /* Indicateur logique precisant si 'L_SUBSTITUTION_X_WINDOW' est necessaire ('VRAI') ou */ /* pas ('FAUX'), ce qui se produit lorsqu'il y a correspondance un pour un des niveaux (cas */ /* sur 'SYSTEME_SG4D..._IRIX' lorsque l'on demande la liste de substitution */ /* 'L_SUBSTITUTION_NEUTRE'...). A l'etat initial cette liste n'est pas utile a priori. */ EGAL(ASD1(ITb1(entree_courante_de_la_palette,INDX(COULEUR_UNIQUE_ALLOUEE,COULEUR_UNIQUE_ALLOUEE)),flags) ,OUI03(DoRed ,DoGreen ,DoBlue ) ); /* Afin de positionner les trois composantes chromatiques... */ BoIn(niveau,NOIR,BLANC,PAS_COULEURS) Bblock Test(EST_INVALIDE(contenu_de_la_palette)) Bblock /* Lorsque le contenu de la palette est 'INVALIDE', cela signifie qu'elle n'a pas encore */ /* ete allouee, il convient donc de le faire... */ Test(EST_INACTIF_FILTRAGE) Bblock EGAL(NIVEAU_DE_L_entree_courante_de_la_palette ,ADD2(VRAI_NIVEAU_DE_NOIR_DE_L_ECRAN,NIVR(niveau)) ); /* Afin de selectionner le niveau de gris de l'entree courante ; lorsqu'il n'y a pas de */ /* substitution active, on le prend tel quel... */ Eblock ATes Bblock EGAL(NIVEAU_DE_L_entree_courante_de_la_palette ,ADD2(VRAI_NIVEAU_DE_NOIR_DE_L_ECRAN,NIVR(Nsubstitution(niveau))) ); /* Afin de selectionner le niveau de gris de l'entree courante ; lorsqu'une substitution */ /* est active, ce niveau de gris (qui est aussi rappelons-le l'index d'acces a la */ /* palette de la fenetre) passe dans cette substitution courante, ce qui permet de faire */ /* des "tassements" de palettes, afin qu'elles occupent moins de 'COULEURS' entrees... */ Eblock ETes Eblock ATes Bblock /* Lorsque le contenu de la palette est 'VALIDE', cela signifie qu'elle a deja ete */ /* allouee, il convient donc de recuperer les allocations deja faites... */ 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. */ SUBSTITUTION(L_SUBSTITUTION_X_WINDOW); EGAL(NIVEAU_DE_L_entree_courante_de_la_palette ,ADD2(VRAI_NIVEAU_DE_NOIR_DE_L_ECRAN,NIVR(Nsubstitution(niveau))) ); /* Afin de recuperer l'entree deja allouee dans la palette de couleurs... */ PULL_SUBSTITUTION; PULL_FILTRAGE; /* Et restauration des conditions initiales... */ Eblock ETes Test(IFEQ(NIVEAU_DE_L_entree_courante_de_la_palette ,PAS_D_ENTREE_PRECEDENTE_DE_LA_PALETTE ) ) Bblock PRINT_ATTENTION("la detection de la reallocation ne fonctionne pas correctement"); Eblock ATes Bblock Eblock ETes Test(IFNE(NIVEAU_DE_L_entree_courante_de_la_palette ,entree_precedente_de_la_palette ) ) Bblock 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. */ ACCES_LA_PALETTE_ET_TRANSLATION(ROUGE,red); /* Recuperation de la composante 'ROUGE', */ ACCES_LA_PALETTE_ET_TRANSLATION(VERTE,green); /* Recuperation de la composante 'VERTE', */ ACCES_LA_PALETTE_ET_TRANSLATION(BLEUE,blue); /* Recuperation de la composante 'BLEUE', */ PULL_SUBSTITUTION; PULL_FILTRAGE; /* Et restauration des conditions initiales... */ EGAL(faire_le_XStoreColors,VRAI); /* A priori, le 'XStoreColors()' doit etre effectue... */ EGAL(entree_precedente_de_la_palette ,NIVEAU_DE_L_entree_courante_de_la_palette ); /* Ainsi, on se souvient de la derniere entree initialisee, afin d'eviter les */ /* re-allocations, que la palette soit 'VALIDE' ou 'INVALIDE'... */ Test(IFINff(niveau,NIVA(VRAI_NIVEAU_DE_NOIR_DE_L_ECRAN),NIVA(VRAI_NIVEAU_DE_BLANC_DE_L_ECRAN))) /* ATTENTION, on notera que l'on n'ecrit pas : */ /* */ /* Test(IFINff(niveau,NIVA(NIVEAU_DU_NOIR_DE_L_ECRAN),NIVA(NIVEAU_DU_BLANC_DE_L_ECRAN))) */ /* */ /* car, en effet, 'NIVEAU_DU_BLANC_DE_L_ECRAN' ne designe pas, sur certains SYSTEMEs le */ /* niveau maximal. Ainsi, sur 'SYSTEME_SG4D...', on trouve : */ /* */ /* preallocated pixels: black 0, white 7 */ /* */ /* et donc 'NIVEAU_DU_BLANC_DE_L_ECRAN' vaut 7 (et non pas 255...). De meme, sur */ /* 'SYSTEME_NWS3000_NEWSOS', on trouve : */ /* */ /* preallocated pixels: black 1, white 0 */ /* */ /* toutes ces informations etant obtenues par 'xdpyinfo'. */ Bblock Test(EST_INVALIDE(contenu_de_la_palette)) Bblock Test(X_IL_Y_A_ERREUR(CODE_ERROR(XAllocColorCells (description_du_serveur_et_de_l_ecran ,PALETTE_DE_COULEURS_UTILISEE ,CONTIGUITE_DES_ENTREES ,Amasques_alloues_dans_la_palette ,POSI(NOMBRE_DE_PLANS_MASQUES_ALLOUES_EN_UNE_FOIS) ,Aentrees_allouees_dans_la_palette ,POSI(NOMBRE_DE_COULEURS_ALLOUEES_EN_UNE_FOIS) ) ) ) ) /* Et allocation de l'entree de rang 'niveau', cette entree etant en mode 'read-write'... */ Bblock PRINT_ERREUR("l'allocation d'un registre de coloriage est impossible"); CAL1(Prer1("son niveau est %d\n",niveau)); EGAL(faire_le_XStoreColors,FAUX); /* Puisqu'il y a eu erreur, il faut inhiber le 'XStoreColors()'... */ Eblock ATes Bblock EGAL(entree_allouee_de_la_palette ,ITb1(entrees_allouees_dans_la_palette ,INDX(COULEUR_UNIQUE_ALLOUEE,COULEUR_UNIQUE_ALLOUEE) ) ); /* Ainsi, on se souvient de la derniere entree allouee pour calculer la liste de */ /* substitution 'L_SUBSTITUTION_X_WINDOW'. */ EGAL(NIVEAU_DE_L_entree_courante_de_la_palette ,entree_allouee_de_la_palette ); /* Mise en place de l'entree allouee... */ INCR(nombre_d_entrees_utilisees,I); /* Comptage des entrees reellement utilises dans la palette de couleurs. */ Eblock ETes Eblock ATes Bblock Eblock ETes Test(IL_FAUT(faire_le_XStoreColors)) Bblock CALS(XStoreColors(description_du_serveur_et_de_l_ecran ,PALETTE_DE_COULEURS_UTILISEE ,entree_courante_de_la_palette ,NOMBRE_DE_COULEURS_ALLOUEES_EN_UNE_FOIS ) ); /* Enfin, on initialise (ou re-initialise) l'entree courante de la palette lorsqu'il */ /* n'y a pas eu d'erreur dans 'XAllocColorCells()'... */ Eblock ATes Bblock Eblock ETes Eblock ATes Bblock PRINT_ERREUR("la palette du serveur ne supporte pas assez de couleurs"); CAL1(Prer3("le niveau %d est ignore car en dehors de [%d,%d]\n" ,niveau ,NIVA(VRAI_NIVEAU_DE_NOIR_DE_L_ECRAN) ,NIVA(VRAI_NIVEAU_DE_BLANC_DE_L_ECRAN) ) ); Eblock ETes Eblock ATes Bblock Eblock ETes Test(EST_INVALIDE(contenu_de_la_palette)) Bblock MODIFICATION_LISTE_DE_COLORIAGE_X_WINDOW(niveau ,NIVA(SOUS(entree_allouee_de_la_palette ,VRAI_NIVEAU_DE_NOIR_DE_L_ECRAN ) ) ); /* Ainsi, on memorise les niveaux de gris qui sont reellement alloues par 'X-Window' */ /* pour cette palette afin que l'affichage des images puisse l'utiliser... */ Test(IFNE(niveau ,NIVA(SOUS(entree_allouee_de_la_palette,VRAI_NIVEAU_DE_NOIR_DE_L_ECRAN)) ) ) Bblock EGAL(utiliser_L_SUBSTITUTION_X_WINDOW,VRAI); /* On sait ici que 'L_SUBSTITUTION_X_WINDOW' est necessaire puisqu'on a decouvert au moins */ /* une correspondance qui n'est pas un pour un... */ Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes Eblock EBoI Test(EST_INVALIDE(contenu_de_la_palette)) Bblock CALS(XSetWindowColormap(description_du_serveur_et_de_l_ecran ,X11_____fenetre_courante ,PALETTE_DE_COULEURS_UTILISEE ) ); /* Et affectation de cette palette a la fenetre courante... */ # ifdef BUG_SYSTEME_X_WINDOW_EVENEMENTS_2 ATTENTE_DE_L_EVENEMENT_ColormapNotify; # Aifdef BUG_SYSTEME_X_WINDOW_EVENEMENTS_2 ATTENTE_D_UN_EVENEMENT_CONNU(ColormapNotify,BLOC(VIDE;)); /* Et attente de notification... */ # Eifdef BUG_SYSTEME_X_WINDOW_EVENEMENTS_2 Test(IFLT(NOMBRE_MAXIMAL_DE_COULEURS_ACCESSIBLES,nombre_d_entrees_utilisees)) Bblock PRINT_ERREUR("en mode 'pseudo-couleurs', le nombre de couleurs disponibles est insuffisant"); Eblock ATes Bblock Eblock ETes EGAL(contenu_de_la_palette,VALIDE); /* Ainsi, on sait que le contenu de la palette est 'VALIDE' ; l'invalidation se fera dans */ /* le 'IXclose()'. */ Eblock ATes Bblock Eblock ETes Test(ACCES_AUX_PALETTES_DE_COULEURS_VERSION_02) Bblock Test(IFNE(PALETTE_DE_COULEURS_UTILISEE,PALETTE_DE_COULEURS_PAR_DEFAUT)) Bblock EGAL(ASD1(attributs_de_la_fenetre,colormap),PALETTE_DE_COULEURS_UTILISEE); CALS(XChangeWindowAttributes(description_du_serveur_et_de_l_ecran ,X11_____fenetre_courante ,CWColormap ,ADRESSE(attributs_de_la_fenetre) ) ); /* Changement des attributs de la fenetre, au cas ou la palette utilisee ne serait pas */ /* la palette par defaut... */ # ifdef BUG_SYSTEME_X_WINDOW_EVENEMENTS_3 # Aifdef BUG_SYSTEME_X_WINDOW_EVENEMENTS_3 ATTENTE_DE_L_EVENEMENT_ColormapNotify; # Eifdef BUG_SYSTEME_X_WINDOW_EVENEMENTS_3 CALS(XInstallColormap(description_du_serveur_et_de_l_ecran ,PALETTE_DE_COULEURS_UTILISEE ) ); /* Installation physique (au niveau hardware) de la palette. On notera que cette appel */ /* est fait apres chaque modification de la palette ; cela est rendu obligatoire par */ /* 'SYSTEME_SG4D..._IRIX' qui sans lui, laisse la palette inchangee a l'ecran, alors que */ /* pour 'SYSTEME_DPX5000_SPIX', tout se passe bien. Mais encore une fois, le fait que l'on */ /* soit sur 'SYSTEME_DPX5000_SPIX' n'empeche pas d'utiliser le serveur distant de */ /* 'SYSTEME_SG4D..._IRIX', d'ou cet appel inconditionnel... */ Test(EST_VRAI(c_est_le_premier_XInstallColormap)) Bblock ATTENTE_DE_L_EVENEMENT_ColormapNotify; /* Dans le cas du premier 'XInstallColormap(...)' apres le 'IXopen(...)', il faut faire */ /* le 'ATTENTE_DE_L_EVENEMENT_ColormapNotify', alors que pour les eventuels suivants, il */ /* n'y en aura pas... */ EGAL(c_est_le_premier_XInstallColormap,FAUX); /* Indiquons ainsi que le premier 'XInstallColormap(...)' a ete fait, et ce jusqu'a ce que */ /* l'on fasse le 'IXclose(...)'... */ Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes Eblock ETes Test(ACCES_AUX_PALETTES_DE_COULEURS_VERSION_03) Bblock PRINT_ERREUR("le changement de couleurs ne peut avoir lieu en vraies couleurs (1)"); /* En fait, evidemment on ne passe jamais par ici (par definition du mode */ /* 'ACCES_AUX_PALETTES_DE_COULEURS_VERSION_03'), mais c'est plus "symetrique"... */ Eblock ATes Bblock Eblock ETes Eblock ATes Bblock /* Cas des vraies couleurs : */ PRINT_ERREUR("le changement de couleurs ne peut avoir lieu en vraies couleurs (2)"); Eblock ETes Eblock ATes Bblock PRINT_ERREUR("le chargement des couleurs ne peut avoir lieu car la liaison avec le serveur 'X-Window' est inactive"); Eblock ETes RETU_ERROR; Eblock # undef PAS_D_ENTREE_ALLOUEE_DE_LA_PALETTE # undef PAS_D_ENTREE_PRECEDENTE_DE_LA_PALETTE # undef POURCENTAGE_DES_COULEURS # undef ACCES_LA_PALETTE_ET_TRANSLATION # undef NIVEAU_DE_L_entree_courante_de_la_palette # undef X_FACTEUR_MULTIPLICATIF_DES_NIVEAUX # undef CONTIGUITE_DES_ENTREES # undef NOMBRE_DE_PLANS_MASQUES_ALLOUES_EN_UNE_FOIS # undef COULEUR_UNIQUE_ALLOUEE # undef NOMBRE_DE_COULEURS_ALLOUEES_EN_UNE_FOIS EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C H O I X E N T R E N E P A S I N V E R S E R L ' I M A G E E T L ' I N V E R S E R : */ /* */ /*************************************************************************************************************************************/ # define LAISSER_LES_NIVEAUX_DE_L_IMAGE_EN_L_ETAT \ NOTL(INVERSER_LES_NIVEAUX_DE_L_IMAGE) \ /* L'image a visualiser l'est en mode 'GXcopy', c'est-a-dire qu'elle n'est pas inversee... */ # define INVERSER_LES_NIVEAUX_DE_L_IMAGE \ IFOU(LE_SERVEUR_X_WINDOW_EST_CELUI_DE("X_LACT23") \ ,TOUJOURS_FAUX \ ) \ /* L'image a visualiser l'est en mode 'GXcopyInverted', c'est-a-dire qu'elle est inversee... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* S A U V E G A R D E D E S D I M E N S I O N S D E L ' I M A G E : */ /* */ /*************************************************************************************************************************************/ # if ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \ || (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \ ) DEFV(Local,DEFV(Int,INIT(EnTete_de_sauvegardM ## Xmin_avant_IXopen,UNDEF))); DEFV(Local,DEFV(Int,INIT(EnTete_de_sauvegardM ## Xmax_avant_IXopen,UNDEF))); DEFV(Local,DEFV(Int,INIT(EnTete_de_sauvegardM ## Ymin_avant_IXopen,UNDEF))); DEFV(Local,DEFV(Int,INIT(EnTete_de_sauvegardM ## Ymax_avant_IXopen,UNDEF))); /* Sauvegarde de {{Xmin,Xmax},{Ymin,Ymax}} avant 'IXopen(...)'. Ce dispositif a ete */ /* introduit le 20010222172555 car, en effet, j'ai decouvert a cette date que l'affichage */ /* etait incorrect (incomplet...) lorsque 'Xmin' ou 'Ymin' etaient non nuls... */ # Aif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \ || (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \ ) # Eif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \ || (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \ ) /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* O U V E R T U R E D ' U N E F E N E T R E : */ /* */ /*************************************************************************************************************************************/ # define NOMBRE_D_ARGUMENTS_ARGV \ UN \ /* Nombre maximal d'arguments 'argc' et 'argv' de 'XSetStandardProperties()' ; ces */ \ /* arguments vont etre provoirement inutilises... */ # define NOMBRE_MAXIMAL_DE_COULEURS_AUTORISEES \ COND(ACCES_AUX_PALETTES_DE_COULEURS_VERSION_01 \ ,MOIT(COULEURS) \ ,COND(ACCES_AUX_PALETTES_DE_COULEURS_VERSION_02 \ ,NEUT(COULEURS) \ ,COND(ACCES_AUX_PALETTES_DE_COULEURS_VERSION_03 \ ,NEUT(COULEURS) \ ,NEUT(COULEURS) \ ) \ ) \ ) \ /* Nombre maximal de couleurs que l'on autorise pour une image... */ # define ABSENCE_DE_TRANSLATION_DE_LA_PALETTE \ ZERO \ /* Afin que la palette soit transmise telle qu'elle... */ # define NOM_DE_LA_FENETRE \ nom_de_la_fenetreA \ /* Nom a donner a la fenetre courante, */ # define NOM_DE_SON_ICONE \ nom_de_la_fenetreA \ /* Et nom a donner a son icone associee... */ # define EDITION_DES_MESSAGES_DE_CONNEXION_IMPOSSIBLE_AVEC_LE_SERVEUR \ Bblock \ PRINT_ERREUR("la liaison avec le serveur 'X-Window' n'a pu se faire"); \ CAL1(Prer0("Les causes possibles sont :\n")); \ CAL1(Prer0(" 1-l'ordinateur demande n'existe pas dans '$Fhosts',\n")); \ CAL1(Prer0(" 2-l'eventuel accelerateur de '$Fhosts' n'est pas a jour")); \ CAL1(Prer0(" (voir 'mkhosts' sur 'SYSTEME_NWS3000_NEWSOS'),\n")); \ CAL1(Prer0(" 3-il n'y a pas les autorisations necessaires sur l'ordinateur demande")); \ CAL1(Prer0(" (voir '$FXhosts'),\n")); \ CAL1(Prer0(" 4-le serveur 'X-Window' n'est pas actif,\n")); \ CAL1(Prer0(" 5-il n'y a pas d'utilisateurs 'logue'.\n")); \ Eblock \ /* Messages a envoyer apres un echec de la fonction 'XOpenDisplay(...)'. */ # define TEST_DE_LA_RELEASE_DU_SERVEUR(description_du_serveur_et_de_l_ecran) \ Bblock \ Test(IFNE(VendorRelease(description_du_serveur_et_de_l_ecran),X_WINDOW_RELEASE)) \ Bblock \ /* ATTENTION : la fonction 'VendorRelease(...)' renvoie le numero de release du serveur, qui */ \ /* s'il est distant a de forte chance d'etre different de celui des bibliotheques locales ; */ \ /* ce test n'est donc pas forcement le signe d'un bug quelconque, a moins que les valeurs */ \ /* editees ci-dessous ne soient completement farfelues... */ \ PRINT_ATTENTION("le numero de release du serveur n'est pas celui des bibliotheques locales"); \ CAL1(Prer1("release a la compilation = %d\n",X_WINDOW_RELEASE)); \ CAL1(Prer1("release du serveur = %d\n",VendorRelease(description_du_serveur_et_de_l_ecran))); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Test du numero de la release du serveur 'X-Window'. */ # define TEST_DE_L_EXISTENCE_DU_BACKINGSTORE(description_du_serveur_et_de_l_ecran) \ Bblock \ Test(IFEQ(DoesBackingStore(XDefaultScreenOfDisplay(description_du_serveur_et_de_l_ecran)),NotUseful)) \ Bblock \ PRINT_ATTENTION("le mode 'backing-store' n'est pas supporte par le serveur utilise"); \ /* On verra a ce propos le fichier '$FxSGINeWS_cmd', et les commentaires qui lui sont */ \ /* associes dans le fichier '$Ffiles'... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Test(IFEQ(DoesSaveUnders(XDefaultScreenOfDisplay(description_du_serveur_et_de_l_ecran)),False)) \ Bblock \ PRINT_ATTENTION("le mode 'save-under' n'est pas supporte par le serveur utilise"); \ /* On verra a ce propos le fichier '$FxSGINeWS_cmd', et les commentaires qui lui sont */ \ /* associes dans le fichier '$Ffiles'... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Test de l'exisence du 'BackingStore' et du 'SaveUnder'. */ # define TESTS_DE_L_ECRAN_DU_SERVEUR(description_du_serveur_et_de_l_ecran) \ Bblock \ Test(IZLE(ScreenCount(description_du_serveur_et_de_l_ecran))) \ Bblock \ PRINT_ERREUR("il n'y a pas d'ecrans sur ce serveur 'X-Window'"); \ EGAL(l_ouverture_de_la_fenetre_est_tentable,FAUX); \ /* Et l'ouverture de la fenetre est refusee... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Test(IL_NE_FAUT_PAS(X11_____tenter_l_ouverture_des_fenetres_trop_grandes_par_rapport_a_l_ecran)) \ Bblock \ Test(IFLT(LARGEUR_DE_L_ECRAN,dimX)) \ Bblock \ PRINT_ATTENTION("les images sont trop larges pour l'ecran"); \ CAL1(Prer2("une largeur de %d est demandee, alors que %d est la valeur maximale\n" \ ,dimX \ ,LARGEUR_DE_L_ECRAN \ ) \ ); \ \ EGAL(l_ouverture_de_la_fenetre_est_tentable,FAUX); \ /* Et l'ouverture de la fenetre est refusee... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ Test(IFLT(HAUTEUR_DE_L_ECRAN,dimY)) \ Bblock \ PRINT_ATTENTION("les images sont trop hautes pour l'ecran"); \ CAL1(Prer2("une hauteur de %d est demandee, alors que %d est la valeur maximale\n" \ ,dimY \ ,HAUTEUR_DE_L_ECRAN \ ) \ ); \ \ EGAL(l_ouverture_de_la_fenetre_est_tentable,FAUX); \ /* Et l'ouverture de la fenetre est refusee... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Test du nombre d'ecrans du serveur et des dimensions correspondantes. */ # ifdef BUG_SYSTEME_X_WINDOW_IMAGE_3 # define QUE_FAIRE_DU_BACKING_STORE \ NotUseful \ /* Peut-on faire du "backinstore" ? */ # Aifdef BUG_SYSTEME_X_WINDOW_IMAGE_3 # define QUE_FAIRE_DU_BACKING_STORE \ Always \ /* Peut-on faire du "backingstore" ? */ # Eifdef BUG_SYSTEME_X_WINDOW_IMAGE_3 DEFV(Common,DEFV(Logical,ZINT(VALIDATION_PRELIMINAIRE_DES_DIMENSIONS_D_UNE_FENETRE_____compatibilite_20240331,FAUX))); /* Indicateur permettant d'assurer la compatibilite anterieure, si besoin est. Il fut */ /* introduit le 20240331074206v... */ # define VALIDATION_PRELIMINAIRE_DES_DIMENSIONS_D_UNE_FENETRE \ Bblock \ Test(IFET(IL_FAUT(X11_____KeyPress_____editer_XY_curseur) \ ,IFOU(IFOU(IFGT(ASI1(dimension_de_la_fenetre,dx),_____lNORMALISE_OX11(LONGUEUR(LARGEUR_DE_L_ECRAN))) \ ,IFGT(ASI1(dimension_de_la_fenetre,dy),_____lNORMALISE_OY11(LONGUEUR(HAUTEUR_DE_L_ECRAN))) \ ) \ ,IFOU(IFNE(ASI1(dimension_de_la_fenetre,dx),_____lNORMALISE_OX11(dimX)) \ ,IFNE(ASI1(dimension_de_la_fenetre,dy),_____lNORMALISE_OY11(dimY)) \ ) \ ) \ ) \ ) \ Bblock \ Test(IL_FAUT(X11_____KeyPress_____editer_XY_curseur_message_fenetre_incompatible)) \ /* Test introduit le 20091212212950... */ \ Bblock \ PRINT_ATTENTION("la taille de la fenetre est incompatible avec l'edition des coordonnees [X,Y]"); \ PRINT_ATTENTION("cette possibilite est donc inhibee"); \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ \ EGAL(X11_____KeyPress_____editer_XY_curseur \ ,COND(IL_NE_FAUT_PAS(VALIDATION_PRELIMINAIRE_DES_DIMENSIONS_D_UNE_FENETRE_____compatibilite_20240331) \ ,VRAI \ ,FAUX \ ) \ ); \ /* Et le dispositif 'X11_____KeyPress_____editer_XY_curseur' est inhibe... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Validation preliminaire des dimensions d'une fenetre. Ceci a ete introduit le */ \ /* 20000324142904 a cause de 'X11_____KeyPress_____editer_XY_curseur' car en effet, pour des */ \ /* fenetres debordant de l'ecran le resultat de l'evaluation des coordonnees {X,Y} etait en */ \ /* general faux en ce qui concerne 'Y'. Cela semble venir du fait que bien que la fenetre */ \ /* semble correctement reduite de facon a tenir dans l'ecran, ses dimensions {width,height} */ \ /* semblent etre toujours celles qui ont ete demandees lors du 'IXopen...(...)'. */ \ /* 'dimension_de_la_fenetre' car il s'agit d'un argument d'appel (accede par 'ASI1(...)' */ \ /* et cela ne serait pas tres correct d'agir ainsi sur l'appelant... */ \ /* */ \ /* Le 20000327083012, pour simplifier davantage, l'edition des coordonnees {X,Y} ne sera */ \ /* possible que si la taille de le fenetre est strictement egale a celle de l'image, et ne */ \ /* deborde pas de l'ecran de plus... */ DEFV(Common,DEFV(Logical,ZINT(CENTRAGE_EVENTUEL_DE_LA_FENETRE_____compatibilite_20121121,FAUX))); /* Indicateur permettant d'assurer la compatibilite anterieure, si besoin est. Cette */ /* compatibilite permettra, par exemple, d'accoler ou de superposer deux images 'Sud' */ /* et une image 'Std'... */ # define CENTRAGE_EVENTUEL_DE_LA_FENETRE(centrer_la_fenetre) \ Bblock \ Test(IL_FAUT(centrer_la_fenetre)) \ Bblock \ INITIALISATION_POINT_2D(veritable_coin_bas_gauche \ ,ADD2(_____cNORMALISE_OX11(Xmin11) \ ,SOUS(MOIT(_____lNORMALISE_OX11(LONGUEUR(LARGEUR_DE_L_ECRAN))) \ ,MOIT(ASI1(dimension_de_la_fenetre,dx)) \ ) \ ) \ ,ADD2(_____cNORMALISE_OY11(Ymin11) \ ,SOUS(MOIT(_____lNORMALISE_OY11(LONGUEUR(HAUTEUR_DE_L_ECRAN))) \ ,MOIT(ASI1(dimension_de_la_fenetre,dy)) \ ) \ ) \ ); \ /* Cas ou le centrage est demande : l'argument 'coin_bas_gauche' est ignore... */ \ /* */ \ /* ATTENTION, jusqu'au 20000324143439 'LARGEUR_DE_L_ECRAN' et 'HAUTEUR_DE_L_ECRAN' etaient */ \ /* utilises sans 'LONGUEUR(...)'. */ \ Eblock \ ATes \ Bblock \ TRANSFERT_POINT_2D(veritable_coin_bas_gauche,PINDIRECT(coin_bas_gauche)); \ /* Cas ou le centrage n'est pas demande : c'est l'argument 'coin_bas_gauche' qui donne la */ \ /* position de la fenetre... */ \ \ Test(IL_NE_FAUT_PAS(CENTRAGE_EVENTUEL_DE_LA_FENETRE_____compatibilite_20121121)) \ Bblock \ INITIALISATION_POINT_2D(veritable_coin_bas_gauche \ ,ADD2(ASD1(veritable_coin_bas_gauche,x) \ ,MUL2(NEUT(_____lNORMALISE_OX11(EPAISSEUR_DES_BORDURES_DE_FENETRES)) \ ,ASD1(veritable_coin_bas_gauche,x) \ ) \ ) \ ,ADD2(ASD1(veritable_coin_bas_gauche,y) \ ,MUL2(NEUT(_____lNORMALISE_OY11(EPAISSEUR_DES_BORDURES_DE_FENETRES)) \ ,ASD1(veritable_coin_bas_gauche,y) \ ) \ ) \ ); \ /* Le 20121121091543, 'veritable_coin_bas_gauche' a ete translate de facon a prendre en */ \ /* compte l'epaisseur des bordures afin qu'elles ne risquent pas de couvrir d'autres images */ \ /* adjacentes, mais qu'elles se superposent exactement (d'ou les 'NEUT(...)'s et non pas */ \ /* des 'DOUB(...)'s ci-dessus). */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ ETes \ Eblock \ /* Choix de l'emplacement de la fenetre sur l'ecran... */ /* Avant le 20030401164348, 'dimension_non_normalisee_de_la_fenetre' etait ici... */ # define GEOMETRIE_D_UNE_FENETRE(suggestions_au_window_manager,veritable_coin_bas_gauche,dimension_de_la_fenetre) \ /* Le 20121121091153, 'veritable_coin_bas_gauche' a remplace 'coin_bas_gauche' qui evitera */ \ /* des erreurs d'interpretation... */ \ Bblock \ EGAL(ASD1(suggestions_au_window_manager,x) \ ,_cDENORMALISE_OX11(ASI1(veritable_coin_bas_gauche,x)) \ ); \ EGAL(ASD1(suggestions_au_window_manager,y) \ ,C11YA(SOUS(SOUS(SOUS(HAUTEUR_DE_L_ECRAN \ ,C11YR(_cDENORMALISE_OY11(ASI1(veritable_coin_bas_gauche,y))) \ ) \ ,_lDENORMALISE_OY11(ASI1(dimension_de_la_fenetre,dy)) \ ) \ ,DOUB(EPAISSEUR_DU_BORD_DES_FENETRES) \ ) \ ) \ ); \ /* Definition du coin bas gauche de la fenetre, mais attention a l'inversion de l'axe 'Y'. */ \ /* */ \ /* ATTENTION, on notera qu'il ne serait pas logique d'ecrire : */ \ /* */ \ /* INITIALISATION_POINT_2D(suggestions_au_window_manager */ \ /* ,... */ \ /* ,... */ \ /* ); */ \ /* */ \ /* car, en effet, la structure {x,y} de 'X-Window' n'a en toute generalite rien a voir */ \ /* avec la structure {x,y} definie par 'point?_2D'... */ \ /* */ \ /* On notera d'autre part l'utilisation de : */ \ /* */ \ /* _lDENORMALISE_OY11(ASI1(dimension_de_la_fenetre,dy)) */ \ /* */ \ /* ce que l'on pourrait remplacer par : */ \ /* */ \ /* ASD1(suggestions_au_window_manager,height) */ \ /* */ \ /* (a condition de calculer cette derniere quantite -height- au debut de la procedure */ \ /* 'GEOMETRIE_D_UNE_FENETRE(...)') ; mais on ne procede pas ainsi afin de rendre les */ \ /* differentes parties independantes les unes des autres... */ \ \ EGAL(ASD1(suggestions_au_window_manager,width) \ ,_lDENORMALISE_OX11(ASI1(dimension_de_la_fenetre,dx)) \ ); \ EGAL(ASD1(suggestions_au_window_manager,height) \ ,_lDENORMALISE_OY11(ASI1(dimension_de_la_fenetre,dy)) \ ); \ /* Definition des dimensions de la fenetre. */ \ \ INITIALISATION_ACCROISSEMENT_2D(dimension_non_normalisee_de_la_fenetre \ ,ASD1(suggestions_au_window_manager,width) \ ,ASD1(suggestions_au_window_manager,height) \ ); \ /* Memorisation de la taille non normalisee de la fenetre... */ \ \ EGAL(X_position_centree_de_l_image_dans_la_fenetre \ ,COXA(MOYS(ASD1(dimension_non_normalisee_de_la_fenetre,dx),dimX)) \ ); \ EGAL(Y_position_centree_de_l_image_dans_la_fenetre \ ,COYA(MOYS(ASD1(dimension_non_normalisee_de_la_fenetre,dy),dimY)) \ ); \ /* Position de l'image dans la fenetre de facon a ce qu'elle soit centree. Cela a ete */ \ /* introduit le 20030401161443 pour 'v $xci/display$K 20030401153145'. */ \ \ EGAL(ASD1(suggestions_au_window_manager,flags),OUIN(USPosition,USSize)); \ /* Afin de preciser ce que l'on donne dans la definition de la geometrie de la fenetre. */ \ Eblock \ /* Dimensionnement et localisation d'une fenetre... */ # define VALIDATION_D_UNE_FENETRE(fenetre_courante) \ Bblock \ DEFV(X_XWindowAttributes,attributs_effectifs_de_la_fenetre_ouverte); \ /* Afin de stocker les attributs effectifs de la fenetre apres ouverture... */ \ \ CALS(XGetWindowAttributes(description_du_serveur_et_de_l_ecran \ ,fenetre_courante \ ,ADRESSE(attributs_effectifs_de_la_fenetre_ouverte) \ ) \ ); \ /* Afin de voir ce que l'on a reellement obtenu. A la date du 20000324161142, on ne */ \ /* valide rien... */ \ Eblock \ /* Validation d'une fenetre... */ # define CREATION_D_UNE_FENETRE(fenetre_courante,apparence_visuelle_de_la_fenetre) \ Bblock \ EGAL(fenetre_courante \ ,XCreateWindow(description_du_serveur_et_de_l_ecran \ ,RACINE_DU_SYSTEME_HIERARCHIQUE_DE_FENETRES \ ,ASD1(suggestions_au_window_manager,x),ASD1(suggestions_au_window_manager,y) \ ,ASD1(suggestions_au_window_manager,width),ASD1(suggestions_au_window_manager,height) \ ,EPAISSEUR_DU_BORD_DES_FENETRES \ ,NOMBRE_DE_BITS_PAR_POINT \ ,InputOutput \ ,apparence_visuelle_de_la_fenetre \ ,OUI08(CWBackingStore \ ,CWBackingPlanes \ ,CWBackingPixel \ ,CWBitGravity \ ,CWSaveUnder \ ,CWEventMask \ ,CWOverrideRedirect \ ,CWColormap \ ) \ ,ADRESSE(attributs_de_la_fenetre) \ ) \ ); \ /* Ouverture de la fenetre demandee... */ \ \ VALIDATION_D_UNE_FENETRE(fenetre_courante); \ /* Afin de valider la taille de la fenetre ouverte... */ \ Eblock \ /* Creation d'une fenetre... */ # define MISE_EN_PLACE_DES_PROPRIETES_STANDARDS_D_UNE_FENETRE(description_du_serveur_et_de_l_ecran,fenetre,suggestions) \ Bblock \ CALS(XSelectInput(description_du_serveur_et_de_l_ecran \ ,fenetre \ ,LISTE_DES_EVENEMENTS_A_ATTENDRE \ ) \ ); \ /* Enfin, on se prepare a repondre aux evenements... */ \ CALS(XSetStandardProperties(description_du_serveur_et_de_l_ecran \ ,fenetre \ ,Cara(NOM_DE_LA_FENETRE),Cara(NOM_DE_SON_ICONE) \ ,None \ ,arguments,nombre_d_arguments \ ,ADRESSE(suggestions) \ ) \ ); \ /* Mise en place des proprietes standards, */ \ ATTENTE_D_UN_EVENEMENT_CONNU(PropertyNotify,BLOC(VIDE;)); \ /* Et attente de notification... */ \ Eblock \ /* Mise en place des propietes standards d'une fenetre... */ BFonctionI DEFV(Common,DEFV(Logical,SINT(X11_____tenter_l_ouverture_des_fenetres_trop_grandes_par_rapport_a_l_ecran,VRAI))); /* Indicateur logique precisant si l'on doit ('VRAI') ou pas ('FAUX') tenter d'ouvrir malgre */ /* tout les fenetres trop grandes par rapport a l'ecran. Cela a du etre introduit le */ /* 20001123113014 pour permettre de visualiser des images de type 'Sdu' ; cela n'avait pas */ /* ete vu plus tot faute de test, mais doit venir d'une modification des definitions de */ /* 'LARGEUR_DE_L_ECRAN' et 'HAUTEUR_DE_L_ECRAN' qui integrent le double de l'epaisseur des */ /* bordures des fenetres 'EPAISSEUR_DES_BORDURES_DE_FENETRES' (on verra avec profit a ce */ /* propos 'v $Darchives/20000323104006/fonct$vv$FON HAUTEUR_DE_L_ECRAN'). */ /* */ /* Le 20120319175037, cet indicateur est passe de 'FAUX' a 'VRAI', ce qui est quand meme */ /* beaucoup plus pratique... */ DEFV(Local,DEFV(Logical,editer_les_PRINT_ATTENTION_ulterieurs)); /* Memorisation de 'editer_les_PRINT_ATTENTION_initiaux' utilisable, par exemple, dans */ /* la fonction 'IXanimation(...)' (indicateur introduit le 20030101180335)... */ DEFV(Local,DEFV(X_XVisualInfo,type_de_visual_recherche)); /* Description du "visual" necessaire presentement. */ DEFV(Common,DEFV(FonctionI,IXopen(nom_de_la_variable_shell_d_acces_au_serveur_et_a_l_ecran ,nom_de_la_fenetreA ,ARGUMENT_POINTERs(dimension_de_la_fenetre) ,centrer_la_fenetre ,ARGUMENT_POINTERs(coin_bas_gauche) ,editer_les_PRINT_ATTENTION_initiaux ) ) ) DEFV(Argument,DEFV(CHAR,DTb0(nom_de_la_variable_shell_d_acces_au_serveur_et_a_l_ecran))); /* Nom de la variable shell d'acces au nom du serveur et de l'ecran ; en general, ce sera */ /* celui qui est defini par la variable 'DEFINITION_DU_SERVEUR_X_WINDOW'. */ 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(Logical,centrer_la_fenetre)); /* Faut-il centrer la fenetre ('VRAI') ou bien donner explicitement la position de son coin */ /* "bas gauche" ('FAUX') ? */ DEFV(Argument,DEFV(pointF_2D,POINTERs(coin_bas_gauche))); /* Abscisse du point de reference, */ DEFV(Argument,DEFV(Logical,editer_les_PRINT_ATTENTION_initiaux)); /* Indique si les messages initiaux du type 'PRINT_ATTENTION(...)' doivent etre emis */ /* ('VRAI') ou pas ('FAUX'). */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /* ATTENTION : 'INIT_ERROR' est mis en tete des variables locales au cas ou des couples */ /* ('BDEFV','EDEFV') suivraient... */ DEFV(Positive,INIT(nombre_de_couleurs_necessaires,UNDEF)); /* Nombre de couleurs necessaires pour visualiser l'image. */ DEFV(Logical,DTb1(utilisation_des_substitutions,COULEURS)); /* Cette liste est destinee a voir comment est utiliser la susbstitution courante... */ DEFV(X_XSizeHints,suggestions_au_window_manager); /* Parametre communiquant au 'Window-Manager' un certain nombre de suggestions (qu'il n'est */ /* pas oblige d'honorer), et en particulier relatives a la geometrie de la fenetre... */ DEFV(pointF_2D,veritable_coin_bas_gauche); /* Abscisse du point de reference reellement utilise... */ DEFV(X_Visual,apparence_visuelle_de_la_fenetre); /* Apparence visuelle de la fenetre. */ DEFV(X_XVisualInfo,INIT(POINTERs(Atype_de_visual_recherche),ADRESSE(type_de_visual_recherche))); /* Et son pointeur pour faire plaisir aus SYSTEMEs du type 'SYSTEME_CRAYYMP...' qui */ /* valident les arguments dans 'XGetVisualInfo(...)'... */ DEFV(X_Visual,apparence_visuelle_de_la_fenetre_par_defaut); /* Apparence visuelle de la fenetre lorsqu'aucun "visual" satisfaisant n'a ete trouve. */ DEFV(Int,INIT(nombre_d_arguments,ZERO)); # if ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (defined(SYSTEME_APC_LinuxRedHat_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_ICC)) \ || (defined(SYSTEME_APC_LinuxUlmint_GCC)) \ || (defined(SYSTEME_APC_LinuxUlmint_ICC)) \ || (defined(SYSTEME_VAX9000_ULTRIX)) \ || ((defined(SYSTEME_SGO200A1_IRIX_CC)) && (nC_RELEASE >= 701000000)) \ || ((defined(SYSTEME_SGO200A2_IRIX_CC)) && (nC_RELEASE >= 701000000)) \ || ((defined(SYSTEME_SGO200A4_IRIX_CC)) && (nC_RELEASE >= 701000000)) \ || ((defined(SYSTEME_SGO25224_IRIX_CC)) && (nC_RELEASE >= 701000000)) \ || ((defined(SYSTEME_SGO252VA_IRIX_CC)) && (nC_RELEASE >= 701000000)) \ || ((defined(SYSTEME_SGO252VN_IRIX_CC)) && (nC_RELEASE >= 701000000)) \ || ((defined(SYSTEME_SGPCM801_IRIX_CC)) && (nC_RELEASE >= 600020000)) \ || ((defined(SYSTEME_SGPCMA01_IRIX_CC)) && (nC_RELEASE >= 600020000)) \ ) DEFV(Char,INIT(POINTERc(POINTERc(arguments)),ADRESSE_NON_ENCORE_DEFINIE)); /* Ces arguments vont etre provoirement inutilises, mais correspondent aux arguments */ /* 'argc' et 'argv' de 'XSetStandardProperties()'. */ # Aif ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (defined(SYSTEME_APC_LinuxRedHat_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_ICC)) \ || (defined(SYSTEME_APC_LinuxUlmint_GCC)) \ || (defined(SYSTEME_APC_LinuxUlmint_ICC)) \ || (defined(SYSTEME_VAX9000_ULTRIX)) \ || ((defined(SYSTEME_SGO200A1_IRIX_CC)) && (nC_RELEASE >= 701000000)) \ || ((defined(SYSTEME_SGO200A2_IRIX_CC)) && (nC_RELEASE >= 701000000)) \ || ((defined(SYSTEME_SGO200A4_IRIX_CC)) && (nC_RELEASE >= 701000000)) \ || ((defined(SYSTEME_SGO25224_IRIX_CC)) && (nC_RELEASE >= 701000000)) \ || ((defined(SYSTEME_SGO252VA_IRIX_CC)) && (nC_RELEASE >= 701000000)) \ || ((defined(SYSTEME_SGO252VN_IRIX_CC)) && (nC_RELEASE >= 701000000)) \ || ((defined(SYSTEME_SGPCM801_IRIX_CC)) && (nC_RELEASE >= 600020000)) \ || ((defined(SYSTEME_SGPCMA01_IRIX_CC)) && (nC_RELEASE >= 600020000)) \ ) DEFV(CHAR,POINTERc(DTb1(arguments,NOMBRE_D_ARGUMENTS_ARGV))); /* Ces arguments vont etre provoirement inutilises, mais correspondent aux arguments */ /* 'argc' et 'argv' de 'XSetStandardProperties()' ; mais ATTENTION, il y avait autrefois */ /* */ /* DEFV(CHAR,POINTERc(POINTERc(DTb0(arguments)))); */ /* */ /* qui m'a pose des problemes considerables en passant sur le CRAY2, je suis donc revenu */ /* a une version plus orthodoxe... */ # Eif ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (defined(SYSTEME_APC_LinuxRedHat_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_ICC)) \ || (defined(SYSTEME_APC_LinuxUlmint_GCC)) \ || (defined(SYSTEME_APC_LinuxUlmint_ICC)) \ || (defined(SYSTEME_VAX9000_ULTRIX)) \ || ((defined(SYSTEME_SGO200A1_IRIX_CC)) && (nC_RELEASE >= 701000000)) \ || ((defined(SYSTEME_SGO200A2_IRIX_CC)) && (nC_RELEASE >= 701000000)) \ || ((defined(SYSTEME_SGO200A4_IRIX_CC)) && (nC_RELEASE >= 701000000)) \ || ((defined(SYSTEME_SGO25224_IRIX_CC)) && (nC_RELEASE >= 701000000)) \ || ((defined(SYSTEME_SGO252VA_IRIX_CC)) && (nC_RELEASE >= 701000000)) \ || ((defined(SYSTEME_SGO252VN_IRIX_CC)) && (nC_RELEASE >= 701000000)) \ || ((defined(SYSTEME_SGPCM801_IRIX_CC)) && (nC_RELEASE >= 600020000)) \ || ((defined(SYSTEME_SGPCMA01_IRIX_CC)) && (nC_RELEASE >= 600020000)) \ ) DEFV(X_XGCValues,parametres_du_contexte_graphique_de_visualisation); /* Definition des parametres du contexte graphique. L'element 'function' permet de */ /* definir la nature de l'operation effectuee entre l'ancien niveau ("ancien") et le */ /* nouveau ("nouveau") ; les fonctions disponibles sont les suivantes : */ /* */ /* GXclear NOIR */ /* GXand ETLO(nouveau,ancien) */ /* GXandReverse ETLO(nouveau,COMK(ancien)) */ /* GXcopy nouveau */ /* GXandInverted ETLO(COMK(nouveau),ancien) */ /* GXnoop ancien */ /* GXxor OUEX(nouveau,ancien) */ /* GXor OUIN(nouveau,ancien) */ /* GXnor ETLO(COMK(nouveau),COMK(ancien)) */ /* GXequiv OUEX(COMK(nouveau),ancien) */ /* GXinvert COMK(ancien) */ /* GXorReverse OUIN(nouveau,COMK(ancien)) */ /* GXcopyInverted COMK(nouveau) */ /* GXorInverted OUIN(COMK(nouveau),ancien) */ /* GXnand OUIN(COMK(nouveau),COMK(ancien)) */ /* GXset BLANC */ /* */ /*..............................................................................................................................*/ Test(I3ET(IFNE(MULTIPLICITE_DES_LIGNES_DES_BITMAPS,HUIT) ,IFNE(MULTIPLICITE_DES_LIGNES_DES_BITMAPS,SEIZE) ,IFNE(MULTIPLICITE_DES_LIGNES_DES_BITMAPS,TRENTE_DEUX) ) ) Bblock PRINT_ERREUR("la fonction 'XCreateImage(...)' exige que son Argument 'bitmap_pad' vaille 8, 16 ou 32"); Eblock ATes Bblock Eblock ETes Test(IFET(IFNE(pointeur_de_IXdisplay,ADRESSE_NON_ENCORE_DEFINIE) ,EST_INACTIF(X11_____liaison_avec_le_serveur) ) ) /* ATTENTION, il serait stupide d'ecrire : */ /* */ /* Test(IFET(EST_INACTIF(X11_____liaison_avec_le_serveur) */ /* ,IFNE(Gvar("X_WINDOW"),VALEUR_D_UNE_VARIABLE_UNDEF) */ /* ) */ /* ) */ /* */ /* car, en effet, la variable '$X_WINDOW' concerne le serveur local, et non pas un eventuel */ /* serveur distant... */ Bblock EGAL(editer_les_PRINT_ATTENTION_ulterieurs,editer_les_PRINT_ATTENTION_initiaux); /* Memorisation de 'editer_les_PRINT_ATTENTION_initiaux' utilisable, par exemple, dans */ /* la fonction 'IXanimation(...)' (indicateur introduit le 20030101180335)... */ EGAL(IXopen_____tenter_X_Window_en_mode_fausses_couleurs,IXopen_____mettre_X_Window_en_mode_fausses_couleurs); /* A priori (introduit le 20030109154236). */ EGAL(IXopen_____X_Window_a_ete_mis_en_mode_fausses_couleurs,VRAI); /* A priori (introduit le 20021229105731). */ # if ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \ || (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \ ) EGAL(EnTete_de_sauvegardM ## Xmin_avant_IXopen,Xmin); EGAL(EnTete_de_sauvegardM ## Xmax_avant_IXopen,Xmax); EGAL(EnTete_de_sauvegardM ## Ymin_avant_IXopen,Ymin); EGAL(EnTete_de_sauvegardM ## Ymax_avant_IXopen,Ymax); /* Sauvegarde de {{Xmin,Xmax},{Ymin,Ymax}} avant 'IXopen(...)'. Ce dispositif a ete */ /* introduit le 20010222172555 car, en effet, j'ai decouvert a cette date que l'affichage */ /* etait incorrect (incomplet...) lorsque 'Xmin' ou 'Ymin' etaient non nuls... */ SET_DIMENSIONS_2D_SANS_VALIDATION(Xmin11,Xmax11 ,Ymin11,Ymax11 ); /* D'ou cette mise a jour de {{Xmin,Xmax},{Ymin,Ymax}}... */ /* */ /* Le 20010224190211 j'ai mofifie 'v $xiii/Images$DEF SET_DIMENSIONS_DE_L_AXE_OX' et */ /* 'v $xiii/Images$DEF SET_DIMENSIONS_DE_L_AXE_OY' (et aussi pour l'axe 'OY') ayant oublie */ /* que les definitions de {{Xmin11,Xmax11},{Ymin11,Ymax11}} utilisaient */ /* 'v $xiidX/fonct$vv$DEF COXR.Xmin.' et 'v $xiidX/fonct$vv$DEF COYR.Ymin.' ; il est */ /* donc impossible de mettre simultanement a jour {Xmin,Ymin} et de les utiliser... */ # Aif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \ || (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \ ) # Eif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \ || (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \ ) EGAL(IXdisplay_____imageA_courante_revisualisable,FAUX); /* A priori... */ EGAL(X11_____nom_du_serveur_et_de_l_ecran,Gvar(nom_de_la_variable_shell_d_acces_au_serveur_et_a_l_ecran)); /* Recuperation du nom du serveur 'X-Window' ainsi que du numero de l'ecran utilise. */ Test(EST_FAUX(ACCES_AUX_PALETTES_DE_COULEURS_VERSION_02_TEST_DU_SERVEUR_X_WINDOW)) Bblock PRINT_ERREUR("aucun serveur 'X-Window' n'a ete reconnu (l'environnement 'en' est peut-etre tres incomplet)"); CAL1(Prer1("(la variable '$DISPLAY' vaut '%s')\n" ,X11_____nom_du_serveur_et_de_l_ecran ) ); /* Ceci a ete introduit le 20051028101739, alors que je faisais des essais infructueux */ /* du type : */ /* */ /* $RSH $CMAP28 "csh -c '$xci/display.x A=$xiio/GRILLE_16x16 p=cercle.35'" */ /* */ /* etant sur '$CMAP28' avec 'XLACT16' actif. Le probleme venait du fait que 'csh -c' ne */ /* met pas en place mon environnement et ainsi la variable '$DISPLAY' vaut "localhost:12.0" */ /* et mes variables du type '$X_LACT16' n'existent alors pas. Cela signifie donc que '$CSH' */ /* appele via '$RSH' n'interprete pas '$FCshrc' : pourquoi ? */ Eblock ATes Bblock Eblock ETes EGAL(description_du_serveur_et_de_l_ecran,XOpenDisplay(Cara(X11_____nom_du_serveur_et_de_l_ecran))); /* Etablissement de la liaison avec le serveur 'X-Window' demande... */ Test(X_IL_Y_A_ERREUR(description_du_serveur_et_de_l_ecran)) Bblock EDITION_DES_MESSAGES_DE_CONNEXION_IMPOSSIBLE_AVEC_LE_SERVEUR; Eblock ATes Bblock VALIDATION_PRELIMINAIRE_DES_DIMENSIONS_D_UNE_FENETRE; /* Afin d'inhiber eventuellement l'edition des coordonnees {X,Y} du curseur... */ Test(IL_FAUT(editer_les_PRINT_ATTENTION_initiaux)) Bblock TEST_DE_LA_RELEASE_DU_SERVEUR(description_du_serveur_et_de_l_ecran); /* Test du numero de la release du serveur 'X-Window'. */ TEST_DE_L_EXISTENCE_DU_BACKINGSTORE(description_du_serveur_et_de_l_ecran); /* Test de l'exisence du 'BackingStore' et du 'SaveUnder'. */ Test(IFNE(Xsize_p,size_p)) /* Nota : ce test est fait a l'execution, et non pas au pre-processing, a cause de la */ /* facon de definir les constantes du type 'size_p' ; le pre-processeur ne peut pas les */ /* comparer... */ Bblock PRINT_ATTENTION("incoherence dans la taille des pixels, mais 'IXopen(...)' aura quand meme lieu"); /* Pourquoi ? et bien tout simplement pour m'eviter de rajouter un nouveau niveau de */ /* 'Test(...)' dans ce qui suit... */ Eblock ATes Bblock Eblock ETes Test(IFNE(NOIR,VRAI_NIVEAU_DE_NOIR_DE_L_ECRAN)) Bblock PRINT_ATTENTION("probleme avec le niveau de NOIR, mais 'IXopen(...)' aura quand meme lieu"); CAL1(Prer2("(%08X # %08X)\n",NOIR,VRAI_NIVEAU_DE_NOIR_DE_L_ECRAN)); Eblock ATes Bblock Eblock ETes Test(IFNE(BLANC,VRAI_NIVEAU_DE_BLANC_DE_L_ECRAN)) Bblock PRINT_ATTENTION("probleme avec le niveau de BLANC, mais 'IXopen(...)' aura quand meme lieu"); CAL1(Prer2("(%08X # %08X)\n",BLANC,VRAI_NIVEAU_DE_BLANC_DE_L_ECRAN)); Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes Test(EST_INACTIF_FILTRAGE) /* On notera que ce cas se rencontre, par exemple, lorsque le mode vraies couleurs est */ /* demande ('v $xci/animation$K IXopen_____mettre_X_Window_en_mode_fausses_couleurs') ; */ /* alors, le filtrage n'est pas active (il est dans son etat par defaut 'INACTIF') et */ /* donc ainsi, 'nombre_de_couleurs_necessaires' est fixe a 'COULEURS'. Si l'on est de */ /* plus en mode 'ACCES_AUX_PALETTES_DE_COULEURS_VERSION_01' (cas de '$LACT14' par exemple), */ /* 'Test(IFLE(nombre_de_couleurs_necessaires,NOMBRE_MAXIMAL_DE_COULEURS_AUTORISEES))' est */ /* alors FAUX ci-apres et l'ouverture de la fenetre est refusee. Ceci a ete mis en */ /* evidence le 20030101181317... */ Bblock EGAL(nombre_de_couleurs_necessaires,COULEURS); /* Lorsque le filtrage est 'INACTIF', il faut toutes les couleurs... */ Eblock ATes Bblock BoIn(index,NOIR,BLANC,PAS_COULEURS) Bblock EGAL(ITb1(utilisation_des_substitutions,INDX(index,NOIR)),INACTIF); /* A priori, on considere qu'aucun niveau substitue n'est atteint (ce qui en fait voudrait */ /* dire que tous les niveaux -de NOIR a BLANC- sont substitues a un 'NIVEAU_UNDEF'). */ Eblock EBoI BoIn(index,NOIR,BLANC,PAS_COULEURS) Bblock EGAL(ITb1(utilisation_des_substitutions,INDX(Nsubstitution(GENP(index)),NOIR)),ACTIF); /* Puis on regarde en fait quels niveaux substitues sont atteints. */ Eblock EBoI CLIR(nombre_de_couleurs_necessaires); /* Puis, on va compter les niveaux substitues atteints... */ BoIn(index,NOIR,BLANC,PAS_COULEURS) Bblock Test(EST_ACTIF(ITb1(utilisation_des_substitutions,INDX(index,NOIR)))) Bblock INCR(nombre_de_couleurs_necessaires,I); /* Et maintenant on va compter les niveaux susbstitues qui sont utilises. */ Eblock ATes Bblock Eblock ETes Eblock EBoI Eblock ETes Test(IFLE(nombre_de_couleurs_necessaires,NOMBRE_MAXIMAL_DE_COULEURS_AUTORISEES)) Bblock DEFV(Logical,INIT(l_ouverture_de_la_fenetre_est_tentable,VRAI)); /* A priori, on va tenter d'ouvrir la fenetre... */ TESTS_DE_L_ECRAN_DU_SERVEUR(description_du_serveur_et_de_l_ecran); /* Test du nombre d'ecrans du serveur et des dimensions correspondantes. */ Test(EST_VRAI(l_ouverture_de_la_fenetre_est_tentable)) Bblock CENTRAGE_EVENTUEL_DE_LA_FENETRE(centrer_la_fenetre); /* Positionnement de la fenetre... */ GEOMETRIE_D_UNE_FENETRE(suggestions_au_window_manager ,ADRESSE(veritable_coin_bas_gauche) ,dimension_de_la_fenetre ); /* Dimensionnement et localisation d'une fenetre... */ EGAL(ASD1(attributs_de_la_fenetre,override_redirect),False); /* ATTENTION : il y a avait autrefois : */ /* */ /* EGAL(ASD1(suggestions_au_window_manager,flags),OUIN(PPosition,PSize)); */ /* */ /* et : */ /* */ /* EGAL(ASD1(attributs_de_la_fenetre,override_redirect),True); */ /* */ /* mais si l'on veut que d'une part les coordonnees de la fenetre soient fixees et imposees */ /* par le programme, et que d'autre part le 'window-manager' gere cette fenetre (et soit */ /* capable, par exemple, de la ramener au premier plan), il faut utiliser 'USPosition', */ /* 'USSize' et 'False' respectivement... */ EGAL(ASD1(attributs_de_la_fenetre,colormap),CopyFromParent); EGAL(ASD1(attributs_de_la_fenetre,event_mask),LISTE_DES_EVENEMENTS_A_ATTENDRE); /* Definition des attributs de la fenetre, et en particulier, les evenements auxquels */ /* elle doit reagir ('StructureNotifyMask' pour l'evenement de fin d'affichage). */ EGAL(ASD1(attributs_de_la_fenetre,backing_store),QUE_FAIRE_DU_BACKING_STORE); /* Activation eventuelle du "backingstore"... */ Test(IL_FAUT(editer_les_PRINT_ATTENTION_initiaux)) Bblock Test(IFNE(NIVEAU_DU_BLANC_DE_L_ECRAN,VRAI_NIVEAU_DE_BLANC_DE_L_ECRAN)) Bblock PRINT_ATTENTION("le niveau de BLANC de l'ecran et le masque des points sont differents"); CAL1(Prer2("(%08X # %08X)\n",NIVEAU_DU_BLANC_DE_L_ECRAN,VRAI_NIVEAU_DE_BLANC_DE_L_ECRAN)); Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes EGAL(ASD1(attributs_de_la_fenetre,backing_planes),MASQUE_D_UN_POINT); EGAL(ASD1(attributs_de_la_fenetre,backing_pixel),NIVEAU_DU_BLANC_DE_L_ECRAN); EGAL(ASD1(attributs_de_la_fenetre,bit_gravity),StaticGravity); EGAL(ASD1(attributs_de_la_fenetre,save_under),True); /* Definition du comportement de la fenetre lorsqu'elle est masquee par une autre fenetre, */ /* puis demasquee : on souhaite ainsi qu'elle soit regeneree completement et correctement... */ Test(ACCES_AUX_PALETTES_DE_COULEURS_VERSION_01) Bblock EGAL(ASD1(apparence_visuelle_de_la_fenetre,visualid),CopyFromParent); EGAL(ASD1(apparence_visuelle_de_la_fenetre,class),PseudoColor); EGAL(IXopen_____X_Window_a_ete_mis_en_mode_fausses_couleurs,VRAI); EGAL(ASD1(apparence_visuelle_de_la_fenetre,map_entries),COULEURS); /* Definition de l'apparence visuelle de la fenetre. */ CREATION_D_UNE_FENETRE(X11_____fenetre_courante,ADRESSE(apparence_visuelle_de_la_fenetre)); /* Tentative de creation de la fenetre... */ Eblock ATes Bblock Eblock ETes Test(ACCES_AUX_PALETTES_DE_COULEURS_VERSION_02) Bblock Test(EST_VRAI(IXopen_____tenter_X_Window_en_mode_fausses_couleurs)) Bblock /* Cas ou les fausses couleurs sont demandees... */ Eblock ATes Bblock /* Cas ou les vraies couleurs sont demandees... */ Test(IFGT(NOMBRE_EFFECTIF_DE_BITS_PAR_POINT(IXopen_____tenter_X_Window_en_mode_fausses_couleurs) ,NOMBRE_DE_BITS_PAR_POINT ) ) Bblock PRINT_ERREUR("une fenetre 'fille' ne peut avoir plus de couleurs que son 'parent'"); PRINT_ERREUR("la mise en 'FAUSSES COULEURS' est donc forcee"); PRINT_ERREUR("la visualisation va certainement avoir lieu en NOIR et BLANC"); /* Voir en effet 'v $xci/display$K Iluminance' et 'v $xci/animation$K Iluminance'... */ CAL1(Prer2("(%d bits sont demandes, alors que seulement %d sont possibles)\n" ,NOMBRE_EFFECTIF_DE_BITS_PAR_POINT (IXopen_____tenter_X_Window_en_mode_fausses_couleurs) ,NOMBRE_DE_BITS_PAR_POINT ) ); EGAL(IXopen_____tenter_X_Window_en_mode_fausses_couleurs ,NOTL(IXopen_____tenter_X_Window_en_mode_fausses_couleurs) ); /* Et le mode de coloriage est inverse... */ Eblock ATes Bblock Eblock ETes Eblock ETes EGAL(ASD1(type_de_visual_recherche,class) ,COND(EST_VRAI(IXopen_____tenter_X_Window_en_mode_fausses_couleurs) ,PseudoColor ,TrueColor ) ); EGAL(IXopen_____X_Window_a_ete_mis_en_mode_fausses_couleurs ,COND(EST_VRAI(IXopen_____tenter_X_Window_en_mode_fausses_couleurs) ,VRAI ,FAUX ) ); EGAL(ASD1(type_de_visual_recherche,screen),ECRAN_UTILISE); EGAL(ASD1(type_de_visual_recherche,depth),NOMBRE_DE_BITS_PAR_POINT); /* Definition des specifications du "visual" necessaire : il faut qu'il fonctionne en */ /* pseudo-couleur ('PseudoColor') ; de plus, on notera que : */ /* */ /* 1 - on ignore 'colormap_size', un test etant fait ulterieurement afin de savoir si */ /* il y a suffisamment ('COULEURS') de couleurs (voir a ce propos la definition et */ /* l'utilisation de 'NOMBRE_MAXIMAL_DE_COULEURS_ACCESSIBLES'), */ /* 2 - on ignore 'bits_per_rgb' dont la valeur est en fait sans grande importance... */ /* */ EGAL(liste_des_visuals_supportes_et_satisfaisants ,XGetVisualInfo(description_du_serveur_et_de_l_ecran ,OUI03(VisualClassMask ,VisualScreenMask ,VisualDepthMask ) ,Atype_de_visual_recherche ,Anombre_de_visuals_satisfaisants_recuperes ) ); /* Recuperation de la liste des differents types de "visual"s supportes physiquement */ /* par le systeme, et qui correspondent aux specifications de 'type_de_visual_recherche'. */ Test(IZGT(nombre_de_visuals_satisfaisants_recuperes)) Bblock CREATION_D_UNE_FENETRE(X11_____fenetre_courante,APPARENCE_VISUELLE_DE_LA_FENETRE); /* Tentative de creation de la fenetre... */ Eblock ATes Bblock EGAL(ASD1(type_de_visual_recherche,class) ,COND(EST_VRAI(IXopen_____tenter_X_Window_en_mode_fausses_couleurs) ,TrueColor ,PseudoColor ) ); EGAL(IXopen_____X_Window_a_ete_mis_en_mode_fausses_couleurs ,COND(EST_VRAI(IXopen_____tenter_X_Window_en_mode_fausses_couleurs) ,FAUX ,VRAI ) ); EGAL(ASD1(type_de_visual_recherche,depth),NOMBRE_DE_BITS_PAR_POINT); EGAL(liste_des_visuals_supportes_et_satisfaisants ,XGetVisualInfo(description_du_serveur_et_de_l_ecran ,OUI03(VisualClassMask ,VisualScreenMask ,VisualDepthMask ) ,Atype_de_visual_recherche ,Anombre_de_visuals_satisfaisants_recuperes ) ); /* Recuperation de la liste des differents types de "visual"s supportes physiquement */ /* par le systeme, et qui correspondent aux specifications de 'type_de_visual_recherche'. */ Test(IZGT(nombre_de_visuals_satisfaisants_recuperes)) Bblock CREATION_D_UNE_FENETRE(X11_____fenetre_courante,APPARENCE_VISUELLE_DE_LA_FENETRE); /* Tentative de creation de la fenetre... */ Eblock ATes Bblock PRINT_ERREUR("aucun 'visual' satisfaisant n'a ete trouve"); EGAL(ASD1(apparence_visuelle_de_la_fenetre_par_defaut,visualid),CopyFromParent); EGAL(ASD1(apparence_visuelle_de_la_fenetre_par_defaut,class),PseudoColor); EGAL(IXopen_____X_Window_a_ete_mis_en_mode_fausses_couleurs,VRAI); EGAL(ASD1(apparence_visuelle_de_la_fenetre_par_defaut,map_entries),COULEURS); /* Definition de l'apparence visuelle de la fenetre, lorsqu'aucun "visual" satisfaisant */ /* n'a ete trouve... */ CREATION_D_UNE_FENETRE(X11_____fenetre_courante ,ADRESSE(apparence_visuelle_de_la_fenetre_par_defaut) ); /* Tentative de creation de la fenetre lorsqu'aucun "visual" satisfaisant n'a ete trouve... */ Eblock ETes Eblock ETes Eblock ATes Bblock Eblock ETes # ifdef BUG_SYSTEME_X_WINDOW_EVENEMENTS_1 # Aifdef BUG_SYSTEME_X_WINDOW_EVENEMENTS_1 ATTENTE_D_UN_EVENEMENT_CONNU(CreateNotify,BLOC(VIDE;)); /* Et attente de notification... */ # Eifdef BUG_SYSTEME_X_WINDOW_EVENEMENTS_1 Test(IFNE(IXopen_____X_Window_a_ete_mis_en_mode_fausses_couleurs ,IXopen_____tenter_X_Window_en_mode_fausses_couleurs ) ) Bblock Test(IL_FAUT(editer_les_PRINT_ATTENTION_initiaux)) Bblock PRINT_ATTENTION("l'ouverture de la fenetre n'a pu se faire dans le mode de couleurs demande"); PRINT_ATTENTION("la visualisation sera donc faite en NOIR et BLANC"); Test(EST_VRAI(IXopen_____mettre_X_Window_en_mode_fausses_couleurs)) Bblock CAL1(Prer0("Le mode 'FAUSSES COULEURS' avait ete demande et ")); Eblock ATes Bblock CAL1(Prer0("Le mode 'VRAIES COULEURS' avait ete demande et ")); Eblock ETes Test(EST_VRAI(IXopen_____X_Window_a_ete_mis_en_mode_fausses_couleurs)) Bblock CAL1(Prer0("le mode 'FAUSSES COULEURS' a ete utilise,\n")); Eblock ATes Bblock CAL1(Prer0("le mode 'VRAIES COULEURS' a ete utilise.\n")); Eblock ETes Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes Test(X_IL_Y_A_ERREUR(X11_____fenetre_courante)) Bblock PRINT_ERREUR("l'ouverture de la fenetre est impossible"); Eblock ATes Bblock MISE_EN_PLACE_DES_PROPRIETES_STANDARDS_D_UNE_FENETRE(description_du_serveur_et_de_l_ecran ,X11_____fenetre_courante ,suggestions_au_window_manager ); /* Mise en place des propietes standards d'une fenetre... */ CALS(XSetWindowBackground(description_du_serveur_et_de_l_ecran ,X11_____fenetre_courante ,NIVEAU_DU_NOIR_DE_L_ECRAN ) ); /* Ainsi que du niveau du fond, */ ATTENTE_D_UN_EVENEMENT_CONNU(PropertyNotify,BLOC(VIDE;)); /* Et attente de notification... */ CALS(XSetWindowBorder(description_du_serveur_et_de_l_ecran ,X11_____fenetre_courante ,SE33(NEUT(NEUT(NIVEAU_DU_BLANC_DE_L_ECRAN)) ,NEUT(PRED(NIVEAU_DU_BLANC_DE_L_ECRAN)) ,PRED(PRED(NIVEAU_DU_BLANC_DE_L_ECRAN)) ) ) ); /* Ainsi que du niveau du bord ; on notera les trois possibilites qui sont offertes suivant */ /* la position de la souris par rapport a la fenetre : */ /* */ /* CHOIX : Souris dans la fenetre : Souris hors de la fenetre : */ /* */ /* */ /* SE13 : Border=NIVEAU_DU_BLANC_DE_L_ECRAN Border=NIVEAU_DU_BLANC_DE_L_ECRAN */ /* __________________________ */ /* SE23 : Border=NIVEAU_DU_BLANC_DE_L_ECRAN Border=NIVEAU_DU_BLANC_DE_L_ECRAN */ /* __________________________ */ /* SE33 : Border=NIVEAU_DU_BLANC_DE_L_ECRAN Border=NIVEAU_DU_MARQUEUR_DE_LA_SOURIS */ /* */ /* On notera que 'SE23' correspond a la gestion habituelle des fenetres, alors que 'SE33' */ /* propose une gestion inverse, mais plus logique pour l'affichage des images : le cadre */ /* est mis lorsque la souris est hors du cadre... */ ATTENTE_D_UN_EVENEMENT_CONNU(PropertyNotify,BLOC(VIDE;)); /* Et attente de notification... */ CALS(XMapWindow(description_du_serveur_et_de_l_ecran ,X11_____fenetre_courante ) ); /* Maintenant que tout est pret, on fait apparaitre la fenetre a l'ecran, cette operation */ /* s'appelant "mapping" sous 'X-Window'. On notera que sur 'SYSTEME_SG4D..._IRIX' et sur */ /* 'SYSTEME_DPX5000_SPIX', le 'CALS(XMapWindow(...))' devrait etre suivi de : */ /* */ /* ATTENTE_D_UN_EVENEMENT_CONNU(PropertyNotify,BLOC(VIDE;)); */ /* */ /* mais que pour eviter des problemes lors de redirections eventuelles de ces deux SYSTEMEs */ /* vers d'autres systemes 'X-Window', cette attente n'est pas implementee... */ ATTENTE_D_UN_EVENEMENT_CONNU(MapNotify,BLOC(VIDE;)); ATTENTE_D_UN_EVENEMENT_CONNU(VisibilityNotify,BLOC(VIDE;)); ATTENTE_D_UN_EVENEMENT_CONNU(Expose,BLOC(VIDE;)); /* Ainsi, on attend la fin de l'affichage (ou "mapping"). */ Test(IL_FAUT(LAISSER_LES_NIVEAUX_DE_L_IMAGE_EN_L_ETAT)) /* ATTENTION, il y a eu ici pendant longtemps le test suivant : */ /* */ /* Test(IFLE(NIVEAU_DU_NOIR_DE_L_ECRAN,NIVEAU_DU_BLANC_DE_L_ECRAN)) */ /* */ /* qui permettait de pendre en compte la machine '$LACT23' ('SYSTEME_NWS3000_NEWSOS'). */ /* Malheureusement, l'arrivee de la machine '$LACT26' (qui est un 'MacIntosh PowerBook 180c' */ /* sous 'MacOS' avec serveur 'X-Window') est venu compliquer la situation. En effet, pour */ /* '$LACT26' comme pour '$LACT23', il y a inversion de 'NIVEAU_DU_NOIR_DE_L_ECRAN' et de */ /* 'NIVEAU_DU_BLANC_DE_L_ECRAN', mais pour '$LACT26' il faut malgre tout utiliser le mode */ /* 'GXcopy'... Il n'y a apparemment pas d'autres solutions que de tester explicitement le */ /* serveur utilise, d'ou ce nouveau test... */ Bblock EGAL(ASD1(parametres_du_contexte_graphique_de_visualisation,function) ,GXcopy ); EGAL(ASD1(parametres_du_contexte_graphique_de_visualisation,background) ,NIVEAU_DU_NOIR_DE_L_ECRAN ); EGAL(ASD1(parametres_du_contexte_graphique_de_visualisation,foreground) ,NIVEAU_DU_BLANC_DE_L_ECRAN ); /* Initialisation du NOIR et du BLANC : */ /* */ /* 'background' designe le fond (et donc le NOIR), */ /* 'foreground' designe les points (et donc le BLANC). */ /* */ Test(IFEQ(NIVEAU_DU_NOIR_DE_L_ECRAN,NIVEAU_DU_BLANC_DE_L_ECRAN)) Bblock PRINT_ATTENTION("les niveaux de NOIR et de BLANC de l'ecran sont identiques"); Eblock ATes Bblock Eblock ETes Eblock ATes Bblock EGAL(ASD1(parametres_du_contexte_graphique_de_visualisation,function) ,GXcopyInverted ); EGAL(ASD1(parametres_du_contexte_graphique_de_visualisation,background) ,NIVEAU_DU_BLANC_DE_L_ECRAN ); EGAL(ASD1(parametres_du_contexte_graphique_de_visualisation,foreground) ,NIVEAU_DU_NOIR_DE_L_ECRAN ); /* Ces initialisations sont surtout destinees a 'SYSTEME_NWS3000_NEWSOS' lorsqu'il est */ /* utilise en Noir & Blanc (en mode 'XYPixmap) ; on notera que les definitions standards */ /* sont inversees : */ /* */ /* 'background' designe le fond (qui est le BLANC...), */ /* 'foreground' designe les points (qui est le NOIR...). */ /* */ Eblock ETes EGAL(contexte_graphique_de_visualisation ,XCreateGC(description_du_serveur_et_de_l_ecran,X11_____fenetre_courante ,OUI03(GCFunction ,GCBackground ,GCForeground ) ,ADRESSE(parametres_du_contexte_graphique_de_visualisation) ) ); /* Initialisation du contexte graphique de visualisation. Autrefois, on forcait les points */ /* a l'aide de la fonction 'GXset' grace a l'instruction : */ /* */ /* EGAL(ASD1(parametres_du_contexte_graphique_de_visualisation,function),GXset); */ /* EGAL(contexte_graphique_de_visualisation */ /* ,XCreateGC(description_du_serveur_et_de_l_ecran,X11_____fenetre_courante */ /* ,GCFunction */ /* ,ADRESSE(parametres_du_contexte_graphique_de_visualisation) */ /* ) */ /* ); */ /* */ /* Or, 'SYSTEME_SG4D..._IRIX' ne le supportait pas, et par definition de 'X-Window', il */ /* faut qu'un programme tournant sur une machine ('SYSTEME_DPX5000_SPIX' par exemple) */ /* puisse utiliser le serveur d'une autre ('SYSTEME_SG4D..._IRIX' par exemple). Donc j'ai */ /* renonce a 'GXset', et j'ai ecrit : */ /* */ /* EGAL(contexte_graphique_de_visualisation */ /* ,XCreateGC(description_du_serveur_et_de_l_ecran,X11_____fenetre_courante */ /* ,None */ /* ,ADRESSE(parametres_du_contexte_graphique_de_visualisation) */ /* ) */ /* ); */ /* */ /* auquel j'ai du renoncer aussi a cause de 'SYSTEME_NWS3000_NEWSOS' (en Noir & Blanc). */ EGAL(X11_____liaison_avec_le_serveur,ACTIF); /* Ainsi, on sait que la liaison est active... */ Test(EST_VRAI(IXopen_____X_Window_a_ete_mis_en_mode_fausses_couleurs)) /* Cas des fausses couleurs : */ Bblock Test(IFNE(IXpalette(ABSENCE_DE_TRANSLATION_DE_LA_PALETTE,LE_NOIR_N_EST_PAS_TRANSLATABLE),ERREUR28)) /* Et envoi des listes de COLORIAGE courante maintenant que la liaison est active. Le */ /* test a ete introduit le 20021223104745 pour '$LACT15'. ATTENTION : il est impossible */ /* d'utiliser ici simplement 'PAS_D_ERREUR(...)' car, en effet, 'IXpalette(...)' peut */ /* renvoyer d'autres erreurs que 'ERREUR28' et qui ne doivent pas provoquer l'etat 'INACTIF' */ /* de la liaison... */ Bblock Eblock ATes Bblock EGAL(X11_____liaison_avec_le_serveur,INACTIF); /* Et on annule la liaison (introduit le 20021223104745). */ Eblock ETes Eblock ATes Bblock /* Cas des vraies couleurs : */ Eblock ETes Eblock ETes Eblock ATes Bblock PRINT_ERREUR("l'ouverture de la fenetre est donc refusee sur ce serveur 'X-Window'"); Eblock ETes Eblock ATes Bblock /* Pour justifier ce cas 'v $xiidX/fonct$vv$FON 20030101181317'... */ PRINT_ERREUR("l'ouverture de la fenetre ne peut avoir lieu car trop de couleurs sont demandees"); CAL1(Prer2("%d couleurs sont demandees, alors que seulement %d sont possibles\n" ,nombre_de_couleurs_necessaires ,NOMBRE_MAXIMAL_DE_COULEURS_AUTORISEES ) ); Eblock ETes Eblock ETes Eblock ATes Bblock Test(IFEQ(pointeur_de_IXdisplay,ADRESSE_NON_ENCORE_DEFINIE)) Bblock PRINT_ERREUR("la fonction 'IXinitialisation(...)' n'a pas ete referencee"); Eblock ATes Bblock Eblock ETes Test(EST_ACTIF(X11_____liaison_avec_le_serveur)) Bblock PRINT_ERREUR("l'ouverture de la fenetre ne peut avoir lieu car la liaison avec le serveur 'X-Window' est deja active"); Eblock ATes Bblock Eblock ETes Eblock ETes RETU_ERROR; Eblock EFonctionI # undef CREATION_D_UNE_FENETRE # undef ABSENCE_DE_TRANSLATION_DE_LA_PALETTE # undef NOMBRE_MAXIMAL_DE_COULEURS_AUTORISEES # undef INVERSER_LES_NIVEAUX_DE_L_IMAGE # undef LAISSER_LES_NIVEAUX_DE_L_IMAGE_EN_L_ETAT /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A T T E N T E D ' U N E V E N E M E N T Q U E L C O N Q U E : */ /* */ /*************************************************************************************************************************************/ # define ATTENTE_D_UN_EVENEMENT_QUELCONQUE(evenement) \ Bblock \ CALS(IXattente_d_un_evenement_quelconque("evenement",evenement)); \ Eblock \ /* Attente d'un evenement quelconque dont on se donne le type 'evenement'. */ BFonctionI DEFV(Common,DEFV(FonctionI,IXattente_d_un_evenement_quelconque(nom_de_l_evenement,evenement))) DEFV(Argument,DEFV(CHAR,DTb0(nom_de_l_evenement))); /* Nom de l'evenement attendu. */ DEFV(Argument,DEFV(Int,evenement)); /* Type de l'evenement attendu parmi la liste suivante : */ /* */ /* KeyPress, */ /* KeyRelease, */ /* ButtonPress, */ /* ButtonRelease, */ /* MotionNotify, */ /* EnterNotify, */ /* LeaveNotify, */ /* FocusIn, */ /* FocusOut, */ /* KeymapNotify, */ /* Expose, */ /* GraphicsExpose, */ /* NoExpose, */ /* VisibilityNotify, */ /* CreateNotify, */ /* DestroyNotify, */ /* UnmapNotify, */ /* MapNotify, */ /* MapRequest, */ /* ReparentNotify, */ /* ConfigureNotify, */ /* ConfigureRequest, */ /* GravityNotify, */ /* ResizeRequest, */ /* CirculateNotify, */ /* CirculateRequest, */ /* PropertyNotify, */ /* SelectionClear, */ /* SelectionRequest, */ /* SelectionNotify, */ /* ColormapNotify, */ /* ClientMessage, */ /* MappingNotify. */ /* */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /* ATTENTION : 'INIT_ERROR' est mis en tete des variables locales au cas ou des couples */ /* ('BDEFV','EDEFV') suivraient... */ /*..............................................................................................................................*/ Test(EST_ACTIF(X11_____liaison_avec_le_serveur)) Bblock ATTENTE_D_UN_EVENEMENT_INCONNU(nom_de_l_evenement,evenement,BLOC(VIDE;)); /* Ainsi, on attend l'evenement argument... */ Eblock ATes Bblock PRINT_ERREUR("une attente d'evenement ne peut avoir lieu car la liaison avec le serveur 'X-Window' n'est pas active"); Eblock ETes RETU_ERROR; Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A T T E N T E D E L ' E V E N E M E N T ' B u t t o n P r e s s ' : */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Common,DEFV(FonctionI,IXattente_de_l_evenement_ButtonPress())) /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /* ATTENTION : 'INIT_ERROR' est mis en tete des variables locales au cas ou des couples */ /* ('BDEFV','EDEFV') suivraient... */ /*..............................................................................................................................*/ ATTENTE_D_UN_EVENEMENT_QUELCONQUE(ButtonPress); /* Attente de l'evenement 'ButtonPress' correspondant au fait que l'on appuie sur l'un */ /* des trois boutons de la souris. On notera que l'on est oblige de creer une fonction */ /* au sens 'C' du terme, et non une macro-procedure, et ce afin de cacher aux programmes */ /* utilisateurs (par exemple '$xci/display$K') les definitions de 'X-Window' (et ici par */ /* exemple 'ButtonPress'), et donc tous leurs fichiers d'includes... */ RETU_ERROR; Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A T T E N T E D E L ' E V E N E M E N T ' E x p o s e ' : */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Common,DEFV(FonctionI,IXattente_de_l_evenement_Expose())) /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /* ATTENTION : 'INIT_ERROR' est mis en tete des variables locales au cas ou des couples */ /* ('BDEFV','EDEFV') suivraient... */ /*..............................................................................................................................*/ ATTENTE_D_UN_EVENEMENT_QUELCONQUE(Expose); /* Attente de l'evenement 'Expose' correspondant au fait que la fenetre d'affichage */ /* courante vient d'etre ramenee au premier plan. On notera que l'on est oblige de creer */ /* une fonction au sens 'C' du terme, et non une macro-procedure, et ce afin de cacher aux */ /* programmes utilisateurs (par exemple '$xci/display$K') les definitions de 'X-Window' (et */ /* ici par exemple 'Expose'), et donc tous leurs fichiers d'includes... */ RETU_ERROR; Eblock EFonctionI # undef ATTENTE_D_UN_EVENEMENT_QUELCONQUE /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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,IXclose())) /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /* ATTENTION : 'INIT_ERROR' est mis en tete des variables locales au cas ou des couples */ /* ('BDEFV','EDEFV') suivraient... */ /*..............................................................................................................................*/ Test(EST_ACTIF(X11_____liaison_avec_le_serveur)) Bblock EGAL(IXdisplay_____imageA_courante_revisualisable,FAUX); /* A partir de maintenant, 'imageA' n'est plus "revisualisable"... */ CALS(XSetCloseDownMode(description_du_serveur_et_de_l_ecran ,DestroyAll ) ); /* Et ce afin que tout ce qui fut cree ne soit pas rendu permanent... */ EGAL(contenu_de_la_palette,INVALIDE); /* Ainsi, on sait que le contenu de la palette est maintenant 'INVALIDE'... */ CALS(XFreeGC(description_du_serveur_et_de_l_ecran,contexte_graphique_de_visualisation)); /* Liberation du contexte graphique... */ Test(ACCES_AUX_PALETTES_DE_COULEURS_VERSION_01) Bblock Eblock ATes Bblock Eblock ETes Test(ACCES_AUX_PALETTES_DE_COULEURS_VERSION_02) Bblock CALS(XFreeColormap(description_du_serveur_et_de_l_ecran ,PALETTE_DE_COULEURS_UTILISEE ) ); /* Desinstallation physique (au niveau hardware) de la palette. On notera que cette */ /* operation 'XFreeColormap(...)' est faite avant 'XUnmapWindow(...)', alors qu'il aurait */ /* ete plus logique de la faire apres, et ce afin que l'image visualisee n'apparaisse pas, */ /* pour quelques instants, avec de mauvaises couleurs. Malheureusement, au niveau de la */ /* gestion de l'evenement 'ColormapNotify', cela pose un probleme... */ ATTENTE_DE_L_EVENEMENT_ColormapNotify; EGAL(c_est_le_premier_XInstallColormap,VRAI); /* Reinitialisation de l'indicateur logique precisant que le premier 'XInstallColormap(...)' */ /* n'a pas encore ete fait... */ EGAL(creer_une_palette,VRAI); /* Et que la palette doit etre recree... */ CALS(Xliberation(liste_des_visuals_supportes_et_satisfaisants)); /* Ainsi on libere le "visual" utilise... */ Eblock ATes Bblock Eblock ETes Test(ACCES_AUX_PALETTES_DE_COULEURS_VERSION_03) Bblock Eblock ATes Bblock Eblock ETes EGAL(X11_____liaison_avec_le_serveur,INACTIF); /* Ainsi, on sait que la liaison n'est plus active... */ CALS(XUnmapWindow(description_du_serveur_et_de_l_ecran,X11_____fenetre_courante)); /* Tentative de "de-visualisation" de la fenetre, */ ATTENTE_D_UN_EVENEMENT_CONNU(UnmapNotify,BLOC(VIDE;)); /* Ainsi, on attend la fin du "desaffichage". On notera le phenomene interessant suivant ; */ /* avant l'evenement 'UnmapNotify', on peut rencontrer, suivant les cas : */ /* */ /* 'SYSTEME_DPX5000_SPIX' --> 'SYSTEME_DPX5000_SPIX' : rien, */ /* */ /* 'SYSTEME_SG4D20G_IRIX' --> 'SYSTEME_DPX5000_SPIX' : 1 evenement 'ColormapNotify' */ /* apparait avant, */ /* */ /* 'SYSTEME_SG4D20G_IRIX' --> 'SYSTEME_SG4D20G_IRIX' : 2 evenements 'ColormapNotify' */ /* apparaissent avant. */ /* */ /* 'SYSTEME_SG4D25TG_IRIX' --> 'SYSTEME_DPX5000_SPIX' : 1 evenement 'ColormapNotify' */ /* apparait avant, */ /* */ /* 'SYSTEME_SG4D25TG_IRIX' --> 'SYSTEME_SG4D25TG_IRIX' : 2 evenements 'ColormapNotify' */ /* apparaissent avant. */ /* */ /* Alors pourquoi ? puisqu'on a fait avant 'ATTENTE_DE_L_EVENEMENT_ColormapNotify'. Mais */ /* ces differences font qu'il est impossible de faire d'une maniere tout a fait generale */ /* des 'ATTENTE_D_UN_EVENEMENT_CONNU(ColormapNotify,BLOC(VIDE;))' qui resoudraient tous les */ /* cas, et donc, je m'abstiens... */ CALS(XDestroyWindow(description_du_serveur_et_de_l_ecran,X11_____fenetre_courante)); /* Tentative de destruction de la fenetre, */ ATTENTE_D_UN_EVENEMENT_CONNU(DestroyNotify,BLOC(VIDE;)); /* Ainsi, on attend la fin de la destruction... */ CALS(XSync(description_du_serveur_et_de_l_ecran,True)); /* Ainsi, on purge tous les evenements en attente... */ CALS(XCloseDisplay(description_du_serveur_et_de_l_ecran)); /* Et enfin, on rompt la liaison avec le serveur 'X-Windoiws'. */ # if ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \ || (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \ ) SET_DIMENSIONS_2D_SANS_VALIDATION(EnTete_de_sauvegardM ## Xmin_avant_IXopen,EnTete_de_sauvegardM ## Xmax_avant_IXopen ,EnTete_de_sauvegardM ## Ymin_avant_IXopen,EnTete_de_sauvegardM ## Ymax_avant_IXopen ); /* Restauration de {{Xmin,Xmax},{Ymin,Ymax}} apres 'IXclose(...)'. Ce dispositif a ete */ /* introduit le 20010222172555 car, en effet, j'ai decouvert a cette date que l'affichage */ /* etait incorrect (incomplet...) lorsque 'Xmin' ou 'Ymin' etaient non nuls... */ # Aif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \ || (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \ ) # Eif ( (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_02)) \ || (defined(GESTION_DU_FORMAT_DES_IMAGES_VERSION_03)) \ ) Eblock ATes Bblock PRINT_ERREUR("la fermeture de la fenetre ne peut avoir lieu car la liaison avec le serveur 'X-Window' n'est pas active"); Eblock ETes RETU_ERROR; Eblock EFonctionI # undef ATTENTE_DE_L_EVENEMENT_ColormapNotify # ifdef BUG_SYSTEME_X_WINDOW_EVENEMENTS_2 # undef LISTE_DES_EVENEMENTS_A_ATTENDRE # Aifdef BUG_SYSTEME_X_WINDOW_EVENEMENTS_2 # undef LISTE_DES_EVENEMENTS_A_ATTENDRE # Eifdef BUG_SYSTEME_X_WINDOW_EVENEMENTS_2 /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F O N C T I O N S N E C E S S A I R E S P O U R L ' E N T R E E V I D E O T E M P S R E E L : */ /* */ /*************************************************************************************************************************************/ # ifdef __VERSION__COMPILER_L_OPTION_VIDEO_ANALOGIQUE_DU_GRAPHIQUE_SILICON_GRAPHICS /* Common,DEFV(Fonction,) : Galileo. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* O U V E R T U R E D ' U N E F E N E T R E P O U R L ' E N T R E E V I D E O T E M P S R E E L : */ /* */ /*************************************************************************************************************************************/ # define LISTE_DES_EVENEMENTS_A_ATTENDRE \ OUIN(PropertyChangeMask \ ,ButtonPressMask \ ) \ /* Liste des evenements qu'il est utile d'attendre... */ BFonctionL # define CREATION_D_UNE_FENETRE(fenetre_courante) \ Bblock \ EGAL(ASD1(attributs_de_la_fenetre,save_under),True); \ EGAL(ASD1(attributs_de_la_fenetre,backing_store),QUE_FAIRE_DU_BACKING_STORE); \ /* Activation eventuelle du "backingstore" et du "save-under"... */ \ \ EGAL(ASD1(attributs_de_la_fenetre,event_mask),LISTE_DES_EVENEMENTS_A_ATTENDRE); \ \ EGAL(fenetre_courante \ ,XCreateWindow(description_du_serveur_et_de_l_ecran \ ,RACINE_DU_SYSTEME_HIERARCHIQUE_DE_FENETRES \ ,ASD1(suggestions_au_window_manager,x),ASD1(suggestions_au_window_manager,y) \ ,ASD1(suggestions_au_window_manager,width),ASD1(suggestions_au_window_manager,height) \ ,EPAISSEUR_DU_BORD_DES_FENETRES \ ,CopyFromParent \ ,CopyFromParent \ ,CopyFromParent \ ,OUI03(CWBackingStore \ ,CWSaveUnder \ ,CWEventMask \ ) \ ,ADRESSE(attributs_de_la_fenetre) \ ) \ ); \ /* Ouverture de la fenetre demandee... */ \ \ VALIDATION_D_UNE_FENETRE(fenetre_courante); \ /* Afin de valider la taille de la fenetre ouverte... */ \ Eblock \ /* Creation d'une fenetre... */ DEFV(Common,DEFV(FonctionL,IXopen_pour_l_entree_video_temps_reel(nom_de_la_variable_shell_d_acces_au_serveur_et_a_l_ecran ,nom_de_la_fenetreA ,ARGUMENT_POINTERs(dimension_de_la_fenetre) ,centrer_la_fenetre_video_temps_reel ,ARGUMENT_POINTERs(coin_bas_gauche) ,editer_les_PRINT_ATTENTION_initiaux ) ) ) DEFV(Argument,DEFV(CHAR,DTb0(nom_de_la_variable_shell_d_acces_au_serveur_et_a_l_ecran))); /* Nom de la variable shell d'acces au nom du serveur et de l'ecran ; en general, ce sera */ /* celui qui est defini par la variable 'DEFINITION_DU_SERVEUR_X_WINDOW'. */ 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(Logical,centrer_la_fenetre_video_temps_reel)); /* Faut-il centrer la fenetre video temps reel ('VRAI') ou bien donner explicitement la */ /* position de son coin "bas gauche" ('FAUX') ? */ DEFV(Argument,DEFV(pointF_2D,POINTERs(coin_bas_gauche))); /* Abscisse du point de reference dans le cas ou l'on ne centre pas... */ DEFV(Argument,DEFV(Logical,editer_les_PRINT_ATTENTION_initiaux)); /* Indique si les messages initiaux du type 'PRINT_ATTENTION(...)' doivent etre emis */ /* ('VRAI') ou pas ('FAUX'). */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(X_XSizeHints,suggestions_au_window_manager); /* Parametre communiquant au 'Window-Manager' un certain nombre de suggestions (qu'il n'est */ /* pas oblige d'honorer), et en particulier relatives a la geometrie de la fenetre... */ DEFV(pointF_2D,veritable_coin_bas_gauche); /* Abscisse du point de reference reellement utilise... */ DEFV(Int,INIT(nombre_d_arguments,ZERO)); # if ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (defined(SYSTEME_APC_LinuxRedHat_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_ICC)) \ || (defined(SYSTEME_APC_LinuxUlmint_GCC)) \ || (defined(SYSTEME_APC_LinuxUlmint_ICC)) \ || (defined(SYSTEME_VAX9000_ULTRIX)) \ || ((defined(SYSTEME_SGO200A1_IRIX_CC)) && (nC_RELEASE >= 701000000)) \ || ((defined(SYSTEME_SGO200A2_IRIX_CC)) && (nC_RELEASE >= 701000000)) \ || ((defined(SYSTEME_SGO200A4_IRIX_CC)) && (nC_RELEASE >= 701000000)) \ || ((defined(SYSTEME_SGO25224_IRIX_CC)) && (nC_RELEASE >= 701000000)) \ || ((defined(SYSTEME_SGO252VA_IRIX_CC)) && (nC_RELEASE >= 701000000)) \ || ((defined(SYSTEME_SGO252VN_IRIX_CC)) && (nC_RELEASE >= 701000000)) \ || ((defined(SYSTEME_SGPCM801_IRIX_CC)) && (nC_RELEASE >= 600020000)) \ || ((defined(SYSTEME_SGPCMA01_IRIX_CC)) && (nC_RELEASE >= 600020000)) \ ) DEFV(Char,INIT(POINTERc(POINTERc(arguments)),ADRESSE_NON_ENCORE_DEFINIE)); /* Ces arguments vont etre provoirement inutilises, mais correspondent aux arguments */ /* 'argc' et 'argv' de 'XSetStandardProperties()'. */ # Aif ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (defined(SYSTEME_APC_LinuxRedHat_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_ICC)) \ || (defined(SYSTEME_APC_LinuxUlmint_GCC)) \ || (defined(SYSTEME_APC_LinuxUlmint_ICC)) \ || (defined(SYSTEME_VAX9000_ULTRIX)) \ || ((defined(SYSTEME_SGO200A1_IRIX_CC)) && (nC_RELEASE >= 701000000)) \ || ((defined(SYSTEME_SGO200A2_IRIX_CC)) && (nC_RELEASE >= 701000000)) \ || ((defined(SYSTEME_SGO200A4_IRIX_CC)) && (nC_RELEASE >= 701000000)) \ || ((defined(SYSTEME_SGO25224_IRIX_CC)) && (nC_RELEASE >= 701000000)) \ || ((defined(SYSTEME_SGO252VA_IRIX_CC)) && (nC_RELEASE >= 701000000)) \ || ((defined(SYSTEME_SGO252VN_IRIX_CC)) && (nC_RELEASE >= 701000000)) \ || ((defined(SYSTEME_SGPCM801_IRIX_CC)) && (nC_RELEASE >= 600020000)) \ || ((defined(SYSTEME_SGPCMA01_IRIX_CC)) && (nC_RELEASE >= 600020000)) \ ) DEFV(CHAR,POINTERc(DTb1(arguments,NOMBRE_D_ARGUMENTS_ARGV))); /* Ces arguments vont etre provoirement inutilises, mais correspondent aux arguments */ /* 'argc' et 'argv' de 'XSetStandardProperties()' ; mais ATTENTION, il y avait autrefois */ /* */ /* DEFV(CHAR,POINTERc(POINTERc(DTb0(arguments)))); */ /* */ /* qui m'a pose des problemes considerables en passant sur le CRAY2, je suis donc revenu */ /* a une version plus orthodoxe... */ # Eif ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (defined(SYSTEME_APC_LinuxRedHat_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_ICC)) \ || (defined(SYSTEME_APC_LinuxUlmint_GCC)) \ || (defined(SYSTEME_APC_LinuxUlmint_ICC)) \ || (defined(SYSTEME_VAX9000_ULTRIX)) \ || ((defined(SYSTEME_SGO200A1_IRIX_CC)) && (nC_RELEASE >= 701000000)) \ || ((defined(SYSTEME_SGO200A2_IRIX_CC)) && (nC_RELEASE >= 701000000)) \ || ((defined(SYSTEME_SGO200A4_IRIX_CC)) && (nC_RELEASE >= 701000000)) \ || ((defined(SYSTEME_SGO25224_IRIX_CC)) && (nC_RELEASE >= 701000000)) \ || ((defined(SYSTEME_SGO252VA_IRIX_CC)) && (nC_RELEASE >= 701000000)) \ || ((defined(SYSTEME_SGO252VN_IRIX_CC)) && (nC_RELEASE >= 701000000)) \ || ((defined(SYSTEME_SGPCM801_IRIX_CC)) && (nC_RELEASE >= 600020000)) \ || ((defined(SYSTEME_SGPCMA01_IRIX_CC)) && (nC_RELEASE >= 600020000)) \ ) /*..............................................................................................................................*/ Test(EST_INACTIF(X11_____liaison_avec_le_serveur)) Bblock EGAL(X11_____nom_du_serveur_et_de_l_ecran,Gvar(nom_de_la_variable_shell_d_acces_au_serveur_et_a_l_ecran)); /* Recuperation du nom du serveur 'X-Window' ainsi que du numero de l'ecran utilise. */ Test(IFEQ_chaine(X11_____nom_du_serveur_et_de_l_ecran,Gvar("X_LOCAL"))) Bblock EGAL(description_du_serveur_et_de_l_ecran,XOpenDisplay(Cara(X11_____nom_du_serveur_et_de_l_ecran))); /* Etablissement de la liaison avec le serveur 'X-Window' demande... */ Test(X_IL_Y_A_ERREUR(description_du_serveur_et_de_l_ecran)) Bblock EDITION_DES_MESSAGES_DE_CONNEXION_IMPOSSIBLE_AVEC_LE_SERVEUR; Eblock ATes Bblock DEFV(Logical,INIT(l_ouverture_de_la_fenetre_est_tentable,VRAI)); /* A priori, on va tenter d'ouvrir la fenetre... */ VALIDATION_PRELIMINAIRE_DES_DIMENSIONS_D_UNE_FENETRE; /* Afin d'inhiber eventuellement l'edition des coordonnees {X,Y} du curseur... */ Test(IL_FAUT(editer_les_PRINT_ATTENTION_initiaux)) Bblock TEST_DE_LA_RELEASE_DU_SERVEUR(description_du_serveur_et_de_l_ecran); /* Test du numero de la release du serveur 'X-Window'. */ Eblock ATes Bblock Eblock ETes TESTS_DE_L_ECRAN_DU_SERVEUR(description_du_serveur_et_de_l_ecran); /* Test du nombre d'ecrans du serveur et des dimensions correspondantes. */ Test(EST_VRAI(l_ouverture_de_la_fenetre_est_tentable)) Bblock CENTRAGE_EVENTUEL_DE_LA_FENETRE(centrer_la_fenetre_video_temps_reel); /* Positionnement de la fenetre video temps reel... */ GEOMETRIE_D_UNE_FENETRE(suggestions_au_window_manager ,ADRESSE(veritable_coin_bas_gauche) ,dimension_de_la_fenetre ); /* Dimensionnement et localisation d'une fenetre... */ CREATION_D_UNE_FENETRE(X11_____fenetre_courante); /* Tentative de creation de la fenetre... */ Test(X_IL_Y_A_ERREUR(X11_____fenetre_courante)) Bblock PRINT_ERREUR("l'ouverture de la fenetre est impossible"); Eblock ATes Bblock MISE_EN_PLACE_DES_PROPRIETES_STANDARDS_D_UNE_FENETRE(description_du_serveur_et_de_l_ecran ,X11_____fenetre_courante ,suggestions_au_window_manager ); /* Mise en place des propietes standards d'une fenetre... */ EGAL(X11_____liaison_avec_le_serveur,ACTIF); /* Ainsi, on sait que la liaison est active... */ Eblock ETes Eblock ATes Bblock PRINT_ERREUR("l'ouverture de la fenetre est donc refusee sur ce serveur 'X-Window'"); Eblock ETes Eblock ETes Eblock ATes Bblock PRINT_ERREUR("l'ouverture de la fenetre ne peut avoir lieu car le serveur 'X-Window' n'est pas local"); Eblock ETes Eblock ATes Bblock PRINT_ERREUR("l'ouverture de la fenetre ne peut avoir lieu car la liaison avec le serveur 'X-Window' est deja active"); Eblock ETes RETU(X11_____liaison_avec_le_serveur); Eblock # undef CREATION_D_UNE_FENETRE EFonctionL /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M A P P I N G D ' U N E F E N E T R E P O U R L ' E N T R E E V I D E O T E M P S R E E L : */ /* */ /*************************************************************************************************************************************/ BFonctionI TypedefS(X_Bool,vrai_Int_de_base) /* Structure definissant un "booleen"... */ DEFV(Extern,DEFV(X_Bool,XTranslateCoordinates())); /* Fonction permettant de translater les coordonnees dans la fenetre... */ DEFV(Common,DEFV(FonctionI,IXmapping_pour_l_entree_video_temps_reel(Adecalage_en_X ,Adecalage_en_Y ,ARGUMENT_POINTEUR(Rdecalage_en_X) ,ARGUMENT_POINTEUR(Rdecalage_en_Y) ) ) ) DEFV(Argument,DEFV(Int,Adecalage_en_X)); DEFV(Argument,DEFV(Int,Adecalage_en_Y)); /* Decalage en {X,Y} Argument de la video dans la fenetre... */ DEFV(Argument,DEFV(X_Int,POINTEUR(Rdecalage_en_X))); DEFV(Argument,DEFV(X_Int,POINTEUR(Rdecalage_en_Y))); /* Decalage en {X,Y} Resultat de la video dans la fenetre... */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /* ATTENTION : 'INIT_ERROR' est mis en tete des variables locales au cas ou des couples */ /* ('BDEFV','EDEFV') suivraient... */ DEFV(X_Window,fenetre_de_manoeuvre); /* Fenetre rendue necessaire par 'XTranslateCoordinates(...)'... */ /*..............................................................................................................................*/ Test(EST_ACTIF(X11_____liaison_avec_le_serveur)) Bblock CALS(XMapWindow(description_du_serveur_et_de_l_ecran,X11_____fenetre_courante)); /* Maintenant que tout est pret, on fait apparaitre la fenetre a l'ecran... */ CALS(XSync(description_du_serveur_et_de_l_ecran,False)); /* Ainsi, on purge tout, sauf les evenements en attente... */ CALS(XTranslateCoordinates(description_du_serveur_et_de_l_ecran ,X11_____fenetre_courante ,RACINE_DU_SYSTEME_HIERARCHIQUE_DE_FENETRES ,Adecalage_en_X,Adecalage_en_Y ,Rdecalage_en_X,Rdecalage_en_Y ,ADRESSE(fenetre_de_manoeuvre) ) ); /* Positionnement de la video dans la fenetre 'X-Window'... */ Eblock ATes Bblock PRINT_ERREUR("le mapping de la fenetre ne peut avoir lieu car la liaison avec le serveur 'X-Window' n'est pas active"); Eblock ETes RETU_ERROR; Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F E R M E T U R E D ' U N E F E N E T R E P O U R L ' E N T R E E V I D E O T E M P S R E E L : */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Common,DEFV(FonctionI,IXclose_pour_l_entree_video_temps_reel())) /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /* ATTENTION : 'INIT_ERROR' est mis en tete des variables locales au cas ou des couples */ /* ('BDEFV','EDEFV') suivraient... */ /*..............................................................................................................................*/ Test(EST_ACTIF(X11_____liaison_avec_le_serveur)) Bblock CALS(XSetCloseDownMode(description_du_serveur_et_de_l_ecran ,DestroyAll ) ); /* Et ce afin que tout ce qui fut cree ne soit pas rendu permanent... */ EGAL(X11_____liaison_avec_le_serveur,INACTIF); /* Ainsi, on sait que la liaison n'est plus active... */ CALS(XUnmapWindow(description_du_serveur_et_de_l_ecran,X11_____fenetre_courante)); /* Tentative de "de-visualisation" de la fenetre, */ CALS(XDestroyWindow(description_du_serveur_et_de_l_ecran,X11_____fenetre_courante)); /* Tentative de destruction de la fenetre, */ CALS(XSync(description_du_serveur_et_de_l_ecran,True)); /* Ainsi, on purge tous les evenements en attente... */ CALS(XCloseDisplay(description_du_serveur_et_de_l_ecran)); /* Et enfin, on rompt la liaison avec le serveur 'X-Windoiws'. */ Eblock ATes Bblock PRINT_ERREUR("la fermeture de la fenetre ne peut avoir lieu car la liaison avec le serveur 'X-Window' n'est pas active"); Eblock ETes RETU_ERROR; Eblock EFonctionI # undef LISTE_DES_EVENEMENTS_A_ATTENDRE # Aifdef __VERSION__COMPILER_L_OPTION_VIDEO_ANALOGIQUE_DU_GRAPHIQUE_SILICON_GRAPHICS /* Common,DEFV(Fonction,) : Galileo. */ # Eifdef __VERSION__COMPILER_L_OPTION_VIDEO_ANALOGIQUE_DU_GRAPHIQUE_SILICON_GRAPHICS /* Common,DEFV(Fonction,) : Galileo. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F O N C T I O N S N E C E S S A I R E S A L ' U T I L I S A T I O N D E ' G L ' : */ /* */ /*************************************************************************************************************************************/ # ifdef __VERSION__UTILISER_LA_BIBLIOTHEQUE_GL /* Common,DEFV(Fonction,) : avec 'GL'... */ # Aifdef __VERSION__UTILISER_LA_BIBLIOTHEQUE_GL /* Common,DEFV(Fonction,) : avec 'GL'... */ # Eifdef __VERSION__UTILISER_LA_BIBLIOTHEQUE_GL /* Common,DEFV(Fonction,) : avec 'GL'... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F O N C T I O N S N E C E S S A I R E S A L ' U T I L I S A T I O N D E ' O p e n G L ' : */ /* */ /*************************************************************************************************************************************/ # ifdef __VERSION__UTILISER_LA_BIBLIOTHEQUE_OpenGL /* Common,DEFV(Fonction,) : avec 'OpenGL'... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 : */ /* */ /*************************************************************************************************************************************/ TypedefP(G_GLXContext,GLXContext) /* Structure definissant le contexte de connexion de 'OpenGL' a 'X-Window'. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* O U V E R T U R E D ' U N E F E N E T R E P O U R U T I L I S E R ' O p e n G L ' : */ /* */ /*************************************************************************************************************************************/ DEFV(Local,DEFV(X_XVisualInfo,POINTERs(informations_relatives_au_visuel_utilise))); /* Informations relatives au visuel. */ # define APPARENCE_VISUELLE_DE_LA_FENETRE_POUR_OpenGL \ ASI1(informations_relatives_au_visuel_utilise,visual) \ /* Apparence visuelle de la fenetre. On notera qu'au lieu de definir : */ \ /* */ \ /* APPARENCE_VISUELLE_DE_LA_FENETRE */ \ /* */ \ /* on definit : */ \ /* */ \ /* APPARENCE_VISUELLE_DE_LA_FENETRE_POUR_OpenGL */ \ /* */ \ /* car, en effet, le definition 'APPARENCE_VISUELLE_DE_LA_FENETRE' servira encore apres */ \ /* la definition des fonctions utiles a 'OpenGL'... */ # define LISTE_DES_EVENEMENTS_A_ATTENDRE \ OUI06(PropertyChangeMask \ ,ButtonPressMask \ ,KeyPressMask \ ,StructureNotifyMask \ ,ExposureMask \ ,VisibilityChangeMask \ ) \ /* Liste des evenements qu'il est utile d'attendre. L'evenement 'KeyPressMask' a ete */ \ /* ajoute le 20000323104448. */ BFonctionL # define CREATION_D_UNE_FENETRE(fenetre_courante) \ Bblock \ DEFV(vrai_Int_de_base,INIS(DTb0(liste_des_caracteristiques_necessaires_a_OPenGL) \ ,IstructL08(GLX_RGBA \ ,GLX_RED_SIZE,Bsize_p \ ,GLX_GREEN_SIZE,Bsize_p \ ,GLX_BLUE_SIZE,Bsize_p \ ,None \ ) \ ) \ ); \ /* Description des caracteristiques du visuel necessaires a 'OpenGL' ; on notera donc que */ \ /* l'on recherche un visuel vraies couleurs (le code 'None' indique la fin de la liste des */ \ /* des carcateristiques recherchees). On notera le 'vrai_Int_de_base' pour eviter des */ \ /* problemes de type de pointeur dans l'appel 'glXChooseVisual(...)' qui suit... */ \ DEFV(X_Colormap,palette_necessaire); \ /* Palette necessaire (dont je ne vois pas en fait l'utilite, mais elle est indispensable). */ \ \ EGAL(informations_relatives_au_visuel_utilise \ ,glXChooseVisual(description_du_serveur_et_de_l_ecran \ ,ECRAN_UTILISE \ ,liste_des_caracteristiques_necessaires_a_OPenGL \ ) \ ); \ \ EGAL(palette_necessaire \ ,XCreateColormap(description_du_serveur_et_de_l_ecran \ ,RACINE_DU_SYSTEME_HIERARCHIQUE_DE_FENETRES \ ,APPARENCE_VISUELLE_DE_LA_FENETRE_POUR_OpenGL \ ,AllocNone \ ) \ ); \ \ EGAL(ASD1(attributs_de_la_fenetre,save_under),True); \ EGAL(ASD1(attributs_de_la_fenetre,backing_store),QUE_FAIRE_DU_BACKING_STORE); \ /* Activation eventuelle du "backingstore" et du "save-under"... */ \ /* */ \ /* ATTENTION, a la date du 1995032700, il apparait que les options 'save_under' et */ \ /* 'backing_store' sont ineffectives ; il s'agit d'un probleme repertorie (voir l'appel */ \ /* '30325' dans 'v $Dbugs/SGIND4GA$D/IRIX$D/$Fnota 30325'). */ \ \ EGAL(ASD1(attributs_de_la_fenetre,event_mask),LISTE_DES_EVENEMENTS_A_ATTENDRE); \ EGAL(ASD1(attributs_de_la_fenetre,border_pixel),NOIR); \ EGAL(ASD1(attributs_de_la_fenetre,colormap),palette_necessaire); \ /* Mise en place des attributs obligatoires (voir 'v $xtc/OpenGL.16$c'). */ \ \ EGAL(fenetre_courante \ ,XCreateWindow(description_du_serveur_et_de_l_ecran \ ,RACINE_DU_SYSTEME_HIERARCHIQUE_DE_FENETRES \ ,ASD1(suggestions_au_window_manager,x),ASD1(suggestions_au_window_manager,y) \ ,ASD1(suggestions_au_window_manager,width),ASD1(suggestions_au_window_manager,height) \ ,EPAISSEUR_DU_BORD_DES_FENETRES \ ,ASI1(informations_relatives_au_visuel_utilise,depth) \ ,InputOutput \ ,APPARENCE_VISUELLE_DE_LA_FENETRE_POUR_OpenGL \ ,OUI05(CWBackingStore \ ,CWSaveUnder \ ,CWEventMask \ ,CWBorderPixel \ ,CWColormap \ ) \ ,ADRESSE(attributs_de_la_fenetre) \ ) \ ); \ /* Ouverture de la fenetre demandee... */ \ \ VALIDATION_D_UNE_FENETRE(fenetre_courante); \ /* Afin de valider la taille de la fenetre ouverte... */ \ Eblock \ /* Creation d'une fenetre... */ DEFV(Common,DEFV(FonctionL,IXopen_pour_utiliser_OpenGL(nom_de_la_variable_shell_d_acces_au_serveur_et_a_l_ecran ,nom_de_la_fenetreA ,ARGUMENT_POINTERs(dimension_de_la_fenetre) ,centrer_la_fenetre_pour_OpenGL ,ARGUMENT_POINTERs(coin_bas_gauche) ,editer_les_PRINT_ATTENTION_initiaux ) ) ) DEFV(Argument,DEFV(CHAR,DTb0(nom_de_la_variable_shell_d_acces_au_serveur_et_a_l_ecran))); /* Nom de la variable shell d'acces au nom du serveur et de l'ecran ; en general, ce sera */ /* celui qui est defini par la variable 'DEFINITION_DU_SERVEUR_X_WINDOW'. */ 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(Logical,centrer_la_fenetre_pour_OpenGL)); /* Faut-il centrer la fenetre video temps reel ('VRAI') ou bien donner explicitement la */ /* position de son coin "bas gauche" ('FAUX') ? */ DEFV(Argument,DEFV(pointF_2D,POINTERs(coin_bas_gauche))); /* Abscisse du point de reference dans le cas ou l'on ne centre pas... */ DEFV(Argument,DEFV(Logical,editer_les_PRINT_ATTENTION_initiaux)); /* Indique si les messages initiaux du type 'PRINT_ATTENTION(...)' doivent etre emis */ /* ('VRAI') ou pas ('FAUX'). */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock DEFV(X_XSizeHints,suggestions_au_window_manager); /* Parametre communiquant au 'Window-Manager' un certain nombre de suggestions (qu'il n'est */ /* pas oblige d'honorer), et en particulier relatives a la geometrie de la fenetre... */ DEFV(pointF_2D,veritable_coin_bas_gauche); /* Abscisse du point de reference reellement utilise... */ DEFV(Int,INIT(nombre_d_arguments,ZERO)); # if ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (defined(SYSTEME_APC_LinuxRedHat_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_ICC)) \ || (defined(SYSTEME_APC_LinuxUlmint_GCC)) \ || (defined(SYSTEME_APC_LinuxUlmint_ICC)) \ || (defined(SYSTEME_VAX9000_ULTRIX)) \ || ((defined(SYSTEME_SGO200A1_IRIX_CC)) && (nC_RELEASE >= 701000000)) \ || ((defined(SYSTEME_SGO200A2_IRIX_CC)) && (nC_RELEASE >= 701000000)) \ || ((defined(SYSTEME_SGO200A4_IRIX_CC)) && (nC_RELEASE >= 701000000)) \ || ((defined(SYSTEME_SGO25224_IRIX_CC)) && (nC_RELEASE >= 701000000)) \ || ((defined(SYSTEME_SGO252VA_IRIX_CC)) && (nC_RELEASE >= 701000000)) \ || ((defined(SYSTEME_SGO252VN_IRIX_CC)) && (nC_RELEASE >= 701000000)) \ || ((defined(SYSTEME_SGPCM801_IRIX_CC)) && (nC_RELEASE >= 600020000)) \ || ((defined(SYSTEME_SGPCMA01_IRIX_CC)) && (nC_RELEASE >= 600020000)) \ ) DEFV(Char,INIT(POINTERc(POINTERc(arguments)),ADRESSE_NON_ENCORE_DEFINIE)); /* Ces arguments vont etre provoirement inutilises, mais correspondent aux arguments */ /* 'argc' et 'argv' de 'XSetStandardProperties()'. */ # Aif ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (defined(SYSTEME_APC_LinuxRedHat_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_ICC)) \ || (defined(SYSTEME_APC_LinuxUlmint_GCC)) \ || (defined(SYSTEME_APC_LinuxUlmint_ICC)) \ || (defined(SYSTEME_VAX9000_ULTRIX)) \ || ((defined(SYSTEME_SGO200A1_IRIX_CC)) && (nC_RELEASE >= 701000000)) \ || ((defined(SYSTEME_SGO200A2_IRIX_CC)) && (nC_RELEASE >= 701000000)) \ || ((defined(SYSTEME_SGO200A4_IRIX_CC)) && (nC_RELEASE >= 701000000)) \ || ((defined(SYSTEME_SGO25224_IRIX_CC)) && (nC_RELEASE >= 701000000)) \ || ((defined(SYSTEME_SGO252VA_IRIX_CC)) && (nC_RELEASE >= 701000000)) \ || ((defined(SYSTEME_SGO252VN_IRIX_CC)) && (nC_RELEASE >= 701000000)) \ || ((defined(SYSTEME_SGPCM801_IRIX_CC)) && (nC_RELEASE >= 600020000)) \ || ((defined(SYSTEME_SGPCMA01_IRIX_CC)) && (nC_RELEASE >= 600020000)) \ ) DEFV(CHAR,POINTERc(DTb1(arguments,NOMBRE_D_ARGUMENTS_ARGV))); /* Ces arguments vont etre provoirement inutilises, mais correspondent aux arguments */ /* 'argc' et 'argv' de 'XSetStandardProperties()' ; mais ATTENTION, il y avait autrefois */ /* */ /* DEFV(CHAR,POINTERc(POINTERc(DTb0(arguments)))); */ /* */ /* qui m'a pose des problemes considerables en passant sur le CRAY2, je suis donc revenu */ /* a une version plus orthodoxe... */ # Eif ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (defined(SYSTEME_APC_LinuxRedHat_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_ICC)) \ || (defined(SYSTEME_APC_LinuxUlmint_GCC)) \ || (defined(SYSTEME_APC_LinuxUlmint_ICC)) \ || (defined(SYSTEME_VAX9000_ULTRIX)) \ || ((defined(SYSTEME_SGO200A1_IRIX_CC)) && (nC_RELEASE >= 701000000)) \ || ((defined(SYSTEME_SGO200A2_IRIX_CC)) && (nC_RELEASE >= 701000000)) \ || ((defined(SYSTEME_SGO200A4_IRIX_CC)) && (nC_RELEASE >= 701000000)) \ || ((defined(SYSTEME_SGO25224_IRIX_CC)) && (nC_RELEASE >= 701000000)) \ || ((defined(SYSTEME_SGO252VA_IRIX_CC)) && (nC_RELEASE >= 701000000)) \ || ((defined(SYSTEME_SGO252VN_IRIX_CC)) && (nC_RELEASE >= 701000000)) \ || ((defined(SYSTEME_SGPCM801_IRIX_CC)) && (nC_RELEASE >= 600020000)) \ || ((defined(SYSTEME_SGPCMA01_IRIX_CC)) && (nC_RELEASE >= 600020000)) \ ) /*..............................................................................................................................*/ Test(EST_INACTIF(X11_____liaison_avec_le_serveur)) Bblock EGAL(IGdisplay_____imageA_courante_visualisable,FAUX); /* A priori... */ EGAL(X11_____nom_du_serveur_et_de_l_ecran,Gvar(nom_de_la_variable_shell_d_acces_au_serveur_et_a_l_ecran)); /* Recuperation du nom du serveur 'X-Window' ainsi que du numero de l'ecran utilise. */ EGAL(description_du_serveur_et_de_l_ecran,XOpenDisplay(Cara(X11_____nom_du_serveur_et_de_l_ecran))); /* Etablissement de la liaison avec le serveur 'X-Window' demande... */ Test(X_IL_Y_A_ERREUR(description_du_serveur_et_de_l_ecran)) Bblock EDITION_DES_MESSAGES_DE_CONNEXION_IMPOSSIBLE_AVEC_LE_SERVEUR; Eblock ATes Bblock DEFV(Logical,INIT(l_ouverture_de_la_fenetre_est_tentable,VRAI)); /* A priori, on va tenter d'ouvrir la fenetre... */ VALIDATION_PRELIMINAIRE_DES_DIMENSIONS_D_UNE_FENETRE; /* Afin d'inhiber eventuellement l'edition des coordonnees {X,Y} du curseur... */ Test(IL_FAUT(editer_les_PRINT_ATTENTION_initiaux)) Bblock TEST_DE_LA_RELEASE_DU_SERVEUR(description_du_serveur_et_de_l_ecran); /* Test du numero de la release du serveur 'X-Window'. */ TEST_DE_L_EXISTENCE_DU_BACKINGSTORE(description_du_serveur_et_de_l_ecran); /* Test de l'exisence du 'BackingStore' et du 'SaveUnder'. */ Eblock ATes Bblock Eblock ETes TESTS_DE_L_ECRAN_DU_SERVEUR(description_du_serveur_et_de_l_ecran); /* Test du nombre d'ecrans du serveur et des dimensions correspondantes. */ Test(EST_VRAI(l_ouverture_de_la_fenetre_est_tentable)) Bblock CENTRAGE_EVENTUEL_DE_LA_FENETRE(centrer_la_fenetre_pour_OpenGL); /* Positionnement de la fenetre video temps reel... */ GEOMETRIE_D_UNE_FENETRE(suggestions_au_window_manager ,ADRESSE(veritable_coin_bas_gauche) ,dimension_de_la_fenetre ); /* Dimensionnement et localisation d'une fenetre... */ CREATION_D_UNE_FENETRE(X11_____fenetre_courante); /* Tentative de creation de la fenetre... */ Test(X_IL_Y_A_ERREUR(X11_____fenetre_courante)) Bblock PRINT_ERREUR("l'ouverture de la fenetre est impossible"); Eblock ATes Bblock MISE_EN_PLACE_DES_PROPRIETES_STANDARDS_D_UNE_FENETRE(description_du_serveur_et_de_l_ecran ,X11_____fenetre_courante ,suggestions_au_window_manager ); /* Mise en place des propietes standards d'une fenetre... */ CALS(XMapWindow(description_du_serveur_et_de_l_ecran ,X11_____fenetre_courante ) ); /* Maintenant que tout est pret, on fait apparaitre la fenetre a l'ecran, cette operation */ /* s'appelant "mapping" sous 'X-Window'. */ ATTENTE_D_UN_EVENEMENT_CONNU(MapNotify,BLOC(VIDE;)); /* Ne pas faire cette attente donne un phenomene de "fantome" qui a ete l'objet de l'appel */ /* 32747 de 'v $Dbugs/SGIND4GA$D/IRIX$D/$Fnota 32747'. */ EGAL(X11_____liaison_avec_le_serveur,ACTIF); /* Ainsi, on sait que la liaison est active... */ Eblock ETes Eblock ATes Bblock PRINT_ERREUR("l'ouverture de la fenetre est donc refusee sur ce serveur 'X-Window'"); Eblock ETes Eblock ETes Eblock ATes Bblock PRINT_ERREUR("l'ouverture de la fenetre ne peut avoir lieu car la liaison avec le serveur 'X-Window' est deja active"); Eblock ETes RETU(X11_____liaison_avec_le_serveur); Eblock # undef CREATION_D_UNE_FENETRE EFonctionL /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C O N N E X I O N E N T R E ' X - W I N D O W ' E T ' O p e n G L ' : */ /* */ /*************************************************************************************************************************************/ BFonctionI /* ATTENTION : la fonction 'IXconnexion_avec_OpenGL(...)' utilisent deux fonctions */ /* 'glXCreateContext(...)' et 'glXMakeCurrent(...)' qui sont malheureusement des fonctions */ /* de 'OpenGL' alors qu'on est ici dans '$xiidX' (soit 'X-Window'). Malgre cela, il est */ /* plus logique de la mettre ici a cause de l'utilisation des elements : */ /* */ /* X11_____liaison_avec_le_serveur */ /* description_du_serveur_et_de_l_ecran */ /* informations_relatives_au_visuel_utilise */ /* */ /* qui font partie de '$xiidX'... */ DEFV(Local,DEFV(G_GLXContext,contexte_de_OpenGL)); /* Contexte necessaire a la connexion entre 'X-Window' et 'OpenGL'. Il est imperatif de */ /* le declarer 'Local' afin que sa duree de vie soit au moins suffisante pour attendre */ /* l'appel a 'IXclose_pour_utiliser_OpenGL(...)'... */ DEFV(Common,DEFV(FonctionI,IXconnexion_avec_OpenGL())) /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /* ATTENTION : 'INIT_ERROR' est mis en tete des variables locales au cas ou des couples */ /* ('BDEFV','EDEFV') suivraient... */ /*..............................................................................................................................*/ Test(EST_ACTIF(X11_____liaison_avec_le_serveur)) Bblock EGAL(IGdisplay_____imageA_courante_visualisable,FAUX); /* A partir de maintenant, 'imageA' n'est plus "revisualisable"... */ EGAL(contexte_de_OpenGL ,glXCreateContext(description_du_serveur_et_de_l_ecran,informations_relatives_au_visuel_utilise,NULL,GL_FALSE) ); /* Creation du contexte necessaire a 'OpenGL'... */ CALS(glXMakeCurrent(description_du_serveur_et_de_l_ecran,X11_____fenetre_courante,contexte_de_OpenGL)); /* Maintenant que tout est pret, on connecte 'X-Window' et 'OpenGL', ce qui signifie qu'a */ /* partir de ce moment, des elements de 'OpenGL' peuvent etre visualises a l'interieur de */ /* cette fenetre 'X-Window'... */ Eblock ATes Bblock PRINT_ERREUR("pas de connexion de 'X-Window' et de 'OpenGL' car la liaison avec le serveur 'X-Window' n'est pas active"); Eblock ETes RETU_ERROR; Eblock EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* F E R M E T U R E D ' U N E F E N E T R E P O U R U T I L I S E R ' O p e n G L ' : */ /* */ /*************************************************************************************************************************************/ BFonctionI /* ATTENTION : la fonction 'IXclose_pour_utiliser_OpenGL(...)' utilisent deux fonctions */ /* 'glXMakeCurrent(...)' et 'glXDestroyContext(...)' qui sont malheureusement des fonctions */ /* de 'OpenGL' alors qu'on est ici dans '$xiidX' (soit 'X-Window'). Malgre cela, il est */ /* plus logique de la mettre ici a cause de l'utilisation des elements : */ /* */ /* X11_____liaison_avec_le_serveur */ /* description_du_serveur_et_de_l_ecran */ /* */ /* qui font partie de '$xiidX'... */ DEFV(Common,DEFV(FonctionI,IXclose_pour_utiliser_OpenGL())) /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /* ATTENTION : 'INIT_ERROR' est mis en tete des variables locales au cas ou des couples */ /* ('BDEFV','EDEFV') suivraient... */ /*..............................................................................................................................*/ Test(EST_ACTIF(X11_____liaison_avec_le_serveur)) Bblock CALS(XSetCloseDownMode(description_du_serveur_et_de_l_ecran ,DestroyAll ) ); /* Et ce afin que tout ce qui fut cree ne soit pas rendu permanent... */ CALS(glXMakeCurrent(description_du_serveur_et_de_l_ecran,None,NULL)); /* Liberation du contexte graphique, */ CALS(glXDestroyContext(description_du_serveur_et_de_l_ecran,contexte_de_OpenGL)); /* Et enfin destruction... */ EGAL(X11_____liaison_avec_le_serveur,INACTIF); /* Ainsi, on sait que la liaison n'est plus active... */ CALS(XUnmapWindow(description_du_serveur_et_de_l_ecran,X11_____fenetre_courante)); /* Tentative de "de-visualisation" de la fenetre, */ CALS(XDestroyWindow(description_du_serveur_et_de_l_ecran,X11_____fenetre_courante)); /* Tentative de destruction de la fenetre, */ CALS(XSync(description_du_serveur_et_de_l_ecran,True)); /* Ainsi, on purge tous les evenements en attente... */ CALS(XCloseDisplay(description_du_serveur_et_de_l_ecran)); /* Et enfin, on rompt la liaison avec le serveur 'X-Windoiws'. */ Eblock ATes Bblock PRINT_ERREUR("la fermeture de la fenetre ne peut avoir lieu car la liaison avec le serveur 'X-Window' n'est pas active"); Eblock ETes RETU_ERROR; Eblock EFonctionI # undef LISTE_DES_EVENEMENTS_A_ATTENDRE # undef APPARENCE_VISUELLE_DE_LA_FENETRE_POUR_OpenGL # Aifdef __VERSION__UTILISER_LA_BIBLIOTHEQUE_OpenGL /* Common,DEFV(Fonction,) : avec 'OpenGL'... */ # Eifdef __VERSION__UTILISER_LA_BIBLIOTHEQUE_OpenGL /* Common,DEFV(Fonction,) : avec 'OpenGL'... */ # ifdef BUG_SYSTEME_X_WINDOW_IMAGE_3 # undef QUE_FAIRE_DU_BACKING_STORE # Aifdef BUG_SYSTEME_X_WINDOW_IMAGE_3 # undef QUE_FAIRE_DU_BACKING_STORE # Eifdef BUG_SYSTEME_X_WINDOW_IMAGE_3 # undef VALIDATION_D_UNE_FENETRE # undef GEOMETRIE_D_UNE_FENETRE # undef CENTRAGE_EVENTUEL_DE_LA_FENETRE # undef VALIDATION_PRELIMINAIRE_DES_DIMENSIONS_D_UNE_FENETRE # undef MISE_EN_PLACE_DES_PROPRIETES_STANDARDS_D_UNE_FENETRE # undef TESTS_DE_L_ECRAN_DU_SERVEUR # undef TEST_DE_L_EXISTENCE_DU_BACKINGSTORE # undef TEST_DE_LA_RELEASE_DU_SERVEUR # undef EDITION_DES_MESSAGES_DE_CONNEXION_IMPOSSIBLE_AVEC_LE_SERVEUR # undef NOMBRE_D_ARGUMENTS_ARGV # undef NOM_DE_SON_ICONE # undef NOM_DE_LA_FENETRE # undef ATTENTE_D_UN_EVENEMENT_INCONNU # undef Y_CURSEUR_KeyPress # undef X_CURSEUR_KeyPress # undef TrY_CURSEUR_KeyPress # undef TrX_CURSEUR_KeyPress # undef EY_curseur_KeyPress # undef EX_curseur_KeyPress # undef OY_curseur_KeyPress # undef OX_curseur_KeyPress # ifdef __VERSION__UTILISER_LA_BIBLIOTHEQUE_OpenGL # undef REAFFICHAGE_D_UNE_IMAGE_PAR_IGdisplay # undef CENTRER_L_IMAGE_DANS_LA_FENETRE_LORS_DU_REAFFICHAGE # Aifdef __VERSION__UTILISER_LA_BIBLIOTHEQUE_OpenGL # undef REAFFICHAGE_D_UNE_IMAGE_PAR_IGdisplay # Eifdef __VERSION__UTILISER_LA_BIBLIOTHEQUE_OpenGL # undef REAFFICHAGE_D_UNE_IMAGE_PAR_IXdisplay # undef SE_REMETTRE_EN_ATTENTE_D_UN_NOUVEL_EVENEMENT_DE_MEME_TYPE # undef NE_PAS_SE_REMETTRE_EN_ATTENTE_D_UN_NOUVEL_EVENEMENT_DE_MEME_TYPE # undef ATTENTE_D_UN_EVENEMENT_CONNU # undef RECEPTION_D_UN_EVENEMENT_INATTENDU # undef TRAITEMENT_D_UN_EVENEMENT_ARRIVE # undef ATTENTE_DE_N_IMPORTE_LEQUEL_DES_EVENEMENTS_POSSIBLES /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D E L ' I M A G E C O U R A N T E : */ /* */ /*************************************************************************************************************************************/ DEFV(Local,DEFV(X_XImage,INIT(POINTERs(descripteur_de_l_image),ADRESSE_NON_ENCORE_DEFINIE))); /* Descripteur permettant de definir au serveur l'image raster que l'on veut afficher. Ce */ /* descripteur est commun a 'IXdisplay(...)' et a 'IXanimation(...)' a cause de la fonction */ /* 'Iconversion_d_une_image_en_fausses_couleurs_en_une_image_en_vraies_couleurs(...)' qui */ /* l'utilise... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* M I S E D E L ' I M A G E A U F O R M A T ' X - W I N D O W ' : */ /* */ /*************************************************************************************************************************************/ # ifdef BUG_SYSTEME_X_WINDOW_IMAGE_2 # define MISE_EN_FORME_DE_L_IMAGE(image_symetrisee_par_rapport_a_OX,image) \ /* L'argument 'image_symetrisee_par_rapport_a_OX' a ete introduit le 20021230114120 par */ \ /* soucis de generalite... */ \ Bblock \ NETTOYAGE_DE_L_image_symetrisee_par_rapport_a_OX; \ Test(IL_FAUT(utiliser_L_SUBSTITUTION_X_WINDOW)) \ /* ATTENTION : on ne peut pas programmer autrement cette sequence : il faut imperativement */ \ /* que les couples (PUSH_FILTRAGE,PULL_FILTRAGE) et (PUSH_SUBSTITUTION,PULL_SUBSTITUTION) */ \ /* soient a l'interieur d'un meme couple (Bblock,Eblock) etant donnee leur programmation. */ \ Bblock \ 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. */ \ SUBSTITUTION(L_SUBSTITUTION_X_WINDOW); \ /* Mise en place de la substitution specifique liee a la palette courante... */ \ CALS(Ix_symetrie(image_symetrisee_par_rapport_a_OX,image)); \ /* Simultanement, on fait la symetrie horizontale, et l'adaptation a la palette... */ \ PULL_SUBSTITUTION; \ PULL_FILTRAGE; \ /* Et restauration des conditions initiales... */ \ Eblock \ ATes \ Bblock \ PUSH_FILTRAGE; \ /* Sauvegarde de l'etat courant du filtrage des niveaux. */ \ SET_FILTRAGE(INACTIF); \ /* On inhibe tous les filtrages (y compris la 'SUBSTITUTION')... */ \ CALS(Ix_symetrie(image_symetrisee_par_rapport_a_OX,image)); \ /* Simultanement, on fait la symetrie horizontale, et l'adaptation a la palette... */ \ PULL_FILTRAGE; \ /* Et restauration des conditions initiales... */ \ Eblock \ ETes \ Eblock \ /* L'image argument est mise en forme pour 'X-Window', ce qui signifie que d'une part */ \ /* on lui fait subir une symetrie d'axe 'OX' (puisque l'axe 'OY' de 'X-Window' descend), */ \ /* et d'autre part, on lui fait subir une substitution adaptee a la palette courante */ \ /* des couleurs... */ # Aifdef BUG_SYSTEME_X_WINDOW_IMAGE_2 # define MISE_EN_FORME_DE_L_IMAGE(image_symetrisee_par_rapport_a_OX,image) \ /* L'argument 'image_symetrisee_par_rapport_a_OX' a ete introduit le 20021230114120 par */ \ /* soucis de generalite... */ \ Bblock \ NETTOYAGE_DE_L_image_symetrisee_par_rapport_a_OX; \ Test(IL_FAUT(utiliser_L_SUBSTITUTION_X_WINDOW)) \ /* ATTENTION : on ne peut pas programmer autrement cette sequence : il faut imperativement */ \ /* que les couples (PUSH_FILTRAGE,PULL_FILTRAGE) et (PUSH_SUBSTITUTION,PULL_SUBSTITUTION) */ \ /* soient a l'interieur d'un meme couple (Bblock,Eblock) etant donnee leur programmation. */ \ Bblock \ 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. */ \ SUBSTITUTION(L_SUBSTITUTION_X_WINDOW); \ /* Mise en place de la substitution specifique liee a la palette courante... */ \ CALS(Imove(image_symetrisee_par_rapport_a_OX,image)); \ /* Adaptation a la palette... */ \ PULL_SUBSTITUTION; \ PULL_FILTRAGE; \ /* Et restauration des conditions initiales... */ \ Eblock \ ATes \ Bblock \ PUSH_FILTRAGE; \ /* Sauvegarde de l'etat courant du filtrage des niveaux. */ \ SET_FILTRAGE(INACTIF); \ /* On inhibe tous les filtrages (y compris la 'SUBSTITUTION')... */ \ CALS(Imove(image_symetrisee_par_rapport_a_OX,image)); \ /* Adaptation a la palette... */ \ PULL_FILTRAGE; \ /* Et restauration des conditions initiales... */ \ Eblock \ ETes \ Eblock \ /* L'image argument est mise en forme pour 'X-Window', ce qui signifie qu'on lui fait */ \ /* subir une substitution adaptee a la palette courante des couleurs... */ # Eifdef BUG_SYSTEME_X_WINDOW_IMAGE_2 # define CONVERSION_D_UNE_IMAGE_EN_UN_BITMAP(bitmap) \ Bblock \ TesV(IL_FAUT(convertir_l_image_en_un_bit_map)) \ /* Nota : ce 'TesV(...)' est destine a permettre la mise en place d'une eventuelle option */ \ /* permettant de visualiser des images deja mises sous la forme de bit-maps ; alors il */ \ /* conviendrait de definir la variable logique 'convertir_l_image_en_un_bit_map'. Mais */ \ /* actuellement, la conversion est systematique... */ \ Bblock \ PUSH_FILTRAGE; \ /* Sauvegarde de l'etat courant du filtrage des niveaux. */ \ SET_FILTRAGE(INACTIF); \ /* Et ce afin de ne pas perturber le processus de 'IXpalette()'... */ \ CALS(Igeneration_d_un_bitmap(bitmap,image_symetrisee_par_rapport_a_OX)); \ /* Tant que 'X-Window' ne reconnaitra pas les matrices de points, mais uniquement les */ \ /* bit-maps en parallele, il faudra cette image intermediaire... */ \ PULL_FILTRAGE; \ /* Et restauration des conditions initiales... */ \ Eblock \ ATes \ Bblock \ Eblock \ ETes \ Eblock \ /* Conversion d'une image "standard" en un ensemble de bit-maps "paralleles"... */ # define NETTOYAGE_DE_L_image_symetrisee_par_rapport_a_OX \ Bblock \ Test(IL_FAUT_UNE_CONVERSION_EN_UN_BIT_MAP) \ Bblock \ /* Le nettoyage n'est pas utile ici, puisqu'ensuite, on passe par un bit-map intermediaire. */ \ Eblock \ ATes \ Bblock \ /* Le nettoyage est utile ici, afin que si (pasX,pasY) est different de (PasX,PasY), */ \ /* l'image apparaisse propre a l'ecran (bien que clairsemee). */ \ Test(IFET(IFEQ(pasX,PasX),IFEQ(pasY,PasY))) \ Bblock \ /* Je n'aime pas cela, mais j'ai quand-meme fait cette petite optimisation... */ \ Eblock \ ATes \ Bblock \ PUSH_ECHANTILLONNAGE; \ /* Sauvegarde du sous-echantillonnage courant... */ \ SET_ECHANTILLONNAGE(PasX,PasY); \ /* Et mise en place d'un sous-echantillonnage de base... */ \ PUSH_FILTRAGE; \ /* Sauvegarde de l'etat courant du filtrage des niveaux. */ \ SET_FILTRAGE(INACTIF); \ /* On inhibe le filtrage afin de mettre vraiment a 'NOIR' (et de gagner du temps aussi... */ \ CALS(Inoir(image_symetrisee_par_rapport_a_OX)); \ /* Nettoyage parfait de 'image_symetrisee_par_rapport_a_OX'... */ \ PULL_FILTRAGE; \ PULL_ECHANTILLONNAGE; \ /* Et restauration des conditions initiales... */ \ Eblock \ ETes \ Eblock \ ETes \ Eblock \ /* Nettoyage eventuelle de 'image_symetrisee_par_rapport_a_OX'... */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C O N V E R S I O N D ' U N E I M A G E F A U S S E S C O U L E U R S */ /* E N U N E I M A G E V R A I E S C O U L E U R S : */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Local,DEFV(FonctionI,Iconversion_d_une_image_en_fausses_couleurs_en_une_image_en_vraies_couleurs(imageR ,imageA ,imageA_ROUGE ,imageA_VERTE ,imageA_BLEUE ,increment_des_niveaux ,translater_le_NOIR ) ) ) /* Fonction introduite le 20021230102551 pour 'ACCES_AUX_PALETTES_DE_COULEURS_VERSION_03'. */ DEFV(Argument,DEFV(X_XImage,POINTERs(imageR))); /* Structure image Resultat. */ DEFV(Argument,DEFV(image,imageA)); /* Image Argument en mode 'EST_VRAI(IXopen_____tenter_X_Window_en_mode_fausses_couleurs)'. */ DEFV(Argument,DEFV(image,imageA_ROUGE)); DEFV(Argument,DEFV(image,imageA_VERTE)); DEFV(Argument,DEFV(image,imageA_BLEUE)); /* Image Argument en mode 'EST_FAUX(IXopen_____tenter_X_Window_en_mode_fausses_couleurs)'. */ DEFV(Argument,DEFV(Int,increment_des_niveaux)); /* Increment du niveau courant dans [NOIR,BLANC] afin de pouvoir decaler la palette (ce */ /* qui signifie aussi la faire "tourner"). */ DEFV(Argument,DEFV(Logical,translater_le_NOIR)); /* Indique si le niveau 'NOIR' est translatable ('LE_NOIR_EST_TRANSLATABLE') dans */ /* 'ACCES_LA_PALETTE_ET_TRANSLATION(...)' ou pas ('LE_NOIR_N_EST_PAS_TRANSLATABLE')... */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /* ATTENTION : 'INIT_ERROR' est mis en tete des variables locales au cas ou des couples */ /* ('BDEFV','EDEFV') suivraient... */ BDEFV(image,image_symetrisee_par_rapport_a_OX); /* Malheureusement, l'axe 'OY' de 'X-Window' descend, d'ou cette image ; on notera que */ /* meme si 'BUG_SYSTEME_X_WINDOW_IMAGE_2' n'existe plus, cette image subsiste afin de faire */ /* une adaptation a la palette, c'est pourquoi elle est toujours la... */ BDEFV(image,image_ROUGE); BDEFV(image,image_VERTE); BDEFV(image,image_BLEUE); /* Composantes chromatiques donnant 'imageA' en vraies couleurs. */ DEFV(Int,INIT(masque_ROUGE,UNDEF)); DEFV(Int,INIT(masque_VERTE,UNDEF)); DEFV(Int,INIT(masque_BLEUE,UNDEF)); /* Masque de multiplexage des trois niveaux {ROUGE,VERTE,BLEUE}. */ DEFV(Int,INIT(decalage_du_masque_ROUGE,UNDEF)); DEFV(Int,INIT(decalage_du_masque_VERTE,UNDEF)); DEFV(Int,INIT(decalage_du_masque_BLEUE,UNDEF)); /* Decalages respectifs des trois niveaux {ROUGE,VERTE,BLEUE}. */ /*..............................................................................................................................*/ Test(X_IL_Y_A_ERREUR(descripteur_de_l_image)) Bblock PRINT_ERREUR("le descripteur de l'image n'est pas valide"); PRINT_ERREUR("la commande est donc brutalement abortee afin d'eviter la propagation de cette anomalie"); Abort(ERREUR34); /* Abort introduit le 20170620094632... */ Eblock ATes Bblock EGAL(masque_ROUGE,ASI1(descripteur_de_l_image,red_mask)); EGAL(masque_VERTE,ASI1(descripteur_de_l_image,green_mask)); EGAL(masque_BLEUE,ASI1(descripteur_de_l_image,blue_mask)); /* Masque de multiplexage des trois niveaux {ROUGE,VERTE,BLEUE} mis ici le 20170619121634 */ /* suite a des problemes sur les MACHINEs de type '$CMAP28' a cette date... */ Eblock ETes EGAL(ASI1(descripteur_de_l_image,bits_per_pixel),ASD1(type_de_visual_recherche,depth)); /* Mise en place du nombre de bits par point... */ Test(EST_VRAI(IXopen_____tenter_X_Window_en_mode_fausses_couleurs)) /* Test introduit le 20021231091605. */ Bblock MISE_EN_FORME_DE_L_IMAGE(image_symetrisee_par_rapport_a_OX,imageA); /* Symetrie eventuelle par rapport a l'axe 'OY'. */ PUSH_OPTIMISATION; SET_OPTIMISATION(VRAI); /* Afin de ne passer que par les listes de substitution... */ CALS(Ivraies_couleurs(image_ROUGE,image_VERTE,image_BLEUE ,image_symetrisee_par_rapport_a_OX ,VRAI,VRAI,VRAI ,increment_des_niveaux ,translater_le_NOIR ) ); /* Passage des fausses aux vraies couleurs via la palette courante. */ PULL_OPTIMISATION; Eblock ATes Bblock MISE_EN_FORME_DE_L_IMAGE(image_ROUGE,imageA_ROUGE); MISE_EN_FORME_DE_L_IMAGE(image_VERTE,imageA_VERTE); MISE_EN_FORME_DE_L_IMAGE(image_BLEUE,imageA_BLEUE); /* Symetrie eventuelle par rapport a l'axe 'OY'. */ Eblock ETes Test(I3OU(IZNE(ETLO(masque_ROUGE,masque_VERTE)) ,IZNE(ETLO(masque_VERTE,masque_BLEUE)) ,IZNE(ETLO(masque_BLEUE,masque_ROUGE)) ) ) Bblock PRINT_ERREUR("au moins deux des trois masques de couleurs se recouvrent"); CAL1(Prer2("masque ROUGE=%0*x\n",NCHXMO,masque_ROUGE)); CAL1(Prer2("masque VERTE=%0*x\n",NCHXMO,masque_VERTE)); CAL1(Prer2("masque BLEUE=%0*x\n",NCHXMO,masque_BLEUE)); /* La constante 'NCHXMO' (=DIVI(NBITMO,NBITHX)' fut introduite le 20051210175559... */ Eblock ATes Bblock Eblock ETes EGAL(decalage_du_masque_ROUGE,AMPLITUDE_DE_CADRAGE_A_DROITE_D_UN_MASQUE(masque_ROUGE)); EGAL(decalage_du_masque_VERTE,AMPLITUDE_DE_CADRAGE_A_DROITE_D_UN_MASQUE(masque_VERTE)); EGAL(decalage_du_masque_BLEUE,AMPLITUDE_DE_CADRAGE_A_DROITE_D_UN_MASQUE(masque_BLEUE)); /* Decalages respectifs des trois niveaux {ROUGE,VERTE,BLEUE}. */ Test(I3OU(NON_DIVISIBLE(decalage_du_masque_ROUGE,NBITOC) ,NON_DIVISIBLE(decalage_du_masque_VERTE,NBITOC) ,NON_DIVISIBLE(decalage_du_masque_BLEUE,NBITOC) ) ) Bblock PRINT_ERREUR("au moins un des decalages des masques de couleurs est incorrect"); CAL1(Prer1("decalage ROUGE=%d\n",decalage_du_masque_ROUGE)); CAL1(Prer1("decalage VERTE=%d\n",decalage_du_masque_BLEUE)); CAL1(Prer1("decalage ROUGE=%d\n",decalage_du_masque_ROUGE)); Eblock ATes Bblock Eblock ETes begin_image Bblock CALS(XPutPixel(imageR ,X,Y ,OUI03(SLLS(INTE(load_point(image_ROUGE,NEUT(X),NEUT(Y))),decalage_du_masque_ROUGE) ,SLLS(INTE(load_point(image_VERTE,NEUT(X),NEUT(Y))),decalage_du_masque_VERTE) ,SLLS(INTE(load_point(image_BLEUE,NEUT(X),NEUT(Y))),decalage_du_masque_BLEUE) ) ) ); /* Generation de l'image en vraies couleurs au format 'X-Window'. Avant le 20030105103030 */ /* le niveau du point etait genere par : */ /* */ /* HORNER_1_02(COULEURS */ /* ,INTE(load_point(image_ROUGE,NEUT(X),NEUT(Y))) */ /* ,INTE(load_point(image_VERTE,NEUT(X),NEUT(Y))) */ /* ,INTE(load_point(image_BLEUE,NEUT(X),NEUT(Y))) */ /* ) */ /* */ /* en verifiant au prealable que 'IFNE(PUIX(DEUX,LO2X(COULEURS)),COULEURS)' etait fausse. */ /* En effet, cette methode faisait l'hypothese de l'ordre implicite {R,V,B}... */ /* */ /* Une experience effectuee le 20071127135008 en forcant : */ /* */ /* niveau_courant = 0x12345678 */ /* ..BBVVRR (soit dans l'ordre {B,V,R}} */ /* */ /* ont montre que la structure 'ASI1(imageR,data)' contenait la suite d'octets : */ /* */ /* {0x78,0x56,0x34,0x78,0x56,0x34,...} */ /* */ /* (sur '$LACT16') soit dans l'ordre {R,V,B}... */ Eblock end_image EDEFV(image,image_BLEUE); EDEFV(image,image_VERTE); EDEFV(image,image_ROUGE); /* Composantes chromatiques donnant 'imageA' en vraies couleurs. */ EDEFV(image,image_symetrisee_par_rapport_a_OX); /* Malheureusement, l'axe 'OY' de 'X-Window' descend, d'ou cette image ; on notera que */ /* meme si 'BUG_SYSTEME_X_WINDOW_IMAGE_2' n'existe plus, cette image subsiste afin de faire */ /* une adaptation a la palette, c'est pourquoi elle est toujours la... */ 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 ( F I N ) : */ /* */ /*************************************************************************************************************************************/ BFonctionIB /* Les definitions {L_IMAGE_N_EST_PAS_DECOUPEE_EN_MORCEAUX,...,INVERSION_AXE_OY} ont ete */ /* deplacees le 20000323104448. */ DEFV(Common,DEFV(FonctionIB,IXdisplay(imageA ,imageA_ROUGE,imageA_VERTE,imageA_BLEUE ,increment_des_niveaux ,translater_le_NOIR ) ) ) /* L'argument {imageA_ROUGE,imageA_VERTE,imageA_BLEUE} ont ete introduits le 20030101114234. */ /* */ /* Le 20100317152727, le type est passe de 'FonctionI' a 'FonctionIB' a cause des */ /* "references en avant" dont 'IXdisplay(...)' est l'objet via les procedures */ /* 'REAFFICHAGE_D_UNE_IMAGE_PAR_IXdisplay(...)' dans 'ATTENTE_D_UN_EVENEMENT_INCONNU(...)'. */ DEFV(Argument,DEFV(image,imageA)); /* Image Argument en mode 'EST_VRAI(IXopen_____tenter_X_Window_en_mode_fausses_couleurs)'. */ DEFV(Argument,DEFV(image,imageA_ROUGE)); DEFV(Argument,DEFV(image,imageA_VERTE)); DEFV(Argument,DEFV(image,imageA_BLEUE)); /* Image Argument en mode 'EST_FAUX(IXopen_____tenter_X_Window_en_mode_fausses_couleurs)'. */ DEFV(Argument,DEFV(Int,increment_des_niveaux)); /* Increment du niveau courant dans [NOIR,BLANC] afin de pouvoir decaler la palette (ce */ /* qui signifie aussi la faire "tourner"). */ /* Cet argument a ete introduit le 20030101233411 afin de permettre la rotation des */ /* couleurs meme en "passant" par le mode 'TrueColor'... */ DEFV(Argument,DEFV(Logical,translater_le_NOIR)); /* Indique si le niveau 'NOIR' est translatable ('LE_NOIR_EST_TRANSLATABLE') dans */ /* 'ACCES_LA_PALETTE_ET_TRANSLATION(...)' ou pas ('LE_NOIR_N_EST_PAS_TRANSLATABLE')... */ /* Cet argument a ete introduit le 20030101233411 afin de permettre la rotation des */ /* couleurs meme en "passant" par le mode 'TrueColor'... */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /* ATTENTION : 'INIT_ERROR' est mis en tete des variables locales au cas ou des couples */ /* ('BDEFV','EDEFV') suivraient... */ /*..............................................................................................................................*/ Test(EST_ACTIF(X11_____liaison_avec_le_serveur)) Bblock BDEFV(image,image_symetrisee_par_rapport_a_OX); /* Malheureusement, l'axe 'OY' de 'X-Window' descend, d'ou cette image... */ EGAL(IXdisplay_____increment_des_niveaux,increment_des_niveaux); EGAL(IXdisplay_____translater_le_NOIR,translater_le_NOIR); /* Dispositif introduit le 20070713103714 (et donc avec quelques annees de retard) afin de */ /* permettre de rafraichir correctement une image lorsqu'elle a ete masque par quelque chose */ /* et que son affichage avait ete demande avec incrementation des niveaux de la palette... */ Test(EST_VRAI(IXopen_____X_Window_a_ete_mis_en_mode_fausses_couleurs)) /* Cas des fausses couleurs : */ Bblock DEFV(CHAR,INIT(POINTERc(bit_map_equivalent),CHAINE_UNDEF)); /* Tant que 'X-Window' ne reconnaitra pas les matrices de points, mais uniquement les */ /* bit-maps en parallele, il faudra cette image intermediaire... */ MISE_EN_FORME_DE_L_IMAGE(image_symetrisee_par_rapport_a_OX,imageA); /* Malheureusement, l'axe 'OY' de 'X-Window' descend, d'ou cette symetrie par rapport */ /* a l'axe 'OX' ; l'operation prend en compte la 'SUBSTITUTION' courante, et ce afin */ /* de permettre le fonctionnement correct de 'IXpalette()'... */ Test(IL_FAUT_UNE_CONVERSION_EN_UN_BIT_MAP) Bblock EGAL(bit_map_equivalent,kMalo(DIMENSION_DU_BIT_MAP)); /* Allocation d'un vecteur intermediaire pour la generation des bit-maps en parallele. */ CONVERSION_D_UNE_IMAGE_EN_UN_BITMAP(bit_map_equivalent); /* Conversion d'une image "standard" en un ensemble de bit-maps "paralleles"... */ CALS_XCreateImage(descripteur_de_l_image ,description_du_serveur_et_de_l_ecran ,APPARENCE_VISUELLE_DE_LA_FENETRE ,NOMBRE_DE_BITS_PAR_POINT ,XYPixmap ,DECALAGE_DES_POINTS_SUR_LES_LIGNES ,Cara(bit_map_equivalent) ,DIMENSION_HORIZONTALE_DU_BIT_MAP(pasX),DIMENSION_VERTICALE_DU_BIT_MAP(pasY) ,MULTIPLICITE_DES_LIGNES_DES_BITMAPS ,BYTES_PER_LINE_XCreateImage(DIVI(DIMENSION_HORIZONTALE_DU_BIT_MAP(pasX),NBITOC)) ); /* Tant que 'X-Window' ne reconnaitra pas les matrices de points, mais uniquement les */ /* bit-maps en parallele, il faudra cette image intermediaire... */ EGAL(BitmapBitOrder(description_du_serveur_et_de_l_ecran),MSBFirst); /* Et ce afin que les bits soient presentes dans le bon ordre... */ /* */ /* Des experiences effectuees le 20030109154236 montrent que cette variable semble etre */ /* correctement positionnee et vaut implicitement : */ /* */ /* LSBFirst (=0) sur '$LACT15' */ /* */ /* et : */ /* */ /* MSBFirst (=1) sur '$LACT27' */ /* */ /* ce qui est correct. Malgre tout, je ne supprime pas cette sequence car, en effet, nous */ /* sommes a l'interieur du test 'Test(IL_FAUT_UNE_CONVERSION_EN_UN_BIT_MAP)' qui ne doit */ /* plus etre utile depuis belle lurette... */ CALS(XPutImage(description_du_serveur_et_de_l_ecran,X11_____fenetre_courante ,contexte_graphique_de_visualisation ,descripteur_de_l_image ,Xmin ,Ymin /* Coordonnees de la sous-image (ici l'image entiere) a extraire, dans l'image entiere, */ ,X_position_centree_de_l_image_dans_la_fenetre ,fINVERSION_AXE_OY(Y_position_centree_de_l_image_dans_la_fenetre ,DIMENSION_VERTICALE_DU_BIT_MAP(pasY) ,L_IMAGE_N_EST_PAS_DECOUPEE_EN_MORCEAUX ) /* Position de la sous-image (ici l'image entiere) a extraire, dans la fenetre, */ ,DIMENSION_HORIZONTALE_DU_BIT_MAP(pasX),DIMENSION_VERTICALE_DU_BIT_MAP(pasY) /* Dimension de la sous-image (ici l'image entiere) a extraire. */ ) ); /* Et affichage de l'image... */ Eblock ATes Bblock CALS_XCreateImage(descripteur_de_l_image ,description_du_serveur_et_de_l_ecran ,APPARENCE_VISUELLE_DE_LA_FENETRE ,NOMBRE_DE_BITS_PAR_POINT ,ZPixmap ,DECALAGE_DES_POINTS_SUR_LES_LIGNES ,Cara(image_symetrisee_par_rapport_a_OX) ,dimX,dimY ,MULTIPLICITE_DES_LIGNES_DES_BITMAPS ,BYTES_PER_LINE_XCreateImage(LONGUEUR_EN_OCTETS_DES_LIGNES_D_IMAGES) ); /* Ca y est, 'X-Window' connait les matrices de points... */ CALS(XPutImage(description_du_serveur_et_de_l_ecran,X11_____fenetre_courante ,contexte_graphique_de_visualisation ,descripteur_de_l_image ,Xmin ,Ymin /* Coordonnees de la sous-image (ici l'image entiere) a extraire, dans l'image entiere, */ ,X_position_centree_de_l_image_dans_la_fenetre ,fINVERSION_AXE_OY(Y_position_centree_de_l_image_dans_la_fenetre ,DIMENSION_VERTICALE_DE_L_IMAGE(pasY) ,L_IMAGE_N_EST_PAS_DECOUPEE_EN_MORCEAUX ) /* Position de la sous-image (ici l'image entiere) a extraire, dans la fenetre, */ ,DIMENSION_HORIZONTALE_DE_L_IMAGE(pasX),DIMENSION_VERTICALE_DE_L_IMAGE(pasY) /* Dimension de la sous-image (ici l'image entiere) a extraire. */ ) ); /* Et affichage de l'image... */ Eblock ETes EGAL(ASI1(descripteur_de_l_image,data),None); /* Ceci est destine a 'XDestroyImage(...)' afin qu'il ne detruise pas l'espace memoire */ /* occupe par l'image (au cas ou ce dernier aurait ete alloue dynamiquement, ce qui est */ /* en fait extremement frequent...). */ CALS_XDestroyImage(descripteur_de_l_image); /* Enfin, on libere la structure descriptive de l'image visualisee... */ Test(IL_FAUT_UNE_CONVERSION_EN_UN_BIT_MAP) Bblock CALZ_FreSS(bit_map_equivalent); /* Liberation du vecteur intermediaire utilise pour la generation des bit-maps en parallele. */ Eblock ATes Bblock Eblock ETes Eblock ATes Bblock /* Cas des vraies couleurs : */ DEFV(CHAR,INIT(POINTERc(image_en_vraies_couleurs),CHAINE_UNDEF)); EGAL(image_en_vraies_couleurs,kMalo(MUL2(dimXY,NOMBRE_DE_COMPOSANTES_CHROMATIQUES))); /* Allocation d'un vecteur intermediaire pour la generation de l'image en vraies couleurs. */ CALS_XCreateImage(descripteur_de_l_image ,description_du_serveur_et_de_l_ecran ,APPARENCE_VISUELLE_DE_LA_FENETRE ,NOMBRE_DE_BITS_PAR_POINT ,ZPixmap ,DECALAGE_DES_POINTS_SUR_LES_LIGNES ,Cara(image_en_vraies_couleurs) ,dimX,dimY ,MULTIPLICITE_DES_LIGNES_DES_BITMAPS ,BYTES_PER_LINE_XCreateImage(LONGUEUR_EN_OCTETS_DES_LIGNES_D_IMAGES) ); CALS(Iconversion_d_une_image_en_fausses_couleurs_en_une_image_en_vraies_couleurs(descripteur_de_l_image ,imageA ,imageA_ROUGE ,imageA_VERTE ,imageA_BLEUE ,increment_des_niveaux ,translater_le_NOIR ) ); /* Conversion de l'image en vraies couleurs. */ CALS(XPutImage(description_du_serveur_et_de_l_ecran,X11_____fenetre_courante ,contexte_graphique_de_visualisation ,descripteur_de_l_image ,Xmin ,Ymin /* Coordonnees de la sous-image (ici l'image entiere) a extraire, dans l'image entiere, */ ,X_position_centree_de_l_image_dans_la_fenetre ,fINVERSION_AXE_OY(Y_position_centree_de_l_image_dans_la_fenetre ,DIMENSION_VERTICALE_DE_L_IMAGE(pasY) ,L_IMAGE_N_EST_PAS_DECOUPEE_EN_MORCEAUX ) /* Position de la sous-image (ici l'image entiere) a extraire, dans la fenetre, */ ,DIMENSION_HORIZONTALE_DE_L_IMAGE(pasX),DIMENSION_VERTICALE_DE_L_IMAGE(pasY) /* Dimension de la sous-image (ici l'image entiere) a extraire. */ ) ); /* Et affichage de l'image... */ CALZ_FreSS(image_en_vraies_couleurs); /* Liberation du vecteur intermediaire pour la generation de l'image en vraies couleurs. */ EGAL(ASI1(descripteur_de_l_image,data),None); /* Afin d'eviter un : */ /* */ /* Segmentation fault */ /* */ /* dans le 'XDestroyImage...)' a suivre... */ CALS_XDestroyImage(descripteur_de_l_image); /* Enfin, on libere la structure descriptive de l'image visualisee. Ceci a ete introduit */ /* le 20170722113356 car, en effet, il manquait... */ Eblock ETes Test(EST_VRAI(IXdisplay_____on_peut_revisualiser_l_imageA_courante)) Bblock Test(EST_FAUX(IXdisplay_____imageA_courante_revisualisable)) /* Ce qui suit ne doit etre fait qu'apres le "premier" appel a 'IXdisplay(...)'. */ Bblock PUSH_FILTRAGE; SET_FILTRAGE(INACTIF); /* Inhition du filtrage et sauvegarde des conditions initiales... */ Test(EST_VRAI(IXopen_____mettre_X_Window_en_mode_fausses_couleurs)) /* Cas des fausses couleurs (jusqu'au 20030116181304, c'etait, par erreur, l'indicateur */ /* 'IXopen_____X_Window_a_ete_mis_en_mode_fausses_couleurs' qui etait teste ici) : */ Bblock CALi(Imove(IXdisplay_____imageA_courante,imageA)); /* Et sauvegarde systematique de la derniere image affichee 'imageA'. On notera que l'on */ /* sauvegarde l'image elle-meme (et non pas son adresse) car, en effet, entre l'instant */ /* de cette sauvegarde et son eventuelle utilisation, l'image (en memoire) peut avoir */ /* changee, voire avoir disparue (son espace memoire ayant ete desalloue par exemple...). */ Eblock ATes Bblock /* Cas des vraies couleurs : */ CALi(Imove(IXdisplay_____imageA_ROUGE_courante,imageA_ROUGE)); CALi(Imove(IXdisplay_____imageA_VERTE_courante,imageA_VERTE)); CALi(Imove(IXdisplay_____imageA_BLEUE_courante,imageA_BLEUE)); /* La sauvegarde de l'image en vraies couleurs {ROUGE,VERTE,BLEUE} a ete introduite le */ /* 20030102101041. */ Eblock ETes PULL_FILTRAGE; /* Et restauration des conditions initiales... */ EGAL(IXdisplay_____imageA_courante_revisualisable,VRAI); /* A partir de maintenant, 'imageA' est "revisualisable", mais a condition d'aller ensuite */ /* dans une fonction du type 'IXattente_d_un_evenement_quelconque(...)'. */ Eblock ATes Bblock Eblock ETes Eblock ATes Bblock EGAL(IXdisplay_____imageA_courante_revisualisable,FAUX); /* On ne sait jamais... */ Eblock ETes EDEFV(image,image_symetrisee_par_rapport_a_OX); /* Malheureusement, l'axe 'OY' de 'X-Window' descend, d'ou cette image... */ Eblock ATes Bblock PRINT_ERREUR("la visualisation de l'image ne peut avoir lieu car la liaison avec le serveur 'X-Window' n'est pas active"); Eblock ETes RETU_ERROR; Eblock EFonctionIB /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* 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 A V E C R E I N I T I A L I S A T I O N */ /* A P R I O R I D U D I S P O S T I F D E R E A F F I C H A G E : */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Common,DEFV(FonctionI,IXdisplay_avec_reinitialisation_du_reaffichage(imageA ,imageA_ROUGE,imageA_VERTE,imageA_BLEUE ,increment_des_niveaux ,translater_le_NOIR ) ) ) /* Fonction introduite le 20101118092254... */ DEFV(Argument,DEFV(image,imageA)); /* Image Argument en mode 'EST_VRAI(IXopen_____tenter_X_Window_en_mode_fausses_couleurs)'. */ DEFV(Argument,DEFV(image,imageA_ROUGE)); DEFV(Argument,DEFV(image,imageA_VERTE)); DEFV(Argument,DEFV(image,imageA_BLEUE)); /* Image Argument en mode 'EST_FAUX(IXopen_____tenter_X_Window_en_mode_fausses_couleurs)'. */ DEFV(Argument,DEFV(Int,increment_des_niveaux)); /* Increment du niveau courant dans [NOIR,BLANC] afin de pouvoir decaler la palette (ce */ /* qui signifie aussi la faire "tourner"). */ DEFV(Argument,DEFV(Logical,translater_le_NOIR)); /* Indique si le niveau 'NOIR' est translatable ('LE_NOIR_EST_TRANSLATABLE') dans */ /* 'ACCES_LA_PALETTE_ET_TRANSLATION(...)' ou pas ('LE_NOIR_N_EST_PAS_TRANSLATABLE')... */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /* ATTENTION : 'INIT_ERROR' est mis en tete des variables locales au cas ou des couples */ /* ('BDEFV','EDEFV') suivraient... */ /*..............................................................................................................................*/ EGAL(IXdisplay_____imageA_courante_revisualisable,FAUX); /* Afin de forcer la reinitialisation du dispositif de reaffichage... */ /* */ /* ATTENTION : il ne faut pas ecrire : */ /* */ /* BSaveModifyVariable(Logical */ /* ,IXdisplay_____imageA_courante_revisualisable */ /* ,FAUX */ /* ); */ /* */ /* car sinon, ensuite le 'ESaveModifyVariable' redonnerait la valeur anterieure de */ /* 'IXdisplay_____imageA_courante_revisualisable' alors qu'il faut que celle-ci reste */ /* imperativement a 'FAUX' puisque d'autres fonctions peuvent tester cet indicateur au */ /* retour de 'IXdisplay_avec_reinitialisation_du_reaffichage(...)'. */ CALS(IXdisplay(imageA,imageA_ROUGE,imageA_VERTE,imageA_BLEUE,increment_des_niveaux,translater_le_NOIR)); /* Et affichage de l'image Argument... */ /* ATTENTION : il ne faut pas ecrire : */ /* */ /* ESaveModifyVariable(Logical */ /* ,IXdisplay_____imageA_courante_revisualisable */ /* ); */ /* */ /* car sinon, cela a 'IXdisplay_____imageA_courante_revisualisable' sa valeur anterieure */ /* alors qu'il faut que celle-ci reste imperativement a 'FAUX', d'autres fonctions pouvant */ /* tester cet indicateur au retour de 'IXdisplay_avec_reinitialisation_du_reaffichage(...)'. */ 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 o-------------> */ /* 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 o-----------------------> */ /* 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 o-------------------------------------------> */ /* 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 # define PLUS_PETITE_TEMPORISATION_INTER_ANIMATIONS \ UN \ /* Plus petite temporisation inter-animations non nulle... */ # define Xcentre_TRANSLATE \ ADD2(COXA(MOIT(ASD1(dimension_non_normalisee_de_la_fenetre,dx))) \ ,_lDENORMALISE_OX(ASD1(translation_spatiale_courante_des_trames,dx)) \ ) # define Ycentre_TRANSLATE \ ADD2(COYA(MOIT(ASD1(dimension_non_normalisee_de_la_fenetre,dy))) \ ,_lDENORMALISE_OY(ASD1(translation_spatiale_courante_des_trames,dy)) \ ) /* Definition de {Xcentre,Ycentre} apres translation, et ceci lorsque 'centrer_l_animation'. */ /* ATTENTION, on notera que l'on utilise la fonction 'ADD2(...)' et non pas la fonction */ /* 'SOUS(...)' ce qui fait que si l'on souhaite que la derniere trame affichee apparaisse */ /* en bas et a gauche, et au premier plan, il faut des translations negatives. Cette */ /* contrainte influence l'initialisation de 'translation_spatiale_courante_des_trames'... */ /* */ /* ATTENTION, avant le 20030401183123 c'etait {Xcentre,Ycentre} qui etait utilise alors que */ /* depuis que les fenetres peuvent etre de taille differente des images, cette solution */ /* n'est plus correcte... */ DEFV(Common,DEFV(FonctionI,IXanimation(imageA ,imageA_ROUGE ,imageA_VERTE ,imageA_BLEUE ,nombre_de_trames ,temporisation_inter_trames ,facteur_de_ralentissement ,temporisation_inter_animations ,nombre_de_repetitions ,centrer_l_animation ,ARGUMENT_POINTERs(translation_spatiale_entre_deux_trames) ,mettre_un_fond,ARGUMENT_FACULTATIF(fond_de_la_fenetre) ) ) ) /* L'argument {imageA_ROUGE,imageA_VERTE,imageA_BLEUE} ont ete introduits le 20030101114234. */ /* 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(image,imageA)); /* Image Argument en mode 'EST_VRAI(IXopen_____tenter_X_Window_en_mode_fausses_couleurs)'. */ DEFV(Argument,DEFV(image,imageA_ROUGE)); DEFV(Argument,DEFV(image,imageA_VERTE)); DEFV(Argument,DEFV(image,imageA_BLEUE)); /* Image Argument en mode 'EST_FAUX(IXopen_____tenter_X_Window_en_mode_fausses_couleurs)'. */ 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,facteur_de_ralentissement)); /* Donne le nombre de fois que chaque trame sera repetee, ce qui permet de ralentir (dans */ /* rapport entier) la diffusion des animations... */ 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,centrer_l_animation)); /* Indique s'il faut centrer ('VRAI') ou mettre dans le coin inferieur gauche ('FAUX') */ /* les images de l'animation... */ DEFV(Argument,DEFV(deltaF_2D,POINTERs(translation_spatiale_entre_deux_trames))); /* Translation horizontale ('dx') et verticale ('dy') separant deux trames consecutives */ /* de l'animation. Lorsque celles-ci ne sont pas nulles, cela permet de visualiser l'axe */ /* du temps comme une troisieme dimension spatiale. On notera un petit defaut contre lequel */ /* je ne peux rien : en general 'nombre_de_trames' est un nombre pair (4,16,64), ce qui */ /* fait qu'il n'y a pas de trame "du milieu", et qu'ainsi donc l'ensemble des trames n'est */ /* pas parfaitement centree par rapport au centre de la fenetre... Enfin, cette possibilite */ /* n'est offerte que si 'centrer_l_animation' est demandee... */ 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... */ /*..............................................................................................................................*/ Test(EST_ACTIF(X11_____liaison_avec_le_serveur)) Bblock 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'. */ 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 Test(IZEQ(facteur_de_ralentissement)) Bblock PRINT_ERREUR("le facteur de ralentissment est nul, l'animation ne sera pas visible"); Eblock ATes Bblock Eblock ETes Test(IFET(IFEQ(pasX,PasX),IFEQ(pasY,PasY))) Bblock BDEFV(image,image_symetrisee_par_rapport_a_OX); /* Malheureusement, l'axe 'OY' de 'X-Window' descend, d'ou cette image ; on notera que */ /* meme si 'BUG_SYSTEME_X_WINDOW_IMAGE_2' n'existe plus, cette image subsiste afin de faire */ /* une adaptation a la palette, c'est pourquoi elle est toujours la... */ 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), */ DEFV(deltaF_2D,translation_spatiale_courante_des_trames); /* Translation horizontale ('dx') et verticale ('dy') courante des trames par rapport au */ /* centre de la fenetre lorsque 'centrer_l_animation' est demande... */ DEFV(CHAR,INIT(POINTERc(bit_map_equivalent),CHAINE_UNDEF)); /* Tant que 'X-Window' ne reconnaitra pas les matrices de points, mais uniquement les */ /* bit-maps en parallele, il faudra cette image intermediaire, utile uniquement si */ /* 'EST_VRAI(IXopen_____X_Window_a_ete_mis_en_mode_fausses_couleurs)'. */ DEFV(CHAR,INIT(POINTERc(animation_en_vraies_couleurs),CHAINE_UNDEF)); /* Definition d'un vecteur intermediaire pour la generation de l'image en vraies couleurs */ /* utile uniquement si 'EST_FAUX(IXopen_____X_Window_a_ete_mis_en_mode_fausses_couleurs)'. */ Test(IL_FAUT(mettre_un_fond)) Bblock Test(IL_FAUT(editer_les_PRINT_ATTENTION_ulterieurs)) Bblock Test(EST_VRAI(IXopen_____tenter_X_Window_en_mode_fausses_couleurs)) /* Cas des fausses couleurs : */ Bblock Eblock ATes /* Cas des vraies couleurs : */ Bblock PRINT_ATTENTION("en mode 'VRAIES COULEURS' la mise d'un fond se fait en NOIR et BLANC"); Eblock ETes Eblock ATes Bblock Eblock ETes CALS(IXdisplay(fond_de_la_fenetre ,fond_de_la_fenetre ,fond_de_la_fenetre ,fond_de_la_fenetre ,INCREMENT_DES_NIVEAUX_PAR_DEFAUT_DE_IXdisplay ,TRANSLATER_LE_NOIR_PAR_DEFAUT_DE_IXdisplay ) ); /* Mise en place du decor. On notera que le 20030101172647 j'ai ajoute un triplet */ /* necessaire a la visualisation en vraies couleurs et qui est fait de trois images */ /* identiques (ce qui fera du noir et blanc...) car, en effet, je ne sais pas quoi */ /* faire d'autre... */ Eblock ATes Bblock Eblock ETes Test(EST_VRAI(IXopen_____X_Window_a_ete_mis_en_mode_fausses_couleurs)) /* Cas des fausses couleurs : */ Bblock MISE_EN_FORME_DE_L_IMAGE(image_symetrisee_par_rapport_a_OX,imageA); /* Malheureusement, l'axe 'OY' de 'X-Window' descend, d'ou cette symetrie par rapport */ /* a l'axe 'OX' ; l'operation prend en compte la 'SUBSTITUTION' courante, et ce afin */ /* de permettre le fonctionnement correct de 'IXpalette()'... */ Test(IL_FAUT_UNE_CONVERSION_EN_UN_BIT_MAP) Bblock EGAL(bit_map_equivalent,kMalo(DIMENSION_DU_BIT_MAP)); /* Allocation d'un vecteur intermediaire pour la generation des bit-maps en parallele. */ CONVERSION_D_UNE_IMAGE_EN_UN_BITMAP(bit_map_equivalent); /* Conversion d'une image "standard" en un ensemble de bit-maps "paralleles"... */ Eblock ATes Bblock Eblock ETes Eblock ATes Bblock /* Cas des vraies couleurs : */ EGAL(animation_en_vraies_couleurs,kMalo(MUL2(dimXY,NOMBRE_DE_COMPOSANTES_CHROMATIQUES))); /* Allocation d'un vecteur intermediaire pour la generation de l'image en vraies couleurs. */ CALS_XCreateImage(descripteur_de_l_image ,description_du_serveur_et_de_l_ecran ,APPARENCE_VISUELLE_DE_LA_FENETRE ,NOMBRE_DE_BITS_PAR_POINT ,ZPixmap ,DECALAGE_DES_POINTS_SUR_LES_LIGNES ,Cara(animation_en_vraies_couleurs) ,dimX,dimY ,MULTIPLICITE_DES_LIGNES_DES_BITMAPS ,BYTES_PER_LINE_XCreateImage(LONGUEUR_EN_OCTETS_DES_LIGNES_D_IMAGES) ); # define INCREMENT_DES_NIVEAUX_PAR_DEFAUT \ INCREMENT_DES_NIVEAUX_PAR_DEFAUT_DE_IXdisplay # define TRANSLATER_LE_NOIR_PAR_DEFAUT \ TRANSLATER_LE_NOIR_PAR_DEFAUT_DE_IXdisplay /* Pour raccourcir les lignes qui suivent... */ CALS(Iconversion_d_une_image_en_fausses_couleurs_en_une_image_en_vraies_couleurs(descripteur_de_l_image ,imageA ,imageA_ROUGE ,imageA_VERTE ,imageA_BLEUE ,INCREMENT_DES_NIVEAUX_PAR_DEFAUT ,TRANSLATER_LE_NOIR_PAR_DEFAUT ) ); /* Conversion de l'image en vraies couleurs. */ # undef TRANSLATER_LE_NOIR_PAR_DEFAUT # undef INCREMENT_DES_NIVEAUX_PAR_DEFAUT 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), */ Repe(nombre_de_repetitions) Bblock INITIALISATION_ACCROISSEMENT_2D(translation_spatiale_courante_des_trames ,NEGA(MUL2(MOIT(nombre_de_trames) ,ASI1(translation_spatiale_entre_deux_trames,dx) ) ) ,NEGA(MUL2(MOIT(nombre_de_trames) ,ASI1(translation_spatiale_entre_deux_trames,dy) ) ) ); /* Initialisation du decalage spatial des trames entre-elles... ATTENTION, on notera que */ /* l'on utilise la fonction 'NEGA(...)' et non pas la fonction 'NEUT(...)'. Dans ces */ /* conditions, si l'on souhaite que la derniere trame affichee apparaisse en bas et a */ /* gauche, et au premier plan, il faut des translations negatives. Cette contrainte */ /* influence la definition de 'Xcentre_TRANSLATE' et de 'Ycentre_TRANSLATE'... */ begin_colonneQ(DoIn,Ymin,LIMITATION_VERTICALE(Ymax,dimension_lineaire),dimY_des_trames) Bblock begin_ligneQ(DoIn,Xmin,LIMITATION_HORIZONTALE(Xmax,dimension_lineaire),dimX_des_trames) Bblock Repe(facteur_de_ralentissement) Bblock Test(EST_VRAI(IXopen_____X_Window_a_ete_mis_en_mode_fausses_couleurs)) /* Cas des fausses couleurs : */ Bblock Test(IL_FAUT_UNE_CONVERSION_EN_UN_BIT_MAP) Bblock CALS_XCreateImage(descripteur_de_l_image ,description_du_serveur_et_de_l_ecran ,APPARENCE_VISUELLE_DE_LA_FENETRE ,NOMBRE_DE_BITS_PAR_POINT ,XYPixmap ,DECALAGE_DES_POINTS_SUR_LES_LIGNES ,Cara(bit_map_equivalent) ,DIMENSION_HORIZONTALE_DU_BIT_MAP(pasX_global) ,DIMENSION_VERTICALE_DU_BIT_MAP(pasY_global) ,MULTIPLICITE_DES_LIGNES_DES_BITMAPS ,BYTES_PER_LINE_XCreateImage (DIVI(DIMENSION_HORIZONTALE_DU_BIT_MAP(pasX_global) ,NBITOC ) ) ); /* Allocation d'une image intermediaire pour la generation des bit-maps en parallele. */ # define X_position_centree_de_l_image \ X_position_centree_de_l_image_dans_la_fenetre # define Y_position_centree_de_l_image \ Y_position_centree_de_l_image_dans_la_fenetre /* Pour reduire la longueur des lignes suivantes... */ CALS(XPutImage(description_du_serveur_et_de_l_ecran,X11_____fenetre_courante ,contexte_graphique_de_visualisation ,descripteur_de_l_image ,COXA(REDUCTION_HORIZONTALE(COXR(X) ,pasX_global ) ) ,COYA(REDUCTION_VERTICALE(COYR(iINVERSION_AXE_OY(Y ,dimY_des_trames ,dimension_lineaire ) ) ,pasY_global ) ) /* Coordonnees de la sous-image a extraire, dans l'image entiere, */ ,COXA(REDUCTION_HORIZONTALE(COXR(COND(IL_FAUT(centrer_l_animation) ,SOUS(Xcentre_TRANSLATE ,MOIT(dimX_des_trames) ) ,X_position_centree_de_l_image ) ) ,pasX_global ) ) ,fINVERSION_AXE_OY (COYA(REDUCTION_VERTICALE(COYR(COND(IL_FAUT(centrer_l_animation) ,SOUS(Ycentre_TRANSLATE ,MOIT(dimY_des_trames) ) ,Y_position_centree_de_l_image ) ) ,pasY_global ) ) ,REDUCTION_VERTICALE(dimY_des_trames ,pasY_global ) ,dimension_lineaire ) /* Position de la sous-image a extraire, dans la fenetre, */ ,REDUCTION_HORIZONTALE(dimX_des_trames,pasX_global) ,REDUCTION_VERTICALE(dimY_des_trames,pasY_global) /* Dimension de la sous-image a extraire. */ ) ); /* Et affichage de la sous-image, mais on notera bien l'inversion de l'axe 'OY' fait */ /* avec 'COYA(SOUS(SOUS(dimY,COYR(Y)),dimY_des_trames))'... */ # undef Y_position_centree_de_l_image # undef X_position_centree_de_l_image CALS_XDestroyImage(descripteur_de_l_image); /* Enfin, on libere la structure descriptive de l'image visualisee. Ceci a ete introduit */ /* le 20170722133825 car, en effet, cela semblait manquer... */ Eblock ATes Bblock CALS_XCreateImage(descripteur_de_l_image ,description_du_serveur_et_de_l_ecran ,APPARENCE_VISUELLE_DE_LA_FENETRE ,NOMBRE_DE_BITS_PAR_POINT ,ZPixmap ,DECALAGE_DES_POINTS_SUR_LES_LIGNES ,Cara(image_symetrisee_par_rapport_a_OX) ,dimX ,dimY ,MULTIPLICITE_DES_LIGNES_DES_BITMAPS ,BYTES_PER_LINE_XCreateImage(LONGUEUR_EN_OCTETS_DES_LIGNES_D_IMAGES) ); /* Ca y est, 'X-Window' connait les matrices de points... */ CALS(XPutImage(description_du_serveur_et_de_l_ecran,X11_____fenetre_courante ,contexte_graphique_de_visualisation ,descripteur_de_l_image ,X ,iINVERSION_AXE_OY(Y,dimY_des_trames,dimension_lineaire) /* Coordonnees de la sous-image a extraire, dans l'image entiere, */ ,COND(IL_FAUT(centrer_l_animation) ,SOUS(Xcentre_TRANSLATE ,MOIT(dimX_des_trames) ) ,X_position_centree_de_l_image_dans_la_fenetre ) ,fINVERSION_AXE_OY(COND(IL_FAUT(centrer_l_animation) ,SOUS(Ycentre_TRANSLATE ,MOIT(dimY_des_trames) ) ,Y_position_centree_de_l_image_dans_la_fenetre ) ,dimY_des_trames ,dimension_lineaire ) /* Position de la sous-image a extraire, dans la fenetre, */ ,dimX_des_trames ,dimY_des_trames /* Dimension de la sous-image a extraire. */ ) ); /* Et affichage de la sous-image, mais on notera bien l'inversion de l'axe 'OY' fait */ /* avec 'COYA(SOUS(SOUS(dimY,COYR(Y)),dimY_des_trames))'... */ EGAL(ASI1(descripteur_de_l_image,data),None); /* Ceci est destine a 'XDestroyImage(...)' afin qu'il ne detruise pas l'espace memoire */ /* occupe par l'image (au cas ou ce dernier aurait ete alloue dynamiquement, ce qui est */ /* en fait extremement frequent...). */ CALS_XDestroyImage(descripteur_de_l_image); /* Enfin, on libere la structure descriptive de l'image visualisee... */ Eblock ETes Eblock ATes Bblock /* Cas des vraies couleurs : */ CALS(XPutImage(description_du_serveur_et_de_l_ecran,X11_____fenetre_courante ,contexte_graphique_de_visualisation ,descripteur_de_l_image ,X ,iINVERSION_AXE_OY(Y,dimY_des_trames,dimension_lineaire) /* Coordonnees de la sous-image a extraire, dans l'image entiere, */ ,COND(IL_FAUT(centrer_l_animation) ,SOUS(Xcentre_TRANSLATE ,MOIT(dimX_des_trames) ) ,X_position_centree_de_l_image_dans_la_fenetre ) ,fINVERSION_AXE_OY(COND(IL_FAUT(centrer_l_animation) ,SOUS(Ycentre_TRANSLATE ,MOIT(dimY_des_trames) ) ,Y_position_centree_de_l_image_dans_la_fenetre ) ,dimY_des_trames ,dimension_lineaire ) /* Position de la sous-image a extraire, dans la fenetre, */ ,dimX_des_trames ,dimY_des_trames /* Dimension de la sous-image a extraire. */ ) ); /* Et affichage de la sous-image, mais on notera bien l'inversion de l'axe 'OY' fait */ /* avec 'COYA(SOUS(SOUS(dimY,COYR(Y)),dimY_des_trames))'... */ Eblock ETes Test(IFET(IFEQ(compteur_des_repetitions_du_Repe,PREMIERE_ITERATION_D_UN_Repe) ,IFET(IFEQ(X,Xmin),IFEQ(Y,Ymin)) ) ) Bblock DODO(temporisation_inter_animations); /* Attente eventuelle apres la premiere image de chaque animation, et ce afin d'avoir */ /* le temps de la regarder ; le controle de ce 'DODO' est fait par la meme variable */ /* ('temporisation_inter_animations') que le 'DODO' apres chaque animation... Enfin, on */ /* notera qu'autrefois il y avait : */ /* */ /* DODO(COND(IFLE(temporisation_inter_animations */ /* ,MUL2(facteur_de_ralentissement */ /* ,PLUS_PETITE_TEMPORISATION_INTER_ANIMATIONS */ /* ) */ /* ) */ /* ,MIN2(temporisation_inter_animations */ /* ,PLUS_PETITE_TEMPORISATION_INTER_ANIMATIONS */ /* ) */ /* ,DIVI(temporisation_inter_animations,facteur_de_ralentissement) */ /* ) */ /* ); */ /* */ /* mais qu'etant a l'interieur d'un 'Repe(...)', ce 'DODO(...)' etait lui aussi repete... */ Eblock ATes Bblock Eblock ETes DODO(temporisation_inter_trames); /* Attente eventuelle apres chaque trame de l'animation ; on notera que pour la premiere */ /* image (Xmin,Ymin), on peut donc attendre deux fois de suite (on procede ainsi pour ne */ /* avoir a compliquer inutilement le test ci-dessus, et prendre en compte tous les cas). */ Eblock ERep INITIALISATION_ACCROISSEMENT_2D(translation_spatiale_courante_des_trames ,ADD2(ASD1(translation_spatiale_courante_des_trames,dx) ,ASI1(translation_spatiale_entre_deux_trames,dx) ) ,ADD2(ASD1(translation_spatiale_courante_des_trames,dy) ,ASI1(translation_spatiale_entre_deux_trames,dy) ) ); /* Mise a jour du decalage spatial des trames entre-elles... */ Eblock end_ligneQ(EDoI) Eblock end_colonneQ(EDoI) DODO(temporisation_inter_animations); /* Attente eventuelle apres chaque animation... */ Eblock ERep Test(EST_VRAI(IXopen_____X_Window_a_ete_mis_en_mode_fausses_couleurs)) /* Cas des fausses couleurs : */ Bblock Test(IL_FAUT_UNE_CONVERSION_EN_UN_BIT_MAP) Bblock CALZ_FreSS(bit_map_equivalent); /* Liberation du vecteur intermediaire utilise pour la generation des bit-maps en parallele. */ Eblock ATes Bblock Eblock ETes Eblock ATes Bblock /* Cas des vraies couleurs : */ EGAL(ASI1(descripteur_de_l_image,data),None); /* Ceci est destine a 'XDestroyImage(...)' afin qu'il ne detruise pas l'espace memoire */ /* occupe par l'image (au cas ou ce dernier aurait ete alloue dynamiquement, ce qui est */ /* en fait extremement frequent...). */ CALS_XDestroyImage(descripteur_de_l_image); /* Enfin, on libere la structure descriptive de l'image visualisee... */ CALZ_FreSS(animation_en_vraies_couleurs); /* Liberation du vecteur intermediaire pour la generation de l'image en vraies couleurs. */ Eblock ETes EDEFV(image,image_symetrisee_par_rapport_a_OX); /* Malheureusement, l'axe 'OY' de 'X-Window' descend, d'ou cette image ; on notera que */ /* meme si 'BUG_SYSTEME_X_WINDOW_IMAGE_2' n'existe plus, cette image subsiste afin de faire */ /* une adaptation a la palette, c'est pourquoi elle est toujours la... */ Eblock ATes Bblock PRINT_ERREUR("l'animation de sequences demande les pas de base (PasX,PasY)"); Eblock ETes Eblock ATes Bblock PRINT_ERREUR("la visualisation de l'image ne peut avoir lieu car la liaison avec le serveur 'X-Window' n'est pas active"); Eblock ETes RETU_ERROR; Eblock # undef Xcentre_TRANSLATE # undef Ycentre_TRANSLATE # undef PLUS_PETITE_TEMPORISATION_INTER_ANIMATIONS EFonctionI # undef iINVERSION_AXE_OY # undef fINVERSION_AXE_OY # ifdef BUG_SYSTEME_X_WINDOW_IMAGE_2 # undef _INVERSION_AXE_OY # Aifdef BUG_SYSTEME_X_WINDOW_IMAGE_2 # undef _INVERSION_AXE_OY # Eifdef BUG_SYSTEME_X_WINDOW_IMAGE_2 # undef LIMITATION_VERTICALE # undef LIMITATION_HORIZONTALE # undef L_IMAGE_N_EST_PAS_DECOUPEE_EN_MORCEAUX # undef CONVERSION_D_UNE_IMAGE_EN_UN_BITMAP # undef NETTOYAGE_DE_L_image_symetrisee_par_rapport_a_OX # ifdef BUG_SYSTEME_X_WINDOW_IMAGE_2 # undef MISE_EN_FORME_DE_L_IMAGE # Aifdef BUG_SYSTEME_X_WINDOW_IMAGE_2 # undef MISE_EN_FORME_DE_L_IMAGE # Eifdef BUG_SYSTEME_X_WINDOW_IMAGE_2 # undef X_IL_Y_A_ERREUR # undef DECALAGE_DES_POINTS_SUR_LES_LIGNES # if ( (defined(BUG_SYSTEME_SG_X_WINDOW_BORDER_1)) \ ) # undef EPAISSEUR_DU_BORD_DES_FENETRES # Aif ( (defined(BUG_SYSTEME_SG_X_WINDOW_BORDER_1)) \ ) # undef EPAISSEUR_DU_BORD_DES_FENETRES # Eif ( (defined(BUG_SYSTEME_SG_X_WINDOW_BORDER_1)) \ ) # undef PALETTE_DE_COULEURS_UTILISEE # undef VISUAL_SATISFAISANT_A_UTILISER # undef PALETTE_DE_COULEURS_PAR_DEFAUT # undef NOMBRE_MAXIMAL_DE_COULEURS_ACCESSIBLES # undef TYPE_DU_COLORIAGE_COURANT # if ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (defined(SYSTEME_APC_LinuxRedHat_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_ICC)) \ || (defined(SYSTEME_APC_LinuxUlmint_GCC)) \ || (defined(SYSTEME_APC_LinuxUlmint_ICC)) \ || (defined(SYSTEME_CRAYC98_UNICOS)) \ || (defined(SYSTEME_CRAYC916_UNICOS)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS)) \ || (defined(SYSTEME_DECALPHA340_OSF1)) \ || (defined(SYSTEME_DECALPHA350_OSF1)) \ || (defined(SYSTEME_DECALPHA464_OSF1)) \ || (defined(SYSTEME_ES9000_AIX)) \ || (defined(SYSTEME_FX2800_CONCENTRIX)) \ || (defined(SYSTEME_FX40_CONCENTRIX)) \ || (defined(SYSTEME_NWS3000_NEWSOS)) \ || (defined(SYSTEME_RS6000_AIX)) \ || (defined(SYSTEME_SG4D20G_IRIX)) \ || (defined(SYSTEME_SG4D25TG_IRIX)) \ || (defined(SYSTEME_SG4D310VGX_IRIX)) \ || (defined(SYSTEME_SG4D35TG_IRIX)) \ || (defined(SYSTEME_SG4D85GT_IRIX)) \ || (defined(SYSTEME_SGIND308_IRIX)) \ || (defined(SYSTEME_SGIND324_IRIX)) \ || (defined(SYSTEME_SGIND3GA_IRIX)) \ || (defined(SYSTEME_SGIND408_IRIX)) \ || (defined(SYSTEME_SGIND424_IRIX)) \ || (defined(SYSTEME_SGIND4GA_IRIX)) \ || (defined(SYSTEME_SGIND508_IRIX)) \ || (defined(SYSTEME_SGIND524_IRIX)) \ || (defined(SYSTEME_SGIND5GA_IRIX)) \ || (defined(SYSTEME_SGIND808_IRIX)) \ || (defined(SYSTEME_SGIND824_IRIX)) \ || (defined(SYSTEME_SGIND8GA_IRIX)) \ || (defined(SYSTEME_SGINDA08_IRIX)) \ || (defined(SYSTEME_SGINDA24_IRIX)) \ || (defined(SYSTEME_SGINDAGA_IRIX)) \ || (defined(SYSTEME_SGO200A1_IRIX)) \ || (defined(SYSTEME_SGO200A2_IRIX)) \ || (defined(SYSTEME_SGO200A4_IRIX)) \ || (defined(SYSTEME_SGO25224_IRIX)) \ || (defined(SYSTEME_SGO252VA_IRIX)) \ || (defined(SYSTEME_SGO252VN_IRIX)) \ || (defined(SYSTEME_SGPCM801_IRIX)) \ || (defined(SYSTEME_SGPCMA01_IRIX)) \ || (defined(SYSTEME_SUN3_SUNOS)) \ || (defined(SYSTEME_SUN4_SUNOS)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS)) \ || (defined(SYSTEME_VAX8600_ULTRIX)) \ || (defined(SYSTEME_VAX9000_ULTRIX)) \ ) # undef APPARENCE_VISUELLE_DE_LA_FENETRE # Aif ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (defined(SYSTEME_APC_LinuxRedHat_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_ICC)) \ || (defined(SYSTEME_APC_LinuxUlmint_GCC)) \ || (defined(SYSTEME_APC_LinuxUlmint_ICC)) \ || (defined(SYSTEME_CRAYC98_UNICOS)) \ || (defined(SYSTEME_CRAYC916_UNICOS)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS)) \ || (defined(SYSTEME_DECALPHA340_OSF1)) \ || (defined(SYSTEME_DECALPHA350_OSF1)) \ || (defined(SYSTEME_DECALPHA464_OSF1)) \ || (defined(SYSTEME_ES9000_AIX)) \ || (defined(SYSTEME_FX2800_CONCENTRIX)) \ || (defined(SYSTEME_FX40_CONCENTRIX)) \ || (defined(SYSTEME_NWS3000_NEWSOS)) \ || (defined(SYSTEME_RS6000_AIX)) \ || (defined(SYSTEME_SG4D20G_IRIX)) \ || (defined(SYSTEME_SG4D25TG_IRIX)) \ || (defined(SYSTEME_SG4D310VGX_IRIX)) \ || (defined(SYSTEME_SG4D35TG_IRIX)) \ || (defined(SYSTEME_SG4D85GT_IRIX)) \ || (defined(SYSTEME_SGIND308_IRIX)) \ || (defined(SYSTEME_SGIND324_IRIX)) \ || (defined(SYSTEME_SGIND3GA_IRIX)) \ || (defined(SYSTEME_SGIND408_IRIX)) \ || (defined(SYSTEME_SGIND424_IRIX)) \ || (defined(SYSTEME_SGIND4GA_IRIX)) \ || (defined(SYSTEME_SGIND508_IRIX)) \ || (defined(SYSTEME_SGIND524_IRIX)) \ || (defined(SYSTEME_SGIND5GA_IRIX)) \ || (defined(SYSTEME_SGIND808_IRIX)) \ || (defined(SYSTEME_SGIND824_IRIX)) \ || (defined(SYSTEME_SGIND8GA_IRIX)) \ || (defined(SYSTEME_SGINDA08_IRIX)) \ || (defined(SYSTEME_SGINDA24_IRIX)) \ || (defined(SYSTEME_SGINDAGA_IRIX)) \ || (defined(SYSTEME_SGO200A1_IRIX)) \ || (defined(SYSTEME_SGO200A2_IRIX)) \ || (defined(SYSTEME_SGO200A4_IRIX)) \ || (defined(SYSTEME_SGO25224_IRIX)) \ || (defined(SYSTEME_SGO252VA_IRIX)) \ || (defined(SYSTEME_SGO252VN_IRIX)) \ || (defined(SYSTEME_SGPCM801_IRIX)) \ || (defined(SYSTEME_SGPCMA01_IRIX)) \ || (defined(SYSTEME_SUN3_SUNOS)) \ || (defined(SYSTEME_SUN4_SUNOS)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS)) \ || (defined(SYSTEME_VAX8600_ULTRIX)) \ || (defined(SYSTEME_VAX9000_ULTRIX)) \ ) # undef APPARENCE_VISUELLE_DE_LA_FENETRE # Eif ( (defined(SYSTEME_APC_LinuxDebian_GCC)) \ || (defined(SYSTEME_APC_LinuxMandrake_GCC)) \ || (defined(SYSTEME_APC_LinuxRedHat_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_GCC)) \ || (defined(SYSTEME_APC_LinuxUbuntu_ICC)) \ || (defined(SYSTEME_APC_LinuxUlmint_GCC)) \ || (defined(SYSTEME_APC_LinuxUlmint_ICC)) \ || (defined(SYSTEME_CRAYC98_UNICOS)) \ || (defined(SYSTEME_CRAYC916_UNICOS)) \ || (defined(SYSTEME_CRAYYMP1_UNICOS)) \ || (defined(SYSTEME_CRAYYMP2_UNICOS)) \ || (defined(SYSTEME_CRAYYMP4_UNICOS)) \ || (defined(SYSTEME_DECALPHA340_OSF1)) \ || (defined(SYSTEME_DECALPHA350_OSF1)) \ || (defined(SYSTEME_DECALPHA464_OSF1)) \ || (defined(SYSTEME_ES9000_AIX)) \ || (defined(SYSTEME_FX2800_CONCENTRIX)) \ || (defined(SYSTEME_FX40_CONCENTRIX)) \ || (defined(SYSTEME_NWS3000_NEWSOS)) \ || (defined(SYSTEME_RS6000_AIX)) \ || (defined(SYSTEME_SG4D20G_IRIX)) \ || (defined(SYSTEME_SG4D25TG_IRIX)) \ || (defined(SYSTEME_SG4D310VGX_IRIX)) \ || (defined(SYSTEME_SG4D35TG_IRIX)) \ || (defined(SYSTEME_SG4D85GT_IRIX)) \ || (defined(SYSTEME_SGIND308_IRIX)) \ || (defined(SYSTEME_SGIND324_IRIX)) \ || (defined(SYSTEME_SGIND3GA_IRIX)) \ || (defined(SYSTEME_SGIND408_IRIX)) \ || (defined(SYSTEME_SGIND424_IRIX)) \ || (defined(SYSTEME_SGIND4GA_IRIX)) \ || (defined(SYSTEME_SGIND508_IRIX)) \ || (defined(SYSTEME_SGIND524_IRIX)) \ || (defined(SYSTEME_SGIND5GA_IRIX)) \ || (defined(SYSTEME_SGIND808_IRIX)) \ || (defined(SYSTEME_SGIND824_IRIX)) \ || (defined(SYSTEME_SGIND8GA_IRIX)) \ || (defined(SYSTEME_SGINDA08_IRIX)) \ || (defined(SYSTEME_SGINDA24_IRIX)) \ || (defined(SYSTEME_SGINDAGA_IRIX)) \ || (defined(SYSTEME_SGO200A1_IRIX)) \ || (defined(SYSTEME_SGO200A2_IRIX)) \ || (defined(SYSTEME_SGO200A4_IRIX)) \ || (defined(SYSTEME_SGO25224_IRIX)) \ || (defined(SYSTEME_SGO252VA_IRIX)) \ || (defined(SYSTEME_SGO252VN_IRIX)) \ || (defined(SYSTEME_SGPCM801_IRIX)) \ || (defined(SYSTEME_SGPCMA01_IRIX)) \ || (defined(SYSTEME_SUN3_SUNOS)) \ || (defined(SYSTEME_SUN4_SUNOS)) \ || (defined(SYSTEME_SUN4NCUBE2S_SUNOS)) \ || (defined(SYSTEME_VAX8600_ULTRIX)) \ || (defined(SYSTEME_VAX9000_ULTRIX)) \ ) # undef RACINE_DU_SYSTEME_HIERARCHIQUE_DE_FENETRES # undef LARGEUR_DE_L_ECRAN # undef HAUTEUR_DE_L_ECRAN # undef EPAISSEUR_DES_BORDURES_DE_FENETRES # undef VRAI_NIVEAU_DE_NOIR_DE_L_ECRAN # undef VRAI_NIVEAU_DE_BLANC_DE_L_ECRAN # undef NIVEAU_DU_BLANC_DE_L_ECRAN # undef NIVEAU_DU_NOIR_DE_L_ECRAN # undef MASQUE_D_UN_POINT # undef NOMBRE_EFFECTIF_DE_BITS_PAR_POINT # undef NOMBRE_DE_BITS_PAR_POINT # undef ECRAN_UTILISE % undef ACCES_AUX_PALETTES_DE_COULEURS_VERSION_03 % undef ACCES_AUX_PALETTES_DE_COULEURS_VERSION_02 % undef ACCES_AUX_PALETTES_DE_COULEURS_VERSION_02_TEST_DU_SERVEUR_X_WINDOW % undef ACCES_AUX_PALETTES_DE_COULEURS_VERSION_01 # undef Xliberation # undef DIMENSION_VERTICALE_DE_L_IMAGE # undef DIMENSION_HORIZONTALE_DE_L_IMAGE # undef DIMENSION_DU_BIT_MAP # undef DIMENSION_VERTICALE_DU_BIT_MAP # undef DIMENSION_HORIZONTALE_DU_BIT_MAP # undef REDUCTION_VERTICALE # undef REDUCTION_HORIZONTALE # undef IL_FAUT_UNE_CONVERSION_EN_UN_BIT_MAP # if ( (defined(BUG_SYSTEME_APC_LinuxRedHat_X_WINDOW_XCreateImage_1)) \ || (defined(BUG_SYSTEME_APC_LinuxUbuntu_X_WINDOW_XCreateImage_1)) \ || (defined(BUG_SYSTEME_APC_LinuxUlmint_X_WINDOW_XCreateImage_1)) \ ) /* Introduit le 20120226083215... */ # undef BYTES_PER_LINE_XCreateImage # Aif ( (defined(BUG_SYSTEME_APC_LinuxRedHat_X_WINDOW_XCreateImage_1)) \ || (defined(BUG_SYSTEME_APC_LinuxUbuntu_X_WINDOW_XCreateImage_1)) \ || (defined(BUG_SYSTEME_APC_LinuxUlmint_X_WINDOW_XCreateImage_1)) \ ) # undef BYTES_PER_LINE_XCreateImage # Eif ( (defined(BUG_SYSTEME_APC_LinuxRedHat_X_WINDOW_XCreateImage_1)) \ || (defined(BUG_SYSTEME_APC_LinuxUbuntu_X_WINDOW_XCreateImage_1)) \ || (defined(BUG_SYSTEME_APC_LinuxUlmint_X_WINDOW_XCreateImage_1)) \ ) # if ( (defined(BUG_SYSTEME_APC_LinuxUbuntu_X_WINDOW_XCreateImage_3)) \ || (defined(BUG_SYSTEME_APC_LinuxUlmint_X_WINDOW_XCreateImage_3)) \ ) /* Introduit le 20120226083215... */ # undef AMELIORATION_XCreateImage_3 # Aif ( (defined(BUG_SYSTEME_APC_LinuxUbuntu_X_WINDOW_XCreateImage_3)) \ || (defined(BUG_SYSTEME_APC_LinuxUlmint_X_WINDOW_XCreateImage_3)) \ ) # undef AMELIORATION_XCreateImage_3 # Eif ( (defined(BUG_SYSTEME_APC_LinuxUbuntu_X_WINDOW_XCreateImage_3)) \ || (defined(BUG_SYSTEME_APC_LinuxUlmint_X_WINDOW_XCreateImage_3)) \ ) # if ( (defined(BUG_SYSTEME_APC_LinuxRedHat_X_WINDOW_XCreateImage_2)) \ || (defined(BUG_SYSTEME_APC_LinuxUbuntu_X_WINDOW_XCreateImage_2)) \ || (defined(BUG_SYSTEME_APC_LinuxUlmint_X_WINDOW_XCreateImage_2)) \ ) /* Introduit le 20120226083215... */ # undef CALS_XCreateImage # undef CALS_XDestroyImage # Aif ( (defined(BUG_SYSTEME_APC_LinuxRedHat_X_WINDOW_XCreateImage_2)) \ || (defined(BUG_SYSTEME_APC_LinuxUbuntu_X_WINDOW_XCreateImage_2)) \ || (defined(BUG_SYSTEME_APC_LinuxUlmint_X_WINDOW_XCreateImage_2)) \ ) # undef CALS_XCreateImage # undef CALS_XDestroyImage # Eif ( (defined(BUG_SYSTEME_APC_LinuxRedHat_X_WINDOW_XCreateImage_2)) \ || (defined(BUG_SYSTEME_APC_LinuxUbuntu_X_WINDOW_XCreateImage_2)) \ || (defined(BUG_SYSTEME_APC_LinuxUlmint_X_WINDOW_XCreateImage_2)) \ ) # undef MULTIPLICITE_DES_LIGNES_DES_BITMAPS # undef LONGUEUR_EN_OCTETS_DES_LIGNES_D_IMAGES #Aifdef __VERSION__COMPILER_LE_GRAPHIQUE_X_WINDOW /* Common,DEFV(Fonction,) : sous X-Window compiler la bibliotheque. */ #Eifdef __VERSION__COMPILER_LE_GRAPHIQUE_X_WINDOW /* Common,DEFV(Fonction,) : sous X-Window compiler la bibliotheque. */ /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* C O M P A C T A G E D ' U N E P A L E T T E : */ /* */ /*************************************************************************************************************************************/ BFonctionI #define PAS_DU_FACTEUR_DE_REDUCTION \ FLOT(INVE(FLOT(COULEURS))) \ /* Pas du facteur de reduction ; avec cette valeur, on garantit de trouver quelque */ \ /* chose de convenable... */ #define REDUCTION_DU_FACTEUR_DE_REDUCTION \ DECR(facteur_de_reduction,PAS_DU_FACTEUR_DE_REDUCTION); \ /* Reduction du facteur de reduction... */ #define REDUCTION_D_UNE_COMPOSANTE_RVB(niveau,composante) \ fINTE(MUL2(facteur_de_reduction \ ,FLOT(NIVR(ACCES_listes_de_substitution(L_SUBSTITUTION`composante,niveau))) \ ) \ ) \ /* Reduction d'un niveau de gris ; on notera le 'INTE' qui est destine a assurer la */ \ /* coincidence, pour des valeurs de plus en plus petite de 'facteur_de_reduction', de */ \ /* polynomes 'RVB'; la composante 'ROUGE', 'VERTE' ou 'BLEUE' est definie par 'composante'. */ DEFV(Common,DEFV(FonctionI,Icompactage_d_une_palette(nombre_maximal_de_couleurs_demande))) DEFV(Argument,DEFV(Positive,nombre_maximal_de_couleurs_demande)); /* Nombre maximum de couleurs auquel on souhaite se ramener ; il y a un autre Argument */ /* "cache" : il s'agit des trois listes de substitution (ROUGE,VERTE,BLEUE). Le Resultat */ /* sera la liste de substitution 'VARIABLE' indiquant les substitutions permettant donc */ /* de compacter la palette (ROUGE,VERTE,BLEUE)... */ /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /* ATTENTION : 'INIT_ERROR' est mis en tete des variables locales au cas ou des couples */ /* ('BDEFV','EDEFV') suivraient... */ DEFV(Positive,INIT(nombre_d_entrees_necessaires,COULEURS)); /* Nombre courant d'entrees necessaires dans la palette (ROUGE,VERTE,BLEUE) ; ce nombre */ /* doit etre inferieur ou egal a l'Argument 'nombre_maximal_de_couleurs_demande'. */ DEFV(Float,DTb1(valeur_des_polynomes_RVB,COULEURS)); /* A chaque entree de la palette (ROUGE,VERTE,BLEUE), on associe un polynome du type : */ /* */ /* 2 1 0 */ /* (alpha.nR).COULEURS + (alpha.nV).COULEURS + (alpha.nB).COULEURS */ /* */ /* ou : */ /* */ /* alpha E [0,1], */ /* */ /* ce polynome permettant de tester la proximite reciproque des entrees entre elles. */ DEFV(Float,INIT(facteur_de_reduction,FU)); /* Facteur de reduction de calcul des polynomes 'RVB' (il est appele 'alpha' ci-dessus). */ DEFV(Logical,DTb1(etat_des_polynomes_RVB,COULEURS)); /* Cette liste indique si les polynomes correspondants sont 'ACTIF's (etat initial), ou */ /* bien 'INACTIF', ce qui signifie qu'on leur a trouve une autre entree ayant le meme */ /* polynome : il y a donc eu pour eux compactage... */ /*..............................................................................................................................*/ /* On notera que l'on n'initialise pas les listes de substitution a priori, et a l'aide */ /* de 'INITIALISATION_LISTES_DE_SUBSTITUTION', car en effet, cela aurait pour facheux effet */ /* de reinitialiser les listes (ROUGE,VERTE,BLEUE) ; enfin, il faut supposer que tout est */ /* bon lorsque l'on arrive ici... */ Test(IZGT(nombre_maximal_de_couleurs_demande)) Bblock Tant(IFET(IFGT(nombre_d_entrees_necessaires,nombre_maximal_de_couleurs_demande) ,IZGT(facteur_de_reduction) ) ) Bblock EGAL(nombre_d_entrees_necessaires,COULEURS); /* A prior, il faut 'COULEURS' entrees... */ BoIn(index,NOIR,BLANC,PAS_COULEURS) Bblock EGAL(ACCES_listes_de_substitution(L_SUBSTITUTION_VARIABLE,index),fonction_neutre_de_substitution(index)); /* On reinitialise la liste de substitution 'VARIABLE' avec la fonction 'neutre', et non */ /* pas avec sa fonction specifique, au cas ou cette derniere ne serait pas neutre... */ Eblock EBoI BoIn(index,NOIR,BLANC,PAS_COULEURS) Bblock EGAL(ITb1(etat_des_polynomes_RVB,INDX(index,NOIR)),ACTIF); /* A priori, tous les polynomes 'RVB' sont 'ACTIF's... */ EGAL(ITb1(valeur_des_polynomes_RVB,INDX(index,NOIR)) ,AXPB(AXPB(REDUCTION_D_UNE_COMPOSANTE_RVB(index,ROUGE) ,FLOT(COULEURS) ,REDUCTION_D_UNE_COMPOSANTE_RVB(index,VERTE) ) ,FLOT(COULEURS) ,REDUCTION_D_UNE_COMPOSANTE_RVB(index,BLEUE) ) ); /* Calcul des polynomes 'RVB' : */ /* */ /* 2 1 0 */ /* (alpha.nR).COULEURS + (alpha.nV).COULEURS + (alpha.nB).COULEURS */ /* */ /* ou : */ /* */ /* alpha E [0,1], */ /* */ Eblock EBoI BoIn(index_ACTIF,NOIR,BLANC,PAS_COULEURS) Bblock Test(IFET(EST_ACTIF(ITb1(etat_des_polynomes_RVB,INDX(index_ACTIF,NOIR))) ,IFLE(ADD2(index_ACTIF,PAS_COULEURS),BLANC) ) ) Bblock BoIn(index_INACTIF,ADD2(index_ACTIF,PAS_COULEURS),BLANC,PAS_COULEURS) Bblock Test(EST_ACTIF(ITb1(etat_des_polynomes_RVB,INDX(index_INACTIF,NOIR)))) Bblock Test(IFEQ(ITb1(valeur_des_polynomes_RVB,INDX(index_INACTIF,NOIR)) ,ITb1(valeur_des_polynomes_RVB,INDX(index_ACTIF,NOIR)) ) ) Bblock EGAL(ITb1(etat_des_polynomes_RVB,INDX(index_INACTIF,NOIR)),INACTIF); /* Le polynome correspondant a l'entree 'index_INACTIF' de la palette de couleurs */ /* (ROUGE,VERTE,BLEUE) etant egal a l'entree 'index_ACTIF' est rendue inactif, puisqu'il */ /* il y a "coincidence" pour le 'facteur_de_reduction' courant... */ MODIFICATION_LISTE_DE_SUBSTITUTION(index_INACTIF,index_ACTIF); /* Et on modifie donc la liste de substitution 'VARIABLE' en consequence... */ DECR(nombre_d_entrees_necessaires,I); /* Enfin, on decompte le nombre d'entrees necessaires... */ Eblock ATes Bblock Eblock ETes Eblock ATes Bblock Eblock ETes Eblock EBoI Eblock ATes Bblock Eblock ETes Eblock EBoI REDUCTION_DU_FACTEUR_DE_REDUCTION; /* Et on reduit le facteur de reduction pour l'iteration suivante (si elle a lieu...). */ Eblock ETan Test(IFGT(nombre_d_entrees_necessaires,nombre_maximal_de_couleurs_demande)) Bblock PRINT_ATTENTION("le nombre maximal de couleurs demande n'a pu etre atteint"); Eblock ATes Bblock Eblock ETes Eblock ATes Bblock PRINT_ATTENTION("une palette sans couleurs est demandee, elle est renvoyee 'neutre'"); Eblock ETes CLEAR_LISTE_INVERSE_DE_SUBSTITUTION(L_SUBSTITUTION_VARIABLE); /* Initialisation preliminaire a 'NIVEAU_UNDEF' des listes "inverses". */ BoIn(index,NOIR,BLANC,PAS_COULEURS) Bblock CALCUL_LISTE_INVERSE_DE_SUBSTITUTION(L_SUBSTITUTION_VARIABLE,index); /* Puis initialisation des listes "directes" et "inverses", */ EGAL(ACCES_blocage_des_listes_de_substitution(L_SUBSTITUTION_VARIABLE,index),AUTORISE); /* Ainsi que de la matrice des blocages de modification des listes "directes". */ Eblock EBoI RETU_ERROR; Eblock #undef REDUCTION_D_UNE_COMPOSANTE_RVB #undef REDUCTION_DU_FACTEUR_DE_REDUCTION #undef PAS_DU_FACTEUR_DE_REDUCTION EFonctionI /*===================================================================================================================================*/ /*************************************************************************************************************************************/ /* */ /* A F I N D E P E R M E T T R E D E S R E F E R E N C E S " E N A V A N T " D E ' IXdisplay(...) ' : */ /* */ /*************************************************************************************************************************************/ BFonctionI DEFV(Common,DEFV(FonctionI,IXinitialisation())) /*-----------------------------------------------------------------------------------------------------------------------------------*/ Bblock INIT_ERROR; /* ATTENTION : 'INIT_ERROR' est mis en tete des variables locales au cas ou des couples */ /* ('BDEFV','EDEFV') suivraient... */ /*..............................................................................................................................*/ EGAL(pointeur_de_IXdisplay,aFONCTION(IXdisplay)); /* A ce niveau, la fonction 'IXdisplay(...)' est evidemment connue... */ RETU_ERROR; Eblock EFonctionI _______________________________________________________________________________________________________________________________________