Skip to content
  • Daniel van Vugt's avatar
    clutter: Fix offscreen-effect painting of clones · 8655bc5d
    Daniel van Vugt authored and Marco Trevisan's avatar Marco Trevisan committed
    `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,
    #196,
    #282,
    gnome-shell#387,
    https://launchpad.net/bugs/1767648,
    https://launchpad.net/bugs/1779615
    8655bc5d