xcb_image_t * xcb_image_create_native (xcb_connection_t * c, uint16_t width, uint16_t height, xcb_image_format_t format, uint8_t depth, void * base, uint32_t bytes, uint8_t * data) { const xcb_setup_t * setup = xcb_get_setup(c); xcb_format_t * fmt; xcb_image_format_t ef = format; if (ef == XCB_IMAGE_FORMAT_Z_PIXMAP && depth == 1) ef = XCB_IMAGE_FORMAT_XY_PIXMAP; switch (ef) { case XCB_IMAGE_FORMAT_XY_BITMAP: if (depth != 1) return 0; /* fall through */ case XCB_IMAGE_FORMAT_XY_PIXMAP: if (depth > 1) { fmt = find_format_by_depth(setup, depth); if (!fmt) return 0; } return xcb_image_create(width, height, format, setup->bitmap_format_scanline_pad, depth, depth, setup->bitmap_format_scanline_unit, setup->image_byte_order, setup->bitmap_format_bit_order, base, bytes, data); case XCB_IMAGE_FORMAT_Z_PIXMAP: fmt = find_format_by_depth(setup, depth); if (!fmt) return 0; return xcb_image_create(width, height, format, fmt->scanline_pad, fmt->depth, fmt->bits_per_pixel, 0, setup->image_byte_order, XCB_IMAGE_ORDER_MSB_FIRST, base, bytes, data); default: assert(0); } assert(0); }
xcb_image_t *hhxcb_create_image(uint32_t width, uint32_t height, xcb_format_t *fmt, const xcb_setup_t *setup) { size_t image_size = width * height * (fmt->bits_per_pixel / 8); uint8_t *image_data = (uint8_t *)malloc(image_size); return xcb_image_create(width, height, XCB_IMAGE_FORMAT_Z_PIXMAP, fmt->scanline_pad, fmt->depth, fmt->bits_per_pixel, 0, (xcb_image_order_t)setup->image_byte_order, XCB_IMAGE_ORDER_LSB_FIRST, image_data, image_size, image_data); }
xcb_image_t * xcb_image_native (xcb_connection_t * c, xcb_image_t * image, int convert) { xcb_image_t * tmp_image = 0; const xcb_setup_t * setup = xcb_get_setup(c); xcb_format_t * fmt = 0; xcb_image_format_t ef = effective_format(image->format, image->bpp); uint8_t bpp = 1; if (image->depth > 1 || ef == XCB_IMAGE_FORMAT_Z_PIXMAP) { fmt = find_format_by_depth(setup, image->depth); /* XXX For now, we don't do depth conversions, even for xy-pixmaps */ if (!fmt) return 0; bpp = fmt->bits_per_pixel; } switch (ef) { case XCB_IMAGE_FORMAT_XY_PIXMAP: if (setup->bitmap_format_scanline_unit != image->unit || setup->bitmap_format_scanline_pad != image->scanline_pad || setup->image_byte_order != image->byte_order || setup->bitmap_format_bit_order != image->bit_order || bpp != image->bpp) { if (!convert) return 0; tmp_image = xcb_image_create(image->width, image->height, image->format, setup->bitmap_format_scanline_pad, image->depth, bpp, setup->bitmap_format_scanline_unit, setup->image_byte_order, setup->bitmap_format_bit_order, 0, 0, 0); if (!tmp_image) return 0; } break; case XCB_IMAGE_FORMAT_Z_PIXMAP: if (fmt->scanline_pad != image->scanline_pad || setup->image_byte_order != image->byte_order || bpp != image->bpp) { if (!convert) return 0; tmp_image = xcb_image_create(image->width, image->height, image->format, fmt->scanline_pad, image->depth, bpp, 0, setup->image_byte_order, XCB_IMAGE_ORDER_MSB_FIRST, 0, 0, 0); if (!tmp_image) return 0; } break; default: assert(0); } if (tmp_image) { if (!xcb_image_convert(image, tmp_image)) { xcb_image_destroy(tmp_image); return 0; } image = tmp_image; } return image; }
int main(int arg, char **argv) { srand(time(NULL)); xcb_connection_t *connection = xcb_connect(NULL, NULL); xcb_screen_t *screen = xcb_setup_roots_iterator(xcb_get_setup(connection)).data; xcb_colormap_t colormap = screen->default_colormap; xcb_drawable_t window = xcb_generate_id(connection); uint32_t mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK; uint32_t values[] = {screen->black_pixel, XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_BUTTON_PRESS}; xcb_create_window(connection, /*screen->root_depth,*/ 24, window, screen->root, 0, 0, WIDTH, HEIGHT, 1, XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual, mask, values); xcb_pixmap_t pixmap = xcb_generate_id(connection); xcb_create_pixmap(connection, 24, pixmap, window, WIDTH, HEIGHT); uint8_t *img = malloc(WIDTH * HEIGHT * 4); uint8_t *limg = img; /*for (int y = 0; y < HEIGHT; y++)*/ /*for (int x = 0; x < WIDTH; x++) {*/ /**(limg++) = 128;*/ /**(limg++) = 128;*/ /**(limg++) = 128;*/ /*limg++;*/ /*}*/ perlin(img, WIDTH, HEIGHT); xcb_image_t *image = xcb_image_create(WIDTH, HEIGHT, XCB_IMAGE_FORMAT_Z_PIXMAP, 8, 24, 32, 0, /*xcb_get_setup(connection)->image_byte_order,*/ XCB_IMAGE_ORDER_MSB_FIRST, XCB_IMAGE_ORDER_LSB_FIRST, img, WIDTH * HEIGHT * 4, img); xcb_gcontext_t gc = xcb_generate_id(connection); xcb_create_gc(connection, gc, pixmap, 0, NULL); xcb_image_put(connection, pixmap, gc, image, 0, 0, 0); xif_write(image, "test.xif"); xcb_map_window(connection, window); xcb_flush(connection); xcb_generic_event_t *event; xcb_expose_event_t *expose; while ((event = xcb_wait_for_event(connection))) { switch (event->response_type & ~0x80) { case XCB_EXPOSE: expose = (xcb_expose_event_t *)event; xcb_copy_area(connection, pixmap, window, gc, expose->x, expose->y, expose->x, expose->y, expose->width, expose->height); xcb_flush(connection); break; case XCB_BUTTON_PRESS: goto end; break; default: break; } free(event); } end: xcb_free_pixmap(connection, pixmap); xcb_disconnect(connection); xcb_image_destroy(image); return 0; }
int main(int argc, char **argv) { xcb_connection_t *connection = xcb_connect(NULL, NULL); xcb_screen_t *screen = xcb_setup_roots_iterator(xcb_get_setup(connection)).data; uint32_t mask = XCB_CW_BACK_PIXEL; uint32_t values[] = {screen->black_pixel}; xcb_drawable_t window = xcb_generate_id(connection); xcb_create_window(connection, 24, window, screen->root, 0, 0, WIDTH, HEIGHT, 1, XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual, mask, values); xcb_change_property(connection, XCB_PROP_MODE_REPLACE, window, XCB_ATOM_WM_NAME, XCB_ATOM_STRING, 8, strlen(argv[0]), argv[0]); xcb_pixmap_t pixmap = xcb_generate_id(connection); xcb_create_pixmap(connection, 24, pixmap, window, WIDTH, HEIGHT); uint8_t *img = malloc(WIDTH * HEIGHT * 4); xcb_image_t *image = xcb_image_create(WIDTH, HEIGHT, XCB_IMAGE_FORMAT_Z_PIXMAP, 8, 24, 32, 0, XCB_IMAGE_ORDER_MSB_FIRST, XCB_IMAGE_ORDER_LSB_FIRST, img, WIDTH * HEIGHT * 4, img); mask = XCB_GC_FOREGROUND | XCB_GC_BACKGROUND; values[0] = screen->black_pixel; values[1] = 0xFFFFFF; xcb_gcontext_t gc = xcb_generate_id(connection); xcb_create_gc(connection, gc, pixmap, mask, values); xcb_image_put(connection, pixmap, gc, image, 0, 0, 0); xcb_map_window(connection, window); xcb_flush(connection); uint8_t value = 0; uint32_t *limg; Gol *gol = gol_new(BOARD_WIDTH, BOARD_HEIGHT); gol_random(gol, time(NULL)); while (1) { limg = (uint32_t *)image->data; for (int i = 0; i < BOARD_WIDTH * BOARD_HEIGHT; i++) *(limg++) = gol->buffers[gol->front][i] ? 0x00FFFF00 : 0x00000000; xcb_image_put(connection, pixmap, gc, image, 0, 0, 0); xcb_copy_area(connection, pixmap, window, gc, 0, 0, 0, 0, WIDTH, HEIGHT); xcb_flush(connection); value++; gol_simulate(gol); } return 0; }