summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimm Bäder <mail@baedert.org>2020-09-25 13:35:20 +0000
committerTimm Bäder <mail@baedert.org>2020-09-25 13:35:20 +0000
commit09564a579811a20f429a304f65a6fab33e36202f (patch)
tree65dcf80b0a86839cc62c0bfd79cedcdd1102adbe
parente6d5a3c4e8fe8c6b68e1bd8c2aa7c58883c3b6cd (diff)
parent2f9328747370c6adb1e90ba6187893ff0af6c95c (diff)
downloadgtk+-09564a579811a20f429a304f65a6fab33e36202f.tar.gz
Merge branch 'wip/baedert/for-master' into 'master'
Wip/baedert/for master See merge request GNOME/gtk!2617
-rw-r--r--gsk/gl/gskglrenderer.c112
-rw-r--r--gsk/gl/gskglrenderops.c4
-rw-r--r--gsk/gl/gskglrenderopsprivate.h6
-rw-r--r--gsk/resources/glsl/linear_gradient.glsl2
-rw-r--r--gsk/resources/glsl/radial_gradient.glsl2
-rw-r--r--gtk/gtkcssimagefallback.c28
-rw-r--r--gtk/gtktextbuffer.c23
-rw-r--r--gtk/theme/Adwaita/_common.scss3
8 files changed, 108 insertions, 72 deletions
diff --git a/gsk/gl/gskglrenderer.c b/gsk/gl/gskglrenderer.c
index 96aecbd70b..501daeb45c 100644
--- a/gsk/gl/gskglrenderer.c
+++ b/gsk/gl/gskglrenderer.c
@@ -1175,21 +1175,29 @@ render_linear_gradient_node (GskGLRenderer *self,
GskRenderNode *node,
RenderOpBuilder *builder)
{
- const int n_color_stops = MIN (8, gsk_linear_gradient_node_get_n_color_stops (node));
- const GskColorStop *stops = gsk_linear_gradient_node_peek_color_stops (node, NULL);
- const graphene_point_t *start = gsk_linear_gradient_node_peek_start (node);
- const graphene_point_t *end = gsk_linear_gradient_node_peek_end (node);
-
- ops_set_program (builder, &self->programs->linear_gradient_program);
- ops_set_linear_gradient (builder,
- n_color_stops,
- stops,
- builder->dx + start->x,
- builder->dy + start->y,
- builder->dx + end->x,
- builder->dy + end->y);
+ const int n_color_stops = gsk_linear_gradient_node_get_n_color_stops (node);
- load_vertex_data (ops_draw (builder, NULL), node, builder);
+ if (n_color_stops < GL_MAX_GRADIENT_STOPS)
+ {
+ const GskColorStop *stops = gsk_linear_gradient_node_peek_color_stops (node, NULL);
+ const graphene_point_t *start = gsk_linear_gradient_node_peek_start (node);
+ const graphene_point_t *end = gsk_linear_gradient_node_peek_end (node);
+
+ ops_set_program (builder, &self->programs->linear_gradient_program);
+ ops_set_linear_gradient (builder,
+ n_color_stops,
+ stops,
+ builder->dx + start->x,
+ builder->dy + start->y,
+ builder->dx + end->x,
+ builder->dy + end->y);
+
+ load_vertex_data (ops_draw (builder, NULL), node, builder);
+ }
+ else
+ {
+ render_fallback_node (self, node, builder);
+ }
}
static inline void
@@ -1197,25 +1205,33 @@ render_radial_gradient_node (GskGLRenderer *self,
GskRenderNode *node,
RenderOpBuilder *builder)
{
- const float scale = ops_get_scale (builder);
- const int n_color_stops = MIN (8, gsk_radial_gradient_node_get_n_color_stops (node));
- const GskColorStop *stops = gsk_radial_gradient_node_peek_color_stops (node, NULL);
- const graphene_point_t *center = gsk_radial_gradient_node_peek_center (node);
- const float start = gsk_radial_gradient_node_get_start (node);
- const float end = gsk_radial_gradient_node_get_end (node);
- const float hradius = gsk_radial_gradient_node_get_hradius (node);
- const float vradius = gsk_radial_gradient_node_get_vradius (node);
-
- ops_set_program (builder, &self->programs->radial_gradient_program);
- ops_set_radial_gradient (builder,
- n_color_stops,
- stops,
- builder->dx + center->x,
- builder->dy + center->y,
- start, end,
- hradius * scale, vradius * scale);
+ const int n_color_stops = gsk_radial_gradient_node_get_n_color_stops (node);
- load_vertex_data (ops_draw (builder, NULL), node, builder);
+ if (n_color_stops < GL_MAX_GRADIENT_STOPS)
+ {
+ const GskColorStop *stops = gsk_radial_gradient_node_peek_color_stops (node, NULL);
+ const graphene_point_t *center = gsk_radial_gradient_node_peek_center (node);
+ const float start = gsk_radial_gradient_node_get_start (node);
+ const float end = gsk_radial_gradient_node_get_end (node);
+ const float hradius = gsk_radial_gradient_node_get_hradius (node);
+ const float vradius = gsk_radial_gradient_node_get_vradius (node);
+
+ ops_set_program (builder, &self->programs->radial_gradient_program);
+ ops_set_radial_gradient (builder,
+ n_color_stops,
+ stops,
+ builder->dx + center->x,
+ builder->dy + center->y,
+ start, end,
+ hradius * builder->scale_x,
+ vradius * builder->scale_y);
+
+ load_vertex_data (ops_draw (builder, NULL), node, builder);
+ }
+ else
+ {
+ render_fallback_node (self, node, builder);
+ }
}
static inline gboolean
@@ -1332,17 +1348,18 @@ render_clipped_child (GskGLRenderer *self,
else
{
/* well fuck */
- const float scale = ops_get_scale (builder);
+ const float scale_x = builder->scale_x;
+ const float scale_y = builder->scale_y;
gboolean is_offscreen;
TextureRegion region;
GskRoundedRect scaled_clip;
memset (&scaled_clip, 0, sizeof (GskRoundedRect));
- scaled_clip.bounds.origin.x = clip->origin.x * scale;
- scaled_clip.bounds.origin.y = clip->origin.y * scale;
- scaled_clip.bounds.size.width = clip->size.width * scale;
- scaled_clip.bounds.size.height = clip->size.height * scale;
+ scaled_clip.bounds.origin.x = clip->origin.x * scale_x;
+ scaled_clip.bounds.origin.y = clip->origin.y * scale_y;
+ scaled_clip.bounds.size.width = clip->size.width * scale_x;
+ scaled_clip.bounds.size.height = clip->size.height * scale_y;
ops_push_clip (builder, &scaled_clip);
if (!add_offscreen_ops (self, builder, &child->bounds,
@@ -1375,7 +1392,8 @@ render_rounded_clip_node (GskGLRenderer *self,
GskRenderNode *node,
RenderOpBuilder *builder)
{
- const float scale = ops_get_scale (builder);
+ const float scale_x = builder->scale_x;
+ const float scale_y = builder->scale_y;
const GskRoundedRect *clip = gsk_rounded_clip_node_peek_clip (node);
GskRenderNode *child = gsk_rounded_clip_node_get_child (node);
GskRoundedRect transformed_clip;
@@ -1388,8 +1406,8 @@ render_rounded_clip_node (GskGLRenderer *self,
ops_transform_bounds_modelview (builder, &clip->bounds, &transformed_clip.bounds);
for (i = 0; i < 4; i ++)
{
- transformed_clip.corner[i].width = clip->corner[i].width * scale;
- transformed_clip.corner[i].height = clip->corner[i].height * scale;
+ transformed_clip.corner[i].width = clip->corner[i].width * scale_x;
+ transformed_clip.corner[i].height = clip->corner[i].height * scale_y;
}
if (builder->clip_is_rectilinear)
@@ -1447,16 +1465,16 @@ render_rounded_clip_node (GskGLRenderer *self,
*
* We do, however, apply the scale factor to the child clip of course.
*/
- scaled_clip.bounds.origin.x = clip->bounds.origin.x * scale;
- scaled_clip.bounds.origin.y = clip->bounds.origin.y * scale;
- scaled_clip.bounds.size.width = clip->bounds.size.width * scale;
- scaled_clip.bounds.size.height = clip->bounds.size.height * scale;
+ scaled_clip.bounds.origin.x = clip->bounds.origin.x * scale_x;
+ scaled_clip.bounds.origin.y = clip->bounds.origin.y * scale_y;
+ scaled_clip.bounds.size.width = clip->bounds.size.width * scale_x;
+ scaled_clip.bounds.size.height = clip->bounds.size.height * scale_y;
/* Increase corner radius size by scale factor */
for (i = 0; i < 4; i ++)
{
- scaled_clip.corner[i].width = clip->corner[i].width * scale;
- scaled_clip.corner[i].height = clip->corner[i].height * scale;
+ scaled_clip.corner[i].width = clip->corner[i].width * scale_x;
+ scaled_clip.corner[i].height = clip->corner[i].height * scale_y;
}
ops_push_clip (builder, &scaled_clip);
@@ -3089,7 +3107,7 @@ gsk_gl_renderer_create_programs (GskGLRenderer *self,
out:
gsk_gl_shader_builder_finish (&shader_builder);
- if (error && !(*error))
+ if (error && !(*error) && !programs)
g_set_error (error, GDK_GL_ERROR, GDK_GL_ERROR_COMPILATION_FAILED,
"Failed to compile all shader programs"); /* Probably, eh. */
diff --git a/gsk/gl/gskglrenderops.c b/gsk/gl/gskglrenderops.c
index 7713f294eb..c3ffce648d 100644
--- a/gsk/gl/gskglrenderops.c
+++ b/gsk/gl/gskglrenderops.c
@@ -909,7 +909,7 @@ ops_set_linear_gradient (RenderOpBuilder *self,
{
ProgramState *current_program_state = get_current_program_state (self);
OpLinearGradient *op;
- const guint real_n_color_stops = MIN (MAX_GRADIENT_STOPS, n_color_stops);
+ const guint real_n_color_stops = MIN (GL_MAX_GRADIENT_STOPS, n_color_stops);
g_assert (current_program_state);
@@ -972,7 +972,7 @@ ops_set_radial_gradient (RenderOpBuilder *self,
float hradius,
float vradius)
{
- const guint real_n_color_stops = MIN (MAX_GRADIENT_STOPS, n_color_stops);
+ const guint real_n_color_stops = MIN (GL_MAX_GRADIENT_STOPS, n_color_stops);
OpRadialGradient *op;
/* TODO: State tracking? */
diff --git a/gsk/gl/gskglrenderopsprivate.h b/gsk/gl/gskglrenderopsprivate.h
index a6c6d0f232..b2a574a401 100644
--- a/gsk/gl/gskglrenderopsprivate.h
+++ b/gsk/gl/gskglrenderopsprivate.h
@@ -14,7 +14,7 @@
#define GL_N_VERTICES 6
#define GL_N_PROGRAMS 14
-#define MAX_GRADIENT_STOPS 8
+#define GL_MAX_GRADIENT_STOPS 6
typedef struct
{
@@ -147,13 +147,13 @@ typedef struct
} unblurred_outset_shadow;
struct {
int n_color_stops;
- GskColorStop color_stops[MAX_GRADIENT_STOPS];
+ GskColorStop color_stops[GL_MAX_GRADIENT_STOPS];
float start_point[2];
float end_point[2];
} linear_gradient;
struct {
int n_color_stops;
- GskColorStop color_stops[MAX_GRADIENT_STOPS];
+ GskColorStop color_stops[GL_MAX_GRADIENT_STOPS];
float center[2];
float start;
float end;
diff --git a/gsk/resources/glsl/linear_gradient.glsl b/gsk/resources/glsl/linear_gradient.glsl
index dea01344f0..e0a75b5b42 100644
--- a/gsk/resources/glsl/linear_gradient.glsl
+++ b/gsk/resources/glsl/linear_gradient.glsl
@@ -1,7 +1,7 @@
// VERTEX_SHADER
uniform vec2 u_start_point;
uniform vec2 u_end_point;
-uniform float u_color_stops[8 * 5];
+uniform float u_color_stops[6 * 5];
uniform int u_num_color_stops;
_OUT_ vec2 startPoint;
diff --git a/gsk/resources/glsl/radial_gradient.glsl b/gsk/resources/glsl/radial_gradient.glsl
index 9d8be275b3..e4b36e29a8 100644
--- a/gsk/resources/glsl/radial_gradient.glsl
+++ b/gsk/resources/glsl/radial_gradient.glsl
@@ -1,7 +1,7 @@
// VERTEX_SHADER
uniform float u_start;
uniform float u_end;
-uniform float u_color_stops[8 * 5];
+uniform float u_color_stops[6 * 5];
uniform int u_num_color_stops;
uniform vec2 u_radius;
uniform vec2 u_center;
diff --git a/gtk/gtkcssimagefallback.c b/gtk/gtkcssimagefallback.c
index c6549c6bd4..e214172cc0 100644
--- a/gtk/gtkcssimagefallback.c
+++ b/gtk/gtkcssimagefallback.c
@@ -149,10 +149,10 @@ gtk_css_image_fallback_compute (GtkCssImage *image,
if (fallback->color)
computed_color= _gtk_css_value_compute (fallback->color,
- property_id,
- provider,
- style,
- parent_style);
+ property_id,
+ provider,
+ style,
+ parent_style);
/* image($color) that didn't change */
if (computed_color && !fallback->images &&
@@ -209,6 +209,9 @@ gtk_css_image_fallback_parse_arg (GtkCssParser *parser,
if (image == NULL)
return 0;
+ if (!data->images)
+ data->images = g_ptr_array_new_with_free_func (g_object_unref);
+
g_ptr_array_add (data->images, image);
return 1;
}
@@ -235,18 +238,25 @@ gtk_css_image_fallback_parse (GtkCssImage *image,
return FALSE;
}
- data.images = g_ptr_array_new_with_free_func (g_object_unref);
-
if (!gtk_css_parser_consume_function (parser, 1, G_MAXUINT, gtk_css_image_fallback_parse_arg, &data))
{
g_clear_pointer (&data.color, _gtk_css_value_unref);
- g_ptr_array_free (data.images, TRUE);
+ if (data.images)
+ g_ptr_array_free (data.images, TRUE);
return FALSE;
}
self->color = data.color;
- self->n_images = data.images->len;
- self->images = (GtkCssImage **) g_ptr_array_free (data.images, FALSE);
+ if (data.images)
+ {
+ self->n_images = data.images->len;
+ self->images = (GtkCssImage **) g_ptr_array_free (data.images, FALSE);
+ }
+ else
+ {
+ self->n_images = 0;
+ self->images = NULL;
+ }
return TRUE;
}
diff --git a/gtk/gtktextbuffer.c b/gtk/gtktextbuffer.c
index 854799d8a8..18861d301c 100644
--- a/gtk/gtktextbuffer.c
+++ b/gtk/gtktextbuffer.c
@@ -310,6 +310,7 @@ gtk_text_buffer_deserialize_text_plain_finish (GObject *source,
GtkTextIter start, end;
GError *error = NULL;
gssize written;
+ char *data;
written = g_output_stream_splice_finish (stream, result, &error);
if (written < 0)
@@ -318,15 +319,19 @@ gtk_text_buffer_deserialize_text_plain_finish (GObject *source,
return;
}
- buffer = g_value_get_object (gdk_content_deserializer_get_value (deserializer));
- gtk_text_buffer_get_end_iter (buffer, &end);
- gtk_text_buffer_insert (buffer,
- &end,
- g_memory_output_stream_steal_data (G_MEMORY_OUTPUT_STREAM (
- g_filter_output_stream_get_base_stream (G_FILTER_OUTPUT_STREAM (stream)))),
- -1);
- gtk_text_buffer_get_bounds (buffer, &start, &end);
- gtk_text_buffer_select_range (buffer, &start, &end);
+ data = g_memory_output_stream_steal_data (G_MEMORY_OUTPUT_STREAM (
+ g_filter_output_stream_get_base_stream (G_FILTER_OUTPUT_STREAM (stream))));
+
+ if (data)
+ {
+ buffer = g_value_get_object (gdk_content_deserializer_get_value (deserializer));
+ gtk_text_buffer_get_end_iter (buffer, &end);
+ gtk_text_buffer_insert (buffer, &end, data, -1);
+ gtk_text_buffer_get_bounds (buffer, &start, &end);
+ gtk_text_buffer_select_range (buffer, &start, &end);
+
+ g_free (data);
+ }
gdk_content_deserializer_return_success (deserializer);
}
diff --git a/gtk/theme/Adwaita/_common.scss b/gtk/theme/Adwaita/_common.scss
index 2ab2e5e5f2..56e0a8d277 100644
--- a/gtk/theme/Adwaita/_common.scss
+++ b/gtk/theme/Adwaita/_common.scss
@@ -3255,6 +3255,9 @@ calendar {
background: none;
border-radius: 0;
}
+ > button:backdrop {
+ background: none;
+ }
}
> grid {