[gnome-shell] Support -st-shadow for all background properties
- From: Florian Müllner <fmuellner src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-shell] Support -st-shadow for all background properties
- Date: Mon, 10 May 2010 18:12:53 +0000 (UTC)
commit 014ac2d388e91b3a7229417db7a694f844cb7b8d
Author: Florian Müllner <fmuellner src gnome org>
Date: Fri Mar 12 00:14:12 2010 +0100
Support -st-shadow for all background properties
Extend the existing support for -st-shadow to apply to the background,
background-gradient and border properties in addition to background-image.
https://bugzilla.gnome.org/show_bug.cgi?id=613832
src/st/st-theme-node-drawing.c | 85 +++++++++++++++++++++++++++++++++++----
src/st/st-theme-node-private.h | 3 +-
2 files changed, 78 insertions(+), 10 deletions(-)
---
diff --git a/src/st/st-theme-node-drawing.c b/src/st/st-theme-node-drawing.c
index d202a83..ec226de 100644
--- a/src/st/st-theme-node-drawing.c
+++ b/src/st/st-theme-node-drawing.c
@@ -681,10 +681,12 @@ _st_theme_node_free_drawing_state (StThemeNode *node)
{
if (node->background_texture != COGL_INVALID_HANDLE)
cogl_handle_unref (node->background_texture);
- if (node->shadow_material != COGL_INVALID_HANDLE)
- cogl_handle_unref (node->shadow_material);
+ if (node->background_shadow_material != COGL_INVALID_HANDLE)
+ cogl_handle_unref (node->background_shadow_material);
if (node->border_texture != COGL_INVALID_HANDLE)
cogl_handle_unref (node->border_texture);
+ if (node->border_shadow_material != COGL_INVALID_HANDLE)
+ cogl_handle_unref (node->border_shadow_material);
_st_theme_node_init_drawing_state (node);
}
@@ -693,10 +695,15 @@ void
_st_theme_node_init_drawing_state (StThemeNode *node)
{
node->background_texture = COGL_INVALID_HANDLE;
- node->shadow_material = COGL_INVALID_HANDLE;
+ node->background_shadow_material = COGL_INVALID_HANDLE;
+ node->border_shadow_material = COGL_INVALID_HANDLE;
node->border_texture = COGL_INVALID_HANDLE;
}
+static void st_theme_node_paint_borders (StThemeNode *node,
+ const ClutterActorBox *box,
+ guint8 paint_opacity);
+
static void
st_theme_node_render_resources (StThemeNode *node,
float width,
@@ -704,6 +711,7 @@ st_theme_node_render_resources (StThemeNode *node,
{
StTextureCache *texture_cache;
StBorderImage *border_image;
+ StShadow *shadow_spec;
const char *background_image;
texture_cache = st_texture_cache_get_default ();
@@ -720,6 +728,8 @@ st_theme_node_render_resources (StThemeNode *node,
_st_theme_node_ensure_background (node);
_st_theme_node_ensure_geometry (node);
+ shadow_spec = st_theme_node_get_shadow (node);
+
/* Load referenced images from disk and draw anything we need with cairo now */
border_image = st_theme_node_get_border_image (node);
@@ -736,17 +746,50 @@ st_theme_node_render_resources (StThemeNode *node,
node->border_texture = st_theme_node_render_gradient (node);
}
+ if (shadow_spec)
+ {
+ if (node->border_texture != COGL_INVALID_HANDLE)
+ node->border_shadow_material = create_shadow_material (node, node->border_texture);
+ else if (node->background_color.alpha > 0 ||
+ node->border_width[ST_SIDE_TOP] > 0 ||
+ node->border_width[ST_SIDE_LEFT] > 0 ||
+ node->border_width[ST_SIDE_RIGHT] > 0 ||
+ node->border_width[ST_SIDE_BOTTOM] > 0)
+ {
+ CoglHandle buffer, offscreen;
+
+ buffer = cogl_texture_new_with_size (width,
+ height,
+ COGL_TEXTURE_NO_SLICING,
+ COGL_PIXEL_FORMAT_ANY);
+ offscreen = cogl_offscreen_new_to_texture (buffer);
+
+ if (offscreen != COGL_INVALID_HANDLE)
+ {
+ ClutterActorBox box = { 0, 0, width, height };
+
+ cogl_push_framebuffer (offscreen);
+ cogl_ortho (0, width, height, 0, 0, 1.0);
+ st_theme_node_paint_borders (node, &box, 0xFF);
+ cogl_pop_framebuffer ();
+ cogl_handle_unref (offscreen);
+
+ node->border_shadow_material = create_shadow_material (node,
+ buffer);
+ }
+ cogl_handle_unref (buffer);
+ }
+ }
+
background_image = st_theme_node_get_background_image (node);
if (background_image != NULL)
{
- StShadow *shadow_spec;
node->background_texture = st_texture_cache_load_file_to_cogl_texture (texture_cache, background_image);
- shadow_spec = st_theme_node_get_shadow (node);
if (shadow_spec)
{
- node->shadow_material = create_shadow_material (node, node->background_texture);
+ node->background_shadow_material = create_shadow_material (node, node->background_texture);
}
}
@@ -1043,6 +1086,30 @@ st_theme_node_paint (StThemeNode *node,
* border_image and a single background image above it.
*/
+ if (node->border_shadow_material)
+ {
+ StShadow *shadow_spec;
+ ClutterActorBox shadow_box;
+
+ shadow_spec = node->shadow;
+
+ shadow_box.x1 = allocation.x1 + shadow_spec->xoffset
+ - shadow_spec->blur - shadow_spec->spread;
+ shadow_box.y1 = allocation.y1 + shadow_spec->yoffset
+ - shadow_spec->blur - shadow_spec->spread;
+ shadow_box.x2 = allocation.x2 + shadow_spec->xoffset
+ + shadow_spec->blur + shadow_spec->spread;
+ shadow_box.y2 = allocation.y2 + shadow_spec->yoffset
+ + shadow_spec->blur + shadow_spec->spread;
+
+ cogl_material_set_color4ub (node->border_shadow_material,
+ paint_opacity, paint_opacity, paint_opacity, paint_opacity);
+
+ cogl_set_source (node->border_shadow_material);
+ cogl_rectangle_with_texture_coords (shadow_box.x1, shadow_box.y1, shadow_box.x2, shadow_box.y2,
+ 0, 0, 1, 1);
+ }
+
if (node->border_texture != COGL_INVALID_HANDLE)
{
/* Gradients and border images are mutually exclusive at this time */
@@ -1072,7 +1139,7 @@ st_theme_node_paint (StThemeNode *node,
* image (we could exend this in the future to take other CSS properties
* like boder and background color into account).
*/
- if (node->shadow_material != COGL_INVALID_HANDLE)
+ if (node->background_shadow_material != COGL_INVALID_HANDLE)
{
StShadow *shadow_spec;
ClutterActorBox shadow_box;
@@ -1088,10 +1155,10 @@ st_theme_node_paint (StThemeNode *node,
shadow_box.y2 = background_box.y2 + shadow_spec->yoffset
+ shadow_spec->blur + shadow_spec->spread;
- cogl_material_set_color4ub (node->shadow_material,
+ cogl_material_set_color4ub (node->background_shadow_material,
paint_opacity, paint_opacity, paint_opacity, paint_opacity);
- cogl_set_source (node->shadow_material);
+ cogl_set_source (node->background_shadow_material);
cogl_rectangle_with_texture_coords (shadow_box.x1, shadow_box.y1, shadow_box.x2, shadow_box.y2,
0, 0, 1, 1);
}
diff --git a/src/st/st-theme-node-private.h b/src/st/st-theme-node-private.h
index 6074d5a..bd84ef7 100644
--- a/src/st/st-theme-node-private.h
+++ b/src/st/st-theme-node-private.h
@@ -64,7 +64,8 @@ struct _StThemeNode {
float alloc_width;
float alloc_height;
- CoglHandle shadow_material;
+ CoglHandle background_shadow_material;
+ CoglHandle border_shadow_material;
CoglHandle background_texture;
CoglHandle border_texture;
CoglHandle corner_texture;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]