Commit 262d40e60c033c8e2a822ed94d7e2973c7d3c2e8

Authored by Jean Wasilewski
1 parent a0ae785b

Working version but 30s is needed by pic

Showing 1 changed file with 169 additions and 117 deletions   Show diff stats
1 1 #include <X11/Xlib.h>
2   -#include <X11/Xutil.h>
3   -#include <X11/Xos.h>
4 2 #include <stdio.h>
5   -#include <stdlib.h>
  3 +#include <stdlib.h> /* getenv(), etc. */
  4 +#include <unistd.h> /* sleep(), etc. */
6 5  
7   -#define AWESOME 7
  6 +Window create_simple_window(Display* display, int width, int height, int x, int y)
  7 +{
  8 + int screen_num = DefaultScreen(display);
  9 + int win_border_width = 2;
  10 + Window win;
  11 +
  12 + win = XCreateSimpleWindow(display, RootWindow(display, screen_num), x, y, width, height, win_border_width, BlackPixel(display, screen_num), WhitePixel(display, screen_num));
8 13  
9   -Display *dis;
10   -int screen;
11   -Window win;
12   -GC gc;
13   -int width=320;
14   -int height=240;
15   -int i=0;
  14 + XMapWindow(display, win);
  15 + XFlush(display);
16 16  
17   -void init_x();
18   -void close_x();
19   -void redraw();
  17 + return win;
  18 +}
20 19  
21   -int main ()
  20 +GC create_gc(Display* display, Window win, int reverse_video)
22 21 {
23   - XEvent event; /* the XEvent declaration !!! */
24   - KeySym key; /* a dealie-bob to handle KeyPress Events */
25   - char text[255]; /* a char buffer for KeyPress Events */
26   - XColor col;
27   - int initOffsetBMP;
  22 + GC gc;
  23 + unsigned long valuemask = 0; /* which values in 'values' to */
  24 + /* check when creating the GC. */
  25 + XGCValues values; /* initial values for the GC. */
  26 + unsigned int line_width = 2; /* line width for the GC. */
  27 + int line_style = LineSolid; /* style for lines drawing and */
  28 + int cap_style = CapButt; /* style of the line's edje and */
  29 + int join_style = JoinBevel; /* joined lines. */
  30 + int screen_num = DefaultScreen(display);
  31 +
  32 + gc = XCreateGC(display, win, valuemask, &values);
  33 + if (gc < 0) {
  34 + fprintf(stderr, "XCreateGC: \n");
  35 + }
  36 +
  37 + if (reverse_video)
  38 + {
  39 + XSetForeground(display, gc, WhitePixel(display, screen_num));
  40 + XSetBackground(display, gc, BlackPixel(display, screen_num));
  41 + }
  42 + else
  43 + {
  44 + XSetForeground(display, gc, BlackPixel(display, screen_num));
  45 + XSetBackground(display, gc, WhitePixel(display, screen_num));
  46 + }
  47 +
  48 + XSetLineAttributes(display, gc, line_width, line_style, cap_style, join_style);
  49 + XSetFillStyle(display, gc, FillSolid);
  50 +
  51 + return gc;
  52 +}
