From 7c53d95c6f5a8a1d1f67a0eb9a358f579b031391 Mon Sep 17 00:00:00 2001 From: turret Date: Thu, 29 Jun 2023 17:20:42 -0500 Subject: donut: implement double buffering --- donut.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) (limited to 'donut.c') diff --git a/donut.c b/donut.c index b136c36..36d7a19 100644 --- a/donut.c +++ b/donut.c @@ -28,6 +28,7 @@ #include #include #include +#include char *argv0; #include "arg.h" @@ -121,6 +122,12 @@ int main(int argc, char **argv) { XClearWindow(dis, win); XMapRaised(dis, win); + XdbeSwapInfo swap_info = { + win, + XdbeUndefined + }; + XdbeBackBuffer back_buffer = XdbeAllocateBackBufferName(dis, win, swap_info.swap_action); + // torus rotation floats float A = 0; // x-axis float B = 0; // z-axis @@ -149,12 +156,15 @@ int main(int argc, char **argv) { for(int y = 0; height >= y; y++){ int color = (b[x + width * y] - 1 + M_SQRT2) / sqrt(8) * 255; XSetForeground(dis, gc, color << 16 | color << 8 | color); - XFillRectangle(dis, win, gc, x * SCALE, y * SCALE, SCALE, SCALE); + XFillRectangle(dis, back_buffer, gc, x * SCALE, y * SCALE, SCALE, SCALE); } } + XdbeSwapBuffers(dis, &swap_info, 1); + free(b); + XSync(dis, 1); double etime = utime(); if(etime < stime + 1000/FPS_MAX) -- cgit v1.2.3