summaryrefslogtreecommitdiff
path: root/gsk/gl/gskglrenderer.c
diff options
context:
space:
mode:
Diffstat (limited to 'gsk/gl/gskglrenderer.c')
-rw-r--r--gsk/gl/gskglrenderer.c62
1 files changed, 61 insertions, 1 deletions
diff --git a/gsk/gl/gskglrenderer.c b/gsk/gl/gskglrenderer.c
index 57b0767772..6e77194eb4 100644
--- a/gsk/gl/gskglrenderer.c
+++ b/gsk/gl/gskglrenderer.c
@@ -1483,6 +1483,35 @@ render_radial_gradient_node (GskGLRenderer *self,
}
}
+static inline void
+render_conic_gradient_node (GskGLRenderer *self,
+ GskRenderNode *node,
+ RenderOpBuilder *builder)
+{
+ const int n_color_stops = gsk_conic_gradient_node_get_n_color_stops (node);
+
+ if (n_color_stops < GL_MAX_GRADIENT_STOPS)
+ {
+ const GskColorStop *stops = gsk_conic_gradient_node_get_color_stops (node, NULL);
+ const graphene_point_t *center = gsk_conic_gradient_node_get_center (node);
+ const float rotation = gsk_conic_gradient_node_get_rotation (node);
+
+ ops_set_program (builder, &self->programs->conic_gradient_program);
+ ops_set_conic_gradient (builder,
+ n_color_stops,
+ stops,
+ builder->dx + center->x,
+ builder->dy + center->y,
+ rotation);
+
+ load_vertex_data (ops_draw (builder, NULL), &node->bounds, builder);
+ }
+ else
+ {
+ render_fallback_node (self, node, builder);
+ }
+}
+
static inline gboolean
rounded_inner_rect_contains_rect (const GskRoundedRect *rounded,
const graphene_rect_t *rect)
@@ -3017,6 +3046,23 @@ apply_radial_gradient_op (const Program *program,
}
static inline void
+apply_conic_gradient_op (const Program *program,
+ const OpConicGradient *op)
+{
+ OP_PRINT (" -> Conic gradient");
+ if (op->n_color_stops.send)
+ glUniform1i (program->conic_gradient.num_color_stops_location, op->n_color_stops.value);
+
+ if (op->color_stops.send)
+ glUniform1fv (program->conic_gradient.color_stops_location,
+ op->n_color_stops.value * 5,
+ (float *)op->color_stops.value);
+
+ glUniform1f (program->conic_gradient.rotation_location, op->rotation);
+ glUniform2f (program->conic_gradient.center_location, op->center[0], op->center[1]);
+}
+
+static inline void
apply_border_op (const Program *program,
const OpBorder *op)
{
@@ -3250,6 +3296,7 @@ gsk_gl_renderer_create_programs (GskGLRenderer *self,
{ "/org/gtk/libgsk/glsl/inset_shadow.glsl", "inset shadow" },
{ "/org/gtk/libgsk/glsl/linear_gradient.glsl", "linear gradient" },
{ "/org/gtk/libgsk/glsl/radial_gradient.glsl", "radial gradient" },
+ { "/org/gtk/libgsk/glsl/conic_gradient.glsl", "conic gradient" },
{ "/org/gtk/libgsk/glsl/outset_shadow.glsl", "outset shadow" },
{ "/org/gtk/libgsk/glsl/repeat.glsl", "repeat" },
{ "/org/gtk/libgsk/glsl/unblurred_outset_shadow.glsl", "unblurred_outset shadow" },
@@ -3312,6 +3359,12 @@ gsk_gl_renderer_create_programs (GskGLRenderer *self,
INIT_PROGRAM_UNIFORM_LOCATION (radial_gradient, end);
INIT_PROGRAM_UNIFORM_LOCATION (radial_gradient, radius);
+ /* conic gradient */
+ INIT_PROGRAM_UNIFORM_LOCATION (conic_gradient, color_stops);
+ INIT_PROGRAM_UNIFORM_LOCATION (conic_gradient, num_color_stops);
+ INIT_PROGRAM_UNIFORM_LOCATION (conic_gradient, center);
+ INIT_PROGRAM_UNIFORM_LOCATION (conic_gradient, rotation);
+
/* blur */
INIT_PROGRAM_UNIFORM_LOCATION (blur, blur_radius);
INIT_PROGRAM_UNIFORM_LOCATION (blur, blur_size);
@@ -3663,6 +3716,10 @@ gsk_gl_renderer_add_render_ops (GskGLRenderer *self,
render_radial_gradient_node (self, node, builder);
break;
+ case GSK_CONIC_GRADIENT_NODE:
+ render_conic_gradient_node (self, node, builder);
+ break;
+
case GSK_CLIP_NODE:
render_clip_node (self, node, builder);
break;
@@ -3724,7 +3781,6 @@ gsk_gl_renderer_add_render_ops (GskGLRenderer *self,
case GSK_REPEATING_LINEAR_GRADIENT_NODE:
case GSK_REPEATING_RADIAL_GRADIENT_NODE:
- case GSK_CONIC_GRADIENT_NODE:
case GSK_CAIRO_NODE:
default:
{
@@ -4027,6 +4083,10 @@ gsk_gl_renderer_render_ops (GskGLRenderer *self)
apply_radial_gradient_op (program, ptr);
break;
+ case OP_CHANGE_CONIC_GRADIENT:
+ apply_conic_gradient_op (program, ptr);
+ break;
+
case OP_CHANGE_BLUR:
apply_blur_op (program, ptr);
break;