db_ximage.c 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. #define DB_IMPL_NAME "XImage"
  2. typedef struct {
  3. Display *display;
  4. Window window;
  5. GC gc;
  6. uint32_t *pixels;
  7. XImage *image;
  8. } DB;
  9. void db_init(DB *db, Display *display, Window window)
  10. {
  11. db->display = display;
  12. db->window = window;
  13. db->gc = XCreateGC(display, window, 0, NULL);
  14. db->pixels = malloc(sizeof(uint32_t) * WIDTH * HEIGHT);
  15. XWindowAttributes wa = {0};
  16. XGetWindowAttributes(display, window, &wa);
  17. db->image = XCreateImage(display,
  18. wa.visual,
  19. wa.depth,
  20. ZPixmap,
  21. 0,
  22. (char*) db->pixels,
  23. WIDTH, HEIGHT,
  24. 32,
  25. WIDTH * sizeof(uint32_t));
  26. }
  27. void db_clear(DB *db)
  28. {
  29. memset(db->pixels, 0, sizeof(uint32_t) * WIDTH * HEIGHT);
  30. }
  31. void db_fill_rect(DB *db, int x0, int y0, unsigned int w, unsigned int h)
  32. {
  33. for (unsigned int dx = 0; dx < w; ++dx) {
  34. for (unsigned int dy = 0; dy < h; ++dy) {
  35. int x = x0 + dx;
  36. int y = y0 + dy;
  37. if (0 <= x && (unsigned int) x < WIDTH &&
  38. 0 <= y && (unsigned int) y < HEIGHT) {
  39. db->pixels[y*WIDTH + x] = 0xFF0000;
  40. }
  41. }
  42. }
  43. }
  44. void db_swap_buffers(DB *db)
  45. {
  46. XPutImage(db->display, db->window, db->gc, db->image, 0, 0, 0, 0, WIDTH, HEIGHT);
  47. }