aboutsummaryrefslogtreecommitdiff
path: root/drw.c
diff options
context:
space:
mode:
Diffstat (limited to 'drw.c')
-rw-r--r--drw.c97
1 files changed, 72 insertions, 25 deletions
diff --git a/drw.c b/drw.c
index 3e8fed5..6683cdb 100644
--- a/drw.c
+++ b/drw.c
@@ -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);