summaryrefslogtreecommitdiff
path: root/src/cairo-gl-operand.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cairo-gl-operand.c')
-rw-r--r--src/cairo-gl-operand.c30
1 files changed, 26 insertions, 4 deletions
diff --git a/src/cairo-gl-operand.c b/src/cairo-gl-operand.c
index 2bbd99b74..443d06a5f 100644
--- a/src/cairo-gl-operand.c
+++ b/src/cairo-gl-operand.c
@@ -65,7 +65,7 @@ _cairo_gl_create_gradient_texture (cairo_gl_surface_t *dst,
if (unlikely (status))
return status;
- status = _cairo_gl_gradient_create (ctx, pattern->n_stops, pattern->stops, gradient);
+ status = _cairo_gl_gradient_create (ctx, pattern->n_stops, pattern->stops, gradient, pattern->base.type);
return _cairo_gl_context_release (ctx, status);
}
@@ -1206,6 +1206,7 @@ _cairo_gl_operand_bind_to_shader (cairo_gl_context_t *ctx,
case CAIRO_GL_OPERAND_RADIAL_GRADIENT_NONE:
case CAIRO_GL_OPERAND_RADIAL_GRADIENT_EXT:
+
_cairo_gl_shader_bind_float (ctx,
ctx->current_shader->a_location[tex_unit],
operand->gradient.a);
@@ -1219,6 +1220,28 @@ _cairo_gl_operand_bind_to_shader (cairo_gl_context_t *ctx,
_cairo_gl_shader_bind_float (ctx,
ctx->current_shader->radius_0_location[tex_unit],
operand->gradient.radius_0);
+ if (operand->gradient.gradient->n_stops == 2) {
+ _cairo_gl_shader_bind_vec4 (ctx,
+ ctx->current_shader->color_1_location[tex_unit],
+ operand->gradient.gradient->stops[0].color.red,
+ operand->gradient.gradient->stops[0].color.green,
+ operand->gradient.gradient->stops[0].color.blue,
+ operand->gradient.gradient->stops[0].color.alpha);
+
+ _cairo_gl_shader_bind_vec4 (ctx,
+ ctx->current_shader->color_2_location[tex_unit],
+ operand->gradient.gradient->stops[1].color.red,
+ operand->gradient.gradient->stops[1].color.green,
+ operand->gradient.gradient->stops[1].color.blue,
+ operand->gradient.gradient->stops[1].color.alpha);
+
+ _cairo_gl_shader_bind_float (ctx,
+ ctx->current_shader->offset_1_location[tex_unit],
+ operand->gradient.gradient->stops[0].offset);
+ _cairo_gl_shader_bind_float (ctx,
+ ctx->current_shader->offset_2_location[tex_unit],
+ operand->gradient.gradient->stops[1].offset);
+ }
/* fall through */
case CAIRO_GL_OPERAND_LINEAR_GRADIENT:
case CAIRO_GL_OPERAND_TEXTURE:
@@ -1311,10 +1334,10 @@ _cairo_gl_operand_bind_to_shader (cairo_gl_context_t *ctx,
if (operand->type == CAIRO_GL_OPERAND_TEXTURE ||
operand->type == CAIRO_GL_OPERAND_GAUSSIAN) {
if (operand->texture.texgen)
- texgen = &operand->texture.attributes.matrix;
+ texgen = &operand->texture.attributes.matrix;
} else {
if (operand->gradient.texgen)
- texgen = &operand->gradient.m;
+ texgen = &operand->gradient.m;
}
if (texgen) {
_cairo_gl_shader_bind_matrix(ctx,
@@ -1427,7 +1450,6 @@ _cairo_gl_operand_emit (cairo_gl_operand_t *operand,
double t = y;
cairo_matrix_transform_point (&operand->gradient.m, &s, &t);
-
*(*vb)++ = s;
*(*vb)++ = t;
}