From 1f249064cc5c19a39ffe0faaa8825c8f8b6a2175 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Wed, 2 Jun 2010 18:11:04 +0200 Subject: [PATCH] gl: rework _cairo_gl_set_operator() 1) store the current operator. This will be useful later to check if the operator changed. 2) pass the context instead of the destination as first argument. The destination is known to be the current target. --- src/cairo-gl-composite.c | 16 +++++++++------- src/cairo-gl-device.c | 3 +++ src/cairo-gl-private.h | 1 + 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/cairo-gl-composite.c b/src/cairo-gl-composite.c index ef0c2ac5f..047015764 100644 --- a/src/cairo-gl-composite.c +++ b/src/cairo-gl-composite.c @@ -830,8 +830,9 @@ _cairo_gl_set_src_alpha (cairo_gl_context_t *ctx, } static void -_cairo_gl_set_operator (cairo_gl_surface_t *dst, cairo_operator_t op, - cairo_bool_t component_alpha) +_cairo_gl_set_operator (cairo_gl_context_t *ctx, + cairo_operator_t op, + cairo_bool_t component_alpha) { struct { GLenum src; @@ -856,6 +857,7 @@ _cairo_gl_set_operator (cairo_gl_surface_t *dst, cairo_operator_t op, GLenum src_factor, dst_factor; assert (op < ARRAY_LENGTH (blend_factors)); + ctx->current_operator = op; src_factor = blend_factors[op].src; dst_factor = blend_factors[op].dst; @@ -864,7 +866,7 @@ _cairo_gl_set_operator (cairo_gl_surface_t *dst, cairo_operator_t op, * due to texture filtering of GL_CLAMP_TO_BORDER. So fix those * bits in that case. */ - if (dst->base.content == CAIRO_CONTENT_COLOR) { + if (ctx->current_target->base.content == CAIRO_CONTENT_COLOR) { if (src_factor == GL_ONE_MINUS_DST_ALPHA) src_factor = GL_ZERO; if (src_factor == GL_DST_ALPHA) @@ -878,7 +880,7 @@ _cairo_gl_set_operator (cairo_gl_surface_t *dst, cairo_operator_t op, dst_factor = GL_SRC_COLOR; } - if (dst->base.content == CAIRO_CONTENT_ALPHA) { + if (ctx->current_target->base.content == CAIRO_CONTENT_ALPHA) { glBlendFuncSeparate (GL_ZERO, GL_ZERO, src_factor, dst_factor); } else { glBlendFunc (src_factor, dst_factor); @@ -1063,7 +1065,7 @@ _cairo_gl_composite_begin (cairo_gl_composite_t *setup, } _cairo_gl_context_set_destination (ctx, setup->dst); - _cairo_gl_set_operator (setup->dst, + _cairo_gl_set_operator (ctx, setup->op, component_alpha); @@ -1110,13 +1112,13 @@ _cairo_gl_composite_draw (cairo_gl_context_t *ctx, cairo_gl_shader_t *prev_shader = ctx->current_shader; _cairo_gl_set_shader (ctx, ctx->pre_shader); - _cairo_gl_set_operator (ctx->current_target, CAIRO_OPERATOR_DEST_OUT, TRUE); + _cairo_gl_set_operator (ctx, CAIRO_OPERATOR_DEST_OUT, TRUE); _cairo_gl_set_src_alpha (ctx, TRUE); glDrawArrays (GL_TRIANGLES, 0, count); _cairo_gl_set_src_alpha (ctx, FALSE); _cairo_gl_set_shader (ctx, prev_shader); - _cairo_gl_set_operator (ctx->current_target, CAIRO_OPERATOR_ADD, TRUE); + _cairo_gl_set_operator (ctx, CAIRO_OPERATOR_ADD, TRUE); glDrawArrays (GL_TRIANGLES, 0, count); } } diff --git a/src/cairo-gl-device.c b/src/cairo-gl-device.c index ff64ae6f6..54a2fde8b 100644 --- a/src/cairo-gl-device.c +++ b/src/cairo-gl-device.c @@ -80,6 +80,7 @@ _gl_flush (void *device) } ctx->current_target = NULL; + ctx->current_operator = -1; ctx->vertex_size = 0; ctx->pre_shader = NULL; _cairo_gl_set_shader (ctx, NULL); @@ -196,6 +197,8 @@ _cairo_gl_context_init (cairo_gl_context_t *ctx) else ctx->tex_target = GL_TEXTURE_2D; + ctx->current_operator = -1; + status = _cairo_gl_context_init_shaders (ctx); if (unlikely (status)) return status; diff --git a/src/cairo-gl-private.h b/src/cairo-gl-private.h index 410165165..07333042f 100644 --- a/src/cairo-gl-private.h +++ b/src/cairo-gl-private.h @@ -182,6 +182,7 @@ typedef struct _cairo_gl_context { cairo_list_t fonts; cairo_gl_surface_t *current_target; + cairo_operator_t current_operator; cairo_gl_shader_t *pre_shader; /* for component alpha */ cairo_gl_shader_t *current_shader;