gl: Provide a fast emitter for solid glyphs

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
Chris Wilson 2012-12-30 12:32:45 +00:00
parent 127dd46669
commit d3848521c4

View file

@ -936,10 +936,8 @@ _cairo_gl_context_choose_emit_span (cairo_gl_context_t *ctx)
static inline void
_cairo_gl_composite_emit_glyph_vertex (cairo_gl_context_t *ctx,
GLfloat x,
GLfloat y,
GLfloat glyph_x,
GLfloat glyph_y)
GLfloat x, GLfloat y,
GLfloat glyph_x, GLfloat glyph_y)
{
GLfloat *vb = (GLfloat *) (void *) &ctx->vb[ctx->vb_offset];
@ -956,14 +954,10 @@ _cairo_gl_composite_emit_glyph_vertex (cairo_gl_context_t *ctx,
static void
_cairo_gl_composite_emit_glyph (cairo_gl_context_t *ctx,
GLfloat x1,
GLfloat y1,
GLfloat x2,
GLfloat y2,
GLfloat glyph_x1,
GLfloat glyph_y1,
GLfloat glyph_x2,
GLfloat glyph_y2)
GLfloat x1, GLfloat y1,
GLfloat x2, GLfloat y2,
GLfloat glyph_x1, GLfloat glyph_y1,
GLfloat glyph_x2, GLfloat glyph_y2)
{
_cairo_gl_composite_prepare_buffer (ctx, 6,
CAIRO_GL_PRIMITIVE_TYPE_TRIANGLES);
@ -977,10 +971,52 @@ _cairo_gl_composite_emit_glyph (cairo_gl_context_t *ctx,
_cairo_gl_composite_emit_glyph_vertex (ctx, x1, y2, glyph_x1, glyph_y2);
}
static void
_cairo_gl_composite_emit_solid_glyph (cairo_gl_context_t *ctx,
GLfloat x1, GLfloat y1,
GLfloat x2, GLfloat y2,
GLfloat glyph_x1, GLfloat glyph_y1,
GLfloat glyph_x2, GLfloat glyph_y2)
{
GLfloat *v;
_cairo_gl_composite_prepare_buffer (ctx, 6,
CAIRO_GL_PRIMITIVE_TYPE_TRIANGLES);
v = (GLfloat *) (void *) &ctx->vb[ctx->vb_offset];
v[20] = v[ 8] = v[0] = x1;
v[13] = v[ 5] = v[1] = y1;
v[22] = v[10] = v[2] = glyph_x1;
v[15] = v[ 7] = v[3] = glyph_y1;
v[16] = v[12] = v[4] = x2;
v[18] = v[14] = v[6] = glyph_x2;
v[21] = v[17] = v[ 9] = y2;
v[23] = v[19] = v[11] = glyph_y2;
ctx->vb_offset += 4 * 6 * sizeof (GLfloat);
}
cairo_gl_emit_glyph_t
_cairo_gl_context_choose_emit_glyph (cairo_gl_context_t *ctx)
{
return _cairo_gl_composite_emit_glyph;
switch (ctx->operands[CAIRO_GL_TEX_SOURCE].type) {
default:
case CAIRO_GL_OPERAND_COUNT:
ASSERT_NOT_REACHED;
case CAIRO_GL_OPERAND_NONE:
case CAIRO_GL_OPERAND_CONSTANT:
return _cairo_gl_composite_emit_solid_glyph;
case CAIRO_GL_OPERAND_LINEAR_GRADIENT:
case CAIRO_GL_OPERAND_RADIAL_GRADIENT_A0:
case CAIRO_GL_OPERAND_RADIAL_GRADIENT_NONE:
case CAIRO_GL_OPERAND_RADIAL_GRADIENT_EXT:
case CAIRO_GL_OPERAND_TEXTURE:
return _cairo_gl_composite_emit_glyph;
}
}
void