From d6fe008b2c334f8f7b48b28b87982c06035243e0 Mon Sep 17 00:00:00 2001 From: Lionel Landwerlin Date: Tue, 7 May 2013 23:35:27 +0100 Subject: [PATCH] st-shadow: Fix offset shadow offscreen rendering The shadows are currently rendered by painting the actor we want to apply shadow on, in an offscreen buffer. The problem is that when this actor has an allocation padding (ie allocation that isn't at 0x0 relatively to its parent), this padding is added within the offscreen buffer and as a result the shadow rendering is truncated because the offscreen buffer size is the size of the allocation box, not the allocation box + padding. This patch reposition the actor at 0x0 with rendering it by changing the initial transformation matrix when rendering the actor offscreen. https://bugzilla.gnome.org/show_bug.cgi?id=698301 --- src/st/st-icon.c | 5 ----- src/st/st-label.c | 4 ---- src/st/st-private.c | 1 + src/st/st-shadow.c | 5 ----- 4 files changed, 1 insertion(+), 14 deletions(-) diff --git a/src/st/st-icon.c b/src/st/st-icon.c index 3fec7e2a2..fac474af9 100644 --- a/src/st/st-icon.c +++ b/src/st/st-icon.c @@ -249,11 +249,6 @@ st_icon_paint (ClutterActor *actor) clutter_actor_get_allocation_box (priv->icon_texture, &allocation); clutter_actor_box_get_size (&allocation, &width, &height); - allocation.x1 = (width - priv->shadow_width) / 2; - allocation.y1 = (height - priv->shadow_height) / 2; - allocation.x2 = allocation.x1 + priv->shadow_width; - allocation.y2 = allocation.y1 + priv->shadow_height; - _st_paint_shadow_with_opacity (priv->shadow_spec, priv->shadow_material, &allocation, diff --git a/src/st/st-label.c b/src/st/st-label.c index 4954d4937..9833b8337 100644 --- a/src/st/st-label.c +++ b/src/st/st-label.c @@ -218,10 +218,6 @@ st_label_paint (ClutterActor *actor) clutter_actor_get_allocation_box (priv->label, &allocation); clutter_actor_box_get_size (&allocation, &width, &height); - allocation.x1 = allocation.y1 = 0; - allocation.x2 = width; - allocation.y2 = height; - if (priv->text_shadow_material == COGL_INVALID_HANDLE || width != priv->shadow_width || height != priv->shadow_height) diff --git a/src/st/st-private.c b/src/st/st-private.c index 793202b78..45e909624 100644 --- a/src/st/st-private.c +++ b/src/st/st-private.c @@ -511,6 +511,7 @@ _st_create_shadow_material_from_actor (StShadow *shadow_spec, cogl_color_set_from_4ub (&clear_color, 0, 0, 0, 0); cogl_push_framebuffer (offscreen); cogl_clear (&clear_color, COGL_BUFFER_BIT_COLOR); + cogl_translate (-box.x1, -box.y1, 0); cogl_ortho (0, width, height, 0, 0, 1.0); clutter_actor_paint (actor); cogl_pop_framebuffer (); diff --git a/src/st/st-shadow.c b/src/st/st-shadow.c index df1787f99..4a2ff001d 100644 --- a/src/st/st-shadow.c +++ b/src/st/st-shadow.c @@ -292,11 +292,6 @@ st_shadow_helper_paint (StShadowHelper *helper, clutter_actor_box_get_size (actor_box, &width, &height); - allocation.x1 = (width - helper->width) / 2; - allocation.y1 = (height - helper->height) / 2; - allocation.x2 = allocation.x1 + helper->width; - allocation.y2 = allocation.y1 + helper->height; - _st_paint_shadow_with_opacity (helper->shadow, helper->material, &allocation,