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 */
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);
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);