summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2023-05-16 17:25:17 +0000
committerMatthias Clasen <mclasen@redhat.com>2023-05-16 17:25:17 +0000
commit4efc736a6ee9fdff0132b0f9b66a72c2989751cf (patch)
treed40d532bc6dcd8f330acd08ae4fa7fd6e941b427
parent4a1598dc2a316eb27046467a33c68ff1babb55fa (diff)
parent2b0e3a5b1a595c5c8463706452637c3ed716e0c8 (diff)
downloadgtk+-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
-rw-r--r--demos/node-editor/node-editor-window.c7
-rw-r--r--gdk/gdkdrawcontext.c6
-rw-r--r--gsk/gskrendernodeimpl.c6
-rw-r--r--gsk/gskrendernodeparser.c17
-rw-r--r--gsk/vulkan/gskvulkanclip.c2
-rw-r--r--gsk/vulkan/gskvulkanrenderpass.c2
-rw-r--r--gsk/vulkan/resources/meson.build16
-rw-r--r--gtk/gtkcssimageurl.c16
-rw-r--r--gtk/gtkgridview.c4
-rw-r--r--meson.build1
-rw-r--r--testsuite/css/parser/meson.build2
-rw-r--r--testsuite/css/parser/resource-url.css3
-rw-r--r--testsuite/css/parser/resource-url.ref.css7
-rw-r--r--testsuite/gsk/compare/clip-translate-offscreen.node17
-rw-r--r--testsuite/gsk/compare/clip-translate-offscreen.pngbin0 -> 167 bytes
-rw-r--r--testsuite/gsk/compare/crossfade-clip-both-children.node18
-rw-r--r--testsuite/gsk/compare/crossfade-clip-both-children.pngbin0 -> 214 bytes
-rw-r--r--testsuite/gsk/compare/z-transform-clipping-bounds-3d.node28
-rw-r--r--testsuite/gsk/compare/z-transform-clipping-bounds-3d.pngbin0 -> 331 bytes
-rw-r--r--testsuite/gsk/meson.build3
-rw-r--r--testsuite/gsk/nodeparser/debug-fail.errors4
-rw-r--r--testsuite/gsk/nodeparser/gradient-fail.errors2
-rw-r--r--testsuite/gsk/nodeparser/shadow-fail.errors2
-rw-r--r--testsuite/gsk/nodeparser/text-fail.errors4
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
new file mode 100644
index 0000000000..9fe22b0b47
--- /dev/null
+++ b/testsuite/gsk/compare/clip-translate-offscreen.png
Binary files differ
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
new file mode 100644
index 0000000000..ea47119187
--- /dev/null
+++ b/testsuite/gsk/compare/crossfade-clip-both-children.png
Binary files differ
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
new file mode 100644
index 0000000000..433e3c560f
--- /dev/null
+++ b/testsuite/gsk/compare/z-transform-clipping-bounds-3d.png
Binary files differ
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