From c0134067d77cb4d643c116c6214832bdeb140275 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Sat, 12 Jun 2010 18:54:08 +0200 Subject: [PATCH] [Transitions] Add error checking when setting up framebuffers The framebuffer setup code can fail, e.g. when the texture used as color buffer has a height/width of 0. In that case, the call to cogl_pop_framebuffer() will crash the shell trigger an assert. Add error checking to fail gracefully. --- src/st/st-theme-node-transition.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/st/st-theme-node-transition.c b/src/st/st-theme-node-transition.c index 02b77e484..cbaddde82 100644 --- a/src/st/st-theme-node-transition.c +++ b/src/st/st-theme-node-transition.c @@ -198,7 +198,7 @@ calculate_offscreen_box (StThemeNodeTransition *transition, - allocation->y1; } -static void +static gboolean setup_framebuffers (StThemeNodeTransition *transition, const ClutterActorBox *allocation, guint8 paint_opacity) @@ -210,6 +210,9 @@ setup_framebuffers (StThemeNodeTransition *transition, width = priv->offscreen_box.x2 - priv->offscreen_box.x1; height = priv->offscreen_box.y2 - priv->offscreen_box.y1; + g_return_val_if_fail (width > 0, FALSE); + g_return_val_if_fail (height > 0, FALSE); + if (priv->old_texture) cogl_handle_unref (priv->old_texture); priv->old_texture = cogl_texture_new_with_size (width, height, @@ -222,6 +225,9 @@ setup_framebuffers (StThemeNodeTransition *transition, COGL_TEXTURE_NO_SLICING, COGL_PIXEL_FORMAT_ANY); + g_return_val_if_fail (priv->old_texture != COGL_INVALID_HANDLE, FALSE); + g_return_val_if_fail (priv->new_texture != COGL_INVALID_HANDLE, FALSE); + if (priv->old_offscreen) cogl_handle_unref (priv->old_offscreen); priv->old_offscreen = cogl_offscreen_new_to_texture (priv->old_texture); @@ -230,6 +236,9 @@ setup_framebuffers (StThemeNodeTransition *transition, cogl_handle_unref (priv->new_offscreen); priv->new_offscreen = cogl_offscreen_new_to_texture (priv->new_texture); + g_return_val_if_fail (priv->old_offscreen != COGL_INVALID_HANDLE, FALSE); + g_return_val_if_fail (priv->new_offscreen != COGL_INVALID_HANDLE, FALSE); + if (priv->material) cogl_handle_unref (priv->material); priv->material = cogl_material_new (); @@ -262,6 +271,8 @@ setup_framebuffers (StThemeNodeTransition *transition, allocation, paint_opacity); cogl_pop_framebuffer (); + + return TRUE; } void @@ -291,9 +302,9 @@ st_theme_node_transition_paint (StThemeNodeTransition *transition, priv->last_opacity = paint_opacity; calculate_offscreen_box (transition, allocation); - setup_framebuffers (transition, allocation, paint_opacity); - - priv->needs_setup = FALSE; + priv->needs_setup = !setup_framebuffers (transition, + allocation, + paint_opacity); } width = cogl_texture_get_width (priv->old_texture);