Start creating font driver wrapper functions

This commit is contained in:
twinaphex 2015-12-05 10:31:15 +01:00
parent 63c12b0083
commit 89721b8837
6 changed files with 80 additions and 55 deletions

View File

@ -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

View File

@ -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");

View File

@ -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);
}

View File

@ -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

View File

@ -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)
{

View File

@ -22,6 +22,7 @@
#include <sys/types.h>
#include <boolean.h>
#include <gfx/scaler/scaler.h>
#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)