aboutsummaryrefslogtreecommitdiff
path: root/drw.c
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 /drw.c
parent2c2e0188f7dc29946483b83d088e4f35c3a9069c (diff)
add double buffering
Diffstat (limited to 'drw.c')
-rw-r--r--drw.c26
1 files changed, 20 insertions, 6 deletions
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);
}