* display. It gets destroyed automatically when the backing scaled_scene_buffer
* is being destroyed which in turn happens automatically when the backing
* wlr_scene_buffer (or one of its parents) is being destroyed.
+ *
+ * This function clones the lab_img passed as the image source, so callers are
+ * free to destroy it.
*/
struct scaled_img_buffer *scaled_img_buffer_create(struct wlr_scene_tree *parent,
struct lab_img *img, int width, int height, int padding);
#define LABWC_IMG_H
#include <cairo.h>
+#include <stdbool.h>
#include <stdint.h>
#include <wayland-util.h>
*/
void lab_img_destroy(struct lab_img *img);
+/**
+ * lab_img_equal() - Returns true if two images draw the same content
+ */
+bool lab_img_equal(struct lab_img *img_a, struct lab_img *img_b);
+
#endif /* LABWC_IMG_H */
} title;
char *app_id;
- struct lab_img *icon_img;
} state;
/* An invisible area around the view which allows resizing */
_destroy(struct scaled_scene_buffer *scaled_buffer)
{
struct scaled_img_buffer *self = scaled_buffer->data;
+ lab_img_destroy(self->img);
free(self);
}
struct scaled_img_buffer *a = scaled_buffer_a->data;
struct scaled_img_buffer *b = scaled_buffer_b->data;
- return a->img == b->img
+ return lab_img_equal(a->img, b->img)
&& a->width == b->width
&& a->height == b->height
&& a->padding == b->padding;
scaled_img_buffer_create(struct wlr_scene_tree *parent, struct lab_img *img,
int width, int height, int padding)
{
+ assert(img);
struct scaled_scene_buffer *scaled_buffer = scaled_scene_buffer_create(
parent, &impl, &cached_buffers, /* drop_buffer */ true);
struct scaled_img_buffer *self = znew(*self);
self->scaled_buffer = scaled_buffer;
self->scene_buffer = scaled_buffer->scene_buffer;
- self->img = img;
+ self->img = lab_img_copy(img);
self->width = width;
self->height = height;
self->padding = padding;
scaled_img_buffer_update(struct scaled_img_buffer *self, struct lab_img *img,
int width, int height, int padding)
{
- self->img = img;
+ assert(img);
+ lab_img_destroy(self->img);
+ self->img = lab_img_copy(img);
self->width = width;
self->height = height;
self->padding = padding;
wl_array_release(&img->modifiers);
free(img);
}
+
+bool
+lab_img_equal(struct lab_img *img_a, struct lab_img *img_b)
+{
+ if (img_a == img_b) {
+ return true;
+ }
+ if (!img_a || !img_b || img_a->cache != img_b->cache
+ || img_a->modifiers.size != img_b->modifiers.size) {
+ return false;
+ }
+ return img_a->modifiers.size == 0
+ || !memcmp(img_a->modifiers.data, img_b->modifiers.data,
+ img_a->modifiers.size);
+}
if (ssd->state.app_id) {
zfree(ssd->state.app_id);
}
- if (ssd->state.icon_img) {
- lab_img_destroy(ssd->state.icon_img);
- }
wlr_scene_node_destroy(&ssd->titlebar.tree->node);
ssd->titlebar.tree = NULL;
}
} FOR_EACH_END
- if (ssd->state.icon_img) {
- lab_img_destroy(ssd->state.icon_img);
- }
- ssd->state.icon_img = icon_img;
+ lab_img_destroy(icon_img);
#endif
}