forked from AuroraMiddleware/gtk
broadway: Cache color translated textures
These happen a lot due to the recolored symbolics
This commit is contained in:
parent
9e5a22bbe5
commit
0d4a26f148
@ -198,10 +198,81 @@ glyph_info_equal (const PangoGlyphInfo *a,
|
|||||||
a->attr.is_cluster_start == b->attr.is_cluster_start;
|
a->attr.is_cluster_start == b->attr.is_cluster_start;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static guint
|
||||||
|
hash_matrix (const graphene_matrix_t *matrix)
|
||||||
|
{
|
||||||
|
float m[16];
|
||||||
|
guint h = 0;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
graphene_matrix_to_float (matrix, m);
|
||||||
|
for (i = 0; i < 16; i++)
|
||||||
|
h ^= (guint) m[i];
|
||||||
|
|
||||||
|
return h;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
matrix_equal (const graphene_matrix_t *a,
|
||||||
|
const graphene_matrix_t *b)
|
||||||
|
{
|
||||||
|
float ma[16];
|
||||||
|
float mb[16];
|
||||||
|
int i;
|
||||||
|
|
||||||
|
graphene_matrix_to_float (a, ma);
|
||||||
|
graphene_matrix_to_float (b, mb);
|
||||||
|
for (i = 0; i < 16; i++)
|
||||||
|
{
|
||||||
|
if (ma[i] != mb[i])
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static guint
|
||||||
|
hash_vec4 (const graphene_vec4_t *vec4)
|
||||||
|
{
|
||||||
|
float v[4];
|
||||||
|
guint h = 0;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
graphene_vec4_to_float (vec4, v);
|
||||||
|
for (i = 0; i < 4; i++)
|
||||||
|
h ^= (guint) v[i];
|
||||||
|
|
||||||
|
return h;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
vec4_equal (const graphene_vec4_t *a,
|
||||||
|
const graphene_vec4_t *b)
|
||||||
|
{
|
||||||
|
float va[4];
|
||||||
|
float vb[4];
|
||||||
|
int i;
|
||||||
|
|
||||||
|
graphene_vec4_to_float (a, va);
|
||||||
|
graphene_vec4_to_float (b, vb);
|
||||||
|
for (i = 0; i < 4; i++)
|
||||||
|
{
|
||||||
|
if (va[i] != vb[i])
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
static guint
|
static guint
|
||||||
node_cache_hash (GskRenderNode *node)
|
node_cache_hash (GskRenderNode *node)
|
||||||
{
|
{
|
||||||
if (gsk_render_node_get_node_type (node) == GSK_TEXT_NODE &&
|
GskRenderNodeType type;
|
||||||
|
guint h;
|
||||||
|
|
||||||
|
type = gsk_render_node_get_node_type (node);
|
||||||
|
h = type << 28;
|
||||||
|
if (type == GSK_TEXT_NODE &&
|
||||||
float_is_int32 (gsk_text_node_get_x (node)) &&
|
float_is_int32 (gsk_text_node_get_x (node)) &&
|
||||||
float_is_int32 (gsk_text_node_get_y (node)))
|
float_is_int32 (gsk_text_node_get_y (node)))
|
||||||
{
|
{
|
||||||
@ -210,15 +281,27 @@ node_cache_hash (GskRenderNode *node)
|
|||||||
guint n_glyphs = gsk_text_node_get_num_glyphs (node);
|
guint n_glyphs = gsk_text_node_get_num_glyphs (node);
|
||||||
const PangoGlyphInfo *infos = gsk_text_node_peek_glyphs (node);
|
const PangoGlyphInfo *infos = gsk_text_node_peek_glyphs (node);
|
||||||
const GdkRGBA *color = gsk_text_node_peek_color (node);
|
const GdkRGBA *color = gsk_text_node_peek_color (node);
|
||||||
guint h;
|
|
||||||
|
|
||||||
h = g_direct_hash (font) ^ n_glyphs << 16 ^ gdk_rgba_hash (color);
|
h ^= g_direct_hash (font) ^ n_glyphs << 16 ^ gdk_rgba_hash (color);
|
||||||
for (i = 0; i < n_glyphs; i++)
|
for (i = 0; i < n_glyphs; i++)
|
||||||
h ^= glyph_info_hash (&infos[i]);
|
h ^= glyph_info_hash (&infos[i]);
|
||||||
|
|
||||||
return h;
|
return h;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (type == GSK_COLOR_MATRIX_NODE &&
|
||||||
|
gsk_render_node_get_node_type (gsk_color_matrix_node_get_child (node)) == GSK_TEXTURE_NODE)
|
||||||
|
{
|
||||||
|
const graphene_matrix_t *matrix = gsk_color_matrix_node_peek_color_matrix (node);
|
||||||
|
const graphene_vec4_t *offset = gsk_color_matrix_node_peek_color_offset (node);
|
||||||
|
GskRenderNode *child = gsk_color_matrix_node_get_child (node);
|
||||||
|
GdkTexture *texture = gsk_texture_node_get_texture (child);
|
||||||
|
|
||||||
|
h ^= g_direct_hash (texture) ^ hash_matrix (matrix) ^ hash_vec4 (offset);
|
||||||
|
|
||||||
|
return h;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -226,10 +309,13 @@ static gboolean
|
|||||||
node_cache_equal (GskRenderNode *a,
|
node_cache_equal (GskRenderNode *a,
|
||||||
GskRenderNode *b)
|
GskRenderNode *b)
|
||||||
{
|
{
|
||||||
if (gsk_render_node_get_node_type (a) != gsk_render_node_get_node_type (b))
|
GskRenderNodeType type;
|
||||||
|
|
||||||
|
type = gsk_render_node_get_node_type (a);
|
||||||
|
if (type != gsk_render_node_get_node_type (b))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
if (gsk_render_node_get_node_type (a) == GSK_TEXT_NODE &&
|
if (type == GSK_TEXT_NODE &&
|
||||||
float_is_int32 (gsk_text_node_get_x (a)) &&
|
float_is_int32 (gsk_text_node_get_x (a)) &&
|
||||||
float_is_int32 (gsk_text_node_get_y (a)) &&
|
float_is_int32 (gsk_text_node_get_y (a)) &&
|
||||||
float_is_int32 (gsk_text_node_get_x (b)) &&
|
float_is_int32 (gsk_text_node_get_x (b)) &&
|
||||||
@ -263,6 +349,31 @@ node_cache_equal (GskRenderNode *a,
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (type == GSK_COLOR_MATRIX_NODE &&
|
||||||
|
gsk_render_node_get_node_type (gsk_color_matrix_node_get_child (a)) == GSK_TEXTURE_NODE &&
|
||||||
|
gsk_render_node_get_node_type (gsk_color_matrix_node_get_child (b)) == GSK_TEXTURE_NODE)
|
||||||
|
{
|
||||||
|
const graphene_matrix_t *a_matrix = gsk_color_matrix_node_peek_color_matrix (a);
|
||||||
|
const graphene_vec4_t *a_offset = gsk_color_matrix_node_peek_color_offset (a);
|
||||||
|
GskRenderNode *a_child = gsk_color_matrix_node_get_child (a);
|
||||||
|
GdkTexture *a_texture = gsk_texture_node_get_texture (a_child);
|
||||||
|
const graphene_matrix_t *b_matrix = gsk_color_matrix_node_peek_color_matrix (b);
|
||||||
|
const graphene_vec4_t *b_offset = gsk_color_matrix_node_peek_color_offset (b);
|
||||||
|
GskRenderNode *b_child = gsk_color_matrix_node_get_child (b);
|
||||||
|
GdkTexture *b_texture = gsk_texture_node_get_texture (b_child);
|
||||||
|
|
||||||
|
if (a_texture != b_texture)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if (!matrix_equal (a_matrix, b_matrix))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if (!vec4_equal (a_offset, b_offset))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -303,9 +414,14 @@ node_cache_store (GskRenderNode *node,
|
|||||||
float off_x,
|
float off_x,
|
||||||
float off_y)
|
float off_y)
|
||||||
{
|
{
|
||||||
if (gsk_render_node_get_node_type (node) == GSK_TEXT_NODE &&
|
GskRenderNodeType type;
|
||||||
float_is_int32 (gsk_text_node_get_x (node)) &&
|
|
||||||
float_is_int32 (gsk_text_node_get_y (node)))
|
type = gsk_render_node_get_node_type (node);
|
||||||
|
if ((type == GSK_TEXT_NODE &&
|
||||||
|
float_is_int32 (gsk_text_node_get_x (node)) &&
|
||||||
|
float_is_int32 (gsk_text_node_get_y (node))) ||
|
||||||
|
(type == GSK_COLOR_MATRIX_NODE &&
|
||||||
|
gsk_render_node_get_node_type (gsk_color_matrix_node_get_child (node)) == GSK_TEXTURE_NODE))
|
||||||
{
|
{
|
||||||
NodeCacheElement *element = g_new0 (NodeCacheElement, 1);
|
NodeCacheElement *element = g_new0 (NodeCacheElement, 1);
|
||||||
element->texture = texture;
|
element->texture = texture;
|
||||||
@ -314,6 +430,8 @@ node_cache_store (GskRenderNode *node,
|
|||||||
element->off_y = off_y;
|
element->off_y = off_y;
|
||||||
g_object_weak_ref (G_OBJECT (texture), cached_texture_gone, element);
|
g_object_weak_ref (G_OBJECT (texture), cached_texture_gone, element);
|
||||||
g_hash_table_insert (gsk_broadway_node_cache, element->node, element);
|
g_hash_table_insert (gsk_broadway_node_cache, element->node, element);
|
||||||
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user