From 3026218eaa0d3be59a898939da5126ca03bc5969 Mon Sep 17 00:00:00 2001 From: Nathan Reiner Date: Mon, 10 Apr 2023 21:54:37 +0200 Subject: add double buffering --- config.h | 2 +- drw.c | 26 ++++++++++++++++++++------ drw.h | 2 ++ swt.c | 1 + 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,10 +99,18 @@ 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) { @@ -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); -- cgit v1.2.3-70-g09d2