typedef struct {
int timestamp;
+ int stored;
GskGLCachedGlyph *glyphs[];
} TextRenderData;
static inline TextRenderData *
-ensure_render_data (GskRenderNode *node,
- GskGLGlyphCache *cache)
+get_render_data (GskRenderNode *node,
+ GskGLGlyphCache *cache)
{
TextRenderData *data;
int num_glyphs;
num_glyphs = gsk_text_node_get_num_glyphs (node);
- data = gsk_text_node_get_render_data (node);
+ data = gsk_text_node_get_render_data (node, cache);
if (data)
{
if (data->timestamp < cache->atlas_timestamp)
{
data = g_new0 (TextRenderData, sizeof (TextRenderData) + sizeof (gpointer) * num_glyphs);
data->timestamp = cache->atlas_timestamp;
-
- gsk_text_node_set_render_data (node, data);
}
return data;
}
+static inline void
+set_render_data (GskRenderNode *node,
+ GskGLGlyphCache *cache,
+ TextRenderData *data)
+{
+ if (!data->stored)
+ {
+ data->stored = 1;
+ if (!gsk_text_node_set_render_data (node, cache, data))
+ g_free (data);
+ }
+}
+
static inline void
render_text_node (GskGLRenderer *self,
GskRenderNode *node,
ops_set_color (builder, color);
}
- render_data = ensure_render_data (node, self->glyph_cache);
+ render_data = get_render_data (node, self->glyph_cache);
memset (&lookup, 0, sizeof (CacheKeyData));
lookup.data.font = (PangoFont *)font;
next:
x_position += gi->geometry.width;
}
+
+ set_render_data (node, self->glyph_cache, render_data);
}
static inline void
GdkRGBA color;
graphene_point_t offset;
+ gpointer render_key;
gpointer render_data;
+
guint num_glyphs;
PangoGlyphInfo glyphs[];
};
self->has_color_glyphs = font_has_color_glyphs (font);
self->color = *color;
self->offset = *offset;
+ self->render_key = NULL;
self->render_data = NULL;
self->num_glyphs = glyphs->num_glyphs;
memcpy (self->glyphs, glyphs->glyphs, sizeof (PangoGlyphInfo) * glyphs->num_glyphs);
return &self->offset;
}
-void
+gboolean
gsk_text_node_set_render_data (GskRenderNode *node,
+ gpointer key,
gpointer data)
{
GskTextNode *self = (GskTextNode *) node;
+ if (self->render_key != NULL)
+ return FALSE;
+
+ self->render_key = key;
self->render_data = data;
+
+ return TRUE;
}
gpointer
-gsk_text_node_get_render_data (GskRenderNode *node)
+gsk_text_node_get_render_data (GskRenderNode *node,
+ gpointer key)
{
GskTextNode *self = (GskTextNode *) node;
+ if (self->render_key != key)
+ return NULL;
+
return self->render_data;
}
void gsk_render_node_diff_impossible (GskRenderNode *node1,
GskRenderNode *node2,
cairo_region_t *region);
-void gsk_text_node_set_render_data (GskRenderNode *node,
+gboolean gsk_text_node_set_render_data (GskRenderNode *node,
+ gpointer key,
gpointer data);
-gpointer gsk_text_node_get_render_data (GskRenderNode *node);
+gpointer gsk_text_node_get_render_data (GskRenderNode *node,
+ gpointer key);