From c58b8498b354244524a4a9628f53a7d29e49c7fc Mon Sep 17 00:00:00 2001 From: "Jasper St. Pierre" Date: Fri, 11 Mar 2011 15:29:15 -0500 Subject: [PATCH] st: Add more error checking to shadow-related code The additional error checks should catch quite some warnings (e.g. when trying to create a shadow for a 0-width actor). --- src/st/st-label.c | 9 +++++---- src/st/st-private.c | 33 +++++++++++++++++++++------------ 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/src/st/st-label.c b/src/st/st-label.c index 53fd844b3..1d9b13d0e 100644 --- a/src/st/st-label.c +++ b/src/st/st-label.c @@ -243,10 +243,11 @@ st_label_paint (ClutterActor *actor) priv->text_shadow_material = material; } - _st_paint_shadow_with_opacity (shadow_spec, - priv->text_shadow_material, - &allocation, - clutter_actor_get_paint_opacity (priv->label)); + if (priv->text_shadow_material != COGL_INVALID_HANDLE) + _st_paint_shadow_with_opacity (shadow_spec, + priv->text_shadow_material, + &allocation, + clutter_actor_get_paint_opacity (priv->label)); } clutter_actor_paint (priv->label); diff --git a/src/st/st-private.c b/src/st/st-private.c index e265789ae..f97c2de7f 100644 --- a/src/st/st-private.c +++ b/src/st/st-private.c @@ -604,32 +604,41 @@ _st_create_shadow_material_from_actor (StShadow *shadow_spec, { CoglHandle buffer, offscreen; ClutterActorBox box; + CoglColor clear_color; float width, height; clutter_actor_get_allocation_box (actor, &box); clutter_actor_box_get_size (&box, &width, &height); + if (width == 0 || height == 0) + return COGL_INVALID_HANDLE; + buffer = cogl_texture_new_with_size (width, height, COGL_TEXTURE_NO_SLICING, COGL_PIXEL_FORMAT_ANY); + + if (buffer == COGL_INVALID_HANDLE) + return COGL_INVALID_HANDLE; + offscreen = cogl_offscreen_new_to_texture (buffer); - if (offscreen != COGL_INVALID_HANDLE) + if (offscreen == COGL_INVALID_HANDLE) { - CoglColor clear_color; - - cogl_color_set_from_4ub (&clear_color, 0, 0, 0, 0); - cogl_push_framebuffer (offscreen); - cogl_clear (&clear_color, COGL_BUFFER_BIT_COLOR); - cogl_ortho (0, width, height, 0, 0, 1.0); - clutter_actor_paint (actor); - cogl_pop_framebuffer (); - cogl_handle_unref (offscreen); - - shadow_material = _st_create_shadow_material (shadow_spec, buffer); + cogl_handle_unref (buffer); + return COGL_INVALID_HANDLE; } + cogl_color_set_from_4ub (&clear_color, 0, 0, 0, 0); + cogl_push_framebuffer (offscreen); + cogl_clear (&clear_color, COGL_BUFFER_BIT_COLOR); + cogl_ortho (0, width, height, 0, 0, 1.0); + clutter_actor_paint (actor); + cogl_pop_framebuffer (); + cogl_handle_unref (offscreen); + + shadow_material = _st_create_shadow_material (shadow_spec, buffer); + cogl_handle_unref (buffer); }