diff options
Diffstat (limited to 'drw.c')
| -rw-r--r-- | drw.c | 97 |
1 files changed, 72 insertions, 25 deletions
@@ -1,3 +1,5 @@ +#include <wayland-client-protocol.h> +#define _GNU_SOURCE #include <stdint.h> #include <sys/mman.h> #include <unistd.h> @@ -38,20 +40,18 @@ to_uint32_t(Color color) Canvas* create_drw(struct wl_shm *shm, unsigned width, unsigned height) { - struct wl_shm_pool *pool; Canvas *canvas; - int stride; - int fd; canvas = malloc(sizeof(Canvas)); canvas->width = width; canvas->height = height; + canvas->shm = shm; - stride = width * sizeof(uint32_t); - canvas->size = stride * height; + canvas->stride = width * sizeof(uint32_t); + canvas->size = canvas->stride * height; - fd = allocate_shm_file(canvas->size); - if (fd == -1) { + canvas->buffer_data_fd = allocate_shm_file(canvas->size); + if (canvas->buffer_data_fd == -1) { return NULL; } @@ -60,44 +60,93 @@ create_drw(struct wl_shm *shm, unsigned width, unsigned height) canvas->size, PROT_READ | PROT_WRITE, MAP_SHARED, - fd, + canvas->buffer_data_fd, 0 ); if (canvas->buffer_data == MAP_FAILED) die("mmap failed: "); - pool = wl_shm_create_pool( + canvas->pool = wl_shm_create_pool( shm, - fd, + canvas->buffer_data_fd, canvas->size ); - canvas->buffer = wl_shm_pool_create_buffer( - pool, - 0, - width, - height, - stride, - WL_SHM_FORMAT_XRGB8888 - ); + canvas->buffer = wl_shm_pool_create_buffer(canvas->pool, 0, canvas->width, canvas->height, canvas->size / canvas->height, WL_SHM_FORMAT_XRGB8888); - wl_shm_pool_destroy(pool); - close(fd); + wl_shm_pool_destroy(canvas->pool); - fd = allocate_shm_file(canvas->size); - canvas->data = mmap(NULL, canvas->size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0); + canvas->data_fd = allocate_shm_file(canvas->size); + if (canvas->data_fd == -1) { + return NULL; + } + canvas->data = mmap(NULL, canvas->size, PROT_READ | PROT_WRITE, MAP_PRIVATE, canvas->data_fd, 0); if (canvas->data == MAP_FAILED) die("mmap failed: "); - close(fd); + close(canvas->buffer_data_fd); + close(canvas->data_fd); return canvas; } void +resize_drw(Canvas *canvas, unsigned width, unsigned height) +{ + munmap(canvas->data, canvas->size); + munmap(canvas->buffer_data, canvas->size); + + canvas->width = width; + canvas->height = height; + + canvas->stride = width * sizeof(uint32_t); + canvas->size = canvas->stride * height; + + canvas->buffer_data_fd = allocate_shm_file(canvas->size); + if (canvas->buffer_data_fd == -1) { + return; + } + + canvas->buffer_data = mmap( + NULL, + canvas->size, + PROT_READ | PROT_WRITE, + MAP_SHARED, + canvas->buffer_data_fd, + 0 + ); + + if (canvas->buffer_data == MAP_FAILED) + die("mmap failed: "); + + canvas->pool = wl_shm_create_pool( + canvas->shm, + canvas->buffer_data_fd, + canvas->size + ); + + canvas->buffer = wl_shm_pool_create_buffer(canvas->pool, 0, canvas->width, canvas->height, canvas->size / canvas->height, WL_SHM_FORMAT_XRGB8888); + + wl_shm_pool_destroy(canvas->pool); + + canvas->data_fd = allocate_shm_file(canvas->size); + if (canvas->data_fd == -1) { + return; + } + canvas->data = mmap(NULL, canvas->size, PROT_READ | PROT_WRITE, MAP_PRIVATE, canvas->data_fd, 0); + + if (canvas->data == MAP_FAILED) + die("mmap failed: "); + + close(canvas->buffer_data_fd); + close(canvas->data_fd); +} + + +void free_drw(Canvas *canvas) { munmap(canvas->data, canvas->size); @@ -343,11 +392,9 @@ draw_char(Canvas *canvas, FontCache *fontcache, uint_least32_t charcode, unsigne FT_BitmapGlyph bg; FT_Glyph glyph; - font = get_font_with_charcode(fontcache, charcode); FT_Set_Pixel_Sizes(font->face, 0, fontcache->fontsize); - if (boldstokemode && fontcache->fonttype == FONT_BOLD) { FT_Stroker_Set(font->stroke, fontcache->fontsize * 2, FT_STROKER_LINECAP_ROUND, FT_STROKER_LINEJOIN_ROUND, fontcache->fontsize * 2); |