From 505f92e73339f57b775a1afacadf261c9caf134c Mon Sep 17 00:00:00 2001 From: Consolatis <35009135+Consolatis@users.noreply.github.com> Date: Sun, 12 Jun 2022 21:11:25 +0200 Subject: [PATCH] src/buffer: Automatically adapt to scale attribute Based on discussion in PR #389 --- include/buffer.h | 2 ++ src/buffer.c | 15 ++++++++++++++- src/osd.c | 4 +--- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/include/buffer.h b/include/buffer.h index af833f00..59ec3f12 100644 --- a/include/buffer.h +++ b/include/buffer.h @@ -37,6 +37,8 @@ struct lab_data_buffer { uint32_t format; size_t stride; bool free_on_destroy; + uint32_t unscaled_width; + uint32_t unscaled_height; }; /* Create a buffer which creates a new cairo CAIRO_FORMAT_ARGB32 surface */ diff --git a/src/buffer.c b/src/buffer.c index 44891005..1c64276a 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -92,10 +92,23 @@ buffer_create_cairo(uint32_t width, uint32_t height, float scale, if (!buffer) { return NULL; } - wlr_buffer_init(&buffer->base, &data_buffer_impl, width, height); + buffer->unscaled_width = width; + buffer->unscaled_height = height; + width *= scale; + height *= scale; + /* Allocate the buffer with the scaled size */ + wlr_buffer_init(&buffer->base, &data_buffer_impl, width, height); cairo_surface_t *surf = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height); + + /** + * Tell cairo about the device scale so we can keep drawing in unscaled + * coordinate space. Pango will automatically use the cairo scale attribute + * as well when creating text on this surface. + * + * For a more complete explanation see PR #389 + */ cairo_surface_set_device_scale(surf, scale, scale); buffer->cairo = cairo_create(surf); diff --git a/src/osd.c b/src/osd.c index b057d01f..153f5379 100644 --- a/src/osd.c +++ b/src/osd.c @@ -129,13 +129,11 @@ osd_update(struct server *server) float scale = output->wlr_output->scale; int w = (OSD_ITEM_WIDTH + (2 * OSD_BORDER_WIDTH)); int h = get_osd_height(&server->views); - int scaled_w = w * scale; - int scaled_h = h * scale; if (output->osd_buffer) { wlr_buffer_drop(&output->osd_buffer->base); } - output->osd_buffer = buffer_create_cairo(scaled_w, scaled_h, scale, true); + output->osd_buffer = buffer_create_cairo(w, h, scale, true); cairo_t *cairo = output->osd_buffer->cairo; cairo_surface_t *surf = cairo_get_target(cairo);