8655bc5d8d
`ClutterOffscreenEffect` had been getting the wrong bounding box in the case of clones and descendents of clones, causing visibly incorrect clipping. This was due to `clutter_actor_get_paint_box` only ever being given the source actor during a paint (which is correct) and not the clone. Even if we weren't painting a clone but an offscreened descendent of a clone (like in gnome-shell's desktop zoom), we would get the wrong result. Fortunately we don't need to know the actual clone/actor being painted so don't need to call the problematic `clutter_actor_get_paint_box` at all. The solution is to only keep untransformed rendering in the FBO and leave the correct transformation for later. The correct clone/actor's transformation is already set for us as the current cogl modelview matrix by `clutter_actor_paint`. Bonus optimization: This all means we don't need to keep `last_matrix_drawn` or force a full repaint every time some part of the transformation changes. Because the FBO contents are no longer affected by transformations. As it should be. In other words, offscreen-effected actors can now move around on screen without themselves being repainted. Special thanks to Mai Lavelle for identifying the cause of the problem. Fixes: https://bugzilla.gnome.org/show_bug.cgi?id=789050, https://bugzilla.gnome.org/show_bug.cgi?id=659523#c9, https://gitlab.gnome.org/GNOME/mutter/issues/196, https://gitlab.gnome.org/GNOME/mutter/issues/282, https://gitlab.gnome.org/GNOME/gnome-shell/issues/387, https://launchpad.net/bugs/1767648, https://launchpad.net/bugs/1779615 |
||
---|---|---|
.. | ||
scripts | ||
actor-anchors.c | ||
actor-destroy.c | ||
actor-graph.c | ||
actor-invariants.c | ||
actor-iter.c | ||
actor-layout.c | ||
actor-meta.c | ||
actor-offscreen-redirect.c | ||
actor-paint-opacity.c | ||
actor-pick.c | ||
actor-shader-effect.c | ||
actor-size.c | ||
animator.c | ||
behaviours.c | ||
binding-pool.c | ||
cairo-texture.c | ||
cally-text.c | ||
color.c | ||
group.c | ||
interval.c | ||
meson.build | ||
model.c | ||
path.c | ||
rectangle.c | ||
score.c | ||
script-parser.c | ||
state.c | ||
text-cache.c | ||
text.c | ||
texture-fbo.c | ||
texture.c | ||
timeline-interpolate.c | ||
timeline-progress.c | ||
timeline-rewind.c | ||
timeline.c | ||
units.c |