/*************************************************************************************************************************************/ /* */ /* T E S T D U C R E A T E - W I N D O W T R U E - C O L O R S U R ' SYSTEME_APC_LinuxDebian_GCC ' : */ /* */ /* */ /* Author of '$xtc/Xwindow.43$c' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, 20021226094011). */ /* */ /* */ /*************************************************************************************************************************************/ #include "INCLUDES.01.I" /* Introduit le 20051116100551... */ extern void *malloc(); #define NC 1 #define dimX 512 #define dimY 512 #define Xmin 0 #define Xmax (dimX-1) #define Ymin 0 #define Ymax (dimY-1) #define NBITOC 8 #define pEVENT(x) \ case x: \ { \ printf("\n x"); \ break; \ } #define EVENEMENT(x) \ { \ printf("\n evenement attendu=%d",x); \ evenement.type = LASTEvent; \ /* Ainsi, il n'y a pas encore d'evenement */ \ while (evenement.type != x) \ { \ XNextEvent(display,&evenement); \ printf(" -arrive=%d",evenement.type); \ } \ } #include <fcntl.h> #include <sys/signal.h> #include <X11/Xlib.h> #include <X11/X.h> #include <X11/Xutil.h> extern Display *XOpenDisplay(); extern Window XCreateWindow(); extern int XSelectInput(); extern int XMapWindow(); extern int XUnmapWindow(); extern int XDestroyWindow(); extern Status XAllocColor(); extern int XPutImage(); extern XImage *XCreateImage(); extern GC XCreateGC(); main(argc,argv) int argc; char *argv[]; { int Xargc=0; /* Pour simuler argc */ char **Xargv; /* Pour simuler argv */ unsigned long niveau_du_bord; unsigned long niveau_du_fond; unsigned long largeur_du_bord=9; int profondeur; int NOPP=3; /* Nombre d'octets par point. */ char *nom_du_display; Display *display; int ecran; Window fenetre_de_base; /* Root window */ Window fenetre_a_ouvrir; XEvent evenement; XSetWindowAttributes attributs; XSizeHints hints; Visual visual; Visual *visual_courant; XVisualInfo visual_recherche; XVisualInfo *liste_des_visuals; int nombre_de_visuals; Colormap palette; XColor entree_palette[NC]; int niveau; unsigned long couleurs[NC]; unsigned long Cmasque[1]; int substitution[COULEURS]; int sc=NOIR; GC contexte_graphique; XGCValues valeurs_du_contexte_graphique; unsigned char *image; #define IMAGE(x,y,n) \ (*(image + ((((y-Ymin)*dimX) + (x-Xmin))*NOPP + n))) \ /* Acces a un point de l'image au format externe. */ int cx,cy; /* Coordonnees de l'image */ int offx=0,offy=0; /* Coordonnee sous-image dans l'image */ int dx=0,dy=0; /* Position de la sous-image dans la fenetre */ XImage *Simage; /*************************************************************************************************************************************/ /* */ /* O U V E R T U R E D U D I S P L A Y */ /* */ /*************************************************************************************************************************************/ image = malloc(NOPP*dimY*dimX); nom_du_display = getenv("DISPLAY"); display = XOpenDisplay(nom_du_display); ecran = DefaultScreen(display); if (ecran > ScreenCount(display)-1) { printf("\n probleme de nombre d'ecrans"); } else { } if (display == 0) { printf("\n erreur d'open"); exit(-1); } else { } if (dimX > DisplayWidth(display,ecran)) { printf("\n image trop large"); } else { } if (dimY > DisplayHeight(display,ecran)) { printf("\n image trop haute"); } else { } fenetre_de_base= RootWindow(display,ecran); niveau_du_fond = BlackPixel(display,ecran); niveau_du_bord = WhitePixel(display,ecran); profondeur = NOPP*NBITOC; if (profondeur > DefaultDepth(display,ecran)) { printf("\n la fenetre a ouvrir ne peut avoir plus de couleurs que la fenetre 'parent'"); } else { } printf("\n niveau_du_fond=%x",niveau_du_fond); printf("\n niveau_du_bord=%x",niveau_du_bord); printf("\n profondeur=%d",profondeur); /*************************************************************************************************************************************/ /* */ /* D E F I N I T I O N D U V I S U A L */ /* */ /*************************************************************************************************************************************/ visual_recherche.screen = ecran; visual_recherche.class = TrueColor; visual_recherche.depth = profondeur; liste_des_visuals = XGetVisualInfo(display ,VisualScreenMask | VisualClassMask | VisualDepthMask ,&visual_recherche ,&nombre_de_visuals ); if (nombre_de_visuals == 0) { printf("\n pas de visuals \n"); } else { printf("\n %d visuals \n",nombre_de_visuals); } visual_courant=liste_des_visuals->visual; printf("\n ID=%x",visual_courant->visualid); printf("\n red_mask=%x",visual_courant->red_mask); printf("\n green_mask=%x",visual_courant->green_mask); printf("\n blue_mask=%x",visual_courant->blue_mask); printf("\n bits_per_rgb=%x",visual_courant->bits_per_rgb); printf("\n map_entries=%x",visual_courant->map_entries); printf("\n"); if (visual_courant->class != TrueColor) { printf("\n on n'est pas en vraies couleurs"); } else { } /*************************************************************************************************************************************/ /* */ /* O U V E R T U R E D E L A F E N E T R E */ /* */ /*************************************************************************************************************************************/ hints.x = 400; hints.y = 400; hints.width = dimX; hints.height= dimY; hints.flags = PPosition | PSize; attributs.backing_store = WhenMapped; #define MASKE \ ExposureMask | VisibilityChangeMask | PropertyChangeMask | StructureNotifyMask | ColormapChangeMask attributs.event_mask = MASKE; attributs.override_redirect = True; /* Doit etre present, car sinon, le cadre clignotte */ #define ATTRIB \ CWBackingStore | CWEventMask | CWOverrideRedirect fenetre_a_ouvrir = XCreateWindow(display ,fenetre_de_base ,hints.x,hints.y ,hints.width,hints.height ,largeur_du_bord ,profondeur ,InputOutput ,visual_courant ,ATTRIB,&attributs ); printf("\n ouverture\n"); XSelectInput(display,fenetre_a_ouvrir,MASKE); XSetStandardProperties(display,fenetre_a_ouvrir,"NOM-FENETRE","NOM-ICONE",None,Xargv,Xargc,&hints); EVENEMENT(PropertyNotify); XSetWindowBackground(display,fenetre_a_ouvrir,niveau_du_fond); EVENEMENT(PropertyNotify); XSetWindowBorder(display,fenetre_a_ouvrir,niveau_du_bord-1); EVENEMENT(PropertyNotify); /*************************************************************************************************************************************/ /* */ /* A F F I C H A G E D E L A F E N E T R E */ /* */ /*************************************************************************************************************************************/ XMapWindow(display,fenetre_a_ouvrir); EVENEMENT(MapNotify); EVENEMENT(VisibilityNotify); EVENEMENT(Expose); /*************************************************************************************************************************************/ /* */ /* C R E A T I O N D E L A S T R U C T U R E I M A G E : */ /* */ /*************************************************************************************************************************************/ valeurs_du_contexte_graphique.function = GXcopy; /* Afin de forcer les pixels dans la fenetre */ contexte_graphique = XCreateGC(display,fenetre_a_ouvrir,GCFunction|GCBackground|GCForeground,&valeurs_du_contexte_graphique); fprintf(stderr,"\n display=%d",display); fprintf(stderr,"\n visual_courant=%d",visual_courant); fprintf(stderr,"\n profondeur=%d",profondeur); fprintf(stderr,"\n ZPixmap=%d",ZPixmap); fprintf(stderr,"\n image=%ld",image); fprintf(stderr,"\n dimX=%d",dimX); fprintf(stderr,"\n dimY=%d",dimY); fprintf(stderr,"\n nbitoc=%d",NBITOC); fprintf(stderr,"\n NOPP_dimX=%d",NOPP*dimX); fprintf(stderr,"\n"); /* Editions introduites le 20170619140529 pour voir la difference entre 'vaugirard' (OK...) */ /* et 'porte-brancion' ("Segmentation fault" lors du 'XCreateImage(...)') sur '$CMAP28'... */ Simage = XCreateImage(display,visual_courant,profondeur,ZPixmap,0,image,dimX,dimY,NBITOC,NOPP*dimX); Simage->bits_per_pixel=profondeur; /*************************************************************************************************************************************/ /* */ /* G E N E R A T I O N D E L ' I M A G E */ /* */ /*************************************************************************************************************************************/ for (cy=Ymin ; cy<=Ymax ; cy++) { for (cx=Xmin ; cx<=Xmax ; cx++) { int rouge=(int)((((float)cx)/((float)dimX))*((float)BLANC)); int verte=(int)((((float)cy)/((float)dimX))*((float)BLANC)); int bleue=(int)((((float)(cx+cy))/((float)dimX))*((float)BLANC)); if ((cy%20) == 0) { rouge=verte=bleue=BLANC; } else { } if ((cx%40) == 0) { rouge=verte=bleue=BLANC; } else { } XPutPixel(Simage,cx,cy,(((rouge*COULEURS) + verte)*COULEURS + bleue)); } } /*************************************************************************************************************************************/ /* */ /* E N V O I D E L ' I M A G E */ /* */ /*************************************************************************************************************************************/ fprintf(stderr,"\n Simage=%d",Simage); fprintf(stderr,"\n display=%d",display); fprintf(stderr,"\n visual_courant=%d",visual_courant); fprintf(stderr,"\n width=%d",Simage->width); fprintf(stderr,"\n xoffset=%d",Simage->xoffset); fprintf(stderr,"\n format=%d",Simage->format); fprintf(stderr,"\n data=%d",Simage->data); fprintf(stderr,"\n byte_order=%d",Simage->byte_order); fprintf(stderr,"\n bitmap_unit=%d",Simage->bitmap_unit); fprintf(stderr,"\n bitmap_bit_order=%d",Simage->bitmap_bit_order); fprintf(stderr,"\n bitmap_pad=%d",Simage->bitmap_pad); fprintf(stderr,"\n depth=%d",Simage->depth); fprintf(stderr,"\n bytes_per_line=%d",Simage->bytes_per_line); fprintf(stderr,"\n bits_per_pixel=%d",Simage->bits_per_pixel); fprintf(stderr,"\n red_mask=%x",Simage->red_mask); fprintf(stderr,"\n green_mask=%x",Simage->green_mask); fprintf(stderr,"\n blue_mask=%x",Simage->blue_mask); XPutImage(display,fenetre_a_ouvrir,contexte_graphique,Simage,offx,offy,dx,dy,dimX,dimY); sleep(4); XDestroyImage(Simage); /*************************************************************************************************************************************/ /* */ /* F E R M E T U R E D E L A F E N E T R E */ /* */ /*************************************************************************************************************************************/ XUnmapWindow(display,fenetre_a_ouvrir); EVENEMENT(UnmapNotify); XDestroyWindow(display,fenetre_a_ouvrir); EVENEMENT(DestroyNotify); XSync(display,True); XCloseDisplay(display); }