aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Reiner <nathan@nathanreiner.xyz>2023-04-10 21:54:37 +0200
committerNathan Reiner <nathan@nathanreiner.xyz>2023-04-10 21:54:37 +0200
commit3026218eaa0d3be59a898939da5126ca03bc5969 (patch)
tree6d9dfe729c2bca4a59e158fe44e8c3f7f1b4a476
parent2c2e0188f7dc29946483b83d088e4f35c3a9069c (diff)
add double buffering
-rw-r--r--config.h2
-rw-r--r--drw.c26
-rw-r--r--drw.h2
-rw-r--r--swt.c1
4 files changed, 24 insertions, 7 deletions
diff --git a/config.h b/config.h
index d279ed3..321f89b 100644
--- a/config.h
+++ b/config.h
@@ -21,7 +21,7 @@ static FontPath fonts[] = {
"/usr/share/fonts/gnu-free/FreeMonoBoldOblique.otf" /* Bold-Italic */
},
};
-static int fontsize = 32;
+static int fontsize = 12;
static int borderpx = 2;
/*
diff --git a/drw.c b/drw.c
index dc220dc..79f4ab1 100644
--- a/drw.c
+++ b/drw.c
@@ -53,7 +53,7 @@ create_drw(struct wl_shm *shm, unsigned width, unsigned height)
return NULL;
}
- canvas->data = mmap(
+ canvas->buffer_data = mmap(
NULL,
canvas->size,
PROT_READ | PROT_WRITE,
@@ -62,10 +62,8 @@ create_drw(struct wl_shm *shm, unsigned width, unsigned height)
0
);
- if (canvas->data == MAP_FAILED) {
- close(fd);
- return NULL;
- }
+ if (canvas->buffer_data == MAP_FAILED)
+ die("mmap failed: ");
pool = wl_shm_create_pool(
shm,
@@ -85,6 +83,14 @@ create_drw(struct wl_shm *shm, unsigned width, unsigned height)
wl_shm_pool_destroy(pool);
close(fd);
+ fd = allocate_shm_file(canvas->size);
+ canvas->data = mmap(NULL, canvas->size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
+
+ if (canvas->data == MAP_FAILED)
+ die("mmap failed: ");
+
+ close(fd);
+
return canvas;
}
@@ -93,11 +99,19 @@ void
free_drw(Canvas *canvas)
{
munmap(canvas->data, canvas->size);
+ munmap(canvas->buffer_data, canvas->size);
free(canvas);
}
void
+push_buffer(Canvas *canvas)
+{
+ memcpy(canvas->buffer_data, canvas->data, canvas->size);
+}
+
+
+void
draw_point(Canvas *canvas, unsigned x, unsigned y, uint32_t color)
{
if (!(x < canvas->width && y < canvas->height))
@@ -159,7 +173,7 @@ font_cache_generate_box(FontCache *fontcache)
Font *font = get_font_with_charcode(fontcache, 0);
FT_Set_Pixel_Sizes(font->face, 0, fontcache->fontsize);
fprintf(stderr, "fontsize: %i\n", fontcache->fontsize);
- fontcache->box.width = (font->face->bbox.xMax - font->face->bbox.xMin) >> 6;
+ fontcache->box.width = (font->face->size->metrics.max_advance) >> 6;
fontcache->box.height = (font->face->size->metrics.height) >> 6;
fprintf(stderr, "width: %i, height: %i\n", fontcache->box.width, fontcache->box.height);
}
diff --git a/drw.h b/drw.h
index 578fd2a..821e80e 100644
--- a/drw.h
+++ b/drw.h
@@ -11,6 +11,7 @@
/* type definitions */
typedef struct {
uint32_t *data;
+ uint32_t *buffer_data;
unsigned width;
unsigned height;
unsigned size;
@@ -61,6 +62,7 @@ typedef struct {
/* exported functions */
Canvas* create_drw(struct wl_shm *shm, unsigned width, unsigned height);
void free_drw(Canvas *canvas);
+void push_buffer(Canvas *canvas);
void draw_rect(Canvas *canvas, unsigned x, unsigned y, unsigned width, unsigned height, uint32_t color);
void draw_point(Canvas *canvas, unsigned x, unsigned y, uint32_t color);
diff --git a/swt.c b/swt.c
index 860a85e..9c05200 100644
--- a/swt.c
+++ b/swt.c
@@ -288,6 +288,7 @@ draw_frame()
void
commit_surface()
{
+ push_buffer(win.canvas);
wl_surface_attach(win.surface.wl, win.canvas->buffer, 0, 0);
wl_surface_damage_buffer(win.surface.wl, 0, 0, win.width, win.height);
wl_surface_commit(win.surface.wl);