diff --git a/js/ui/lookingGlass.js b/js/ui/lookingGlass.js index 19a9396d4..ac25c7b73 100644 --- a/js/ui/lookingGlass.js +++ b/js/ui/lookingGlass.js @@ -472,25 +472,40 @@ class ObjInspector extends St.ScrollView { var RedBorderEffect = GObject.registerClass( class RedBorderEffect extends Clutter.Effect { + _init() { + super._init(); + this._pipeline = null; + } + vfunc_paint(paintContext) { + let framebuffer = paintContext.get_framebuffer(); + let coglContext = framebuffer.get_context(); let actor = this.get_actor(); actor.continue_paint(paintContext); - let color = new Cogl.Color(); - color.init_from_4ub(0xff, 0, 0, 0xc4); - Cogl.set_source_color(color); + if (!this._pipeline) { + let color = new Cogl.Color(); + color.init_from_4ub(0xff, 0, 0, 0xc4); + + this._pipeline = new Cogl.Pipeline(coglContext); + this._pipeline.set_color(color); + } let alloc = actor.get_allocation_box(); let width = 2; // clockwise order - Cogl.rectangle(0, 0, alloc.get_width(), width); - Cogl.rectangle(alloc.get_width() - width, width, - alloc.get_width(), alloc.get_height()); - Cogl.rectangle(0, alloc.get_height(), - alloc.get_width() - width, alloc.get_height() - width); - Cogl.rectangle(0, alloc.get_height() - width, - width, width); + framebuffer.draw_rectangle(this._pipeline, + 0, 0, alloc.get_width(), width); + framebuffer.draw_rectangle(this._pipeline, + alloc.get_width() - width, width, + alloc.get_width(), alloc.get_height()); + framebuffer.draw_rectangle(this._pipeline, + 0, alloc.get_height(), + alloc.get_width() - width, alloc.get_height() - width); + framebuffer.draw_rectangle(this._pipeline, + 0, alloc.get_height() - width, + width, width); } }); diff --git a/src/shell-glsl-effect.c b/src/shell-glsl-effect.c index 6347dbf9c..8f4bd2aaf 100644 --- a/src/shell-glsl-effect.c +++ b/src/shell-glsl-effect.c @@ -74,6 +74,7 @@ shell_glsl_effect_paint_target (ClutterOffscreenEffect *effect, ShellGLSLEffectPrivate *priv; ClutterActor *actor; guint8 paint_opacity; + CoglFramebuffer *framebuffer; priv = shell_glsl_effect_get_instance_private (self); @@ -85,7 +86,9 @@ shell_glsl_effect_paint_target (ClutterOffscreenEffect *effect, paint_opacity, paint_opacity, paint_opacity); - cogl_framebuffer_draw_rectangle (cogl_get_draw_framebuffer (), + + framebuffer = clutter_paint_context_get_framebuffer (paint_context); + cogl_framebuffer_draw_rectangle (framebuffer, priv->pipeline, 0, 0, priv->tex_width, priv->tex_height); diff --git a/src/shell-invert-lightness-effect.c b/src/shell-invert-lightness-effect.c index 282725b22..bb0e97961 100644 --- a/src/shell-invert-lightness-effect.c +++ b/src/shell-invert-lightness-effect.c @@ -124,7 +124,7 @@ shell_invert_lightness_effect_paint_target (ClutterOffscreenEffect *effect, ShellInvertLightnessEffect *self = SHELL_INVERT_LIGHTNESS_EFFECT (effect); ClutterActor *actor; guint8 paint_opacity; - CoglFramebuffer *fb = cogl_get_draw_framebuffer (); + CoglFramebuffer *fb = clutter_paint_context_get_framebuffer (paint_context); actor = clutter_actor_meta_get_actor (CLUTTER_ACTOR_META (effect)); paint_opacity = clutter_actor_get_paint_opacity (actor); diff --git a/src/st/st-box-layout.c b/src/st/st-box-layout.c index 66b17b185..019aebd76 100644 --- a/src/st/st-box-layout.c +++ b/src/st/st-box-layout.c @@ -397,7 +397,7 @@ st_box_layout_paint (ClutterActor *actor, ClutterActorBox allocation_box; ClutterActorBox content_box; ClutterActor *child; - CoglFramebuffer *fb = cogl_get_draw_framebuffer (); + CoglFramebuffer *fb = clutter_paint_context_get_framebuffer (paint_context); get_border_paint_offsets (self, &x, &y); if (x != 0 || y != 0) @@ -454,7 +454,7 @@ st_box_layout_pick (ClutterActor *actor, ClutterActorBox allocation_box; ClutterActorBox content_box; ClutterActor *child; - CoglFramebuffer *fb = cogl_get_draw_framebuffer (); + CoglFramebuffer *fb = clutter_pick_context_get_framebuffer (pick_context); get_border_paint_offsets (self, &x, &y); if (x != 0 || y != 0) diff --git a/src/st/st-entry.c b/src/st/st-entry.c index 9c45fbd65..cb75273b5 100644 --- a/src/st/st-entry.c +++ b/src/st/st-entry.c @@ -877,11 +877,16 @@ st_entry_paint (ClutterActor *actor, } if (priv->text_shadow_material != NULL) - _st_paint_shadow_with_opacity (shadow_spec, - cogl_get_draw_framebuffer (), - priv->text_shadow_material, - &allocation, - clutter_actor_get_paint_opacity (priv->entry)); + { + CoglFramebuffer *framebuffer = + clutter_paint_context_get_framebuffer (paint_context); + + _st_paint_shadow_with_opacity (shadow_spec, + framebuffer, + priv->text_shadow_material, + &allocation, + clutter_actor_get_paint_opacity (priv->entry)); + } } /* Since we paint the background ourselves, chain to the parent class diff --git a/src/st/st-icon.c b/src/st/st-icon.c index fc6aa5123..133209d1e 100644 --- a/src/st/st-icon.c +++ b/src/st/st-icon.c @@ -178,10 +178,12 @@ st_icon_paint (ClutterActor *actor, if (priv->shadow_pipeline) { ClutterActorBox allocation; + CoglFramebuffer *framebuffer; clutter_actor_get_allocation_box (priv->icon_texture, &allocation); + framebuffer = clutter_paint_context_get_framebuffer (paint_context); _st_paint_shadow_with_opacity (priv->shadow_spec, - cogl_get_draw_framebuffer (), + framebuffer, priv->shadow_pipeline, &allocation, clutter_actor_get_paint_opacity (priv->icon_texture)); diff --git a/src/st/st-label.c b/src/st/st-label.c index 42816ffdf..947c8ec86 100644 --- a/src/st/st-label.c +++ b/src/st/st-label.c @@ -229,11 +229,17 @@ st_label_paint (ClutterActor *actor, } if (priv->text_shadow_pipeline != NULL) - _st_paint_shadow_with_opacity (shadow_spec, - cogl_get_draw_framebuffer (), - priv->text_shadow_pipeline, - &allocation, - clutter_actor_get_paint_opacity (priv->label)); + { + CoglFramebuffer *framebuffer; + + framebuffer = + clutter_paint_context_get_framebuffer (paint_context); + _st_paint_shadow_with_opacity (shadow_spec, + framebuffer, + priv->text_shadow_pipeline, + &allocation, + clutter_actor_get_paint_opacity (priv->label)); + } } } diff --git a/src/st/st-private.c b/src/st/st-private.c index fd2cc39b1..3107a0cf2 100644 --- a/src/st/st-private.c +++ b/src/st/st-private.c @@ -490,12 +490,6 @@ _st_create_shadow_pipeline_from_actor (StShadow *shadow_spec, cogl_color_init_from_4ub (&clear_color, 0, 0, 0, 0); clutter_actor_get_position (actor, &x, &y); - /* XXX: There's no way to render a ClutterActor to an offscreen - * as it uses the implicit API. */ - G_GNUC_BEGIN_IGNORE_DEPRECATIONS; - cogl_push_framebuffer (fb); - G_GNUC_END_IGNORE_DEPRECATIONS; - cogl_framebuffer_clear (fb, COGL_BUFFER_BIT_COLOR, &clear_color); cogl_framebuffer_translate (fb, -x, -y, 0); cogl_framebuffer_orthographic (fb, 0, 0, width, height, 0, 1.0); @@ -507,10 +501,6 @@ _st_create_shadow_pipeline_from_actor (StShadow *shadow_spec, clutter_actor_paint (actor, paint_context); clutter_paint_context_destroy (paint_context); - G_GNUC_BEGIN_IGNORE_DEPRECATIONS; - cogl_pop_framebuffer (); - G_GNUC_END_IGNORE_DEPRECATIONS; - clutter_actor_set_opacity_override (actor, -1); cogl_object_unref (fb); diff --git a/src/st/st-widget.c b/src/st/st-widget.c index dd11f8ad1..26eccee1f 100644 --- a/src/st/st-widget.c +++ b/src/st/st-widget.c @@ -416,7 +416,7 @@ st_widget_paint_background (StWidget *widget, if (!st_widget_get_resource_scale (widget, &resource_scale)) return; - framebuffer = cogl_get_draw_framebuffer (); + framebuffer = clutter_paint_context_get_framebuffer (paint_context); theme_node = st_widget_get_theme_node (widget); clutter_actor_get_allocation_box (CLUTTER_ACTOR (widget), &allocation); diff --git a/tests/interactive/background-size.js b/tests/interactive/background-size.js index 7b18f8950..064bc9e86 100644 --- a/tests/interactive/background-size.js +++ b/tests/interactive/background-size.js @@ -2,11 +2,13 @@ const UI = imports.testcommon.ui; -const { Cogl, Clutter, St } = imports.gi; +const { Cogl, Clutter, Meta, St } = imports.gi; function test() { - let stage = new Clutter.Stage({ user_resizable: true, width: 1024, height: 768 }); + Meta.init(); + + let stage = Meta.get_backend().get_stage(); UI.init(stage); let vbox = new St.BoxLayout({ style: 'background: #ffee88;' }); @@ -33,20 +35,32 @@ function test() { if (useCairo) obin.style = 'border: 3px solid green;'; else - obin.connect_after('paint', actor => { - Cogl.set_source_color4f(0, 1, 0, 1); + obin.connect_after('paint', (actor, paintContext) => { + let framebuffer = paintContext.get_framebuffer(); + let coglContext = framebuffer.get_context(); + + let pipeline = new Cogl.Pipeline(coglContext); + pipeline.set_color4f(0, 1, 0, 1); let alloc = actor.get_allocation_box(); let width = 3; // clockwise order - Cogl.rectangle(0, 0, alloc.get_width(), width); - Cogl.rectangle(alloc.get_width() - width, width, - alloc.get_width(), alloc.get_height()); - Cogl.rectangle(0, alloc.get_height(), - alloc.get_width() - width, alloc.get_height() - width); - Cogl.rectangle(0, alloc.get_height() - width, - width, width); + framebuffer.draw_rectangle(pipeline, + 0, 0, alloc.get_width(), width); + framebuffer.draw_rectangle(pipeline, + alloc.get_width() - width, width, + alloc.get_width(), alloc.get_height()); + framebuffer.draw_rectangle(pipeline, + 0, + alloc.get_height(), + alloc.get_width() - width, + alloc.get_height() - width); + framebuffer.draw_rectangle(pipeline, + 0, + alloc.get_height() - width, + width, + width); }); tbox.add(obin);