mirror of
https://github.com/labwc/labwc.git
synced 2026-04-02 07:15:43 -04:00
src/buffer: Automatically adapt to scale attribute
Based on discussion in PR #389
This commit is contained in:
parent
5626c20c44
commit
505f92e733
3 changed files with 17 additions and 4 deletions
|
|
@ -37,6 +37,8 @@ struct lab_data_buffer {
|
||||||
uint32_t format;
|
uint32_t format;
|
||||||
size_t stride;
|
size_t stride;
|
||||||
bool free_on_destroy;
|
bool free_on_destroy;
|
||||||
|
uint32_t unscaled_width;
|
||||||
|
uint32_t unscaled_height;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Create a buffer which creates a new cairo CAIRO_FORMAT_ARGB32 surface */
|
/* Create a buffer which creates a new cairo CAIRO_FORMAT_ARGB32 surface */
|
||||||
|
|
|
||||||
15
src/buffer.c
15
src/buffer.c
|
|
@ -92,10 +92,23 @@ buffer_create_cairo(uint32_t width, uint32_t height, float scale,
|
||||||
if (!buffer) {
|
if (!buffer) {
|
||||||
return NULL;
|
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_surface_t *surf =
|
||||||
cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height);
|
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);
|
cairo_surface_set_device_scale(surf, scale, scale);
|
||||||
|
|
||||||
buffer->cairo = cairo_create(surf);
|
buffer->cairo = cairo_create(surf);
|
||||||
|
|
|
||||||
|
|
@ -129,13 +129,11 @@ osd_update(struct server *server)
|
||||||
float scale = output->wlr_output->scale;
|
float scale = output->wlr_output->scale;
|
||||||
int w = (OSD_ITEM_WIDTH + (2 * OSD_BORDER_WIDTH));
|
int w = (OSD_ITEM_WIDTH + (2 * OSD_BORDER_WIDTH));
|
||||||
int h = get_osd_height(&server->views);
|
int h = get_osd_height(&server->views);
|
||||||
int scaled_w = w * scale;
|
|
||||||
int scaled_h = h * scale;
|
|
||||||
|
|
||||||
if (output->osd_buffer) {
|
if (output->osd_buffer) {
|
||||||
wlr_buffer_drop(&output->osd_buffer->base);
|
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_t *cairo = output->osd_buffer->cairo;
|
||||||
cairo_surface_t *surf = cairo_get_target(cairo);
|
cairo_surface_t *surf = cairo_get_target(cairo);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue