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.
This commit is contained in:
parent
113a854048
commit
48a54e8ac4
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user