diff --git a/gfx/d3d/d3d.cpp b/gfx/d3d/d3d.cpp index 132bf73ef7..a8b18d084d 100644 --- a/gfx/d3d/d3d.cpp +++ b/gfx/d3d/d3d.cpp @@ -107,16 +107,10 @@ static void d3d_deinit_chain(d3d_video_t *d3d) static void d3d_deinitialize(d3d_video_t *d3d) { - driver_t *driver = driver_get_ptr(); - const font_renderer_t *font_ctx = NULL; if (!d3d) return; - font_ctx = (const font_renderer_t*)driver->font_osd_driver; - - if (font_ctx->free) - font_ctx->free(driver->font_osd_data); - font_ctx = NULL; + font_driver_free(); d3d_deinit_chain(d3d); } @@ -406,8 +400,7 @@ static bool d3d_initialize(d3d_video_t *d3d, const video_info_t *info) strlcpy(settings->video.font_path, "game:\\media\\Arial_12.xpr", sizeof(settings->video.font_path)); #endif - if (!font_init_first((const void**)&driver->font_osd_driver, &driver->font_osd_data, - d3d, settings->video.font_path, 0, FONT_DRIVER_RENDER_DIRECT3D_API)) + if (!font_driver_init_first(d3d, settings->video.font_path, 0, FONT_DRIVER_RENDER_DIRECT3D_API)) { RARCH_ERR("[D3D]: Failed to initialize font renderer.\n"); return false; @@ -528,14 +521,11 @@ static void d3d_set_osd_msg(void *data, const char *msg, const struct font_params *params, void *font) { d3d_video_t *d3d = (d3d_video_t*)data; - driver_t *driver = driver_get_ptr(); - const font_renderer_t *font_ctx = driver->font_osd_driver; if (d3d->renderchain_driver->set_font_rect && params) d3d->renderchain_driver->set_font_rect(d3d, params); - if (font_ctx->render_msg) - font_ctx->render_msg(driver->font_osd_data, msg, params); + font_driver_render_msg(msg, params); } /* Delay constructor due to lack of exceptions. */ @@ -1505,7 +1495,7 @@ static bool d3d_frame(void *data, const void *frame, return false; } - if (font_ctx->render_msg && msg) + if (font_driver_has_render_msg() && msg) { struct font_params font_parms = {0}; #ifdef _XBOX @@ -1520,7 +1510,7 @@ static bool d3d_frame(void *data, const void *frame, font_parms.y = msg_height; font_parms.scale = 21; #endif - font_ctx->render_msg(driver->font_osd_data, msg, &font_parms); + font_driver_render_msg(msg, &font_params); } #ifdef HAVE_MENU diff --git a/gfx/drivers/gl.c b/gfx/drivers/gl.c index bc8885004a..da7246b917 100644 --- a/gfx/drivers/gl.c +++ b/gfx/drivers/gl.c @@ -1637,9 +1637,7 @@ static bool gl_frame(void *data, const void *frame, struct gfx_tex_info feedback_info; static struct retro_perf_counter frame_run = {0}; gl_t *gl = (gl_t*)data; - driver_t *driver = driver_get_ptr(); settings_t *settings = config_get_ptr(); - const struct font_renderer *font_driver = driver ? driver->font_osd_driver : NULL; rarch_perf_init(&frame_run, "frame_run"); retro_perf_start(&frame_run); @@ -1796,8 +1794,8 @@ static bool gl_frame(void *data, const void *frame, } #endif - if (msg && driver->font_osd_driver && driver->font_osd_data) - font_driver->render_msg(driver->font_osd_data, msg, NULL); + if (msg) + font_driver_render_msg(msg, NULL); #ifdef HAVE_OVERLAY if (gl->overlay_enable) @@ -1916,10 +1914,6 @@ static void gl_free_overlay(gl_t *gl) static void gl_free(void *data) { gl_t *gl = (gl_t*)data; - driver_t *driver = driver_get_ptr(); - const struct font_renderer *font_driver = driver ? - driver->font_osd_driver : NULL; - if (!gl) return; @@ -1940,8 +1934,7 @@ static void gl_free(void *data) } #endif - if (font_driver && driver->font_osd_data) - font_driver->free(driver->font_osd_data); + font_driver_free(); gl_shader_deinit(gl); #ifndef NO_GL_FF_VERTEX @@ -2453,8 +2446,7 @@ static void *gl_init(const video_info_t *video, const input_driver_t **input, vo const char *version = NULL; struct retro_hw_render_callback *hw_render = NULL; settings_t *settings = config_get_ptr(); - driver_t *driver = driver_get_ptr(); - gl_t *gl = (gl_t*)calloc(1, sizeof(gl_t)); + gl_t *gl = (gl_t*)calloc(1, sizeof(gl_t)); if (!gl) return NULL; @@ -2649,8 +2641,7 @@ static void *gl_init(const video_info_t *video, const input_driver_t **input, vo if (settings->video.font_enable) { - if (!font_init_first((const void**)&driver->font_osd_driver, &driver->font_osd_data, - gl, *settings->video.font_path + if (!font_driver_init_first(gl, *settings->video.font_path ? settings->video.font_path : NULL, settings->video.font_size, FONT_DRIVER_RENDER_OPENGL_API)) RARCH_ERR("[GL]: Failed to initialize font renderer.\n"); diff --git a/gfx/font_driver.c b/gfx/font_driver.c index fc0a386284..cd0838136e 100644 --- a/gfx/font_driver.c +++ b/gfx/font_driver.c @@ -142,3 +142,40 @@ bool font_init_first(const void **font_driver, void **font_handle, return false; } + +bool font_driver_has_render_msg(void) +{ + driver_t *driver = driver_get_ptr(); + const font_renderer_t *font_ctx = driver->font_osd_driver; + if (!font_ctx || !font_ctx->render_msg) + return false; + return true; +} + +void font_driver_render_msg(const char *msg, const struct font_params *params) +{ + driver_t *driver = driver_get_ptr(); + const font_renderer_t *font_ctx = driver->font_osd_driver; + + if (font_ctx->render_msg) + font_ctx->render_msg(driver->font_osd_data, msg, params); +} + +void font_driver_free(void) +{ + driver_t *driver = driver_get_ptr(); + const font_renderer_t *font_ctx = (const font_renderer_t*)driver->font_osd_driver; + + if (font_ctx->free) + font_ctx->free(driver->font_osd_data); + driver->font_osd_data = NULL; + driver->font_osd_driver = NULL; +} + +bool font_driver_init_first(void *data, const char *font_path, float font_size, + enum font_driver_render_api api) +{ + driver_t *driver = driver_get_ptr(); + return font_init_first((const void**)&driver->font_osd_driver, &driver->font_osd_data, + data, font_path, font_size, api); +} diff --git a/gfx/font_driver.h b/gfx/font_driver.h index 0bb8d61ea8..56c42d612e 100644 --- a/gfx/font_driver.h +++ b/gfx/font_driver.h @@ -33,11 +33,43 @@ enum font_driver_render_api FONT_DRIVER_RENDER_VITA2D }; +enum text_alignment +{ + TEXT_ALIGN_LEFT = 0, + TEXT_ALIGN_RIGHT, + TEXT_ALIGN_CENTER +}; + +struct font_params +{ + float x; + float y; + float scale; + /* Drop shadow color multiplier. */ + float drop_mod; + /* Drop shadow offset. + * If both are 0, no drop shadow will be rendered. */ + int drop_x, drop_y; + /* ABGR. Use the macros. */ + uint32_t color; + bool full_screen; + enum text_alignment text_align; +}; + bool font_init_first( const void **font_driver, void **font_handle, void *video_data, const char *font_path, float font_size, enum font_driver_render_api api); +bool font_driver_has_render_msg(void); + +void font_driver_render_msg(const char *msg, const struct font_params *params); + +void font_driver_free(void); + +bool font_driver_init_first(void *data, const char *font_path, float font_size, + enum font_driver_render_api api); + #ifdef __cplusplus } #endif diff --git a/gfx/video_driver.c b/gfx/video_driver.c index ba1a2f9393..8aaba963d6 100644 --- a/gfx/video_driver.c +++ b/gfx/video_driver.c @@ -808,8 +808,6 @@ bool video_driver_get_video_output_size(unsigned *width, unsigned *height) return false; } - - void video_driver_set_osd_msg(const char *msg, const struct font_params *params, void *font) { diff --git a/gfx/video_driver.h b/gfx/video_driver.h index 2788d35cde..aa58242aa3 100644 --- a/gfx/video_driver.h +++ b/gfx/video_driver.h @@ -22,6 +22,7 @@ #include #include #include +#include "font_driver.h" #include "video_filter.h" #include "video_shader_parse.h" @@ -33,13 +34,6 @@ extern "C" { #endif -enum text_alignment -{ - TEXT_ALIGN_LEFT = 0, - TEXT_ALIGN_RIGHT, - TEXT_ALIGN_CENTER -}; - enum texture_filter_type { TEXTURE_FILTER_LINEAR = 0, @@ -71,23 +65,6 @@ typedef struct video_info bool rgb32; } video_info_t; - -struct font_params -{ - float x; - float y; - float scale; - /* Drop shadow color multiplier. */ - float drop_mod; - /* Drop shadow offset. - * If both are 0, no drop shadow will be rendered. */ - int drop_x, drop_y; - /* ABGR. Use the macros. */ - uint32_t color; - bool full_screen; - enum text_alignment text_align; -}; - #define FONT_COLOR_RGBA(r, g, b, a) (((r) << 24) | ((g) << 16) | ((b) << 8) | ((a) << 0)) #define FONT_COLOR_GET_RED(col) (((col) >> 24) & 0xff) #define FONT_COLOR_GET_GREEN(col) (((col) >> 16) & 0xff)