From 06cea89daeadaa7d2ec406865aa15336122822a7 Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Thu, 13 Jan 2011 17:46:59 -0500 Subject: [PATCH] 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 file changed, 28 insertions(+), 1 deletion(-) diff --git a/src/st/st-theme-node-drawing.c b/src/st/st-theme-node-drawing.c index 710bc12ba..feea5fc09 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)