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