Use paint and pick context to get framebuffer
Mutter and Clutter was changed to pass around the current target framebuffer via the paint context instead of via the deprecated Cogl framebuffer stack. The framebuffer stack has also been removed from Cogl so change to use the one in the paint context instead. https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/827
This commit is contained in:
parent
988a0e7314
commit
632a643994
@ -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);
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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));
|
||||
|
@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user