[gnome-shell] theme-node: Pass an explicit framebuffer to paint()



commit 48a54e8ac4e958becdd4ea175c65e921212b1ce2
Author: Florian Müllner <fmuellner gnome org>
Date:   Sat Sep 26 05:44:56 2015 +0200

    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 57435fe..fdb69de 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 615f72a..1eef17b 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 111586c..940b97a 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 63a51f5..6191e05 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);
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]