diff --git a/gsk/gpu/gskgpuconicgradientop.c b/gsk/gpu/gskgpuconicgradientop.c index 24348cf195..cb52736c52 100644 --- a/gsk/gpu/gskgpuconicgradientop.c +++ b/gsk/gpu/gskgpuconicgradientop.c @@ -52,24 +52,28 @@ static const GskGpuShaderOpClass GSK_GPU_CONIC_GRADIENT_OP_CLASS = { void gsk_gpu_conic_gradient_op (GskGpuFrame *frame, GskGpuShaderClip clip, - GskGpuColorStates color_states, + GdkColorState *ccs, + float opacity, + const graphene_point_t *offset, + GdkColorState *ics, + GskHueInterpolation hue_interp, const graphene_rect_t *rect, const graphene_point_t *center, float angle, - const graphene_point_t *offset, const GskColorStop *stops, gsize n_stops) { GskGpuConicgradientInstance *instance; - GdkColorState *color_state = gsk_gpu_color_states_get_alt (color_states); g_assert (n_stops > 1); g_assert (n_stops <= 7); - g_assert (gsk_gpu_color_states_is_alt_premultiplied (color_states)); + /* Note: we pass TRUE for alt-premultiplied because the + * vertex shader applies the alpha to the colors. + */ gsk_gpu_shader_op_alloc (frame, &GSK_GPU_CONIC_GRADIENT_OP_CLASS, - color_states, + gsk_gpu_color_states_create (ccs, TRUE, ics, TRUE), (gsk_gpu_frame_should_optimize (frame, GSK_GPU_OPTIMIZE_GRADIENTS) ? VARIATION_SUPERSAMPLING : 0), clip, NULL, @@ -79,18 +83,18 @@ gsk_gpu_conic_gradient_op (GskGpuFrame *frame, gsk_gpu_rect_to_float (rect, offset, instance->rect); gsk_gpu_point_to_float (center, offset, instance->center); instance->angle = angle; - gdk_color_state_from_rgba (color_state, &stops[MIN (n_stops - 1, 6)].color, instance->color6); + gsk_gpu_rgba_to_float (&stops[MIN (n_stops - 1, 6)].color, ics, opacity, instance->color6); instance->offsets1[2] = stops[MIN (n_stops - 1, 6)].offset; - gdk_color_state_from_rgba (color_state, &stops[MIN (n_stops - 1, 5)].color, instance->color5); + gsk_gpu_rgba_to_float (&stops[MIN (n_stops - 1, 5)].color, ics, opacity, instance->color5); instance->offsets1[1] = stops[MIN (n_stops - 1, 5)].offset; - gdk_color_state_from_rgba (color_state, &stops[MIN (n_stops - 1, 4)].color, instance->color4); + gsk_gpu_rgba_to_float (&stops[MIN (n_stops - 1, 4)].color, ics, opacity, instance->color4); instance->offsets1[0] = stops[MIN (n_stops - 1, 4)].offset; - gdk_color_state_from_rgba (color_state, &stops[MIN (n_stops - 1, 3)].color, instance->color3); + gsk_gpu_rgba_to_float (&stops[MIN (n_stops - 1, 3)].color, ics, opacity, instance->color3); instance->offsets0[3] = stops[MIN (n_stops - 1, 3)].offset; - gdk_color_state_from_rgba (color_state, &stops[MIN (n_stops - 1, 2)].color, instance->color2); + gsk_gpu_rgba_to_float (&stops[MIN (n_stops - 1, 2)].color, ics, opacity, instance->color2); instance->offsets0[2] = stops[MIN (n_stops - 1, 2)].offset; - gdk_color_state_from_rgba (color_state, &stops[1].color, instance->color1); + gsk_gpu_rgba_to_float (&stops[1].color, ics, opacity, instance->color1); instance->offsets0[1] = stops[1].offset; - gdk_color_state_from_rgba (color_state, &stops[0].color, instance->color0); + gsk_gpu_rgba_to_float (&stops[0].color, ics, opacity, instance->color0); instance->offsets0[0] = stops[0].offset; } diff --git a/gsk/gpu/gskgpuconicgradientopprivate.h b/gsk/gpu/gskgpuconicgradientopprivate.h index c3860bfd71..275a0a1e50 100644 --- a/gsk/gpu/gskgpuconicgradientopprivate.h +++ b/gsk/gpu/gskgpuconicgradientopprivate.h @@ -2,7 +2,7 @@ #include "gskgpushaderopprivate.h" -#include "gskrendernode.h" +#include "gskrendernodeprivate.h" #include @@ -10,11 +10,14 @@ G_BEGIN_DECLS void gsk_gpu_conic_gradient_op (GskGpuFrame *frame, GskGpuShaderClip clip, - GskGpuColorStates color_states, + GdkColorState *ccs, + float opacity, + const graphene_point_t *offset, + GdkColorState *ics, + GskHueInterpolation hue_interp, const graphene_rect_t *rect, const graphene_point_t *center, float angle, - const graphene_point_t *offset, const GskColorStop *stops, gsize n_stops); diff --git a/gsk/gpu/gskgpulineargradientop.c b/gsk/gpu/gskgpulineargradientop.c index 10147528b3..819259e853 100644 --- a/gsk/gpu/gskgpulineargradientop.c +++ b/gsk/gpu/gskgpulineargradientop.c @@ -55,25 +55,29 @@ static const GskGpuShaderOpClass GSK_GPU_LINEAR_GRADIENT_OP_CLASS = { void gsk_gpu_linear_gradient_op (GskGpuFrame *frame, GskGpuShaderClip clip, - GskGpuColorStates color_states, + GdkColorState *ccs, + float opacity, + const graphene_point_t *offset, + GdkColorState *ics, + GskHueInterpolation hue_interp, gboolean repeating, const graphene_rect_t *rect, const graphene_point_t *start, const graphene_point_t *end, - const graphene_point_t *offset, const GskColorStop *stops, gsize n_stops) { GskGpuLineargradientInstance *instance; - GdkColorState *color_state = gsk_gpu_color_states_get_alt (color_states); g_assert (n_stops > 1); g_assert (n_stops <= 7); - g_assert (gsk_gpu_color_states_is_alt_premultiplied (color_states)); + /* Note: we pass TRUE for alt-premultiplied because the + * vertex shader applies the alpha to the colors. + */ gsk_gpu_shader_op_alloc (frame, &GSK_GPU_LINEAR_GRADIENT_OP_CLASS, - color_states, + gsk_gpu_color_states_create (ccs, TRUE, ics, TRUE), (repeating ? VARIATION_REPEATING : 0) | (gsk_gpu_frame_should_optimize (frame, GSK_GPU_OPTIMIZE_GRADIENTS) ? VARIATION_SUPERSAMPLING : 0), clip, @@ -84,18 +88,18 @@ gsk_gpu_linear_gradient_op (GskGpuFrame *frame, gsk_gpu_rect_to_float (rect, offset, instance->rect); gsk_gpu_point_to_float (start, offset, instance->startend); gsk_gpu_point_to_float (end, offset, &instance->startend[2]); - gdk_color_state_from_rgba (color_state, &stops[MIN (n_stops - 1, 6)].color, instance->color6); + gsk_gpu_rgba_to_float (&stops[MIN (n_stops - 1, 6)].color, ics, opacity, instance->color6); instance->offsets1[2] = stops[MIN (n_stops - 1, 6)].offset; - gdk_color_state_from_rgba (color_state, &stops[MIN (n_stops - 1, 5)].color, instance->color5); + gsk_gpu_rgba_to_float (&stops[MIN (n_stops - 1, 5)].color, ics, opacity, instance->color5); instance->offsets1[1] = stops[MIN (n_stops - 1, 5)].offset; - gdk_color_state_from_rgba (color_state, &stops[MIN (n_stops - 1, 4)].color, instance->color4); + gsk_gpu_rgba_to_float (&stops[MIN (n_stops - 1, 4)].color, ics, opacity, instance->color4); instance->offsets1[0] = stops[MIN (n_stops - 1, 4)].offset; - gdk_color_state_from_rgba (color_state, &stops[MIN (n_stops - 1, 3)].color, instance->color3); + gsk_gpu_rgba_to_float (&stops[MIN (n_stops - 1, 3)].color, ics, opacity, instance->color3); instance->offsets0[3] = stops[MIN (n_stops - 1, 3)].offset; - gdk_color_state_from_rgba (color_state, &stops[MIN (n_stops - 1, 2)].color, instance->color2); + gsk_gpu_rgba_to_float (&stops[MIN (n_stops - 1, 2)].color, ics, opacity, instance->color2); instance->offsets0[2] = stops[MIN (n_stops - 1, 2)].offset; - gdk_color_state_from_rgba (color_state, &stops[1].color, instance->color1); + gsk_gpu_rgba_to_float (&stops[1].color, ics, opacity, instance->color1); instance->offsets0[1] = stops[1].offset; - gdk_color_state_from_rgba (color_state, &stops[0].color, instance->color0); + gsk_gpu_rgba_to_float (&stops[0].color, ics, opacity, instance->color0); instance->offsets0[0] = stops[0].offset; } diff --git a/gsk/gpu/gskgpulineargradientopprivate.h b/gsk/gpu/gskgpulineargradientopprivate.h index 7c692bb972..2485b2d3e5 100644 --- a/gsk/gpu/gskgpulineargradientopprivate.h +++ b/gsk/gpu/gskgpulineargradientopprivate.h @@ -2,7 +2,7 @@ #include "gskgpushaderopprivate.h" -#include "gskrendernode.h" +#include "gskrendernodeprivate.h" #include @@ -10,12 +10,15 @@ G_BEGIN_DECLS void gsk_gpu_linear_gradient_op (GskGpuFrame *frame, GskGpuShaderClip clip, - GskGpuColorStates color_states, + GdkColorState *ccs, + float opacity, + const graphene_point_t *offset, + GdkColorState *ics, + GskHueInterpolation hue_interp, gboolean repeating, const graphene_rect_t *rect, const graphene_point_t *start, const graphene_point_t *end, - const graphene_point_t *offset, const GskColorStop *stops, gsize n_stops); diff --git a/gsk/gpu/gskgpunodeprocessor.c b/gsk/gpu/gskgpunodeprocessor.c index d82c56d578..5ec3eda777 100644 --- a/gsk/gpu/gskgpunodeprocessor.c +++ b/gsk/gpu/gskgpunodeprocessor.c @@ -2488,11 +2488,11 @@ gsk_gpu_node_processor_add_gradient_node (GskGpuNodeProcessor *self, for (i = 0; i < n_stops; i++) { real_stops[i].offset = stops[i].offset; - real_stops[i].color = GDK_RGBA_INIT_ALPHA (&stops[i].color, self->opacity); + real_stops[i].color = stops[i].color; } stops = real_stops; } - + func (self, node, stops, n_stops); return; @@ -2519,7 +2519,7 @@ gsk_gpu_node_processor_add_gradient_node (GskGpuNodeProcessor *self, if (i == 0) { real_stops[0].offset = stops[i].offset; - real_stops[0].color = GDK_RGBA_INIT_ALPHA (&stops[i].color, self->opacity); + real_stops[0].color = stops[i].color; i++; } else @@ -2530,14 +2530,14 @@ gsk_gpu_node_processor_add_gradient_node (GskGpuNodeProcessor *self, for (j = 1; j < 6 && i < n_stops; j++) { real_stops[j].offset = stops[i].offset; - real_stops[j].color = GDK_RGBA_INIT_ALPHA (&stops[i].color, self->opacity); + real_stops[j].color = stops[i].color; i++; } if (i == n_stops - 1) { g_assert (j == 6); real_stops[j].offset = stops[i].offset; - real_stops[j].color = GDK_RGBA_INIT_ALPHA (&stops[i].color, self->opacity); + real_stops[j].color = stops[i].color; j++; i++; } @@ -2574,12 +2574,15 @@ gsk_gpu_node_processor_linear_gradient_op (GskGpuNodeProcessor *self, { gsk_gpu_linear_gradient_op (self->frame, gsk_gpu_clip_get_shader_clip (&self->clip, &self->offset, &node->bounds), - gsk_gpu_node_processor_color_states_explicit (self, GDK_COLOR_STATE_SRGB, TRUE), + self->ccs, + self->opacity, + &self->offset, + GDK_COLOR_STATE_SRGB, + GSK_HUE_INTERPOLATION_SHORTER, GSK_RENDER_NODE_TYPE (node) == GSK_REPEATING_LINEAR_GRADIENT_NODE, &node->bounds, gsk_linear_gradient_node_get_start (node), gsk_linear_gradient_node_get_end (node), - &self->offset, stops, n_stops); } @@ -2603,7 +2606,11 @@ gsk_gpu_node_processor_radial_gradient_op (GskGpuNodeProcessor *self, { gsk_gpu_radial_gradient_op (self->frame, gsk_gpu_clip_get_shader_clip (&self->clip, &self->offset, &node->bounds), - gsk_gpu_node_processor_color_states_explicit (self, GDK_COLOR_STATE_SRGB, TRUE), + self->ccs, + self->opacity, + &self->offset, + GDK_COLOR_STATE_SRGB, + GSK_HUE_INTERPOLATION_SHORTER, GSK_RENDER_NODE_TYPE (node) == GSK_REPEATING_RADIAL_GRADIENT_NODE, &node->bounds, gsk_radial_gradient_node_get_center (node), @@ -2613,7 +2620,6 @@ gsk_gpu_node_processor_radial_gradient_op (GskGpuNodeProcessor *self, ), gsk_radial_gradient_node_get_start (node), gsk_radial_gradient_node_get_end (node), - &self->offset, stops, n_stops); } @@ -2637,11 +2643,14 @@ gsk_gpu_node_processor_conic_gradient_op (GskGpuNodeProcessor *self, { gsk_gpu_conic_gradient_op (self->frame, gsk_gpu_clip_get_shader_clip (&self->clip, &self->offset, &node->bounds), - gsk_gpu_node_processor_color_states_explicit (self, GDK_COLOR_STATE_SRGB, TRUE), + self->ccs, + self->opacity, + &self->offset, + GDK_COLOR_STATE_SRGB, + GSK_HUE_INTERPOLATION_SHORTER, &node->bounds, gsk_conic_gradient_node_get_center (node), gsk_conic_gradient_node_get_angle (node), - &self->offset, stops, n_stops); } diff --git a/gsk/gpu/gskgpuradialgradientop.c b/gsk/gpu/gskgpuradialgradientop.c index 3832844d36..3b1972dcd8 100644 --- a/gsk/gpu/gskgpuradialgradientop.c +++ b/gsk/gpu/gskgpuradialgradientop.c @@ -55,27 +55,31 @@ static const GskGpuShaderOpClass GSK_GPU_RADIAL_GRADIENT_OP_CLASS = { void gsk_gpu_radial_gradient_op (GskGpuFrame *frame, GskGpuShaderClip clip, - GskGpuColorStates color_states, + GdkColorState *ccs, + float opacity, + const graphene_point_t *offset, + GdkColorState *ics, + GskHueInterpolation hue_interp, gboolean repeating, const graphene_rect_t *rect, const graphene_point_t *center, const graphene_point_t *radius, float start, float end, - const graphene_point_t *offset, const GskColorStop *stops, gsize n_stops) { GskGpuRadialgradientInstance *instance; - GdkColorState *color_state = gsk_gpu_color_states_get_alt (color_states); g_assert (n_stops > 1); g_assert (n_stops <= 7); - g_assert (gsk_gpu_color_states_is_alt_premultiplied (color_states)); + /* Note: we pass TRUE for alt-premultiplied because the + * vertex shader applies the alpha to the colors. + */ gsk_gpu_shader_op_alloc (frame, &GSK_GPU_RADIAL_GRADIENT_OP_CLASS, - color_states, + gsk_gpu_color_states_create (ccs, TRUE, ics, TRUE), (repeating ? VARIATION_REPEATING : 0) | (gsk_gpu_frame_should_optimize (frame, GSK_GPU_OPTIMIZE_GRADIENTS) ? VARIATION_SUPERSAMPLING : 0), clip, @@ -88,18 +92,18 @@ gsk_gpu_radial_gradient_op (GskGpuFrame *frame, gsk_gpu_point_to_float (radius, graphene_point_zero(), &instance->center_radius[2]); instance->startend[0] = start; instance->startend[1] = end; - gdk_color_state_from_rgba (color_state, &stops[MIN (n_stops - 1, 6)].color, instance->color6); + gsk_gpu_rgba_to_float (&stops[MIN (n_stops - 1, 6)].color, ics, opacity, instance->color6); instance->offsets1[2] = stops[MIN (n_stops - 1, 6)].offset; - gdk_color_state_from_rgba (color_state, &stops[MIN (n_stops - 1, 5)].color, instance->color5); + gsk_gpu_rgba_to_float (&stops[MIN (n_stops - 1, 5)].color, ics, opacity, instance->color5); instance->offsets1[1] = stops[MIN (n_stops - 1, 5)].offset; - gdk_color_state_from_rgba (color_state, &stops[MIN (n_stops - 1, 4)].color, instance->color4); + gsk_gpu_rgba_to_float (&stops[MIN (n_stops - 1, 4)].color, ics, opacity, instance->color4); instance->offsets1[0] = stops[MIN (n_stops - 1, 4)].offset; - gdk_color_state_from_rgba (color_state, &stops[MIN (n_stops - 1, 3)].color, instance->color3); + gsk_gpu_rgba_to_float (&stops[MIN (n_stops - 1, 3)].color, ics, opacity, instance->color3); instance->offsets0[3] = stops[MIN (n_stops - 1, 3)].offset; - gdk_color_state_from_rgba (color_state, &stops[MIN (n_stops - 1, 2)].color, instance->color2); + gsk_gpu_rgba_to_float (&stops[MIN (n_stops - 1, 2)].color, ics, opacity, instance->color2); instance->offsets0[2] = stops[MIN (n_stops - 1, 2)].offset; - gdk_color_state_from_rgba (color_state, &stops[1].color, instance->color1); + gsk_gpu_rgba_to_float (&stops[1].color, ics, opacity, instance->color1); instance->offsets0[1] = stops[1].offset; - gdk_color_state_from_rgba (color_state, &stops[0].color, instance->color0); + gsk_gpu_rgba_to_float (&stops[0].color, ics, opacity, instance->color0); instance->offsets0[0] = stops[0].offset; } diff --git a/gsk/gpu/gskgpuradialgradientopprivate.h b/gsk/gpu/gskgpuradialgradientopprivate.h index 97a128841a..8a2c216a6e 100644 --- a/gsk/gpu/gskgpuradialgradientopprivate.h +++ b/gsk/gpu/gskgpuradialgradientopprivate.h @@ -2,7 +2,7 @@ #include "gskgpushaderopprivate.h" -#include "gskrendernode.h" +#include "gskrendernodeprivate.h" #include @@ -10,14 +10,17 @@ G_BEGIN_DECLS void gsk_gpu_radial_gradient_op (GskGpuFrame *frame, GskGpuShaderClip clip, - GskGpuColorStates color_states, + GdkColorState *ccs, + float opacity, + const graphene_point_t *offset, + GdkColorState *ics, + GskHueInterpolation hue_interp, gboolean repeating, const graphene_rect_t *rect, const graphene_point_t *center, const graphene_point_t *radius, float start, float end, - const graphene_point_t *offset, const GskColorStop *stops, gsize n_stops); diff --git a/gsk/gpu/gskgpushaderopprivate.h b/gsk/gpu/gskgpushaderopprivate.h index b560c6c963..73c4621d1a 100644 --- a/gsk/gpu/gskgpushaderopprivate.h +++ b/gsk/gpu/gskgpushaderopprivate.h @@ -113,4 +113,18 @@ gsk_gpu_color_to_float (const GdkColor *color, values[3] *= opacity; } +static inline void +gsk_gpu_rgba_to_float (const GdkRGBA *rgba, + GdkColorState *target, + float opacity, + float values[4]) +{ + GdkColor color; + + gdk_color_init_from_rgba (&color, rgba); + gdk_color_to_float (&color, target, values); + values[3] *= opacity; + gdk_color_finish (&color); +} + G_END_DECLS