13 #include <xcb/xcb_aux.h>
14 #include <xcb/xcb_image.h>
16 #include "lissajoux.h"
30 xcb_shm_segment_info_t shminfo;
37 gettimeofday(&timev, NULL);
39 return (double)timev.tv_sec + (((double)timev.tv_usec) / 1000000);
43 draw_lissajoux (Data *datap)
46 double a1, a2, p1, p2;
52 i = xcb_image_shm_get (datap->conn, datap->draw,
53 datap->image, shminfo,
60 datap->image = xcb_image_get (datap->conn, datap->draw,
62 XCB_ALL_PLANES, datap->format);
70 p1 = 4.0*t_previous*pi*0.05;
74 for (i = 0 ; i < nbr ; i++)
76 x = tab_cos[(int)(a1*i + p1*nbr) % 3600];
77 y = tab_sin[(int)(a2*i + p2*nbr) % 3600];
78 xcb_image_put_pixel (datap->image,
79 (int)((double)(W_W-5)*(x+1)/2.0),
80 (int)((double)(W_H-5)*(y+1)/2.0), 65535);
86 for (i = 0 ; i < nbr ; i++)
88 x = tab_cos[(int)(a1*i + p1*nbr) % 3600];
89 y = tab_sin[(int)(a2*i + p2*nbr) % 3600];
90 xcb_image_put_pixel (datap->image,
91 (int)((double)(W_W-5)*(x+1)/2.0),
92 (int)((double)(W_H-5)*(y+1)/2.0), 0);
96 xcb_image_shm_put (datap->conn, datap->draw, datap->gc,
97 datap->image, shminfo,
98 0, 0, 0, 0, W_W, W_H, 0);
101 xcb_image_put (datap->conn, datap->draw, datap->gc, datap->image,
102 0, 0, 0, 0, W_W, W_H);
103 xcb_image_destroy (datap->image);
111 t = get_time () - time_start;
115 draw_lissajoux (datap);
119 printf("FRAME COUNT..: %i frames\n", loop_count);
120 printf("TIME.........: %3.3f seconds\n", t);
121 printf("AVERAGE FPS..: %3.3f fps\n", (double)loop_count / t);
123 xcb_image_shm_destroy (datap->image);
124 xcb_disconnect (datap->conn);
129 /* Return 0 if shm is not available, 1 otherwise */
131 shm_test (Data *datap)
133 xcb_shm_query_version_reply_t *rep;
135 rep = xcb_shm_query_version_reply (datap->conn,
136 xcb_shm_query_version (datap->conn),
143 if (rep->shared_pixmaps &&
144 (rep->major_version > 1 || rep->minor_version > 0))
145 format = rep->pixmap_format;
148 datap->image = xcb_image_shm_create (datap->conn, datap->depth,
149 format, NULL, W_W, W_H);
150 assert(datap->image);
152 shminfo.shmid = shmget (IPC_PRIVATE,
153 datap->image->bytes_per_line*datap->image->height,
155 assert(shminfo.shmid != -1);
156 shminfo.shmaddr = shmat (shminfo.shmid, 0, 0);
157 assert(shminfo.shmaddr);
158 datap->image->data = shminfo.shmaddr;
160 shminfo.shmseg = xcb_generate_id (datap->conn);
161 xcb_shm_attach (datap->conn, shminfo.shmseg,
163 shmctl_status = shmctl(shminfo.shmid, IPC_RMID, 0);
164 assert(shmctl_status != -1);
170 printf ("Use of shm.\n");
175 printf ("Can't use shm. Use standard functions.\n");
176 shmdt (shminfo.shmaddr);
177 shmctl (shminfo.shmid, IPC_RMID, 0);
183 main (int argc, char *argv[])
186 xcb_screen_t *screen;
189 xcb_gcontext_t bgcolor;
193 xcb_rectangle_t rect_coord = { 0, 0, W_W, W_H};
194 xcb_generic_event_t *e;
204 printf ("Usage: lissajoux try_shm\n");
205 printf (" try_shm == 0: shm not used\n");
206 printf (" try_shm != 0: shm is used (if available)\n");
210 try_shm = atoi (argv[1]);
214 data.conn = xcb_connect (0, &screen_num);
215 screen = xcb_aux_get_screen(data.conn, screen_num);
216 data.depth = xcb_aux_get_depth (data.conn, screen);
220 data.gc = xcb_generate_id (data.conn);
221 mask = XCB_GC_FOREGROUND | XCB_GC_GRAPHICS_EXPOSURES;
222 valgc[0] = screen->black_pixel;
223 valgc[1] = 0; /* no graphics exposures */
224 xcb_create_gc (data.conn, data.gc, win, mask, valgc);
226 bgcolor = xcb_generate_id (data.conn);
227 mask = XCB_GC_FOREGROUND | XCB_GC_GRAPHICS_EXPOSURES;
228 valgc[0] = screen->white_pixel;
229 valgc[1] = 0; /* no graphics exposures */
230 xcb_create_gc (data.conn, bgcolor, win, mask, valgc);
232 data.draw = xcb_generate_id (data.conn);
233 mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK | XCB_CW_DONT_PROPAGATE;
234 valwin[0] = screen->white_pixel;
235 valwin[1] = XCB_EVENT_MASK_KEY_PRESS | XCB_EVENT_MASK_BUTTON_RELEASE | XCB_EVENT_MASK_EXPOSURE;
236 valwin[2] = XCB_EVENT_MASK_BUTTON_PRESS;
237 xcb_create_window (data.conn, 0,
242 XCB_WINDOW_CLASS_INPUT_OUTPUT,
245 xcb_map_window (data.conn, data.draw);
247 rect = xcb_generate_id (data.conn);
248 xcb_create_pixmap (data.conn, data.depth,
251 xcb_poly_fill_rectangle(data.conn, rect, bgcolor, 1, &rect_coord);
253 data.format = XCB_IMAGE_FORMAT_Z_PIXMAP;
254 xcb_flush (data.conn);
259 for (i = 0; i < 3600; i++) {
260 tab_cos[i] = cos (2.0 * 3.1415926535897 * (double)i / 3600.0);
261 tab_sin[i] = sin (2.0 * 3.1415926535897 * (double)i / 3600.0);
264 time_start = get_time ();
268 e = xcb_poll_for_event(data.conn);
271 switch (e->response_type)
274 xcb_copy_area(data.conn, rect, data.draw, bgcolor,
275 0, 0, 0, 0, W_W, W_H);
281 xcb_flush (data.conn);