[gnome-shell] st-theme-node: reuse box-shadow materials between paint states when possible
- From: Lionel Landwerlin <llandwerlin src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-shell] st-theme-node: reuse box-shadow materials between paint states when possible
- Date: Tue, 9 Jul 2013 10:24:15 +0000 (UTC)
commit 9391d9d11bbd3f2f7e7195a3adf3c9413cb38cd3
Author: Lionel Landwerlin <llandwerlin gmail com>
Date: Thu Jul 4 14:26:08 2013 +0100
st-theme-node: reuse box-shadow materials between paint states when possible
src/st/st-theme-node-drawing.c | 29 ++++++++++++++++++++++++++---
src/st/st-theme-node-private.h | 3 +++
src/st/st-theme-node.c | 2 ++
3 files changed, 31 insertions(+), 3 deletions(-)
---
diff --git a/src/st/st-theme-node-drawing.c b/src/st/st-theme-node-drawing.c
index 683e9f0..4388029 100644
--- a/src/st/st-theme-node-drawing.c
+++ b/src/st/st-theme-node-drawing.c
@@ -1478,6 +1478,19 @@ st_theme_node_render_resources (StThemeNodePaintState *state,
else if (node->background_color.alpha > 0 || has_border)
st_theme_node_prerender_shadow (state);
}
+
+ /* If we don't have cached textures yet, check whether we can cache
+ them. */
+ if (!node->cached_textures)
+ {
+ if (state->prerendered_material == COGL_INVALID_HANDLE &&
+ width >= node->box_shadow_min_width &&
+ height >= node->box_shadow_min_height)
+ {
+ st_theme_node_paint_state_copy (&node->cached_state, state);
+ node->cached_textures = TRUE;
+ }
+ }
}
static void
@@ -2371,12 +2384,22 @@ st_theme_node_paint (StThemeNode *node,
return;
if (st_theme_node_needs_new_box_shadow_for_size (state, node, width, height))
- st_theme_node_render_resources (state, node, width, height);
+ {
+ /* If we had the ability to cache textures on the node, then we
+ can just copy them over to the paint state and avoid all
+ rendering. We end up sharing textures a cross different
+ widgets. */
+ if (node->rendered_once && node->cached_textures &&
+ width >= node->box_shadow_min_width && height >= node->box_shadow_min_height)
+ st_theme_node_paint_state_copy (state, &node->cached_state);
+ else
+ st_theme_node_render_resources (state, node, width, height);
+
+ node->rendered_once = TRUE;
+ }
else
st_theme_node_update_resources (state, node, width, height);
- node->rendered_once = TRUE;
-
/* Rough notes about the relationship of borders and backgrounds in CSS3;
* see http://www.w3.org/TR/css3-background/ for more accurate details.
*
diff --git a/src/st/st-theme-node-private.h b/src/st/st-theme-node-private.h
index 9d6cf94..aba58a3 100644
--- a/src/st/st-theme-node-private.h
+++ b/src/st/st-theme-node-private.h
@@ -100,6 +100,7 @@ struct _StThemeNode {
guint text_shadow_computed : 1;
guint link_type : 2;
guint rendered_once : 1;
+ guint cached_textures : 1;
int box_shadow_min_width;
int box_shadow_min_height;
@@ -109,6 +110,8 @@ struct _StThemeNode {
CoglHandle background_texture;
CoglHandle background_material;
CoglHandle background_shadow_material;
+
+ StThemeNodePaintState cached_state;
};
struct _StThemeNodeClass {
diff --git a/src/st/st-theme-node.c b/src/st/st-theme-node.c
index 5250e8a..9bfa39f 100644
--- a/src/st/st-theme-node.c
+++ b/src/st/st-theme-node.c
@@ -101,6 +101,8 @@ st_theme_node_dispose (GObject *gobject)
g_signal_handlers_disconnect_by_func (node->theme,
on_custom_stylesheets_changed, node);
+ st_theme_node_paint_state_free (&node->cached_state);
+
g_clear_object (&node->theme);
G_OBJECT_CLASS (st_theme_node_parent_class)->dispose (gobject);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]