From 48a54e8ac4e958becdd4ea175c65e921212b1ce2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Sat, 26 Sep 2015 05:44:56 +0200 Subject: [PATCH] theme-node: Pass an explicit framebuffer to paint() This allows us to paint to an offscreen buffer without using the deprecated cogl_push_framebuffer/cogl_pop_framebuffer functions. --- src/st/st-theme-node-drawing.c | 23 +++++++++++------------ src/st/st-theme-node-transition.c | 10 ++++------ src/st/st-theme-node.h | 4 ++++ src/st/st-widget.c | 1 + 4 files changed, 20 insertions(+), 18 deletions(-) diff --git a/src/st/st-theme-node-drawing.c b/src/st/st-theme-node-drawing.c index 57435fedf..fdb69de2d 100644 --- a/src/st/st-theme-node-drawing.c +++ b/src/st/st-theme-node-drawing.c @@ -1282,6 +1282,7 @@ st_theme_node_prerender_background (StThemeNode *node, } static void st_theme_node_paint_borders (StThemeNodePaintState *state, + CoglFramebuffer *framebuffer, const ClutterActorBox *box, guint8 paint_opacity); @@ -1595,11 +1596,11 @@ paint_material_with_opacity (CoglHandle material, static void st_theme_node_paint_borders (StThemeNodePaintState *state, + CoglFramebuffer *framebuffer, const ClutterActorBox *box, guint8 paint_opacity) { StThemeNode *node = state->node; - CoglFramebuffer *fb = cogl_get_draw_framebuffer (); float width, height; guint border_width[4]; guint border_radius[4]; @@ -1713,20 +1714,20 @@ st_theme_node_paint_borders (StThemeNodePaintState *state, switch (corner_id) { case ST_CORNER_TOPLEFT: - cogl_framebuffer_draw_textured_rectangle (fb, + cogl_framebuffer_draw_textured_rectangle (framebuffer, state->corner_material[corner_id], 0, 0, max_width_radius[ST_CORNER_TOPLEFT], max_width_radius[ST_CORNER_TOPLEFT], 0, 0, 0.5, 0.5); break; case ST_CORNER_TOPRIGHT: - cogl_framebuffer_draw_textured_rectangle (fb, + cogl_framebuffer_draw_textured_rectangle (framebuffer, state->corner_material[corner_id], width - max_width_radius[ST_CORNER_TOPRIGHT], 0, width, max_width_radius[ST_CORNER_TOPRIGHT], 0.5, 0, 1, 0.5); break; case ST_CORNER_BOTTOMRIGHT: - cogl_framebuffer_draw_textured_rectangle (fb, + cogl_framebuffer_draw_textured_rectangle (framebuffer, state->corner_material[corner_id], width - max_width_radius[ST_CORNER_BOTTOMRIGHT], height - max_width_radius[ST_CORNER_BOTTOMRIGHT], @@ -1734,7 +1735,7 @@ st_theme_node_paint_borders (StThemeNodePaintState *state, 0.5, 0.5, 1, 1); break; case ST_CORNER_BOTTOMLEFT: - cogl_framebuffer_draw_textured_rectangle (fb, + cogl_framebuffer_draw_textured_rectangle (framebuffer, state->corner_material[corner_id], 0, height - max_width_radius[ST_CORNER_BOTTOMLEFT], max_width_radius[ST_CORNER_BOTTOMLEFT], height, @@ -2208,9 +2209,7 @@ st_theme_node_prerender_shadow (StThemeNodePaintState *state) state->box_shadow_height, 0, 1.0); cogl_framebuffer_clear4f (offscreen, COGL_BUFFER_BIT_COLOR, 0, 0, 0, 0); - cogl_push_framebuffer (offscreen); - st_theme_node_paint_borders (state, &box, 0xFF); - cogl_pop_framebuffer (); + st_theme_node_paint_borders (state, offscreen, &box, 0xFF); cogl_handle_unref (offscreen); state->box_shadow_pipeline = _st_create_shadow_pipeline (st_theme_node_get_box_shadow (node), @@ -2411,6 +2410,7 @@ st_theme_node_needs_new_box_shadow_for_size (StThemeNodePaintState *state, void st_theme_node_paint (StThemeNode *node, StThemeNodePaintState *state, + CoglFramebuffer *framebuffer, const ClutterActorBox *box, guint8 paint_opacity) { @@ -2512,7 +2512,7 @@ st_theme_node_paint (StThemeNode *node, } else { - st_theme_node_paint_borders (state, box, paint_opacity); + st_theme_node_paint_borders (state, framebuffer, box, paint_opacity); } st_theme_node_paint_outline (node, box, paint_opacity); @@ -2522,7 +2522,6 @@ st_theme_node_paint (StThemeNode *node, { ClutterActorBox background_box; ClutterActorBox texture_coords; - CoglFramebuffer *fb = cogl_get_draw_framebuffer (); gboolean has_visible_outline; /* If the node doesn't have an opaque or repeating background or @@ -2534,7 +2533,7 @@ st_theme_node_paint (StThemeNode *node, get_background_position (node, &allocation, &background_box, &texture_coords); if (has_visible_outline || node->background_repeat) - cogl_framebuffer_push_rectangle_clip (fb, + cogl_framebuffer_push_rectangle_clip (framebuffer, allocation.x1, allocation.y1, allocation.x2, allocation.y2); @@ -2563,7 +2562,7 @@ st_theme_node_paint (StThemeNode *node, paint_opacity); if (has_visible_outline || node->background_repeat) - cogl_framebuffer_pop_clip (fb); + cogl_framebuffer_pop_clip (framebuffer); } } diff --git a/src/st/st-theme-node-transition.c b/src/st/st-theme-node-transition.c index 615f72a54..1eef17b47 100644 --- a/src/st/st-theme-node-transition.c +++ b/src/st/st-theme-node-transition.c @@ -312,9 +312,8 @@ setup_framebuffers (StThemeNodeTransition *transition, priv->offscreen_box.x2, priv->offscreen_box.y2, 0.0, 1.0); - cogl_push_framebuffer (priv->old_offscreen); - st_theme_node_paint (priv->old_theme_node, &priv->old_paint_state, allocation, 255); - cogl_pop_framebuffer (); + st_theme_node_paint (priv->old_theme_node, &priv->old_paint_state, + priv->old_offscreen, allocation, 255); cogl_framebuffer_clear4f (priv->new_offscreen, COGL_BUFFER_BIT_COLOR, 0, 0, 0, 0); @@ -323,9 +322,8 @@ setup_framebuffers (StThemeNodeTransition *transition, priv->offscreen_box.y1, priv->offscreen_box.x2, priv->offscreen_box.y2, 0.0, 1.0); - cogl_push_framebuffer (priv->new_offscreen); - st_theme_node_paint (priv->new_theme_node, &priv->new_paint_state, allocation, 255); - cogl_pop_framebuffer (); + st_theme_node_paint (priv->new_theme_node, &priv->new_paint_state, + priv->new_offscreen, allocation, 255); return TRUE; } diff --git a/src/st/st-theme-node.h b/src/st/st-theme-node.h index 111586c02..940b97a38 100644 --- a/src/st/st-theme-node.h +++ b/src/st/st-theme-node.h @@ -268,8 +268,12 @@ gboolean st_theme_node_geometry_equal (StThemeNode *node, gboolean st_theme_node_paint_equal (StThemeNode *node, StThemeNode *other); +/** + * st_theme_node_paint: (skip) + */ void st_theme_node_paint (StThemeNode *node, StThemeNodePaintState *state, + CoglFramebuffer *framebuffer, const ClutterActorBox *box, guint8 paint_opacity); diff --git a/src/st/st-widget.c b/src/st/st-widget.c index 63a51f533..6191e0521 100644 --- a/src/st/st-widget.c +++ b/src/st/st-widget.c @@ -456,6 +456,7 @@ st_widget_paint_background (StWidget *widget) else st_theme_node_paint (theme_node, current_paint_state (widget), + cogl_get_draw_framebuffer (), &allocation, opacity); }