diff options
| author | Nathan Reiner <nathan@nathanreiner.xyz> | 2023-04-10 21:54:37 +0200 |
|---|---|---|
| committer | Nathan Reiner <nathan@nathanreiner.xyz> | 2023-04-10 21:54:37 +0200 |
| commit | 3026218eaa0d3be59a898939da5126ca03bc5969 (patch) | |
| tree | 6d9dfe729c2bca4a59e158fe44e8c3f7f1b4a476 /drw.c | |
| parent | 2c2e0188f7dc29946483b83d088e4f35c3a9069c (diff) | |
add double buffering
Diffstat (limited to 'drw.c')
| -rw-r--r-- | drw.c | 26 |
1 files changed, 20 insertions, 6 deletions
@@ -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); } |