diff options
Diffstat (limited to 'gsk/gl/gskglrenderer.c')
-rw-r--r-- | gsk/gl/gskglrenderer.c | 62 |
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; |