diff options
author | Matthias Clasen <mclasen@redhat.com> | 2023-05-16 17:25:17 +0000 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2023-05-16 17:25:17 +0000 |
commit | 4efc736a6ee9fdff0132b0f9b66a72c2989751cf (patch) | |
tree | d40d532bc6dcd8f330acd08ae4fa7fd6e941b427 | |
parent | 4a1598dc2a316eb27046467a33c68ff1babb55fa (diff) | |
parent | 2b0e3a5b1a595c5c8463706452637c3ed716e0c8 (diff) | |
download | gtk+-4efc736a6ee9fdff0132b0f9b66a72c2989751cf.tar.gz |
Merge branch 'wip/otte/for-main' into 'main'
gdk: Clamp frame region to surface size
Closes #5812
See merge request GNOME/gtk!5976
24 files changed, 127 insertions, 40 deletions
diff --git a/demos/node-editor/node-editor-window.c b/demos/node-editor/node-editor-window.c index 2872d83320..9cbc458f9a 100644 --- a/demos/node-editor/node-editor-window.c +++ b/demos/node-editor/node-editor-window.c @@ -1701,6 +1701,13 @@ node_editor_window_init (NodeEditorWindow *self) " }\n" " transform: translate(0, 140);\n" "}", -1); + + if (g_getenv ("GSK_RENDERER")) + { + char *new_title = g_strdup_printf ("GTK Node Editor - %s", g_getenv ("GSK_RENDERER")); + gtk_window_set_title (GTK_WINDOW (self), new_title); + g_free (new_title); + } } NodeEditorWindow * diff --git a/gdk/gdkdrawcontext.c b/gdk/gdkdrawcontext.c index 8699807cab..e461ebdd28 100644 --- a/gdk/gdkdrawcontext.c +++ b/gdk/gdkdrawcontext.c @@ -371,6 +371,12 @@ gdk_draw_context_begin_frame_full (GdkDrawContext *context, priv->surface->paint_context = g_object_ref (context); GDK_DRAW_CONTEXT_GET_CLASS (context)->begin_frame (context, prefers_high_depth, priv->frame_region); + + cairo_region_intersect_rectangle (priv->frame_region, + &(cairo_rectangle_int_t) { + 0, 0, + priv->surface->width, priv->surface->height + }); } #ifdef HAVE_SYSPROF diff --git a/gsk/gskrendernodeimpl.c b/gsk/gskrendernodeimpl.c index 90ef6fd13f..c60bd5b00f 100644 --- a/gsk/gskrendernodeimpl.c +++ b/gsk/gskrendernodeimpl.c @@ -4413,6 +4413,11 @@ gsk_shadow_node_draw (GskRenderNode *node, pattern = cairo_pop_group (cr); cairo_restore (cr); + cairo_save (cr); + /* clip so the blur area stays small */ + gsk_cairo_rectangle (cr, &node->bounds); + cairo_clip (cr); + for (i = 0; i < self->n_shadows; i++) { GskShadow *shadow = &self->shadows[i]; @@ -4434,6 +4439,7 @@ gsk_shadow_node_draw (GskRenderNode *node, cairo_set_source (cr, pattern); cairo_paint (cr); + cairo_restore (cr); cairo_pattern_destroy (pattern); } diff --git a/gsk/gskrendernodeparser.c b/gsk/gskrendernodeparser.c index 5c29ce0918..c8ffad4bd1 100644 --- a/gsk/gskrendernodeparser.c +++ b/gsk/gskrendernodeparser.c @@ -1081,20 +1081,21 @@ parse_declarations (GtkCssParser *parser, { if (gtk_css_parser_try_ident (parser, declarations[i].name)) { + if (parsed & (1 << i)) + { + gtk_css_parser_warn_syntax (parser, "Variable \"%s\" defined multiple times", declarations[i].name); + /* Unset, just to be sure */ + parsed &= ~(1 << i); + if (declarations[i].clear_func) + declarations[i].clear_func (declarations[i].result); + } + if (!gtk_css_parser_try_token (parser, GTK_CSS_TOKEN_COLON)) { gtk_css_parser_error_syntax (parser, "Expected ':' after variable declaration"); } else { - if (parsed & (1 << i)) - { - gtk_css_parser_warn_syntax (parser, "Variable \"%s\" defined multiple times", declarations[i].name); - /* Unset, just to be sure */ - parsed &= ~(1 << i); - if (declarations[i].clear_func) - declarations[i].clear_func (declarations[i].result); - } if (!declarations[i].parse_func (parser, context, declarations[i].result)) { /* nothing to do */ diff --git a/gsk/vulkan/gskvulkanclip.c b/gsk/vulkan/gskvulkanclip.c index c157b4aab6..7f54ad2899 100644 --- a/gsk/vulkan/gskvulkanclip.c +++ b/gsk/vulkan/gskvulkanclip.c @@ -106,7 +106,7 @@ gsk_vulkan_clip_intersect_rounded_rect (GskVulkanClip *dest, break; case GSK_VULKAN_CLIP_NONE: - dest->type = gsk_rounded_rect_is_circular (&dest->rect) ? GSK_VULKAN_CLIP_ROUNDED_CIRCULAR : GSK_VULKAN_CLIP_ROUNDED; + dest->type = gsk_rounded_rect_is_circular (rounded) ? GSK_VULKAN_CLIP_ROUNDED_CIRCULAR : GSK_VULKAN_CLIP_ROUNDED; gsk_rounded_rect_init_copy (&dest->rect, rounded); break; diff --git a/gsk/vulkan/gskvulkanrenderpass.c b/gsk/vulkan/gskvulkanrenderpass.c index c23aa0ba7b..f364b7f4c1 100644 --- a/gsk/vulkan/gskvulkanrenderpass.c +++ b/gsk/vulkan/gskvulkanrenderpass.c @@ -157,7 +157,7 @@ gsk_vulkan_render_pass_new (GdkVulkanContext *context, graphene_matrix_init_ortho (&self->p, viewport->origin.x, viewport->origin.x + viewport->size.width, viewport->origin.y, viewport->origin.y + viewport->size.height, - ORTHO_NEAR_PLANE, + 2 * ORTHO_NEAR_PLANE - ORTHO_FAR_PLANE, ORTHO_FAR_PLANE); if (signal_semaphore != VK_NULL_HANDLE) // this is a dependent pass diff --git a/gsk/vulkan/resources/meson.build b/gsk/vulkan/resources/meson.build index 3486a8868b..86e98acb9e 100644 --- a/gsk/vulkan/resources/meson.build +++ b/gsk/vulkan/resources/meson.build @@ -1,10 +1,9 @@ -# FIXME: what's up with these? -#gsk_private_vulkan_include_shaders = [ -# 'clip.frag.glsl', -# 'clip.vert.glsl', -# 'constants.glsl', -# 'rounded-rect.glsl', -#] +gsk_private_vulkan_include_shaders = [ + 'clip.frag.glsl', + 'clip.vert.glsl', + 'constants.glsl', + 'rounded-rect.glsl', +] gsk_private_vulkan_fragment_shaders = [ 'blendmode.frag', @@ -51,6 +50,7 @@ foreach shader: gsk_private_vulkan_shaders compiled_shader = custom_target(spv_shader, input: shader, output: spv_shader, + depend_files: gsk_private_vulkan_include_shaders, command: [ glslc, stage_arg, @@ -61,6 +61,7 @@ foreach shader: gsk_private_vulkan_shaders compiled_clip_shader = custom_target(clip_spv_shader, input: shader, output: clip_spv_shader, + depend_files: gsk_private_vulkan_include_shaders, command: [ glslc, stage_arg, @@ -71,6 +72,7 @@ foreach shader: gsk_private_vulkan_shaders compiled_clip_rounded_shader = custom_target(clip_rounded_spv_shader, input: shader, output: clip_rounded_spv_shader, + depend_files: gsk_private_vulkan_include_shaders, command: [ glslc, stage_arg, diff --git a/gtk/gtkcssimageurl.c b/gtk/gtkcssimageurl.c index d6a03c3483..d0dbe2a26c 100644 --- a/gtk/gtkcssimageurl.c +++ b/gtk/gtkcssimageurl.c @@ -47,21 +47,7 @@ gtk_css_image_url_load_image (GtkCssImageUrl *url, return url->loaded_image; } - /* We special case resources here so we can use gdk_texture_new_from_resource. */ - if (g_file_has_uri_scheme (url->file, "resource")) - { - char *uri = g_file_get_uri (url->file); - char *resource_path = g_uri_unescape_string (uri + strlen ("resource://"), NULL); - - texture = gdk_texture_new_from_resource (resource_path); - - g_free (resource_path); - g_free (uri); - } - else - { - texture = gdk_texture_new_from_file (url->file, &local_error); - } + texture = gdk_texture_new_from_file (url->file, &local_error); if (texture == NULL) { diff --git a/gtk/gtkgridview.c b/gtk/gtkgridview.c index 274f34c3c9..885826a138 100644 --- a/gtk/gtkgridview.c +++ b/gtk/gtkgridview.c @@ -657,7 +657,7 @@ gtk_grid_view_measure_list (GtkWidget *widget, gtk_grid_view_measure_column_size (self, &col_min, &col_nat); for_size = MAX (for_size, col_min * (int) self->min_columns); n_columns = gtk_grid_view_compute_n_columns (self, for_size, xspacing, col_min, col_nat); - column_size = for_size / n_columns; + column_size = (for_size + xspacing) / n_columns - xspacing; i = 0; row_height = 0; @@ -770,7 +770,7 @@ gtk_grid_view_size_allocate (GtkWidget *widget, orientation == GTK_ORIENTATION_VERTICAL ? width : height, xspacing, col_min, col_nat); - self->column_width = (orientation == GTK_ORIENTATION_VERTICAL ? width : height) / self->n_columns; + self->column_width = ((orientation == GTK_ORIENTATION_VERTICAL ? width : height) + xspacing) / self->n_columns - xspacing; self->column_width = MAX (self->column_width, col_min); /* step 2: determine height of known rows */ diff --git a/meson.build b/meson.build index 65eba0bd3a..04f985f19f 100644 --- a/meson.build +++ b/meson.build @@ -298,6 +298,7 @@ elif cc.get_id() == 'gcc' or cc.get_id() == 'clang' 'address', 'array-bounds', 'empty-body', + 'enum-int-mismatch', 'implicit', 'implicit-fallthrough', # For non-gcc 'implicit-fallthrough=5', # For GCC, only recognize the attribute and no comments diff --git a/testsuite/css/parser/meson.build b/testsuite/css/parser/meson.build index b59ad993c8..b05efb7fd2 100644 --- a/testsuite/css/parser/meson.build +++ b/testsuite/css/parser/meson.build @@ -466,6 +466,8 @@ test_data = [ 'radial-positions.errors', 'radial-positions.ref.css', 'radial.ref.css', + 'resource-url.css', + 'resource-url.ref.css', 'rotate3d-crash.css', 'rotate3d-crash.errors', 'rotate3d-crash.ref.css', diff --git a/testsuite/css/parser/resource-url.css b/testsuite/css/parser/resource-url.css new file mode 100644 index 0000000000..04541160e2 --- /dev/null +++ b/testsuite/css/parser/resource-url.css @@ -0,0 +1,3 @@ +window { background-image: url("resource://"); } + +button { background-image: url("resource://doesnotexist.jpg"); } diff --git a/testsuite/css/parser/resource-url.ref.css b/testsuite/css/parser/resource-url.ref.css new file mode 100644 index 0000000000..439229a509 --- /dev/null +++ b/testsuite/css/parser/resource-url.ref.css @@ -0,0 +1,7 @@ +window { + background-image: none /* invalid image */; +} + +button { + background-image: none /* invalid image */; +} diff --git a/testsuite/gsk/compare/clip-translate-offscreen.node b/testsuite/gsk/compare/clip-translate-offscreen.node new file mode 100644 index 0000000000..b5313e3de5 --- /dev/null +++ b/testsuite/gsk/compare/clip-translate-offscreen.node @@ -0,0 +1,17 @@ +color { + bounds: 0 0 50 50; + color: rgb(0,0,0); +} +clip { + clip: 10 10 30 30; + child: transform { + transform: translate(10, 10); + child: opacity { + opacity: 0.8; + child: color { + bounds: -50 -50 100 100; + color: rgb(255,0,0); + } + } + } +} diff --git a/testsuite/gsk/compare/clip-translate-offscreen.png b/testsuite/gsk/compare/clip-translate-offscreen.png Binary files differnew file mode 100644 index 0000000000..9fe22b0b47 --- /dev/null +++ b/testsuite/gsk/compare/clip-translate-offscreen.png diff --git a/testsuite/gsk/compare/crossfade-clip-both-children.node b/testsuite/gsk/compare/crossfade-clip-both-children.node new file mode 100644 index 0000000000..7af2338519 --- /dev/null +++ b/testsuite/gsk/compare/crossfade-clip-both-children.node @@ -0,0 +1,18 @@ +color { + bounds: 0 0 150 50; + color: rgb(0,0,0); +} +clip { + clip: 50 0 50 50; + child: cross-fade { + progress: 0.6; + start: color { + bounds: 0 0 50 50; + color: rgb(255,0,0); + } + end: color { + bounds: 100 0 50 50; + color: rgb(0,0,255); + } + } +} diff --git a/testsuite/gsk/compare/crossfade-clip-both-children.png b/testsuite/gsk/compare/crossfade-clip-both-children.png Binary files differnew file mode 100644 index 0000000000..ea47119187 --- /dev/null +++ b/testsuite/gsk/compare/crossfade-clip-both-children.png diff --git a/testsuite/gsk/compare/z-transform-clipping-bounds-3d.node b/testsuite/gsk/compare/z-transform-clipping-bounds-3d.node new file mode 100644 index 0000000000..ebd4b09bd9 --- /dev/null +++ b/testsuite/gsk/compare/z-transform-clipping-bounds-3d.node @@ -0,0 +1,28 @@ +transform { + transform: translate3d(0, 0, -10000); + child: color { + bounds: 0 0 50 50; + color: rgb(255,0,0); + } +} +transform { + transform: translate3d(0, 0, -10001); + child: color { + bounds: 50 0 50 50; + color: rgb(255,255,0); + } +} +transform { + transform: translate3d(0, 0, 10000); + child: color { + bounds: 0 50 50 50; + color: rgb(0,255,0); + } +} +transform { + transform: translate3d(0, 0, 10001); + child: color { + bounds: 50 50 50 50; + color: rgb(0,0,255); + } +} diff --git a/testsuite/gsk/compare/z-transform-clipping-bounds-3d.png b/testsuite/gsk/compare/z-transform-clipping-bounds-3d.png Binary files differnew file mode 100644 index 0000000000..433e3c560f --- /dev/null +++ b/testsuite/gsk/compare/z-transform-clipping-bounds-3d.png diff --git a/testsuite/gsk/meson.build b/testsuite/gsk/meson.build index 7ef11174ae..263d13cf29 100644 --- a/testsuite/gsk/meson.build +++ b/testsuite/gsk/meson.build @@ -31,9 +31,11 @@ compare_render_tests = [ 'clipped-repeat-3d-ngl', 'clipped_rounded_clip', 'clip-nested1', + 'clip-translate-offscreen', 'color-blur0', 'color-matrix-identity', 'color-matrix-parsing', + 'crossfade-clip-both-children', 'cross-fade-in-opacity', 'cross-fade-in-rotate', 'css-background', @@ -88,6 +90,7 @@ compare_render_tests = [ 'texture-url', 'transform-in-transform', 'transform-in-transform-in-transform', + 'z-transform-clipping-bounds-3d', ] # these are too sensitive to differences in the renderers diff --git a/testsuite/gsk/nodeparser/debug-fail.errors b/testsuite/gsk/nodeparser/debug-fail.errors index e8b664c7d9..0b8b382c70 100644 --- a/testsuite/gsk/nodeparser/debug-fail.errors +++ b/testsuite/gsk/nodeparser/debug-fail.errors @@ -1,2 +1,2 @@ -<data>:5:10-11: error: GTK_CSS_PARSER_WARNING_SYNTAX -<data>:6:8-9: error: GTK_CSS_PARSER_WARNING_SYNTAX +<data>:5:3-10: error: GTK_CSS_PARSER_WARNING_SYNTAX +<data>:6:3-8: error: GTK_CSS_PARSER_WARNING_SYNTAX diff --git a/testsuite/gsk/nodeparser/gradient-fail.errors b/testsuite/gsk/nodeparser/gradient-fail.errors index 052224ba76..259b20a3d5 100644 --- a/testsuite/gsk/nodeparser/gradient-fail.errors +++ b/testsuite/gsk/nodeparser/gradient-fail.errors @@ -1 +1 @@ -<data>:3:8-9: error: GTK_CSS_PARSER_WARNING_SYNTAX +<data>:3:3-8: error: GTK_CSS_PARSER_WARNING_SYNTAX diff --git a/testsuite/gsk/nodeparser/shadow-fail.errors b/testsuite/gsk/nodeparser/shadow-fail.errors index bb77a372fc..d6984612c1 100644 --- a/testsuite/gsk/nodeparser/shadow-fail.errors +++ b/testsuite/gsk/nodeparser/shadow-fail.errors @@ -2,7 +2,7 @@ <data>:2:11-13: error: GTK_CSS_PARSER_ERROR_UNKNOWN_VALUE <data>:2:13-14: error: GTK_CSS_PARSER_ERROR_SYNTAX <data>:2:13-14: error: GTK_CSS_PARSER_ERROR_UNKNOWN_VALUE -<data>:3:9-10: error: GTK_CSS_PARSER_WARNING_SYNTAX +<data>:3:2-9: error: GTK_CSS_PARSER_WARNING_SYNTAX <data>:3:11-13: error: GTK_CSS_PARSER_ERROR_SYNTAX <data>:3:11-13: error: GTK_CSS_PARSER_ERROR_UNKNOWN_VALUE <data>:3:13-14: error: GTK_CSS_PARSER_ERROR_SYNTAX diff --git a/testsuite/gsk/nodeparser/text-fail.errors b/testsuite/gsk/nodeparser/text-fail.errors index 1df16b5cff..612c1ad4b5 100644 --- a/testsuite/gsk/nodeparser/text-fail.errors +++ b/testsuite/gsk/nodeparser/text-fail.errors @@ -1,3 +1,3 @@ -<data>:4:7-8: error: GTK_CSS_PARSER_WARNING_SYNTAX -<data>:6:9-10: error: GTK_CSS_PARSER_WARNING_SYNTAX +<data>:4:3-7: error: GTK_CSS_PARSER_WARNING_SYNTAX +<data>:6:3-9: error: GTK_CSS_PARSER_WARNING_SYNTAX <data>:8:1-2: error: GTK_CSS_PARSER_ERROR_UNKNOWN_VALUE |