gskglrenderer: First class support of repeating-radial-gradient

This commit is contained in:
Fabio Lagalla 2021-01-26 12:49:16 +01:00
parent 976a05f6eb
commit 04000f28e7
5 changed files with 16 additions and 1 deletions

View File

@ -1486,6 +1486,7 @@ render_radial_gradient_node (GskGLRenderer *self,
ops_set_radial_gradient (builder,
n_color_stops,
stops,
gsk_render_node_get_node_type (node) == GSK_REPEATING_RADIAL_GRADIENT_NODE,
builder->dx + center->x,
builder->dy + center->y,
start, end,
@ -3066,6 +3067,8 @@ apply_radial_gradient_op (const Program *program,
scale = 1.0f / (op->end - op->start);
bias = -op->start * scale;
glUniform1i (program->radial_gradient.repeat_location, op->repeat);
glUniform2f (program->radial_gradient.range_location, scale, bias);
glUniform4f (program->radial_gradient.geometry_location,
op->center[0], op->center[1],
@ -3393,6 +3396,7 @@ gsk_gl_renderer_create_programs (GskGLRenderer *self,
/* radial gradient */
INIT_PROGRAM_UNIFORM_LOCATION (radial_gradient, color_stops);
INIT_PROGRAM_UNIFORM_LOCATION (radial_gradient, num_color_stops);
INIT_PROGRAM_UNIFORM_LOCATION (radial_gradient, repeat);
INIT_PROGRAM_UNIFORM_LOCATION (radial_gradient, geometry);
INIT_PROGRAM_UNIFORM_LOCATION (radial_gradient, range);
@ -3751,6 +3755,8 @@ gsk_gl_renderer_add_render_ops (GskGLRenderer *self,
break;
case GSK_RADIAL_GRADIENT_NODE:
/* Intentional fall-through */
case GSK_REPEATING_RADIAL_GRADIENT_NODE:
render_radial_gradient_node (self, node, builder);
break;
@ -3817,7 +3823,6 @@ gsk_gl_renderer_add_render_ops (GskGLRenderer *self,
render_gl_shader_node (self, node, builder);
break;
case GSK_REPEATING_RADIAL_GRADIENT_NODE:
case GSK_CAIRO_NODE:
default:
{

View File

@ -924,6 +924,7 @@ void
ops_set_radial_gradient (RenderOpBuilder *self,
guint n_color_stops,
const GskColorStop *color_stops,
bool repeat,
float center_x,
float center_y,
float start,
@ -947,6 +948,7 @@ ops_set_radial_gradient (RenderOpBuilder *self,
op->radius[1] = vradius;
op->start = start;
op->end = end;
op->repeat = repeat;
}
void

View File

@ -126,6 +126,7 @@ struct _Program
int color_stops_location;
int geometry_location;
int range_location;
int repeat_location;
} radial_gradient;
struct {
int num_color_stops_location;
@ -324,6 +325,7 @@ void ops_set_linear_gradient (RenderOpBuilder *self,
void ops_set_radial_gradient (RenderOpBuilder *self,
guint n_color_stops,
const GskColorStop *color_stops,
bool repeat,
float center_x,
float center_y,
float start,

View File

@ -157,6 +157,7 @@ typedef struct
float end;
float radius[2];
float center[2];
bool repeat;
} OpRadialGradient;
typedef struct

View File

@ -22,6 +22,7 @@ uniform int u_num_color_stops;
uniform highp int u_num_color_stops;
#endif
uniform bool u_repeat;
uniform vec2 u_range;
uniform float u_color_stops[6 * 5];
@ -44,6 +45,10 @@ void main() {
// Reverse scale
float offset = length(coord) * u_range.x + u_range.y;
if (u_repeat) {
offset = fract(offset);
}
if (offset < get_offset(0)) {
gskSetOutputColor(gsk_scaled_premultiply(get_color(0), u_alpha));
return;