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(
|
var RedBorderEffect = GObject.registerClass(
|
||||||
class RedBorderEffect extends Clutter.Effect {
|
class RedBorderEffect extends Clutter.Effect {
|
||||||
|
_init() {
|
||||||
|
super._init();
|
||||||
|
this._pipeline = null;
|
||||||
|
}
|
||||||
|
|
||||||
vfunc_paint(paintContext) {
|
vfunc_paint(paintContext) {
|
||||||
|
let framebuffer = paintContext.get_framebuffer();
|
||||||
|
let coglContext = framebuffer.get_context();
|
||||||
let actor = this.get_actor();
|
let actor = this.get_actor();
|
||||||
actor.continue_paint(paintContext);
|
actor.continue_paint(paintContext);
|
||||||
|
|
||||||
let color = new Cogl.Color();
|
if (!this._pipeline) {
|
||||||
color.init_from_4ub(0xff, 0, 0, 0xc4);
|
let color = new Cogl.Color();
|
||||||
Cogl.set_source_color(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 alloc = actor.get_allocation_box();
|
||||||
let width = 2;
|
let width = 2;
|
||||||
|
|
||||||
// clockwise order
|
// clockwise order
|
||||||
Cogl.rectangle(0, 0, alloc.get_width(), width);
|
framebuffer.draw_rectangle(this._pipeline,
|
||||||
Cogl.rectangle(alloc.get_width() - width, width,
|
0, 0, alloc.get_width(), width);
|
||||||
alloc.get_width(), alloc.get_height());
|
framebuffer.draw_rectangle(this._pipeline,
|
||||||
Cogl.rectangle(0, alloc.get_height(),
|
alloc.get_width() - width, width,
|
||||||
alloc.get_width() - width, alloc.get_height() - width);
|
alloc.get_width(), alloc.get_height());
|
||||||
Cogl.rectangle(0, alloc.get_height() - width,
|
framebuffer.draw_rectangle(this._pipeline,
|
||||||
width, width);
|
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;
|
ShellGLSLEffectPrivate *priv;
|
||||||
ClutterActor *actor;
|
ClutterActor *actor;
|
||||||
guint8 paint_opacity;
|
guint8 paint_opacity;
|
||||||
|
CoglFramebuffer *framebuffer;
|
||||||
|
|
||||||
priv = shell_glsl_effect_get_instance_private (self);
|
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,
|
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,
|
priv->pipeline,
|
||||||
0, 0,
|
0, 0,
|
||||||
priv->tex_width, priv->tex_height);
|
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);
|
ShellInvertLightnessEffect *self = SHELL_INVERT_LIGHTNESS_EFFECT (effect);
|
||||||
ClutterActor *actor;
|
ClutterActor *actor;
|
||||||
guint8 paint_opacity;
|
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));
|
actor = clutter_actor_meta_get_actor (CLUTTER_ACTOR_META (effect));
|
||||||
paint_opacity = clutter_actor_get_paint_opacity (actor);
|
paint_opacity = clutter_actor_get_paint_opacity (actor);
|
||||||
|
@ -397,7 +397,7 @@ st_box_layout_paint (ClutterActor *actor,
|
|||||||
ClutterActorBox allocation_box;
|
ClutterActorBox allocation_box;
|
||||||
ClutterActorBox content_box;
|
ClutterActorBox content_box;
|
||||||
ClutterActor *child;
|
ClutterActor *child;
|
||||||
CoglFramebuffer *fb = cogl_get_draw_framebuffer ();
|
CoglFramebuffer *fb = clutter_paint_context_get_framebuffer (paint_context);
|
||||||
|
|
||||||
get_border_paint_offsets (self, &x, &y);
|
get_border_paint_offsets (self, &x, &y);
|
||||||
if (x != 0 || y != 0)
|
if (x != 0 || y != 0)
|
||||||
@ -454,7 +454,7 @@ st_box_layout_pick (ClutterActor *actor,
|
|||||||
ClutterActorBox allocation_box;
|
ClutterActorBox allocation_box;
|
||||||
ClutterActorBox content_box;
|
ClutterActorBox content_box;
|
||||||
ClutterActor *child;
|
ClutterActor *child;
|
||||||
CoglFramebuffer *fb = cogl_get_draw_framebuffer ();
|
CoglFramebuffer *fb = clutter_pick_context_get_framebuffer (pick_context);
|
||||||
|
|
||||||
get_border_paint_offsets (self, &x, &y);
|
get_border_paint_offsets (self, &x, &y);
|
||||||
if (x != 0 || y != 0)
|
if (x != 0 || y != 0)
|
||||||
|
@ -877,11 +877,16 @@ st_entry_paint (ClutterActor *actor,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (priv->text_shadow_material != NULL)
|
if (priv->text_shadow_material != NULL)
|
||||||
_st_paint_shadow_with_opacity (shadow_spec,
|
{
|
||||||
cogl_get_draw_framebuffer (),
|
CoglFramebuffer *framebuffer =
|
||||||
priv->text_shadow_material,
|
clutter_paint_context_get_framebuffer (paint_context);
|
||||||
&allocation,
|
|
||||||
clutter_actor_get_paint_opacity (priv->entry));
|
_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
|
/* Since we paint the background ourselves, chain to the parent class
|
||||||
|
@ -178,10 +178,12 @@ st_icon_paint (ClutterActor *actor,
|
|||||||
if (priv->shadow_pipeline)
|
if (priv->shadow_pipeline)
|
||||||
{
|
{
|
||||||
ClutterActorBox allocation;
|
ClutterActorBox allocation;
|
||||||
|
CoglFramebuffer *framebuffer;
|
||||||
|
|
||||||
clutter_actor_get_allocation_box (priv->icon_texture, &allocation);
|
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,
|
_st_paint_shadow_with_opacity (priv->shadow_spec,
|
||||||
cogl_get_draw_framebuffer (),
|
framebuffer,
|
||||||
priv->shadow_pipeline,
|
priv->shadow_pipeline,
|
||||||
&allocation,
|
&allocation,
|
||||||
clutter_actor_get_paint_opacity (priv->icon_texture));
|
clutter_actor_get_paint_opacity (priv->icon_texture));
|
||||||
|
@ -229,11 +229,17 @@ st_label_paint (ClutterActor *actor,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (priv->text_shadow_pipeline != NULL)
|
if (priv->text_shadow_pipeline != NULL)
|
||||||
_st_paint_shadow_with_opacity (shadow_spec,
|
{
|
||||||
cogl_get_draw_framebuffer (),
|
CoglFramebuffer *framebuffer;
|
||||||
priv->text_shadow_pipeline,
|
|
||||||
&allocation,
|
framebuffer =
|
||||||
clutter_actor_get_paint_opacity (priv->label));
|
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);
|
cogl_color_init_from_4ub (&clear_color, 0, 0, 0, 0);
|
||||||
clutter_actor_get_position (actor, &x, &y);
|
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_clear (fb, COGL_BUFFER_BIT_COLOR, &clear_color);
|
||||||
cogl_framebuffer_translate (fb, -x, -y, 0);
|
cogl_framebuffer_translate (fb, -x, -y, 0);
|
||||||
cogl_framebuffer_orthographic (fb, 0, 0, width, height, 0, 1.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_actor_paint (actor, paint_context);
|
||||||
clutter_paint_context_destroy (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);
|
clutter_actor_set_opacity_override (actor, -1);
|
||||||
|
|
||||||
cogl_object_unref (fb);
|
cogl_object_unref (fb);
|
||||||
|
@ -416,7 +416,7 @@ st_widget_paint_background (StWidget *widget,
|
|||||||
if (!st_widget_get_resource_scale (widget, &resource_scale))
|
if (!st_widget_get_resource_scale (widget, &resource_scale))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
framebuffer = cogl_get_draw_framebuffer ();
|
framebuffer = clutter_paint_context_get_framebuffer (paint_context);
|
||||||
theme_node = st_widget_get_theme_node (widget);
|
theme_node = st_widget_get_theme_node (widget);
|
||||||
|
|
||||||
clutter_actor_get_allocation_box (CLUTTER_ACTOR (widget), &allocation);
|
clutter_actor_get_allocation_box (CLUTTER_ACTOR (widget), &allocation);
|
||||||
|
@ -2,11 +2,13 @@
|
|||||||
|
|
||||||
const UI = imports.testcommon.ui;
|
const UI = imports.testcommon.ui;
|
||||||
|
|
||||||
const { Cogl, Clutter, St } = imports.gi;
|
const { Cogl, Clutter, Meta, St } = imports.gi;
|
||||||
|
|
||||||
|
|
||||||
function test() {
|
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);
|
UI.init(stage);
|
||||||
|
|
||||||
let vbox = new St.BoxLayout({ style: 'background: #ffee88;' });
|
let vbox = new St.BoxLayout({ style: 'background: #ffee88;' });
|
||||||
@ -33,20 +35,32 @@ function test() {
|
|||||||
if (useCairo)
|
if (useCairo)
|
||||||
obin.style = 'border: 3px solid green;';
|
obin.style = 'border: 3px solid green;';
|
||||||
else
|
else
|
||||||
obin.connect_after('paint', actor => {
|
obin.connect_after('paint', (actor, paintContext) => {
|
||||||
Cogl.set_source_color4f(0, 1, 0, 1);
|
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 alloc = actor.get_allocation_box();
|
||||||
let width = 3;
|
let width = 3;
|
||||||
|
|
||||||
// clockwise order
|
// clockwise order
|
||||||
Cogl.rectangle(0, 0, alloc.get_width(), width);
|
framebuffer.draw_rectangle(pipeline,
|
||||||
Cogl.rectangle(alloc.get_width() - width, width,
|
0, 0, alloc.get_width(), width);
|
||||||
alloc.get_width(), alloc.get_height());
|
framebuffer.draw_rectangle(pipeline,
|
||||||
Cogl.rectangle(0, alloc.get_height(),
|
alloc.get_width() - width, width,
|
||||||
alloc.get_width() - width, alloc.get_height() - width);
|
alloc.get_width(), alloc.get_height());
|
||||||
Cogl.rectangle(0, alloc.get_height() - width,
|
framebuffer.draw_rectangle(pipeline,
|
||||||
width, width);
|
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);
|
tbox.add(obin);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user