static cairo_status_t cairo_gl_shader_get_vertex_source (cairo_gl_var_type_t src, cairo_gl_var_type_t mask, cairo_gl_var_type_t dest, char **out) { cairo_output_stream_t *stream = _cairo_memory_stream_create (); unsigned char *source; unsigned int length; cairo_status_t status; cairo_gl_shader_emit_variable (stream, src, CAIRO_GL_TEX_SOURCE); cairo_gl_shader_emit_variable (stream, mask, CAIRO_GL_TEX_MASK); _cairo_output_stream_printf (stream, "void main()\n" "{\n" " gl_Position = ftransform();\n"); cairo_gl_shader_emit_vertex (stream, src, CAIRO_GL_TEX_SOURCE); cairo_gl_shader_emit_vertex (stream, mask, CAIRO_GL_TEX_MASK); _cairo_output_stream_write (stream, "}\n\0", 3); status = _cairo_memory_stream_destroy (stream, &source, &length); if (unlikely (status)) return status; *out = (char *) source; return CAIRO_STATUS_SUCCESS; }
static cairo_status_t cairo_gl_shader_get_vertex_source (cairo_gl_var_type_t src_type, cairo_gl_var_type_t mask_type, cairo_bool_t src_use_atlas, cairo_bool_t mask_use_atlas, cairo_bool_t use_coverage, cairo_gl_var_type_t dest, char **out) { cairo_output_stream_t *stream = _cairo_memory_stream_create (); unsigned char *source; unsigned long length; cairo_status_t status; cairo_gl_shader_emit_variable (stream, src_type, CAIRO_GL_TEX_SOURCE, src_use_atlas); cairo_gl_shader_emit_variable (stream, mask_type, CAIRO_GL_TEX_MASK, mask_use_atlas); if (use_coverage) cairo_gl_shader_dcl_coverage (stream); _cairo_output_stream_printf (stream, "attribute vec4 Vertex;\n" "attribute vec4 Color;\n" "attribute vec4 Coverage;\n" "attribute vec4 MultiTexCoord0;\n" "attribute vec4 MultiTexCoord1;\n" "attribute vec2 StartCoords0;\n" "attribute vec2 StartCoords1;\n" "attribute vec2 StopCoords0;\n" "attribute vec2 StopCoords1;\n" "uniform mat4 ModelViewProjectionMatrix;\n" "void main()\n" "{\n" " gl_Position = ModelViewProjectionMatrix * Vertex;\n"); cairo_gl_shader_emit_vertex (stream, src_type, CAIRO_GL_TEX_SOURCE); cairo_gl_shader_emit_vertex (stream, mask_type, CAIRO_GL_TEX_MASK); if (use_coverage) cairo_gl_shader_def_coverage (stream); if (src_use_atlas) cairo_gl_shader_def_use_atlas (stream, src_type, CAIRO_GL_TEX_SOURCE); if (mask_use_atlas) cairo_gl_shader_def_use_atlas (stream, mask_type, CAIRO_GL_TEX_MASK); _cairo_output_stream_write (stream, "}\n\0", 3); status = _cairo_memory_stream_destroy (stream, &source, &length); if (unlikely (status)) return status; *out = (char *) source; return CAIRO_STATUS_SUCCESS; }