diff options
author | Matthias Clasen <mclasen@redhat.com> | 2021-01-29 15:15:43 +0000 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2021-01-29 15:15:43 +0000 |
commit | 8eb46bbfb250b90e258bfede2337b89ad66602d5 (patch) | |
tree | 95cb6b89adb1c4c8243fbb3551a92d956c47e912 | |
parent | 1635d9fb78274669380a4514c5a7e3568c4482c3 (diff) | |
parent | 79f273348d9546c3d2a7e1ee9ce4516eb3dc20da (diff) | |
download | gtk+-8eb46bbfb250b90e258bfede2337b89ad66602d5.tar.gz |
Merge branch 'matthiasc/for-master' into 'master'
Matthiasc/for master
Closes #3615
See merge request GNOME/gtk!3132
-rw-r--r-- | demos/node-editor/help-window.ui | 1 | ||||
-rw-r--r-- | demos/node-editor/node-editor-window.c | 20 | ||||
-rw-r--r-- | gsk/gl/gskglrenderer.c | 32 | ||||
-rw-r--r-- | gsk/gl/gskglshaderbuilder.c | 14 | ||||
-rw-r--r-- | tests/showrendernode.c | 113 | ||||
-rw-r--r-- | testsuite/gsk/compare/issue-3615.node | 27 | ||||
-rw-r--r-- | testsuite/gsk/compare/issue-3615.png | bin | 0 -> 385 bytes | |||
-rw-r--r-- | testsuite/gsk/meson.build | 1 |
8 files changed, 150 insertions, 58 deletions
diff --git a/demos/node-editor/help-window.ui b/demos/node-editor/help-window.ui index 7feffb7c18..ad8f50c33e 100644 --- a/demos/node-editor/help-window.ui +++ b/demos/node-editor/help-window.ui @@ -13,6 +13,7 @@ <property name="right-margin">20</property> <property name="top-margin">20</property> <property name="bottom-margin">20</property> + <property name="monospace">1</property> <property name="buffer"> <object class="GtkTextBuffer" id="buffer"/> </property> diff --git a/demos/node-editor/node-editor-window.c b/demos/node-editor/node-editor-window.c index bf1660d6f8..995349b2cb 100644 --- a/demos/node-editor/node-editor-window.c +++ b/demos/node-editor/node-editor-window.c @@ -910,6 +910,26 @@ node_editor_window_init (NodeEditorWindow *self) self->text_buffer = gtk_text_buffer_new (self->tag_table); g_signal_connect (self->text_buffer, "changed", G_CALLBACK (text_changed), self); gtk_text_view_set_buffer (GTK_TEXT_VIEW (self->text_view), self->text_buffer); + + /* Default */ + gtk_text_buffer_set_text (self->text_buffer, + "shadow {\n" + " child: texture {\n" + " bounds: 0 0 128 128;\n" + " texture: url(\"resource:///org/gtk/gtk4/node-editor/icons/apps/org.gtk.gtk4.NodeEditor.Devel.svg\");\n" + " }\n" + " shadows: rgba(0,0,0,0.5) 0 1 12;\n" + "}\n" + "\n" + "transform {\n" + " child: text {\n" + " color: rgb(46,52,54);\n" + " font: \"Cantarell Bold 11\";\n" + " glyphs: \"GTK Node Editor\";\n" + " offset: 8 14.418;\n" + " }\n" + " transform: translate(0, 140);\n" + "}", -1); } NodeEditorWindow * diff --git a/gsk/gl/gskglrenderer.c b/gsk/gl/gskglrenderer.c index 7f1aa2c6cd..5a15bf5911 100644 --- a/gsk/gl/gskglrenderer.c +++ b/gsk/gl/gskglrenderer.c @@ -3833,7 +3833,7 @@ add_offscreen_ops (GskGLRenderer *self, { const float dx = builder->dx; const float dy = builder->dy; - float width, height; + float scaled_width, scaled_height; float scale_x; float scale_y; int render_target; @@ -3889,8 +3889,6 @@ add_offscreen_ops (GskGLRenderer *self, return TRUE; } - width = bounds->size.width; - height = bounds->size.height; scale_x = builder->scale_x; scale_y = builder->scale_y; @@ -3901,23 +3899,23 @@ add_offscreen_ops (GskGLRenderer *self, { const int max_texture_size = gsk_gl_driver_get_max_texture_size (self->gl_driver); - width = ceilf (width * scale_x); - if (width > max_texture_size) + scaled_width = ceilf (bounds->size.width * scale_x); + if (scaled_width > max_texture_size) { - scale_x *= (float)max_texture_size / width; - width = max_texture_size; + scale_x *= (float)max_texture_size / scaled_width; + scaled_width = max_texture_size; } - height = ceilf (height * scale_y); - if (height > max_texture_size) + scaled_height = ceilf (bounds->size.height * scale_y); + if (scaled_height > max_texture_size) { - scale_y *= (float)max_texture_size / height; - height = max_texture_size; + scale_y *= (float)max_texture_size / scaled_height; + scaled_height = max_texture_size; } } gsk_gl_driver_create_render_target (self->gl_driver, - width, height, + scaled_width, scaled_height, filter, filter, &texture_id, &render_target); if (gdk_gl_context_has_debug (self->gl_context)) @@ -3932,9 +3930,11 @@ add_offscreen_ops (GskGLRenderer *self, render_target); } - viewport = GRAPHENE_RECT_INIT ((bounds->origin.x + dx) * scale_x, - (bounds->origin.y + dy) * scale_y, - width, height); + ops_transform_bounds_modelview (builder, bounds, &viewport); + /* Code above will scale the size with the scale we use in the render ops, + * but for the viewport size, we need our own size limited by the texture size */ + viewport.size.width = scaled_width; + viewport.size.height = scaled_height; init_projection_matrix (&item_proj, &viewport); prev_render_target = ops_set_render_target (builder, render_target); @@ -3962,7 +3962,7 @@ add_offscreen_ops (GskGLRenderer *self, g_type_name_from_instance ((GTypeInstance *) child_node), child_node, k ++), - width, height); + scaled_width, scaled_height); } #endif diff --git a/gsk/gl/gskglshaderbuilder.c b/gsk/gl/gskglshaderbuilder.c index 7e47fbd702..d16ad4feb5 100644 --- a/gsk/gl/gskglshaderbuilder.c +++ b/gsk/gl/gskglshaderbuilder.c @@ -64,8 +64,10 @@ prepend_line_numbers (char *code, } static gboolean -check_shader_error (int shader_id, - GError **error) +check_shader_error (int shader_id, + int shader_type, + const char *resource_path, + GError **error) { int status; int log_len; @@ -91,7 +93,9 @@ check_shader_error (int shader_id, prepend_line_numbers (code, s); g_set_error (error, GDK_GL_ERROR, GDK_GL_ERROR_COMPILATION_FAILED, - "Compilation failure in shader.\nSource Code: %s\n\nError Message:\n%s\n\n", + "Compilation failure in %s shader %s.\nSource Code:\n%s\n\nError Message:\n%s\n\n", + (shader_type == GL_FRAGMENT_SHADER ? "fragment" : "vertex"), + resource_path, s->str, buffer); @@ -184,7 +188,7 @@ gsk_gl_shader_builder_create_program (GskGLShaderBuilder *self, }); glCompileShader (vertex_id); - if (!check_shader_error (vertex_id, error)) + if (!check_shader_error (vertex_id, GL_VERTEX_SHADER, resource_path, error)) { glDeleteShader (vertex_id); goto out; @@ -218,7 +222,7 @@ gsk_gl_shader_builder_create_program (GskGLShaderBuilder *self, }); glCompileShader (fragment_id); - if (!check_shader_error (fragment_id, error)) + if (!check_shader_error (fragment_id, GL_FRAGMENT_SHADER, resource_path, error)) { glDeleteShader (fragment_id); goto out; diff --git a/tests/showrendernode.c b/tests/showrendernode.c index 43f99b5198..9d145e6a82 100644 --- a/tests/showrendernode.c +++ b/tests/showrendernode.c @@ -22,6 +22,7 @@ struct _GtkNodeView GtkWidget parent_instance; GskRenderNode *node; + GFileMonitor *file_monitor; }; struct _GtkNodeViewClass @@ -35,6 +36,73 @@ GType gtk_node_view_get_type (void) G_GNUC_CONST; G_DEFINE_TYPE(GtkNodeView, gtk_node_view, GTK_TYPE_WIDGET) static void +deserialize_error_func (const GskParseLocation *start, + const GskParseLocation *end, + const GError *error, + gpointer user_data) +{ + GString *string = g_string_new ("<data>"); + + g_string_append_printf (string, ":%zu:%zu", + start->lines + 1, start->line_chars + 1); + if (start->lines != end->lines || start->line_chars != end->line_chars) + { + g_string_append (string, "-"); + if (start->lines != end->lines) + g_string_append_printf (string, "%zu:", end->lines + 1); + g_string_append_printf (string, "%zu", end->line_chars + 1); + } + + g_warning ("Error at %s: %s", string->str, error->message); + + g_string_free (string, TRUE); +} + +static void +load_file_contents (GtkNodeView *self, + GFile *file) +{ + GBytes *bytes; + GError *error = NULL; + + bytes = g_file_load_bytes (file, NULL, NULL, NULL); + if (bytes == NULL) + return; + + if (!g_utf8_validate (g_bytes_get_data (bytes, NULL), g_bytes_get_size (bytes), NULL)) + { + g_bytes_unref (bytes); + return; + } + + self->node = gsk_render_node_deserialize (bytes, deserialize_error_func, &error); + + if (error) + { + g_critical ("Invalid node file: %s", error->message); + g_clear_error (&error); + return; + } + + gtk_widget_queue_draw (GTK_WIDGET (self)); + + g_bytes_unref (bytes); +} + +static void +file_changed_cb (GFileMonitor *monitor, + GFile *file, + GFile *other_file, + GFileMonitorEvent event_type, + gpointer user_data) +{ + GtkNodeView *self = user_data; + + if (event_type == G_FILE_MONITOR_EVENT_CHANGED) + load_file_contents (self, file); +} + +static void gtk_node_view_measure (GtkWidget *widget, GtkOrientation orientation, int for_size, @@ -102,29 +170,6 @@ gtk_node_view_class_init (GtkNodeViewClass *klass) } static void -deserialize_error_func (const GskParseLocation *start, - const GskParseLocation *end, - const GError *error, - gpointer user_data) -{ - GString *string = g_string_new ("<data>"); - - g_string_append_printf (string, ":%zu:%zu", - start->lines + 1, start->line_chars + 1); - if (start->lines != end->lines || start->line_chars != end->line_chars) - { - g_string_append (string, "-"); - if (start->lines != end->lines) - g_string_append_printf (string, "%zu:", end->lines + 1); - g_string_append_printf (string, "%zu", end->line_chars + 1); - } - - g_warning ("Error at %s: %s", string->str, error->message); - - g_string_free (string, TRUE); -} - -static void quit_cb (GtkWidget *widget, gpointer data) { @@ -140,13 +185,11 @@ main (int argc, char **argv) { GtkWidget *window; GtkWidget *nodeview; - char *contents; - gsize len; - GBytes *bytes; graphene_rect_t node_bounds; GOptionContext *option_context; GError *error = NULL; gboolean done = FALSE; + GFile *file; option_context = g_option_context_new ("NODE-FILE [-o OUTPUT] [--compare]"); g_option_context_add_main_entries (option_context, options, NULL); @@ -175,23 +218,19 @@ main (int argc, char **argv) gtk_window_set_decorated (GTK_WINDOW (window), FALSE); - g_file_get_contents (argv[1], &contents, &len, &error); + file = g_file_new_for_path (argv[1]); + load_file_contents (GTK_NODE_VIEW (nodeview), file); + GTK_NODE_VIEW (nodeview)->file_monitor = g_file_monitor_file (file, G_FILE_MONITOR_NONE, NULL, &error); + g_object_unref (file); + if (error) { g_warning ("%s", error->message); return -1; } - bytes = g_bytes_new_take (contents, len); - GTK_NODE_VIEW (nodeview)->node = gsk_render_node_deserialize (bytes, deserialize_error_func, &error); - g_bytes_unref (bytes); - - if (GTK_NODE_VIEW (nodeview)->node == NULL) - { - g_critical ("Invalid node file: %s", error->message); - g_clear_error (&error); - return -1; - } + g_signal_connect (GTK_NODE_VIEW (nodeview)->file_monitor, + "changed", G_CALLBACK (file_changed_cb), nodeview); if (write_to_filename != NULL) { diff --git a/testsuite/gsk/compare/issue-3615.node b/testsuite/gsk/compare/issue-3615.node new file mode 100644 index 0000000000..4830529fe0 --- /dev/null +++ b/testsuite/gsk/compare/issue-3615.node @@ -0,0 +1,27 @@ +transform { + child: clip { + child: transform { + child: rounded-clip { + child: color { + bounds: 0 0 50 50; + color: rgb(255,0,0); + } + clip: 0 0 30 30 / 15; + } + transform: scale(10); + } + clip: 250 0 587 166; + } + transform: translate(0, 100); +} + +color { color: black; bounds: 250 135 5 10; } +color { color: black; bounds: 255 140 5 10; } +color { color: black; bounds: 260 145 5 10; } +color { color: black; bounds: 265 150 5 10; } +color { color: black; bounds: 270 158 5 10; } +color { color: black; bounds: 275 166 5 10; } +color { color: black; bounds: 280 175 5 10; } +color { color: black; bounds: 285 184 5 13; } +color { color: black; bounds: 290 195 5 20; } +color { color: black; bounds: 295 211 5 55; } diff --git a/testsuite/gsk/compare/issue-3615.png b/testsuite/gsk/compare/issue-3615.png Binary files differnew file mode 100644 index 0000000000..32200a88c6 --- /dev/null +++ b/testsuite/gsk/compare/issue-3615.png diff --git a/testsuite/gsk/meson.build b/testsuite/gsk/meson.build index c23d371e3e..dbe7b9710c 100644 --- a/testsuite/gsk/meson.build +++ b/testsuite/gsk/meson.build @@ -75,6 +75,7 @@ compare_render_tests = [ 'clip-in-rounded-clip1', 'clip-in-rounded-clip2', 'clip-in-rounded-clip3', + 'issue-3615' ] # these are too sensitive to differences in the renderers |