From f22bfc96b29295115675fed273fe3ffdb8af174d Mon Sep 17 00:00:00 2001 From: Johan Malm Date: Sun, 13 Feb 2022 13:00:26 +0000 Subject: [PATCH] buffer: create cairo_t inside buffer_create() --- include/buffer.h | 4 ++-- src/buffer.c | 30 +++++++++++++----------------- src/osd.c | 14 +++++++------- 3 files changed, 22 insertions(+), 26 deletions(-) diff --git a/include/buffer.h b/include/buffer.h index dd841803..63f92f87 100644 --- a/include/buffer.h +++ b/include/buffer.h @@ -38,7 +38,7 @@ struct lab_data_buffer { size_t stride; }; -struct lab_data_buffer *buffer_create(cairo_t *cairo); -void buffer_destroy(struct lab_data_buffer *buffer); +struct lab_data_buffer *buffer_create(uint32_t width, uint32_t height, + float scale); #endif /* __LABWC_BUFFER_H */ diff --git a/src/buffer.c b/src/buffer.c index 640a2189..69f55251 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -42,7 +42,12 @@ static void data_buffer_destroy(struct wlr_buffer *wlr_buffer) { struct lab_data_buffer *buffer = data_buffer_from_buffer(wlr_buffer); - free(buffer->data); + if (buffer->cairo) { + cairo_destroy(buffer->cairo); + } + if (buffer->data) { + free(buffer->data); + } free(buffer); } @@ -72,35 +77,26 @@ static const struct wlr_buffer_impl data_buffer_impl = { }; struct lab_data_buffer * -buffer_create(cairo_t *cairo) +buffer_create(uint32_t width, uint32_t height, float scale) { struct lab_data_buffer *buffer = calloc(1, sizeof(*buffer)); if (!buffer) { return NULL; } - cairo_surface_t *surf = cairo_get_target(cairo); - int width = cairo_image_surface_get_width(surf); - int height = cairo_image_surface_get_height(surf); wlr_buffer_init(&buffer->base, &data_buffer_impl, width, height); - buffer->cairo = cairo; + cairo_surface_t *surf = + cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height); + cairo_surface_set_device_scale(surf, scale, scale); + + buffer->cairo = cairo_create(surf); buffer->data = cairo_image_surface_get_data(surf); buffer->format = DRM_FORMAT_ARGB8888; buffer->stride = cairo_image_surface_get_stride(surf); if (!buffer->data) { - cairo_destroy(cairo); + cairo_destroy(buffer->cairo); free(buffer); } return buffer; } - -void -buffer_destroy(struct lab_data_buffer *buffer) -{ - if (!buffer) { - return; - } - cairo_destroy(buffer->cairo); - wlr_buffer_drop(&buffer->base); -} diff --git a/src/osd.c b/src/osd.c index 9f7beea1..85b5e4fe 100644 --- a/src/osd.c +++ b/src/osd.c @@ -103,10 +103,13 @@ osd_update(struct server *server) int w = (OSD_ITEM_WIDTH + (2 * OSD_BORDER_WIDTH)) * scale; int h = get_osd_height(&server->views) * scale; - cairo_surface_t *surf = - cairo_image_surface_create(CAIRO_FORMAT_ARGB32, w, h); - cairo_surface_set_device_scale(surf, scale, scale); - cairo_t *cairo = cairo_create(surf); + if (output->osd_buffer) { + wlr_buffer_drop(&output->osd_buffer->base); + } + output->osd_buffer = buffer_create(w, h, scale); + + cairo_t *cairo = output->osd_buffer->cairo; + cairo_surface_t *surf = cairo_get_target(cairo); /* background */ set_source(cairo, theme->osd_bg_color); @@ -195,10 +198,7 @@ osd_update(struct server *server) y += OSD_ITEM_HEIGHT; } g_object_unref(layout); - cairo_surface_flush(surf); - buffer_destroy(output->osd_buffer); - output->osd_buffer = buffer_create(cairo); struct wlr_scene_buffer *scene_buffer = wlr_scene_buffer_create( &server->osd_tree->node, &output->osd_buffer->base);