static CoglBool append_tex_coord_attributes_cb (CoglPipeline *pipeline, int layer_index, void *user_data) { AppendTexCoordsState *state = user_data; CoglTexture *texture; float tx, ty; float *t; tx = state->vertices_in[state->vertex].tx; ty = state->vertices_in[state->vertex].ty; /* NULL textures will be handled in * _cogl_pipeline_flush_layers_gl_state but there is no need to worry * about scaling texture coordinates in this case */ texture = cogl_pipeline_get_layer_texture (pipeline, layer_index); if (texture != NULL) _cogl_texture_transform_coords_to_gl (texture, &tx, &ty); /* NB: [X,Y,Z,TX,TY...,R,G,B,A,...] */ t = state->vertices_out + 3 + 2 * state->layer; t[0] = tx; t[1] = ty; state->layer++; return TRUE; }
static void _cogl_texture_pixmap_x11_transform_coords_to_gl (CoglTexture *tex, float *s, float *t) { CoglTexturePixmapX11 *tex_pixmap = COGL_TEXTURE_PIXMAP_X11 (tex); CoglTexture *child_tex = _cogl_texture_pixmap_x11_get_texture (tex_pixmap); /* Forward on to the child texture */ _cogl_texture_transform_coords_to_gl (child_tex, s, t); }
static void _cogl_sub_texture_transform_coords_to_gl (CoglTexture *tex, float *s, float *t) { CoglSubTexture *sub_tex = COGL_SUB_TEXTURE (tex); /* This won't work if the sub texture is not the size of the full texture and the coordinates are outside the range [0,1] */ *s = ((*s * tex->width + sub_tex->sub_x) / cogl_texture_get_width (sub_tex->full_texture)); *t = ((*t * tex->height + sub_tex->sub_y) / cogl_texture_get_height (sub_tex->full_texture)); _cogl_texture_transform_coords_to_gl (sub_tex->full_texture, s, t); }