2 * Copyright © 2023 Keith Packard <keithp@keithp.com>
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * General Public License for more details.
14 * You should have received a copy of the GNU General Public License along
15 * with this program; if not, write to the Free Software Foundation, Inc.,
16 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
23 #define IMAGE_WIDTH (WIDTH * IMAGE_SCALE)
24 #define IMAGE_HEIGHT (HEIGHT * IMAGE_SCALE)
25 #define IMAGE_STRIDE ((IMAGE_WIDTH + 31) / 32)
27 #define DEFAULT_WIDTH IMAGE_WIDTH
28 #define DEFAULT_HEIGHT IMAGE_HEIGHT
37 #include <X11/extensions/XShm.h>
39 #define STRIDE ((WIDTH + 31) / 32)
41 static uint32_t bits[STRIDE * HEIGHT];
43 static struct ao_bitmap fb = {
50 static XImage *shm_image;
51 static XImage *nonshm_image;
52 static XShmSegmentInfo shm_info;
55 Setup(Display *dpy, Window win)
58 if (XShmQueryExtension(dpy)) {
59 shm_image = XShmCreateImage(dpy, visual, (unsigned) depth, ZPixmap, NULL, &shm_info, IMAGE_WIDTH, IMAGE_HEIGHT);
60 shm_info.shmid = shmget(IPC_PRIVATE, (size_t) (shm_image->bytes_per_line * shm_image->height), IPC_CREAT|0777);
61 shm_info.shmaddr = shm_image->data = shmat(shm_info.shmid, 0, 0);
62 shm_info.readOnly = True;
63 XShmAttach(dpy, &shm_info);
65 nonshm_image = XCreateImage(dpy, visual, (unsigned) depth, ZPixmap, 0, NULL,
66 IMAGE_WIDTH, IMAGE_HEIGHT, 32, IMAGE_STRIDE * 4);
67 nonshm_image->data = calloc((size_t) nonshm_image->bytes_per_line, (size_t) nonshm_image->height);
72 DoDisplay(Display *dpy, Window win, GC gc)
77 uint32_t *w, *scan, d;
78 unsigned long white = WhitePixel(dpy, screen);
79 unsigned long black = BlackPixel(dpy, screen);
87 for (iy = 0; iy < HEIGHT; iy++) {
90 for (ix = 0; ix < WIDTH; ix += 32) {
92 for (ib = 0; ib < 32 && ix + ib < WIDTH; ib++) {
93 unsigned long p = d & 1 ? white : black;
95 for (dy = 0; dy < IMAGE_SCALE; dy++) {
97 for (dx = 0; dx < IMAGE_SCALE; dx++) {
98 XPutPixel(image, (ix + ib) * IMAGE_SCALE + dx, iy * IMAGE_SCALE + dy, p);
105 XShmPutImage(dpy, win, gc, image, 0, 0, 0, 0, IMAGE_WIDTH, IMAGE_HEIGHT, False);
107 XPutImage(dpy, win, gc, image, 0, 0, 0, 0, IMAGE_WIDTH, IMAGE_HEIGHT);