Added ZOOM support

This commit is contained in:
Devine Lu Linvega 2023-04-30 11:32:11 -07:00
parent 855b63b1ef
commit 55178e8347
3 changed files with 13 additions and 8 deletions

View File

@ -75,7 +75,7 @@ screen_resize(UxnScreen *p, Uint16 width, Uint16 height)
return; return;
bg = realloc(p->bg.pixels, width * height), bg = realloc(p->bg.pixels, width * height),
fg = realloc(p->fg.pixels, width * height); fg = realloc(p->fg.pixels, width * height);
pixels = realloc(p->pixels, width * height * sizeof(Uint32)); pixels = realloc(p->pixels, width * height * sizeof(Uint32) * ZOOM * ZOOM);
if(!bg || !fg || !pixels) if(!bg || !fg || !pixels)
return; return;
p->bg.pixels = bg; p->bg.pixels = bg;
@ -90,12 +90,15 @@ screen_resize(UxnScreen *p, Uint16 width, Uint16 height)
void void
screen_redraw(UxnScreen *p) screen_redraw(UxnScreen *p)
{ {
Uint32 i, size = p->width * p->height, palette[16], *pixels = p->pixels;
Uint8 *fg = p->fg.pixels, *bg = p->bg.pixels; Uint8 *fg = p->fg.pixels, *bg = p->bg.pixels;
Uint32 i, j, x, y, w = p->width * ZOOM, h = p->height * ZOOM, palette[16], *pixels = p->pixels;
for(i = 0; i < 16; i++) for(i = 0; i < 16; i++)
palette[i] = p->palette[(i >> 2) ? (i >> 2) : (i & 3)]; palette[i] = p->palette[(i >> 2) ? (i >> 2) : (i & 3)];
for(i = 0; i < size; i++) for(y = 0; y < h; y++)
pixels[i] = palette[fg[i] << 2 | bg[i]]; for(x = 0; x < w; x++) {
j = ((x / ZOOM) + (y / ZOOM) * p->width);
pixels[x + y * w] = palette[fg[j] << 2 | bg[j]];
}
p->fg.changed = p->bg.changed = 0; p->fg.changed = p->bg.changed = 0;
} }

View File

@ -10,6 +10,8 @@ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE. WITH REGARD TO THIS SOFTWARE.
*/ */
#define ZOOM 2
typedef struct Layer { typedef struct Layer {
Uint8 *pixels, changed; Uint8 *pixels, changed;
} Layer; } Layer;

View File

@ -72,7 +72,7 @@ static void
emu_draw(void) emu_draw(void)
{ {
screen_redraw(&uxn_screen); screen_redraw(&uxn_screen);
XPutImage(display, window, DefaultGC(display, 0), ximage, 0, 0, PAD, PAD, uxn_screen.width, uxn_screen.height); XPutImage(display, window, DefaultGC(display, 0), ximage, 0, 0, PAD, PAD, uxn_screen.width * ZOOM, uxn_screen.height * ZOOM);
} }
static int static int
@ -166,7 +166,7 @@ emu_event(Uxn *u)
} break; } break;
case MotionNotify: { case MotionNotify: {
XMotionEvent *e = (XMotionEvent *)&ev; XMotionEvent *e = (XMotionEvent *)&ev;
mouse_pos(u, &u->dev[0x90], e->x - PAD, e->y - PAD); mouse_pos(u, &u->dev[0x90], (e->x - PAD) / ZOOM, (e->y - PAD) / ZOOM);
} break; } break;
} }
} }
@ -177,7 +177,7 @@ display_start(char *title)
Atom wmDelete; Atom wmDelete;
display = XOpenDisplay(NULL); display = XOpenDisplay(NULL);
visual = DefaultVisual(display, 0); visual = DefaultVisual(display, 0);
window = XCreateSimpleWindow(display, RootWindow(display, 0), 0, 0, uxn_screen.width + PAD * 2, uxn_screen.height + PAD * 2, 1, 0, 0); window = XCreateSimpleWindow(display, RootWindow(display, 0), 0, 0, uxn_screen.width * ZOOM + PAD * 2, uxn_screen.height * ZOOM + PAD * 2, 1, 0, 0);
if(visual->class != TrueColor) if(visual->class != TrueColor)
return system_error("init", "True-color visual failed"); return system_error("init", "True-color visual failed");
XSelectInput(display, window, ButtonPressMask | ButtonReleaseMask | PointerMotionMask | ExposureMask | KeyPressMask | KeyReleaseMask); XSelectInput(display, window, ButtonPressMask | ButtonReleaseMask | PointerMotionMask | ExposureMask | KeyPressMask | KeyReleaseMask);
@ -185,7 +185,7 @@ display_start(char *title)
XSetWMProtocols(display, window, &wmDelete, 1); XSetWMProtocols(display, window, &wmDelete, 1);
XStoreName(display, window, title); XStoreName(display, window, title);
XMapWindow(display, window); XMapWindow(display, window);
ximage = XCreateImage(display, visual, DefaultDepth(display, DefaultScreen(display)), ZPixmap, 0, (char *)uxn_screen.pixels, uxn_screen.width, uxn_screen.height, 32, 0); ximage = XCreateImage(display, visual, DefaultDepth(display, DefaultScreen(display)), ZPixmap, 0, (char *)uxn_screen.pixels, uxn_screen.width * ZOOM, uxn_screen.height * ZOOM, 32, 0);
hide_cursor(); hide_cursor();
return 1; return 1;
} }