diff --git a/src/st/st-theme-node-drawing.c b/src/st/st-theme-node-drawing.c index 75fc53f7e..1deacd780 100644 --- a/src/st/st-theme-node-drawing.c +++ b/src/st/st-theme-node-drawing.c @@ -1376,7 +1376,8 @@ st_theme_node_load_background_image (StThemeNode *node) node->background_material = _st_create_texture_pipeline (node->background_texture); if (node->background_repeat) - cogl_material_set_layer_wrap_mode (node->background_material, 0, COGL_MATERIAL_WRAP_MODE_REPEAT); + cogl_pipeline_set_layer_wrap_mode (node->background_material, 0, + COGL_PIPELINE_WRAP_MODE_REPEAT); if (background_image_shadow_spec) { @@ -1578,16 +1579,18 @@ paint_material_with_opacity (CoglHandle material, ClutterActorBox *coords, guint8 paint_opacity) { - cogl_material_set_color4ub (material, + CoglFramebuffer *fb = cogl_get_draw_framebuffer (); + + cogl_pipeline_set_color4ub (material, paint_opacity, paint_opacity, paint_opacity, paint_opacity); - cogl_set_source (material); - if (coords) - cogl_rectangle_with_texture_coords (box->x1, box->y1, box->x2, box->y2, - coords->x1, coords->y1, coords->x2, coords->y2); + cogl_framebuffer_draw_textured_rectangle (fb, material, + box->x1, box->y1, box->x2, box->y2, + coords->x1, coords->y1, coords->x2, coords->y2); else - cogl_rectangle (box->x1, box->y1, box->x2, box->y2); + cogl_framebuffer_draw_rectangle (fb, material, + box->x1, box->y1, box->x2, box->y2); } static void @@ -1596,6 +1599,7 @@ st_theme_node_paint_borders (StThemeNodePaintState *state, guint8 paint_opacity) { StThemeNode *node = state->node; + CoglFramebuffer *fb = cogl_get_draw_framebuffer (); float width, height; guint border_width[4]; guint border_radius[4]; @@ -1702,32 +1706,39 @@ st_theme_node_paint_borders (StThemeNodePaintState *state, if (state->corner_material[corner_id] == COGL_INVALID_HANDLE) continue; - cogl_material_set_color4ub (state->corner_material[corner_id], + cogl_pipeline_set_color4ub (state->corner_material[corner_id], paint_opacity, paint_opacity, paint_opacity, paint_opacity); - cogl_set_source (state->corner_material[corner_id]); switch (corner_id) { case ST_CORNER_TOPLEFT: - cogl_rectangle_with_texture_coords (0, 0, - max_width_radius[ST_CORNER_TOPLEFT], max_width_radius[ST_CORNER_TOPLEFT], - 0, 0, 0.5, 0.5); + cogl_framebuffer_draw_textured_rectangle (fb, + 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_rectangle_with_texture_coords (width - max_width_radius[ST_CORNER_TOPRIGHT], 0, - width, max_width_radius[ST_CORNER_TOPRIGHT], - 0.5, 0, 1, 0.5); + cogl_framebuffer_draw_textured_rectangle (fb, + 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_rectangle_with_texture_coords (width - max_width_radius[ST_CORNER_BOTTOMRIGHT], height - max_width_radius[ST_CORNER_BOTTOMRIGHT], - width, height, - 0.5, 0.5, 1, 1); + cogl_framebuffer_draw_textured_rectangle (fb, + state->corner_material[corner_id], + width - max_width_radius[ST_CORNER_BOTTOMRIGHT], + height - max_width_radius[ST_CORNER_BOTTOMRIGHT], + width, height, + 0.5, 0.5, 1, 1); break; case ST_CORNER_BOTTOMLEFT: - cogl_rectangle_with_texture_coords (0, height - max_width_radius[ST_CORNER_BOTTOMLEFT], - max_width_radius[ST_CORNER_BOTTOMLEFT], height, - 0, 0.5, 0.5, 1); + cogl_framebuffer_draw_textured_rectangle (fb, + state->corner_material[corner_id], + 0, height - max_width_radius[ST_CORNER_BOTTOMLEFT], + max_width_radius[ST_CORNER_BOTTOMLEFT], height, + 0, 0.5, 0.5, 1); break; default: g_assert_not_reached(); @@ -1868,6 +1879,7 @@ st_theme_node_paint_sliced_shadow (StThemeNodePaintState *state, guint8 paint_opacity) { StThemeNode *node = state->node; + CoglFramebuffer *fb = cogl_get_draw_framebuffer (); guint border_radius[4]; CoglColor color; StShadow *box_shadow_spec; @@ -1969,16 +1981,14 @@ st_theme_node_paint_sliced_shadow (StThemeNodePaintState *state, right += xoffset; /* Setup pipeline */ - cogl_color_set_from_4ub (&color, - box_shadow_spec->color.red * paint_opacity / 255, - box_shadow_spec->color.green * paint_opacity / 255, - box_shadow_spec->color.blue * paint_opacity / 255, - box_shadow_spec->color.alpha * paint_opacity / 255); + cogl_color_init_from_4ub (&color, + box_shadow_spec->color.red * paint_opacity / 255, + box_shadow_spec->color.green * paint_opacity / 255, + box_shadow_spec->color.blue * paint_opacity / 255, + box_shadow_spec->color.alpha * paint_opacity / 255); cogl_color_premultiply (&color); - cogl_material_set_layer_combine_constant (state->box_shadow_material, 0, &color); - - cogl_set_source (state->box_shadow_material); + cogl_pipeline_set_layer_combine_constant (state->box_shadow_material, 0, &color); idx = 0; @@ -2106,7 +2116,8 @@ st_theme_node_paint_sliced_shadow (StThemeNodePaintState *state, } } - cogl_rectangles_with_texture_coords (rectangles, idx / 8); + cogl_framebuffer_draw_textured_rectangles (fb, state->box_shadow_material, + rectangles, idx / 8); #if 0 /* Visual feedback on shadow's 9-slice and orignal offscreen buffer, @@ -2186,19 +2197,18 @@ st_theme_node_prerender_shadow (StThemeNodePaintState *state) state->box_shadow_height, COGL_TEXTURE_NO_SLICING, COGL_PIXEL_FORMAT_ANY); - offscreen = cogl_offscreen_new_to_texture (buffer); + offscreen = cogl_offscreen_new_with_texture (buffer); if (offscreen != COGL_INVALID_HANDLE) { ClutterActorBox box = { 0, 0, state->box_shadow_width, state->box_shadow_height}; - CoglColor clear_color; + + cogl_framebuffer_orthographic (offscreen, 0, 0, + state->box_shadow_width, + state->box_shadow_height, 0, 1.0); + cogl_framebuffer_clear4f (offscreen, COGL_BUFFER_BIT_COLOR, 0, 0, 0, 0); cogl_push_framebuffer (offscreen); - cogl_ortho (0, state->box_shadow_width, state->box_shadow_height, 0, 0, 1.0); - - cogl_color_set_from_4ub (&clear_color, 0, 0, 0, 0); - cogl_clear (&clear_color, COGL_BUFFER_BIT_COLOR); - st_theme_node_paint_borders (state, &box, 0xFF); cogl_pop_framebuffer (); cogl_handle_unref (offscreen); @@ -2215,6 +2225,7 @@ st_theme_node_paint_sliced_border_image (StThemeNode *node, float height, guint8 paint_opacity) { + CoglFramebuffer *fb = cogl_get_draw_framebuffer (); gfloat ex, ey; gfloat tx1, ty1, tx2, ty2; gint border_left, border_right, border_top, border_bottom; @@ -2245,11 +2256,9 @@ st_theme_node_paint_sliced_border_image (StThemeNode *node, ey = border_bottom; /* FIXME ? */ material = node->border_slices_material; - cogl_material_set_color4ub (material, + cogl_pipeline_set_color4ub (material, paint_opacity, paint_opacity, paint_opacity, paint_opacity); - cogl_set_source (material); - { float rectangles[] = { @@ -2299,7 +2308,7 @@ st_theme_node_paint_sliced_border_image (StThemeNode *node, 1.0, 1.0 }; - cogl_rectangles_with_texture_coords (rectangles, 9); + cogl_framebuffer_draw_textured_rectangles (fb, material, rectangles, 9); } } @@ -2513,6 +2522,7 @@ 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 @@ -2524,7 +2534,9 @@ st_theme_node_paint (StThemeNode *node, get_background_position (node, &allocation, &background_box, &texture_coords); if (has_visible_outline || node->background_repeat) - cogl_clip_push_rectangle (allocation.x1, allocation.y1, allocation.x2, allocation.y2); + cogl_framebuffer_push_rectangle_clip (fb, + allocation.x1, allocation.y1, + allocation.x2, allocation.y2); /* CSS based drop shadows * @@ -2551,7 +2563,7 @@ st_theme_node_paint (StThemeNode *node, paint_opacity); if (has_visible_outline || node->background_repeat) - cogl_clip_pop (); + cogl_framebuffer_pop_clip (fb); } } diff --git a/src/st/st-theme-node-private.h b/src/st/st-theme-node-private.h index 985c24e3a..cf8026890 100644 --- a/src/st/st-theme-node-private.h +++ b/src/st/st-theme-node-private.h @@ -107,11 +107,11 @@ struct _StThemeNode { int box_shadow_min_width; int box_shadow_min_height; - CoglHandle border_slices_texture; - CoglHandle border_slices_material; - CoglHandle background_texture; - CoglHandle background_material; - CoglHandle background_shadow_material; + CoglPipeline *border_slices_texture; + CoglPipeline *border_slices_material; + CoglPipeline *background_texture; + CoglPipeline *background_material; + CoglPipeline *background_shadow_material; StThemeNodePaintState cached_state; }; diff --git a/src/st/st-theme-node-transition.c b/src/st/st-theme-node-transition.c index 5c2f0cfde..615f72a54 100644 --- a/src/st/st-theme-node-transition.c +++ b/src/st/st-theme-node-transition.c @@ -240,7 +240,6 @@ setup_framebuffers (StThemeNodeTransition *transition, const ClutterActorBox *allocation) { StThemeNodeTransitionPrivate *priv = transition->priv; - CoglColor clear_color = { 0, 0, 0, 0 }; guint width, height; /* template material to avoid unnecessary shader compilation */ @@ -269,11 +268,11 @@ setup_framebuffers (StThemeNodeTransition *transition, if (priv->old_offscreen) cogl_handle_unref (priv->old_offscreen); - priv->old_offscreen = cogl_offscreen_new_to_texture (priv->old_texture); + priv->old_offscreen = cogl_offscreen_new_with_texture (priv->old_texture); if (priv->new_offscreen) cogl_handle_unref (priv->new_offscreen); - priv->new_offscreen = cogl_offscreen_new_to_texture (priv->new_texture); + priv->new_offscreen = cogl_offscreen_new_with_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); @@ -282,40 +281,49 @@ setup_framebuffers (StThemeNodeTransition *transition, { if (G_UNLIKELY (material_template == COGL_INVALID_HANDLE)) { - material_template = cogl_material_new (); + CoglContext *ctx = + clutter_backend_get_cogl_context (clutter_get_default_backend ()); + material_template = cogl_pipeline_new (ctx); - cogl_material_set_layer_combine (material_template, 0, + cogl_pipeline_set_layer_combine (material_template, 0, "RGBA = REPLACE (TEXTURE)", NULL); - cogl_material_set_layer_combine (material_template, 1, + cogl_pipeline_set_layer_combine (material_template, 1, "RGBA = INTERPOLATE (PREVIOUS, " "TEXTURE, " "CONSTANT[A])", NULL); - cogl_material_set_layer_combine (material_template, 2, + cogl_pipeline_set_layer_combine (material_template, 2, "RGBA = MODULATE (PREVIOUS, " "PRIMARY)", NULL); } - priv->material = cogl_material_copy (material_template); + priv->material = cogl_pipeline_copy (material_template); } - cogl_material_set_layer (priv->material, 0, priv->new_texture); - cogl_material_set_layer (priv->material, 1, priv->old_texture); + cogl_pipeline_set_layer_texture (priv->material, 0, priv->new_texture); + cogl_pipeline_set_layer_texture (priv->material, 1, priv->old_texture); + + cogl_framebuffer_clear4f (priv->old_offscreen, COGL_BUFFER_BIT_COLOR, + 0, 0, 0, 0); + cogl_framebuffer_orthographic (priv->old_offscreen, + priv->offscreen_box.x1, + priv->offscreen_box.y1, + priv->offscreen_box.x2, + priv->offscreen_box.y2, 0.0, 1.0); cogl_push_framebuffer (priv->old_offscreen); - cogl_clear (&clear_color, COGL_BUFFER_BIT_COLOR); - cogl_ortho (priv->offscreen_box.x1, priv->offscreen_box.x2, - priv->offscreen_box.y2, priv->offscreen_box.y1, - 0.0, 1.0); st_theme_node_paint (priv->old_theme_node, &priv->old_paint_state, allocation, 255); cogl_pop_framebuffer (); + cogl_framebuffer_clear4f (priv->new_offscreen, COGL_BUFFER_BIT_COLOR, + 0, 0, 0, 0); + cogl_framebuffer_orthographic (priv->new_offscreen, + priv->offscreen_box.x1, + priv->offscreen_box.y1, + priv->offscreen_box.x2, + priv->offscreen_box.y2, 0.0, 1.0); cogl_push_framebuffer (priv->new_offscreen); - cogl_clear (&clear_color, COGL_BUFFER_BIT_COLOR); - cogl_ortho (priv->offscreen_box.x1, priv->offscreen_box.x2, - priv->offscreen_box.y2, priv->offscreen_box.y1, - 0.0, 1.0); st_theme_node_paint (priv->new_theme_node, &priv->new_paint_state, allocation, 255); cogl_pop_framebuffer (); @@ -328,6 +336,7 @@ st_theme_node_transition_paint (StThemeNodeTransition *transition, guint8 paint_opacity) { StThemeNodeTransitionPrivate *priv = transition->priv; + CoglFramebuffer *fb = cogl_get_draw_framebuffer (); CoglColor constant; float tex_coords[] = { @@ -352,20 +361,20 @@ st_theme_node_transition_paint (StThemeNodeTransition *transition, return; } - cogl_color_set_from_4f (&constant, 0., 0., 0., - clutter_timeline_get_progress (priv->timeline)); - cogl_material_set_layer_combine_constant (priv->material, 1, &constant); + cogl_color_init_from_4f (&constant, 0., 0., 0., + clutter_timeline_get_progress (priv->timeline)); + cogl_pipeline_set_layer_combine_constant (priv->material, 1, &constant); - cogl_material_set_color4ub (priv->material, + cogl_pipeline_set_color4ub (priv->material, paint_opacity, paint_opacity, paint_opacity, paint_opacity); - cogl_set_source (priv->material); - cogl_rectangle_with_multitexture_coords (priv->offscreen_box.x1, - priv->offscreen_box.y1, - priv->offscreen_box.x2, - priv->offscreen_box.y2, - tex_coords, 8); + cogl_framebuffer_draw_multitextured_rectangle (fb, priv->material, + priv->offscreen_box.x1, + priv->offscreen_box.y1, + priv->offscreen_box.x2, + priv->offscreen_box.y2, + tex_coords, 8); } static void diff --git a/src/st/st-theme-node.h b/src/st/st-theme-node.h index 8f326bd7b..7f21c660c 100644 --- a/src/st/st-theme-node.h +++ b/src/st/st-theme-node.h @@ -104,9 +104,9 @@ struct _StThemeNodePaintState { float box_shadow_width; float box_shadow_height; - CoglHandle box_shadow_material; - CoglHandle prerendered_texture; - CoglHandle prerendered_material; + CoglPipeline *box_shadow_material; + CoglPipeline *prerendered_texture; + CoglPipeline *prerendered_material; CoglHandle corner_material[4]; };