bool surface_owns_data;
cairo_surface_t *surface;
- cairo_t *cairo;
void *data;
uint32_t format; /* currently always DRM_FORMAT_ARGB8888 */
size_t stride;
data_buffer_destroy(struct wlr_buffer *wlr_buffer)
{
struct lab_data_buffer *buffer = data_buffer_from_buffer(wlr_buffer);
- cairo_destroy(buffer->cairo);
/* this also frees buffer->data if surface_owns_data == true */
cairo_surface_destroy(buffer->surface);
if (!buffer->surface_owns_data) {
buffer->stride = cairo_image_surface_get_stride(buffer->surface);
buffer->logical_width = width;
buffer->logical_height = height;
- buffer->cairo = cairo_create(surface);
buffer->surface_owns_data = true;
return buffer;
buffer = buffer_create_cairo(logical.width,
logical.height, scale);
- cairo_t *cairo = buffer->cairo;
+ cairo_t *cairo = cairo_create(buffer->surface);
cairo_scale(cairo, (double)logical.width / width,
(double)logical.height / height);
cairo_set_source_surface(cairo, surface, 0, 0);
/* ensure pixel data is updated */
cairo_surface_flush(buffer->surface);
- /* destroy original surface */
+ /* destroy original cairo surface & context */
cairo_surface_destroy(surface);
+ cairo_destroy(cairo);
}
return buffer;
buffer->stride = stride;
buffer->surface = cairo_image_surface_create_for_data(
pixel_data, CAIRO_FORMAT_ARGB32, width, height, stride);
- buffer->cairo = cairo_create(buffer->surface);
buffer->surface_owns_data = false;
return buffer;
}
return;
}
- cairo_t *cairo = (*buffer)->cairo;
- cairo_surface_t *surf = cairo_get_target(cairo);
+ cairo_surface_t *surf = (*buffer)->surface;
+ cairo_t *cairo = cairo_create(surf);
/*
* Fill with the background color first IF the background color
g_object_unref(layout);
cairo_surface_flush(surf);
+ cairo_destroy(cairo);
}
void
return NULL;
}
- cairo_t *cairo = buffer->cairo;
+ cairo_t *cairo = cairo_create(buffer->surface);
/* Clear background */
cairo_set_operator(cairo, CAIRO_OPERATOR_CLEAR);
set_cairo_color(cairo, self->border_color);
cairo_stroke(cairo);
+ cairo_destroy(cairo);
+
return buffer;
}
*buffer = buffer_create_cairo(size, size, scale);
cairo_surface_t *image = (*buffer)->surface;
- cairo_t *cr = (*buffer)->cairo;
+ cairo_t *cr = cairo_create(image);
rsvg_handle_render_document(svg, cr, &viewport, &err);
if (err) {
goto error;
}
cairo_surface_flush(image);
+ cairo_destroy(cr);
g_object_unref(svg);
return;
error:
wlr_buffer_drop(&(*buffer)->base);
*buffer = NULL;
+ cairo_destroy(cr);
g_object_unref(svg);
}
}
/* Render OSD image */
- cairo_t *cairo = buffer->cairo;
+ cairo_t *cairo = cairo_create(buffer->surface);
render_osd(server, cairo, w, h, show_workspace, workspace_name, views);
+ cairo_destroy(cairo);
struct wlr_scene_buffer *scene_buffer = wlr_scene_buffer_create(
output->osd_tree, &buffer->base);
}
}
-static struct lab_data_buffer *
+struct icon_drawing_context {
+ struct lab_data_buffer *buffer;
+ cairo_t *cairo;
+};
+
+static struct icon_drawing_context
copy_icon_buffer(struct theme *theme, struct lab_data_buffer *icon_buffer)
{
assert(icon_buffer);
int buffer_height = (double)height * scale;
struct lab_data_buffer *buffer = buffer_create_cairo(
buffer_width, buffer_height, 1.0);
- cairo_t *cairo = buffer->cairo;
+ cairo_t *cairo = cairo_create(buffer->surface);
cairo_set_source_surface(cairo, surface,
(buffer_width - icon_width) / 2, (buffer_height - icon_height) / 2);
*/
cairo_scale(cairo, scale, scale);
- return buffer;
+ return (struct icon_drawing_context){
+ .buffer = buffer,
+ .cairo = cairo,
+ };
}
static void
int width = theme->window_button_width;
int height = theme->window_button_height;
- *hover_buffer = copy_icon_buffer(theme, icon_buffer);
- cairo_t *cairo = (*hover_buffer)->cairo;
+ struct icon_drawing_context ctx = copy_icon_buffer(theme, icon_buffer);
+ *hover_buffer = ctx.buffer;
+ cairo_t *cairo = ctx.cairo;
/* Overlay (pre-multiplied alpha) */
float overlay_color[4] = { 0.15f, 0.15f, 0.15f, 0.3f};
cairo_fill(cairo);
cairo_surface_flush(cairo_get_target(cairo));
+ cairo_destroy(cairo);
}
static void
struct lab_data_buffer **rounded_buffer,
struct lab_data_buffer *icon_buffer)
{
- *rounded_buffer = copy_icon_buffer(theme, icon_buffer);
- cairo_t *cairo = (*rounded_buffer)->cairo;
+ struct icon_drawing_context ctx = copy_icon_buffer(theme, icon_buffer);
+ *rounded_buffer = ctx.buffer;
+ cairo_t *cairo = ctx.cairo;
int width = theme->window_button_width;
int height = theme->window_button_height;
};
struct lab_data_buffer *mask_buffer = rounded_rect(&rounded_ctx);
cairo_set_operator(cairo, CAIRO_OPERATOR_DEST_IN);
- cairo_set_source_surface(cairo, cairo_get_target(mask_buffer->cairo),
+ cairo_set_source_surface(cairo, mask_buffer->surface,
(corner == LAB_CORNER_TOP_LEFT) ? -margin_x : 0,
-margin_y);
cairo_paint(cairo);
cairo_surface_flush(cairo_get_target(cairo));
+ cairo_destroy(cairo);
wlr_buffer_drop(&mask_buffer->base);
}
/* TODO: scale */
buffer = buffer_create_cairo(w, h, 1);
- cairo_t *cairo = buffer->cairo;
- cairo_surface_t *surf = cairo_get_target(cairo);
+ cairo_surface_t *surf = buffer->surface;
+ cairo_t *cairo = cairo_create(surf);
/* set transparent background */
cairo_set_operator(cairo, CAIRO_OPERATOR_CLEAR);
out:
cairo_surface_flush(surf);
+ cairo_destroy(cairo);
return buffer;
}
continue;
}
- cairo = buffer->cairo;
+ cairo = cairo_create(buffer->surface);
/* Background */
set_cairo_color(cairo, theme->osd_bg_color);
g_object_unref(layout);
surface = cairo_get_target(cairo);
cairo_surface_flush(surface);
+ cairo_destroy(cairo);
if (!output->workspace_osd) {
output->workspace_osd = wlr_scene_buffer_create(