[gnome-shell] StThemeNodeDrawing: clip background image to node allocation
- From: Ray Strode <halfline src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-shell] StThemeNodeDrawing: clip background image to node allocation
- Date: Mon, 24 Jan 2011 17:24:25 +0000 (UTC)
commit 06cea89daeadaa7d2ec406865aa15336122822a7
Author: Ray Strode <rstrode redhat com>
Date: Thu Jan 13 17:46:59 2011 -0500
StThemeNodeDrawing: clip background image to node allocation
When drawing the background image, we need to make sure
we don't draw outside the bounding rectangle of the node.
https://bugzilla.gnome.org/show_bug.cgi?id=636976
src/st/st-theme-node-drawing.c | 29 ++++++++++++++++++++++++++++-
1 files changed, 28 insertions(+), 1 deletions(-)
---
diff --git a/src/st/st-theme-node-drawing.c b/src/st/st-theme-node-drawing.c
index 710bc12..feea5fc 100644
--- a/src/st/st-theme-node-drawing.c
+++ b/src/st/st-theme-node-drawing.c
@@ -773,8 +773,35 @@ st_theme_node_render_resources (StThemeNode *node,
if (background_image != NULL)
{
+ CoglHandle texture;
+
+ texture = st_texture_cache_load_file_to_cogl_texture (texture_cache, background_image);
+
+ /* If no background position is specified, then we will automatically scale
+ * the background to fit within the node allocation. But, if a background
+ * position is specified, we won't scale the background, and it could
+ * potentially leak out of bounds. To prevent that, we subtexture from the
+ * in bounds area when necessary.
+ */
+ if (node->background_position_set &&
+ (cogl_texture_get_width (texture) > width ||
+ cogl_texture_get_height (texture) > height))
+ {
+ CoglHandle subtexture;
+
+ subtexture = cogl_texture_new_from_sub_texture (texture,
+ 0, 0,
+ width - node->background_position_x,
+ height - node->background_position_y);
+ cogl_handle_unref (texture);
+
+ node->background_texture = subtexture;
+ }
+ else
+ {
+ node->background_texture = texture;
+ }
- node->background_texture = st_texture_cache_load_file_to_cogl_texture (texture_cache, background_image);
node->background_material = _st_create_texture_material (node->background_texture);
if (background_image_shadow_spec)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]