void menu_display_push_quad( unsigned width, unsigned height, const float *colors, int x1, int y1, int x2, int y2) { menu_display_ctx_coord_draw_t coord_draw; float vertex[8]; video_coords_t coords; video_coord_array_t *ca = NULL; ca = menu_display_get_coords_array(); vertex[0] = x1 / (float)width; vertex[1] = y1 / (float)height; vertex[2] = x2 / (float)width; vertex[3] = y1 / (float)height; vertex[4] = x1 / (float)width; vertex[5] = y2 / (float)height; vertex[6] = x2 / (float)width; vertex[7] = y2 / (float)height; coord_draw.ptr = NULL; menu_display_get_tex_coords(&coord_draw); coords.color = colors; coords.vertex = vertex; coords.tex_coord = coord_draw.ptr; coords.lut_tex_coord = coord_draw.ptr; coords.vertices = 3; video_coord_array_append(ca, &coords, 3); coords.color += 4; coords.vertex += 2; coords.tex_coord += 2; coords.lut_tex_coord += 2; video_coord_array_append(ca, &coords, 3); }
static void gl_raster_font_render_line( gl_raster_t *font, const char *msg, unsigned msg_len, GLfloat scale, const GLfloat color[4], GLfloat pos_x, GLfloat pos_y, unsigned text_align) { int x, y, delta_x, delta_y; unsigned i; struct video_coords coords; float inv_tex_size_x, inv_tex_size_y, inv_win_width, inv_win_height; GLfloat font_tex_coords[2 * 6 * MAX_MSG_LEN_CHUNK]; GLfloat font_vertex[2 * 6 * MAX_MSG_LEN_CHUNK]; GLfloat font_color[4 * 6 * MAX_MSG_LEN_CHUNK]; GLfloat font_lut_tex_coord[2 * 6 * MAX_MSG_LEN_CHUNK]; gl_t *gl = font ? font->gl : NULL; const char* msg_end = msg + msg_len; if (!gl) return; x = roundf(pos_x * gl->vp.width); y = roundf(pos_y * gl->vp.height); delta_x = 0; delta_y = 0; switch (text_align) { case TEXT_ALIGN_RIGHT: x -= gl_get_message_width(font, msg, msg_len, scale); break; case TEXT_ALIGN_CENTER: x -= gl_get_message_width(font, msg, msg_len, scale) / 2.0; break; } inv_tex_size_x = 1.0f / font->tex_width; inv_tex_size_y = 1.0f / font->tex_height; inv_win_width = 1.0f / font->gl->vp.width; inv_win_height = 1.0f / font->gl->vp.height; while (msg < msg_end) { i = 0; while ((i < MAX_MSG_LEN_CHUNK) && (msg < msg_end)) { int off_x, off_y, tex_x, tex_y, width, height; unsigned code = utf8_walk(&msg); const struct font_glyph *glyph = font->font_driver->get_glyph( font->font_data, code); if (!glyph) /* Do something smarter here ... */ glyph = font->font_driver->get_glyph(font->font_data, '?'); if (!glyph) continue; off_x = glyph->draw_offset_x; off_y = glyph->draw_offset_y; tex_x = glyph->atlas_offset_x; tex_y = glyph->atlas_offset_y; width = glyph->width; height = glyph->height; gl_raster_font_emit(0, 0, 1); /* Bottom-left */ gl_raster_font_emit(1, 1, 1); /* Bottom-right */ gl_raster_font_emit(2, 0, 0); /* Top-left */ gl_raster_font_emit(3, 1, 0); /* Top-right */ gl_raster_font_emit(4, 0, 0); /* Top-left */ gl_raster_font_emit(5, 1, 1); /* Bottom-right */ i++; delta_x += glyph->advance_x; delta_y -= glyph->advance_y; } coords.tex_coord = font_tex_coords; coords.vertex = font_vertex; coords.color = font_color; coords.vertices = i * 6; coords.lut_tex_coord = font_lut_tex_coord; if (font->block) video_coord_array_append(&font->block->carr, &coords, coords.vertices); else gl_raster_font_draw_vertices(font, &coords); } }