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>
14 /* Parameters of the fractal */
16 /* double cr = -0.7927; */
17 /* double ci = 0.1609; */
19 /* double cr = 0.32; */
20 /* double ci = 0.043; */
22 /* double cr = -1.1380; */
23 /* double ci = -0.2403; */
25 /* double cr = -0.0986; */
26 /* double ci = -0.65186; */
28 /* double cr = -0.1225; */
29 /* double ci = 0.7449; */
33 double origin_x = -1.8;
34 double origin_y = -1.2;
38 /* Numbers of colors in the palette */
42 palette_julia (Data *datap)
44 xcb_alloc_color_reply_t *rep;
47 datap->palette = (uint32_t *)malloc (sizeof (uint32_t) * cmax);
49 for (i = 0 ; i < cmax ; i++)
52 rep = xcb_alloc_color_reply (datap->conn,
53 xcb_alloc_color (datap->conn,
58 rep = xcb_alloc_color_reply (datap->conn,
59 xcb_alloc_color (datap->conn,
61 65535, (i-127)<<9, 0),
64 rep = xcb_alloc_color_reply (datap->conn,
65 xcb_alloc_color (datap->conn,
67 65535, 65535, (i-255)<<10),
71 datap->palette[i] = 0;
73 datap->palette[i] = rep->pixel;
80 draw_julia (Data *datap)
86 datap->image = xcb_image_get (datap->conn, datap->draw,
88 XCB_ALL_PLANES, datap->format);
90 for (i = 0 ; i < datap->image->width ; i++)
91 for (j = 0 ; j < datap->image->height ; j++)
93 zr = origin_x + width * (double)i / (double)datap->image->width;
94 zi = origin_y + height * (double)j / (double)datap->image->height;
96 while ((zr*zr + zi*zi < 4.0) &&
100 zr = zr*zr - zi*zi + cr;
104 xcb_image_put_pixel (datap->image,
109 xcb_image_put (datap->conn, datap->draw, datap->gc, datap->image,
110 0, 0, 0, 0, W_W, W_H);
114 main (int argc, char *argv[])
117 xcb_screen_t *screen;
120 xcb_gcontext_t bgcolor;
124 xcb_rectangle_t rect_coord = { 0, 0, W_W, W_H};
125 xcb_generic_event_t *e;
128 data.conn = xcb_connect (0, &screen_num);
129 screen = xcb_aux_get_screen (data.conn, screen_num);
130 data.depth = xcb_aux_get_depth (data.conn, screen);
132 win.window = screen->root;
134 data.gc = xcb_gcontext_new (data.conn);
135 mask = XCB_GC_FOREGROUND | XCB_GC_GRAPHICS_EXPOSURES;
136 valgc[0] = screen->black_pixel;
137 valgc[1] = 0; /* no graphics exposures */
138 xcb_create_gc (data.conn, data.gc, win, mask, valgc);
140 bgcolor = xcb_gcontext_new (data.conn);
141 mask = XCB_GC_FOREGROUND | XCB_GC_GRAPHICS_EXPOSURES;
142 valgc[0] = screen->white_pixel;
143 valgc[1] = 0; /* no graphics exposures */
144 xcb_create_gc (data.conn, bgcolor, win, mask, valgc);
146 data.draw.window = xcb_window_new (data.conn);
147 mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK | XCB_CW_DONT_PROPAGATE;
148 valwin[0] = screen->white_pixel;
149 valwin[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_BUTTON_RELEASE | XCB_EVENT_MASK_EXPOSURE;
150 valwin[2] = XCB_EVENT_MASK_BUTTON_PRESS;
151 xcb_create_window (data.conn, 0,
156 XCB_WINDOW_CLASS_INPUT_OUTPUT,
159 xcb_map_window (data.conn, data.draw.window);
161 rect.pixmap = xcb_pixmap_new (data.conn);
162 xcb_create_pixmap (data.conn, data.depth,
163 rect.pixmap, data.draw,
165 xcb_poly_fill_rectangle(data.conn, rect, bgcolor, 1, &rect_coord);
167 xcb_map_window (data.conn, data.draw.window);
169 data.format = XCB_IMAGE_FORMAT_Z_PIXMAP;
171 data.cmap = xcb_colormap_new (data.conn);
172 xcb_create_colormap (data.conn,
173 XCB_COLORMAP_ALLOC_NONE,
176 screen->root_visual);
178 palette_julia (&data);
180 xcb_flush (data.conn);
182 while ((e = xcb_wait_for_event(data.conn)))
184 switch (e->response_type)
188 xcb_copy_area(data.conn, rect, data.draw, bgcolor,
189 0, 0, 0, 0, W_W, W_H);
191 xcb_flush (data.conn);
194 case XCB_KEY_RELEASE:
195 case XCB_BUTTON_RELEASE:
200 xcb_image_destroy (data.image);
202 xcb_disconnect (data.conn);