diff --git a/gfx/drivers_font/gl_raster_font.c b/gfx/drivers_font/gl_raster_font.c index d8025cfdb3..1317c184bb 100644 --- a/gfx/drivers_font/gl_raster_font.c +++ b/gfx/drivers_font/gl_raster_font.c @@ -172,7 +172,7 @@ static void gl_raster_font_draw_vertices(gl_t *gl, const gl_coords_t *coords) glDrawArrays(GL_TRIANGLES, 0, coords->vertices); } -static void gl_raster_font_render_message( +static void gl_raster_font_render_line( gl_raster_t *font, const char *msg, GLfloat scale, const GLfloat color[4], GLfloat pos_x, GLfloat pos_y, unsigned text_align) @@ -262,6 +262,38 @@ static void gl_raster_font_render_message( } } +static void gl_raster_font_render_message( + gl_raster_t *font, const char *msg, GLfloat scale, + const GLfloat color[4], GLfloat pos_x, GLfloat pos_y, + unsigned text_align) +{ + //If the font height is not supported just draw as usual + if (!font->font_driver->get_line_height) + { + gl_raster_font_render_line(font, msg, scale, color, pos_x, pos_y, text_align); + return; + } + + char* copy = strdup(msg); + + char* next_line = strtok(copy, "\n"); + int lines = 0; + + float line_height = scale * 1/(float)font->font_driver->get_line_height(font->font_data); + + while (next_line != NULL) + { + //Draw the line + gl_raster_font_render_line(font, next_line, scale, color, pos_x, pos_y - (float)lines*line_height, text_align); + + //Continue to split + next_line = strtok(NULL, "\n"); + lines++; + } + + free(copy); +} + static void gl_raster_font_setup_viewport(gl_raster_t *font, bool full_screen) { unsigned width, height; diff --git a/gfx/drivers_font_renderer/bitmapfont.c b/gfx/drivers_font_renderer/bitmapfont.c index 02ff13b9a1..75cb15e60d 100644 --- a/gfx/drivers_font_renderer/bitmapfont.c +++ b/gfx/drivers_font_renderer/bitmapfont.c @@ -128,6 +128,16 @@ static const char *font_renderer_bmp_get_default_font(void) return ""; } +static int font_renderer_bmp_get_line_height(void* data) +{ + bm_renderer_t *handle = (bm_renderer_t*)data; + + if (!handle) + return FONT_HEIGHT; + + return FONT_HEIGHT * handle->scale_factor; +} + font_renderer_driver_t bitmap_font_renderer = { font_renderer_bmp_init, font_renderer_bmp_get_atlas, @@ -135,5 +145,6 @@ font_renderer_driver_t bitmap_font_renderer = { font_renderer_bmp_free, font_renderer_bmp_get_default_font, "bitmap", + font_renderer_bmp_get_line_height, }; diff --git a/gfx/drivers_font_renderer/coretext.c b/gfx/drivers_font_renderer/coretext.c index fb15f46235..0db58d471a 100644 --- a/gfx/drivers_font_renderer/coretext.c +++ b/gfx/drivers_font_renderer/coretext.c @@ -293,4 +293,5 @@ font_renderer_driver_t coretext_font_renderer = { font_renderer_ct_free, font_renderer_ct_get_default_font, "coretext", + NULL, /*get_line_height*/ }; diff --git a/gfx/drivers_font_renderer/freetype.c b/gfx/drivers_font_renderer/freetype.c index 9890d21823..14f859965c 100644 --- a/gfx/drivers_font_renderer/freetype.c +++ b/gfx/drivers_font_renderer/freetype.c @@ -226,6 +226,15 @@ static const char *font_renderer_ft_get_default_font(void) return NULL; } +static int font_renderer_ft_get_line_height(void* data) +{ + ft_font_renderer_t *handle = (ft_font_renderer_t*)data; + if (!handle) + return 0; + + return handle->face->size->metrics.height/64; +} + font_renderer_driver_t freetype_font_renderer = { font_renderer_ft_init, font_renderer_ft_get_atlas, @@ -233,4 +242,5 @@ font_renderer_driver_t freetype_font_renderer = { font_renderer_ft_free, font_renderer_ft_get_default_font, "freetype", + font_renderer_ft_get_line_height, }; diff --git a/gfx/font_renderer_driver.h b/gfx/font_renderer_driver.h index 9e3c0a3681..d770e7e0da 100644 --- a/gfx/font_renderer_driver.h +++ b/gfx/font_renderer_driver.h @@ -94,6 +94,8 @@ typedef struct font_renderer_driver const char *(*get_default_font)(void); const char *ident; + + int (*get_line_height)(void* data); } font_renderer_driver_t; extern font_renderer_driver_t freetype_font_renderer;