Replace another Sync -> Flush
[free-sw/xcb/demo] / tests / julia.c
1 #include <stdlib.h>
2 #include <stdio.h>
3
4 #include <X11/XCB/xcb.h>
5 #include <X11/XCB/shm.h>
6 #include <X11/XCB/xcb_aux.h>
7 #include <X11/XCB/xcb_image.h>
8
9 #include "julia.h"
10
11 #define W_W 640
12 #define W_H 480
13
14 /* Parameters of the fractal */
15
16 /* double cr = -0.7927; */
17 /* double ci = 0.1609; */
18
19 /* double cr = 0.32; */
20 /* double ci = 0.043; */
21
22 /* double cr = -1.1380; */
23 /* double ci = -0.2403; */
24
25 /* double cr = -0.0986; */
26 /* double ci = -0.65186; */
27
28 /* double cr = -0.1225; */
29 /* double ci = 0.7449; */
30
31 double cr = -0.3380;
32 double ci = -0.6230;
33 double origin_x = -1.8;
34 double origin_y = -1.2;
35 double width = 3.6;
36 double height = 2.4;
37
38 /* Numbers of colors in the palette */
39 int cmax = 316;
40
41 void
42 palette_julia (Data *datap)
43 {
44   XCBAllocColorRep *rep;
45   int               i;
46
47   datap->palette = (CARD32 *)malloc (sizeof (CARD32) * cmax);
48   
49   for (i = 0 ; i < cmax ; i++)
50     {
51       if (i < 128)
52         rep = XCBAllocColorReply (datap->conn,
53                                   XCBAllocColor (datap->conn,
54                                                  datap->cmap,
55                                                  i<<9, 0, 0),
56                                   0);
57       else if (i < 255)
58         rep = XCBAllocColorReply (datap->conn,
59                                   XCBAllocColor (datap->conn,
60                                                  datap->cmap,
61                                                  65535, (i-127)<<9, 0),
62                                   0);
63       else
64         rep = XCBAllocColorReply (datap->conn,
65                                   XCBAllocColor (datap->conn,
66                                                  datap->cmap,
67                                                  65535, 65535, (i-255)<<10),
68                                   0);
69       
70       if (!rep)
71         datap->palette[i] = 0;
72       else
73         datap->palette[i] = rep->pixel;
74       free (rep);
75     }
76   
77 }
78
79 void
80 draw_julia (Data *datap)
81 {
82   double    zr, zi, t;
83   int       c;
84   int       i, j;
85   
86   datap->image = XCBImageGet (datap->conn, datap->draw,
87                        0, 0, W_W, W_H,
88                        XCBAllPlanes, datap->format);
89   
90   for (i = 0 ; i < datap->image->width ; i++)
91     for (j = 0 ; j < datap->image->height ; j++)
92       {
93         zr = origin_x + width * (double)i / (double)datap->image->width;
94         zi = origin_y + height * (double)j / (double)datap->image->height;
95         c = 0;
96         while ((zr*zr + zi*zi < 4.0) &&
97                (c < cmax-1))
98           {
99             t = zr;
100             zr = zr*zr - zi*zi + cr;
101             zi = 2.0*t*zi + ci;
102             c++;
103           }
104         XCBImagePutPixel (datap->image,
105                           i,j,
106                           datap->palette[c]);
107       }
108
109   XCBImagePut (datap->conn, datap->draw, datap->gc, datap->image,
110                0, 0, 0, 0, W_W, W_H);
111 }
112
113 int
114 main (int argc, char *argv[])
115 {
116   Data             data;
117   XCBSCREEN       *screen;
118   XCBDRAWABLE      win;
119   XCBDRAWABLE      rect;
120   XCBGCONTEXT      bgcolor;
121   CARD32           mask;
122   CARD32           valgc[2];
123   CARD32           valwin[3];
124   XCBRECTANGLE     rect_coord = { 0, 0, W_W, W_H};
125   XCBGenericEvent *e;
126   int              screen_num;
127   
128   data.conn = XCBConnect (0, &screen_num);
129   screen = XCBAuxGetScreen (data.conn, screen_num);
130   data.depth = XCBAuxGetDepth (data.conn, screen);
131
132   win.window = screen->root;
133
134   data.gc = XCBGCONTEXTNew (data.conn);
135   mask = XCBGCForeground | XCBGCGraphicsExposures;
136   valgc[0] = screen->black_pixel;
137   valgc[1] = 0; /* no graphics exposures */
138   XCBCreateGC (data.conn, data.gc, win, mask, valgc);
139
140   bgcolor = XCBGCONTEXTNew (data.conn);
141   mask = XCBGCForeground | XCBGCGraphicsExposures;
142   valgc[0] = screen->white_pixel;
143   valgc[1] = 0; /* no graphics exposures */
144   XCBCreateGC (data.conn, bgcolor, win, mask, valgc);
145
146   data.draw.window = XCBWINDOWNew (data.conn);
147   mask = XCBCWBackPixel | XCBCWEventMask | XCBCWDontPropagate;
148   valwin[0] = screen->white_pixel;
149   valwin[1] = XCBEventMaskKeyRelease | XCBEventMaskButtonRelease | XCBEventMaskExposure;
150   valwin[2] = XCBEventMaskButtonPress;
151   XCBCreateWindow (data.conn, 0,
152                    data.draw.window,
153                    screen->root,
154                    0, 0, W_W, W_H,
155                    10,
156                    XCBWindowClassInputOutput,
157                    screen->root_visual,
158                    mask, valwin);
159   XCBMapWindow (data.conn, data.draw.window);
160
161   rect.pixmap = XCBPIXMAPNew (data.conn);
162   XCBCreatePixmap (data.conn, data.depth,
163                    rect.pixmap, data.draw,
164                    W_W, W_H);
165   XCBPolyFillRectangle(data.conn, rect, bgcolor, 1, &rect_coord);
166
167   XCBMapWindow (data.conn, data.draw.window);
168
169   data.format = XCBImageFormatZPixmap;
170
171   data.cmap = XCBCOLORMAPNew (data.conn);
172   XCBCreateColormap (data.conn,
173                      XCBColormapAllocNone,
174                      data.cmap,
175                      data.draw.window,
176                      screen->root_visual);
177
178   palette_julia (&data);
179
180   XCBFlush (data.conn); 
181
182   while ((e = XCBWaitForEvent(data.conn)))
183     {
184       switch (e->response_type)
185         {
186         case XCBExpose:
187           {
188             XCBCopyArea(data.conn, rect, data.draw, bgcolor,
189                         0, 0, 0, 0, W_W, W_H);
190             draw_julia (&data);
191             XCBFlush (data.conn);
192             break;
193           }
194         case XCBKeyRelease:
195         case XCBButtonRelease:
196           {
197             if (data.palette)
198               free (data.palette);
199             if (data.image)
200               XCBImageDestroy (data.image);
201             free (e);
202             XCBDisconnect (data.conn);
203             exit (0);
204             break;
205           }
206         }
207       free (e);
208     }
209
210   return 1;
211 }