28 53  
29   - init_x();
  54 +int main(int argc, char* argv[])
  55 +{
  56 + Display* display; /* pointer to X Display structure. */
  57 + int screen_num; /* number of screen to place the window on. */
  58 + Window win; /* pointer to the newly created window. */
  59 + unsigned int display_width,
  60 + display_height; /* height and width of the X display. */
  61 + unsigned int width, height; /* height and width for the new window. */
  62 + char *display_name = getenv("DISPLAY"); /* address of the X display. */
  63 + GC gc; /* GC (graphics context) used for drawing */
  64 + /* in our window. */
  65 + Colormap screen_colormap; /* color map to use for allocating colors. */
  66 + XColor red, brown, blue, yellow, green;
  67 + /* used for allocation of the given color */
  68 + /* map entries. */
  69 + Status rc; /* return status of various Xlib functions. */
  70 + int initOffsetBMP;
  71 + XColor col;
30 72  
31   - printf("Patte de canard\n");
32   - Colormap cmap = DefaultColormap(dis, DefaultScreen(dis));
33   - printf("?\n");
  73 + display = XOpenDisplay(display_name);
  74 + if (display == NULL) {
  75 + fprintf(stderr, "%s: cannot connect to X server '%s'\n",
  76 + argv[0], display_name);
  77 + exit(1);
  78 + }
  79 +
  80 + screen_num = DefaultScreen(display);
  81 + display_width = DisplayWidth(display, screen_num);
  82 + display_height = DisplayHeight(display, screen_num);
  83 +
  84 + width = display_width;
  85 + height = display_height;
  86 + printf("window width - '%d'; height - '%d'\n", width, height);
  87 +
  88 + win = create_simple_window(display, width, height, 0, 0);
  89 +
  90 + gc = create_gc(display, win, 0);
  91 + XSync(display, False);
  92 + screen_colormap = DefaultColormap(display, DefaultScreen(display));
  93 +
  94 + rc = XAllocNamedColor(display, screen_colormap, "red", &red, &red);
  95 + if (rc == 0) {
  96 + fprintf(stderr, "XAllocNamedColor - failed to allocated 'red' color.\n");
  97 + exit(1);
  98 + }
  99 + rc = XAllocNamedColor(display, screen_colormap, "brown", &brown, &brown);
  100 + if (rc == 0) {
  101 + fprintf(stderr, "XAllocNamedColor - failed to allocated 'brown' color.\n");
  102 + exit(1);
  103 + }
  104 + rc = XAllocNamedColor(display, screen_colormap, "blue", &blue, &blue);
  105 + if (rc == 0) {
  106 + fprintf(stderr, "XAllocNamedColor - failed to allocated 'blue' color.\n");
  107 + exit(1);
  108 + }
  109 + rc = XAllocNamedColor(display, screen_colormap, "yellow", &yellow, &yellow);
  110 + if (rc == 0) {
  111 + fprintf(stderr, "XAllocNamedColor - failed to allocated 'yellow' color.\n");
  112 + exit(1);
  113 + }
  114 + rc = XAllocNamedColor(display, screen_colormap, "green", &green, &green);
  115 + if (rc == 0) {
  116 + fprintf(stderr, "XAllocNamedColor - failed to allocated 'green' color.\n");
  117 + exit(1);
  118 + }
  119 +
  120 + /* draw one pixel near each corner of the window */
  121 + /* draw the pixels in a red color. */
  122 + XSetForeground(display, gc, red.pixel);
  123 + XDrawPoint(display, win, gc, 5, 5);
  124 + XDrawPoint(display, win, gc, 5, height-5);
  125 + XDrawPoint(display, win, gc, width-5, 5);
  126 + XDrawPoint(display, win, gc, width-5, height-5);
34 127  
35 128 FILE* home = NULL;
36 129 char buffer[4];
... ... @@ -47,23 +140,23 @@ int main ()
47 140 initOffsetBMP = buffer[0] + (buffer[1] >> 8) + (buffer[2] >> 16) + (buffer[3] >> 24);
48 141  
49 142 fseek(home, 0x12, SEEK_SET);
50   - buffer[0] = getc(home);
51   - buffer[1] = getc(home);
52   - buffer[2] = getc(home);
53   - buffer[3] = getc(home);
54   - printf("Width %02x %02x %02x %02x\n", buffer[0], buffer[1], buffer[2], buffer[3]);
  143 + buffer[0] = getc(home);
  144 + buffer[1] = getc(home);
  145 + buffer[2] = getc(home);
  146 + buffer[3] = getc(home);
  147 + printf("Width %02x %02x %02x %02x\n", buffer[0], buffer[1], buffer[2], buffer[3]);
55 148  
56 149 //fseek(home, 0x12, SEEK_SET);
57   - buffer[0] = getc(home);
58   - buffer[1] = getc(home);
59   - buffer[2] = getc(home);
60   - buffer[3] = getc(home);
61   - printf("Height %02x %02x %02x %02x\n", buffer[0], buffer[1], buffer[2], buffer[3]);
  150 + buffer[0] = getc(home);
  151 + buffer[1] = getc(home);
  152 + buffer[2] = getc(home);
  153 + buffer[3] = getc(home);
  154 + printf("Height %02x %02x %02x %02x\n", buffer[0], buffer[1], buffer[2], buffer[3]);
62 155  
63 156 fseek(home, 0x1C, SEEK_SET);
64   - buffer[0] = getc(home);
65   - buffer[1] = getc(home);
66   - printf("Bits Per Pixel %02x %02x\n", buffer[0], buffer[1]);
  157 + buffer[0] = getc(home);
  158 + buffer[1] = getc(home);
  159 + printf("Bits Per Pixel %02x %02x\n", buffer[0], buffer[1]);
67 160  
68 161 if(buffer[1] != 0 || buffer[0] != 0x18)
69 162 {
... ... @@ -74,86 +167,45 @@ int main ()
74 167  
75 168 fseek(home, initOffsetBMP, SEEK_SET);
76 169  
77   - while(1)
78   - {
79   - XNextEvent(dis, &event);
  170 + col.flags= DoRed | DoGreen | DoBlue;
80 171  
81   - if (event.type==Expose && event.xexpose.count==0)
82   - redraw();
83   -
84   - if (event.type==KeyPress&& XLookupString(&event.xkey,text,255,&key,0)==1)
85   - {
86   - if (text[0]=='q')
87   - close_x();
88   - printf("You pressed the %c key!\n",text[0]);
89   - }
90   - if (event.type==ButtonPress)
91   - {
92   - //int x=event.xbutton.x,
93   - //y=event.xbutton.y;
94   -
95   - //strcpy(text,"X is FUN!");
96   - //XSetForeground(dis,gc,rand()%event.xbutton.x%255);
97   - //XDrawString(dis,win,gc,x,y, text, strlen(text));
98   -
99   - buffer[0] = getc(home);
100   - buffer[1] = getc(home);
101   - buffer[2] = getc(home);
102   -
103   - int j;
104   -
105   - for(j=0; j<AWESOME; j++)
106   - {
107   - col.red = buffer[2];
108   - col.green = buffer[1];
109   - col.blue = buffer[0];
110   -
111   -
112   -
113   -
114   -
115   - if(XAllocColor(dis, cmap, &col) == 0)
116   - printf("Failed to allocate color\n");
117   - if(XSetForeground(dis, gc, col.pixel) == 0)
118   - printf("Failed to set foreground\n");
119   - if(XDrawPoint(dis,win,gc,i%width,i/height) == 0)
120   - printf("Failed to draw point\n");
121   - buffer[0] = getc(home);
122   - buffer[1] = getc(home);
123   - buffer[2] = getc(home);
124   - printf("X %03d Y %03d R %02x G %02x B %02x\n", i%width, i/height, buffer[0], buffer[1], buffer[2]);
125   - i++;
126   - }
127   - }
  172 + int i;
  173 + for(i=0; i<76800; i++)
  174 + {
  175 + col.red = buffer[2] * 257;
  176 + col.green = buffer[1] * 257;
  177 + col.blue = buffer[0] * 257;
  178 +
  179 + if(XAllocColor(display, screen_colormap, &col) == 0)
  180 + printf("Failed to allocate color\n");
  181 + if(XSetForeground(display, gc, col.pixel) == 0)
  182 + printf("Failed to set foreground\n");
  183 + if(XDrawPoint(display,win,gc,i%width,height-1-(i/width)) == 0)
  184 + printf("Failed to draw point\n");
  185 + buffer[0] = getc(home);
  186 + buffer[1] = getc(home);
  187 + buffer[2] = getc(home);
  188 + //printf("X %03d Y %03d R %02x G %02x B %02x\n", i%width, i/width, buffer[0], buffer[1], buffer[2]);
128 189 }
129   - printf("End of display\n");
130   - return 0;
131   -}
132 190  
133   -void init_x() {
134   - unsigned long black,white;
135   -
136   - dis=XOpenDisplay((char *)0);
137   - screen=DefaultScreen(dis);
138   - black=BlackPixel(dis,screen),
139   - white=WhitePixel(dis, screen);
140   - win=XCreateSimpleWindow(dis,DefaultRootWindow(dis),0,0,width,height, 0,black, white);
141   - XSetStandardProperties(dis,win,"Howdy","Hi",None,NULL,0,NULL);
142   - XSelectInput(dis, win, ExposureMask|ButtonPressMask|KeyPressMask);
143   - gc=XCreateGC(dis, win, 0,0);
144   - XSetBackground(dis,gc,white);
145   - XSetForeground(dis,gc,black);
146   - XClearWindow(dis, win);
147   - XMapRaised(dis, win);
148   -};
149   -
150   -void close_x() {
151   - XFreeGC(dis, gc);
152   - XDestroyWindow(dis,win);
153   - XCloseDisplay(dis);
154   - exit(1);
155   -};
156   -
157   -void redraw() {
158   - XClearWindow(dis, win);
159   -};
  191 +
  192 +
  193 +
  194 +
  195 + /* draw two intersecting lines, one horizontal and one vertical, */
  196 + /* which intersect at point "50,100". */
  197 + /* draw the line in a brown color. */
  198 + //XSetForeground(display, gc, brown.pixel);
  199 + //XDrawLine(display, win, gc, 50, 0, 50, 200);
  200 + //XDrawLine(display, win, gc, 0, 100, 200, 100);
  201 +
  202 + /* flush all pending requests to the X server. */
  203 + XFlush(display);
  204 +
  205 + /* make a delay for a short period. */
  206 + sleep(4);
  207 +
  208 + /* close the connection to the X server. */
  209 + XCloseDisplay(display);
  210 + return(0);
  211 +}
... ...