From 852f46df190bede875b67afeb93a1e3dd37ca622 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Thu, 4 May 2023 20:53:15 -0400 Subject: [PATCH 1/3] Remove a no longer building test --- testsuite/gtk/meson.build | 3 - testsuite/gtk/window.c | 248 -------------------------------------- 2 files changed, 251 deletions(-) delete mode 100644 testsuite/gtk/window.c diff --git a/testsuite/gtk/meson.build b/testsuite/gtk/meson.build index 2c9fd57b1d..11560a95f4 100644 --- a/testsuite/gtk/meson.build +++ b/testsuite/gtk/meson.build @@ -104,9 +104,6 @@ tests = [ { 'name': 'revealer-size' }, { 'name': 'widgetorder' }, { 'name': 'widget-refcount' }, - # This test was disabled for long enough that it no longer compiles - #{ 'name': 'window', - # 'suites': ['failing'] }, ] # Tests that test private apis and therefore are linked against libgtk-4.a diff --git a/testsuite/gtk/window.c b/testsuite/gtk/window.c deleted file mode 100644 index a003b3bbaf..0000000000 --- a/testsuite/gtk/window.c +++ /dev/null @@ -1,248 +0,0 @@ -#include - -#ifdef GDK_WINDOWING_X11 -#include -#include -#endif - -static gboolean interactive = FALSE; - -static gboolean -stop_main (gpointer data) -{ - gboolean *done = data; - - *done = TRUE; - - g_main_context_wakeup (NULL); - - return G_SOURCE_REMOVE; -} - -static void -on_draw (GtkDrawingArea *da, - cairo_t *cr, - int width, - int height, - gpointer data) -{ - int i, j; - - for (i = 0; 20 * i < width; i++) - { - for (j = 0; 20 * j < height; j++) - { - if ((i + j) % 2 == 1) - cairo_set_source_rgb (cr, 1., 1., 1.); - else - cairo_set_source_rgb (cr, 0., 0., 0.); - - cairo_rectangle (cr, 20. * i, 20. *j, 20., 20.); - cairo_fill (cr); - } - } -} - -static gboolean -on_keypress (GtkEventControllerKey *key, - guint keyval, - guint keycode, - GdkModifierType state, - gpointer data) -{ - gboolean *done = data; - - *done = TRUE; - - g_main_context_wakeup (NULL); - - return GDK_EVENT_PROPAGATE; -} - -static void -test_default_size (void) -{ - GtkWidget *window; - GtkWidget *da; - int w, h; - gboolean done; - - window = gtk_window_new (); - if (interactive) - { - GtkEventController *controller = gtk_event_controller_key_new (); - g_signal_connect (controller, "key-pressed", G_CALLBACK (on_keypress), &done); - gtk_widget_add_controller (window, controller); - } - - da = gtk_drawing_area_new (); - gtk_drawing_area_set_draw_func (GTK_DRAWING_AREA (da), on_draw, NULL, NULL); - gtk_window_set_child (GTK_WINDOW (window), da); - - /* check that default size is unset initially */ - gtk_window_get_default_size (GTK_WINDOW (window), &w, &h); - g_assert_cmpint (w, ==, -1); - g_assert_cmpint (h, ==, -1); - - /* check that setting default size before realize works */ - gtk_window_set_default_size (GTK_WINDOW (window), 300, 300); - - gtk_window_get_default_size (GTK_WINDOW (window), &w, &h); - g_assert_cmpint (w, ==, 300); - g_assert_cmpint (h, ==, 300); - - /* check that the window size is also reported accordingly */ - gtk_window_get_size (GTK_WINDOW (window), &w, &h); - g_assert_cmpint (w, ==, 300); - g_assert_cmpint (h, ==, 300); - - gtk_window_present (GTK_WINDOW (window)); - - done = FALSE; - if (!interactive) - g_timeout_add (200, stop_main, &done); - while (!done) - g_main_context_iteration (NULL, TRUE); - - /* check that the window and its content actually gets the right size */ - gtk_window_get_size (GTK_WINDOW (window), &w, &h); - g_assert_cmpint (w, ==, 300); - g_assert_cmpint (h, ==, 300); - - g_assert_cmpint (gtk_widget_get_allocated_width (da), ==, 300); - g_assert_cmpint (gtk_widget_get_allocated_height (da), ==, 300); - - /* check that setting default size after the fact does not change - * window size - */ - gtk_window_set_default_size (GTK_WINDOW (window), 100, 600); - gtk_window_get_default_size (GTK_WINDOW (window), &w, &h); - g_assert_cmpint (w, ==, 100); - g_assert_cmpint (h, ==, 600); - - done = FALSE; - if (!interactive) - g_timeout_add (200, stop_main, &done); - while (!done) - g_main_context_iteration (NULL, TRUE); - - gtk_window_get_size (GTK_WINDOW (window), &w, &h); - g_assert_cmpint (w, ==, 300); - g_assert_cmpint (h, ==, 300); - - /* check that even hide/show does not pull in the new default */ - gtk_widget_set_visible (window, FALSE); - gtk_widget_set_visible (window, TRUE); - - done = FALSE; - if (!interactive) - g_timeout_add (200, stop_main, &done); - while (!done) - g_main_context_iteration (NULL, TRUE); - - gtk_window_get_size (GTK_WINDOW (window), &w, &h); - g_assert_cmpint (w, ==, 300); - g_assert_cmpint (h, ==, 300); - - gtk_window_destroy (GTK_WINDOW (window)); -} - -static void -test_resize_popup (void) -{ - GtkWidget *window; - int w, h; - gboolean done; - - /* testcase for the dnd window */ - window = gtk_window_new (); - gtk_window_set_decorated (GTK_WINDOW (window), FALSE); - gtk_window_set_default_size (GTK_WINDOW (window), 1, 1); - gtk_window_get_size (GTK_WINDOW (window), &w, &h); - g_assert_cmpint (w, ==, 1); - g_assert_cmpint (h, ==, 1); - - gtk_window_present (GTK_WINDOW (window)); - - done = FALSE; - if (!interactive) - g_timeout_add (200, stop_main, &done); - while (!done) - g_main_context_iteration (NULL, TRUE); - - gtk_window_get_size (GTK_WINDOW (window), &w, &h); - g_assert_cmpint (w, ==, 1); - g_assert_cmpint (h, ==, 1); - - gtk_window_destroy (GTK_WINDOW (window)); -} - -static void -test_show_hide (void) -{ - GtkWidget *window; - int w, h, w1, h1; - gboolean done; - - /*http://bugzilla.gnome.org/show_bug.cgi?id=696882 */ - - /* test that hide/show does not affect the size */ - - window = gtk_window_new (); - - gtk_window_present (GTK_WINDOW (window)); - - done = FALSE; - if (!interactive) - g_timeout_add (200, stop_main, &done); - while (!done) - g_main_context_iteration (NULL, TRUE); - - gtk_window_get_size (GTK_WINDOW (window), &w, &h); - - gtk_widget_hide (window); - - done = FALSE; - if (!interactive) - g_timeout_add (200, stop_main, &done); - while (!done) - g_main_context_iteration (NULL, TRUE); - - gtk_window_get_size (GTK_WINDOW (window), &w1, &h1); - g_assert_cmpint (w, ==, w1); - g_assert_cmpint (h, ==, h1); - - gtk_window_present (GTK_WINDOW (window)); - - done = FALSE; - if (!interactive) - g_timeout_add (200, stop_main, &done); - while (!done) - g_main_context_iteration (NULL, TRUE); - - gtk_window_get_size (GTK_WINDOW (window), &w1, &h1); - g_assert_cmpint (w, ==, w1); - g_assert_cmpint (h, ==, h1); - - gtk_window_destroy (GTK_WINDOW (window)); -} - -int -main (int argc, char *argv[]) -{ - int i; - - gtk_test_init (&argc, &argv); - - for (i = 0; i < argc; i++) - { - if (g_strcmp0 (argv[i], "--interactive") == 0) - interactive = TRUE; - } - - g_test_add_func ("/window/default-size", test_default_size); - g_test_add_func ("/window/resize-popup", test_resize_popup); - g_test_add_func ("/window/show-hide", test_show_hide); - - return g_test_run (); -} From ce6569d1a670a9b2ae03d72c2f22cd9019cf38a6 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Thu, 4 May 2023 22:30:12 -0400 Subject: [PATCH 2/3] gsk: Avoid some offscreens We don't have to be too conservative when checking if a rect is contained in a rounded rect, we have a precise api for this. --- gsk/gl/gskglrenderjob.c | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/gsk/gl/gskglrenderjob.c b/gsk/gl/gskglrenderjob.c index 7fa6408fc2..dc1be07d98 100644 --- a/gsk/gl/gskglrenderjob.c +++ b/gsk/gl/gskglrenderjob.c @@ -1750,22 +1750,13 @@ gsk_gl_render_job_visit_rounded_clip_node (GskGLRenderJob *job, if (job->clip->len <= 1) need_offscreen = FALSE; - else if (rounded_inner_rect_contains_rect (&job->current_clip->rect, &transformed_clip.bounds)) + else if (gsk_rounded_rect_contains_rect (&job->current_clip->rect, &transformed_clip.bounds)) need_offscreen = FALSE; else need_offscreen = TRUE; if (!need_offscreen) { - /* If the new clip entirely contains the current clip, the intersection is simply - * the current clip, so we can ignore the new one. - */ - if (rounded_inner_rect_contains_rect (&transformed_clip, &job->current_clip->rect.bounds)) - { - gsk_gl_render_job_visit_node (job, child); - return; - } - gsk_gl_render_job_push_clip (job, &transformed_clip); gsk_gl_render_job_visit_node (job, child); gsk_gl_render_job_pop_clip (job); From 81fd9741fff111f2347ebac546a090a9ef5f974a Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Fri, 5 May 2023 11:35:35 -0400 Subject: [PATCH 3/3] gsk: Better handling of offscreens Take the scale into account for sizing the offscreens for masks, blends and cross-fades. --- gsk/gl/gskglrenderjob.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gsk/gl/gskglrenderjob.c b/gsk/gl/gskglrenderjob.c index dc1be07d98..25943c3fe1 100644 --- a/gsk/gl/gskglrenderjob.c +++ b/gsk/gl/gskglrenderjob.c @@ -2824,7 +2824,7 @@ gsk_gl_render_job_visit_cross_fade_node (GskGLRenderJob *job, offscreen_end.reset_clip = TRUE; offscreen_end.bounds = &node->bounds; - gsk_gl_render_job_set_modelview (job, NULL); + gsk_gl_render_job_set_modelview (job, gsk_transform_scale (NULL, fabs (job->scale_x), fabs (job->scale_y))); if (!gsk_gl_render_job_visit_node_with_offscreen (job, start_node, &offscreen_start)) { @@ -3243,7 +3243,7 @@ gsk_gl_render_job_visit_blend_node (GskGLRenderJob *job, bottom_offscreen.force_offscreen = TRUE; bottom_offscreen.reset_clip = TRUE; - gsk_gl_render_job_set_modelview (job, NULL); + gsk_gl_render_job_set_modelview (job, gsk_transform_scale (NULL, fabs (job->scale_x), fabs (job->scale_y))); /* TODO: We create 2 textures here as big as the blend node, but both the * start and the end node might be a lot smaller than that. */ @@ -3312,7 +3312,7 @@ gsk_gl_render_job_visit_mask_node (GskGLRenderJob *job, mask_offscreen.reset_clip = TRUE; mask_offscreen.do_not_cache = TRUE; - gsk_gl_render_job_set_modelview (job, NULL); + gsk_gl_render_job_set_modelview (job, gsk_transform_scale (NULL, fabs (job->scale_x), fabs (job->scale_y))); /* TODO: We create 2 textures here as big as the mask node, but both * nodes might be a lot smaller than that.