[gnome-shell] [Transitions] Add error checking when setting up framebuffers
- From: Florian Müllner <fmuellner src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-shell] [Transitions] Add error checking when setting up framebuffers
- Date: Sat, 12 Jun 2010 17:33:37 +0000 (UTC)
commit c0134067d77cb4d643c116c6214832bdeb140275
Author: Florian Müllner <fmuellner gnome org>
Date: Sat Jun 12 18:54:08 2010 +0200
[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 files changed, 15 insertions(+), 4 deletions(-)
---
diff --git a/src/st/st-theme-node-transition.c b/src/st/st-theme-node-transition.c
index 02b77e4..cbaddde 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);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]