mutter/clutter/tests/conform/meson.build
Daniel van Vugt 8655bc5d8d clutter: Fix offscreen-effect painting of clones
`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
2019-01-24 17:00:25 +00:00

83 lines
2.0 KiB
Meson

clutter_tests_conform_srcdir = join_paths(clutter_srcdir, 'tests/conform')
clutter_tests_conform_builddir = join_paths(clutter_builddir, 'tests/conform')
clutter_tests_conform_c_args = [
'-DG_LOG_DOMAIN="Clutter-Conform"',
'-DCOGL_DISABLE_DEPRECATION_WARNINGS',
]
clutter_tests_conform_c_args += clutter_debug_c_args
clutter_tests_conform_link_args = [
'-Wl,--export-dynamic',
]
clutter_conform_tests_actor_tests = [
'actor-anchors',
'actor-destroy',
'actor-graph',
'actor-invariants',
'actor-iter',
'actor-layout',
'actor-meta',
'actor-offscreen-redirect',
'actor-paint-opacity',
'actor-pick',
'actor-shader-effect',
'actor-size',
]
clutter_conform_tests_classes_tests = [
'text',
]
clutter_conform_tests_general_tests = [
'binding-pool',
'color',
'interval',
'model',
'script-parser',
'units',
]
clutter_conform_tests_deprecated_tests = [
'animator',
'behaviours',
'group',
'rectangle',
'texture',
]
clutter_conform_tests = []
clutter_conform_tests += clutter_conform_tests_actor_tests
clutter_conform_tests += clutter_conform_tests_classes_tests
clutter_conform_tests += clutter_conform_tests_general_tests
clutter_conform_tests += clutter_conform_tests_deprecated_tests
test_env = environment()
test_env.set('G_TEST_SRCDIR', clutter_tests_conform_srcdir)
test_env.set('G_TEST_BUILDDIR', clutter_tests_conform_builddir)
test_env.set('G_ENABLE_DIAGNOSTIC', '0')
test_env.set('CLUTTER_ENABLE_DIAGNOSTIC', '0')
test_env.set('CLUTTER_SCALE', '1')
foreach test : clutter_conform_tests
test_executable = executable('@0@'.format(test),
sources: [
'@0@.c'.format(test),
],
include_directories: clutter_includes,
c_args: clutter_tests_conform_c_args,
link_args: clutter_tests_conform_link_args,
dependencies: [
clutter_deps,
libmutter_clutter_dep,
libmutter_cogl_path_dep
],
install: false,
)
test('clutter/conform/@0@'.format(test), test_executable,
env: test_env
)
endforeach