#include <wlr/util/log.h>
#include "buffer.h"
#include "common/font.h"
+#include "common/list.h"
#include "common/mem.h"
#include "common/scaled-scene-buffer.h"
#include "common/scaled-font-buffer.h"
+/* This holds all the scaled-font-buffers and used for sharing backing buffers */
+static struct wl_list cached_buffers = WL_LIST_INIT(&cached_buffers);
+
static struct lab_data_buffer *
_create_buffer(struct scaled_scene_buffer *scaled_buffer, double scale)
{
wlr_log(WLR_ERROR, "font_buffer_create() failed");
}
- self->width = buffer ? buffer->logical_width : 0;
- self->height = buffer ? buffer->logical_height : 0;
return buffer;
}
free(self);
}
+static bool str_equal(const char *a, const char *b)
+{
+ return a == b || (a && b && !strcmp(a, b));
+}
+
+static bool
+_equal(struct scaled_scene_buffer *scaled_buffer_a,
+ struct scaled_scene_buffer *scaled_buffer_b)
+{
+ struct scaled_font_buffer *a = scaled_buffer_a->data;
+ struct scaled_font_buffer *b = scaled_buffer_b->data;
+
+ return str_equal(a->text, b->text)
+ && a->max_width == b->max_width
+ && str_equal(a->font.name, b->font.name)
+ && a->font.size == b->font.size
+ && a->font.slant == b->font.slant
+ && a->font.weight == b->font.weight
+ && !memcmp(a->color, b->color, sizeof(a->color))
+ && !memcmp(a->bg_color, b->bg_color, sizeof(a->bg_color))
+ && str_equal(a->arrow, b->arrow);
+}
+
static const struct scaled_scene_buffer_impl impl = {
.create_buffer = _create_buffer,
- .destroy = _destroy
+ .destroy = _destroy,
+ .equal = _equal,
};
/* Public API */
assert(parent);
struct scaled_font_buffer *self = znew(*self);
struct scaled_scene_buffer *scaled_buffer = scaled_scene_buffer_create(
- parent, &impl, NULL, /* drop_buffer */ true);
+ parent, &impl, &cached_buffers, /* drop_buffer */ true);
if (!scaled_buffer) {
free(self);
return NULL;
/* Invalidate cache and force a new render */
scaled_scene_buffer_invalidate_cache(self->scaled_buffer);
+
+ /* Ensure the height / width is up-to-date */
+ self->width = self->scaled_buffer->width;
+ self->height = self->scaled_buffer->height;
}
void
{
self->max_width = max_width;
scaled_scene_buffer_invalidate_cache(self->scaled_buffer);
+
+ /* Ensure the height / width is up-to-date */
+ self->width = self->scaled_buffer->width;
+ self->height = self->scaled_buffer->height;
}