From fbb84ba4b6ff1e61c2cbeec53ddb6a4048e72228 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 30 Mar 2015 00:41:42 +0200 Subject: [PATCH] (D3D) Start changing init functions of d3d font drivers --- gfx/drivers_font/d3d_w32_font.cpp | 23 ++++++++++++------ gfx/drivers_font/xdk1_xfonts.c | 39 ++++++++++++++----------------- gfx/drivers_font/xdk360_fonts.cpp | 34 +++++++++++++-------------- gfx/font_d3d_driver.c | 7 ++++-- gfx/font_d3d_driver.h | 2 +- 5 files changed, 57 insertions(+), 48 deletions(-) diff --git a/gfx/drivers_font/d3d_w32_font.cpp b/gfx/drivers_font/d3d_w32_font.cpp index ddba29fa6c..dce5479b00 100644 --- a/gfx/drivers_font/d3d_w32_font.cpp +++ b/gfx/drivers_font/d3d_w32_font.cpp @@ -25,12 +25,11 @@ typedef struct uint32_t color; } d3dfonts_t; -static d3dfonts_t *d3dfonts; - -static bool d3dfonts_w32_init_font(void *video_data, +static void *d3dfonts_w32_init_font(void *video_data, const char *font_path, unsigned font_size) { uint32_t r, g, b; + d3dfonts_t *d3dfonts = NULL; settings_t *settings = config_get_ptr(); D3DXFONT_DESC desc = { static_cast(font_size), 0, 400, 0, @@ -44,7 +43,7 @@ static bool d3dfonts_w32_init_font(void *video_data, d3dfonts = (d3dfonts_t*)calloc(1, sizeof(*d3dfonts)); if (!d3dfonts) - return false; + return NULL; (void)font_path; @@ -55,12 +54,21 @@ static bool d3dfonts_w32_init_font(void *video_data, d3dfonts->d3d = (d3d_video_t*)video_data; d3dfonts->color = D3DCOLOR_XRGB(r, g, b); - return SUCCEEDED(D3DXCreateFontIndirect(d3dfonts->d3d->dev, &desc, &d3dfonts->font)); + if (!FAILED(D3DXCreateFontIndirect(d3dfonts->d3d->dev, &desc, &d3dfonts->font))) + { + free(d3dfonts); + return NULL; + } + + return d3dfonts; } static void d3dfonts_w32_free_font(void *data) { - (void)data; + d3dfonts_t *d3dfonts = (d3dfonts_t*)data; + + if (!d3dfonts) + return; if (d3dfonts->font) d3dfonts->font->Release(); @@ -74,8 +82,9 @@ static void d3dfonts_w32_render_msg(void *data, const char *msg, const void *userdata) { const struct font_params *params = (const struct font_params*)userdata; + d3dfonts_t *d3dfonts = (d3dfonts_t*)data; - if (!d3dfonts->d3d) + if (!d3dfonts || !d3dfonts->d3d) return; if (!msg) return; diff --git a/gfx/drivers_font/xdk1_xfonts.c b/gfx/drivers_font/xdk1_xfonts.c index 9ad114b35f..7981efe979 100644 --- a/gfx/drivers_font/xdk1_xfonts.c +++ b/gfx/drivers_font/xdk1_xfonts.c @@ -25,33 +25,31 @@ typedef struct D3DSurface *pFrontBuffer; } xfonts_t; -static xfonts_t *xfonts; - -static bool xfonts_init_font(void *video_data, +static void *xfonts_init_font(void *video_data, const char *font_path, unsigned font_size) { + xfonts_t *xfonts = (xfonts_t*)calloc(1, sizeof(*xfont)); + + if (!xfonts) + return NULL; + (void)font_path; (void)font_size; - xfont = (xfonts_t*)calloc(1, sizeof(*xfont)); + xfonts->d3d = video_data; - if (!xfont) - return false; + XFONT_OpenDefaultFont(&xfonts->debug_font); + xfonts->debug_font->SetBkMode(XFONT_TRANSPARENT); + xfonts->debug_font->SetBkColor(D3DCOLOR_ARGB(100,0,0,0)); + xfonts->debug_font->SetTextHeight(14); + xfonts->debug_font->SetTextAntialiasLevel(xfonts->debug_font->GetTextAntialiasLevel()); - xfont->d3d = video_data; - - XFONT_OpenDefaultFont(&xfont->debug_font); - xfont->debug_font->SetBkMode(XFONT_TRANSPARENT); - xfont->debug_font->SetBkColor(D3DCOLOR_ARGB(100,0,0,0)); - xfont->debug_font->SetTextHeight(14); - xfont->debug_font->SetTextAntialiasLevel(xfont->debug_font->GetTextAntialiasLevel()); - - return true; + return xfonts; } static void xfonts_free_font(void *data) { - (void)data; + xfonts_t *xfonts = (xfonts_t*)data; if (xfont) free(xfont); @@ -65,8 +63,7 @@ static void xfonts_render_msg(void *data, const char *msg, float x, y; settings_t *settings = config_get_ptr(); const struct font_params *params = (const struct font_params*)userdata; - - (void)data; + xfonts_t *xfonts = (xfonts_t*)data; if (params) { @@ -79,11 +76,11 @@ static void xfonts_render_msg(void *data, const char *msg, y = settings->video.msg_pos_y; } - xfont->d3d->dev->GetBackBuffer(-1, D3DBACKBUFFER_TYPE_MONO, &xfont->pFrontBuffer); + xfonts->d3d->dev->GetBackBuffer(-1, D3DBACKBUFFER_TYPE_MONO, &xfonts->pFrontBuffer); mbstowcs(str, msg, sizeof(str) / sizeof(wchar_t)); - xfont->debug_font->TextOut(xfont->pFrontBuffer, str, (unsigned)-1, x, y); - xfont->pFrontBuffer->Release(); + xfonts->debug_font->TextOut(xfonts->pFrontBuffer, str, (unsigned)-1, x, y); + xfonts->pFrontBuffer->Release(); } d3d_font_renderer_t d3d_xdk1_font = { diff --git a/gfx/drivers_font/xdk360_fonts.cpp b/gfx/drivers_font/xdk360_fonts.cpp index 3a22e8663c..a05e659b5d 100644 --- a/gfx/drivers_font/xdk360_fonts.cpp +++ b/gfx/drivers_font/xdk360_fonts.cpp @@ -53,7 +53,6 @@ typedef struct const GLYPH_ATTR* m_Glyphs; /* Array of glyphs. */ } xdk360_video_font_t; -static xdk360_video_font_t *m_Font; static PackedResource m_xprResource; #define CALCFONTFILEHEADERSIZE(x) ( sizeof(unsigned long) + (sizeof(float)* 4) + sizeof(unsigned short) + (sizeof(wchar_t)*(x)) ) @@ -176,25 +175,21 @@ static HRESULT xdk360_video_font_create_shaders(xdk360_video_font_t * font) return hr; } -static bool xdk360_init_font(void *video_data, +static void *xdk360_init_font(void *video_data, const char *font_path, unsigned font_size) { unsigned long dwFileVersion; const void *pFontData = NULL; D3DTexture *pFontTexture = NULL; const unsigned char * pData = NULL; - xdk360_video_font_t *font = NULL; + xdk360_video_font_t *font = (xdk360_video_font_t*)calloc(1, sizeof(*font)); - m_Font = (xdk360_video_font_t*)calloc(1, sizeof(*m_Font)); - - if (!m_Font) - return false; - - m_Font->d3d = (d3d_video_t*)video_data; + if (!font) + return NULL; (void)font_size; - font = (xdk360_video_font_t*)m_Font; + font->d3d = (d3d_video_t*)video_data; font->m_pFontTexture = NULL; font->m_dwNumGlyphs = 0L; @@ -245,15 +240,20 @@ static bool xdk360_init_font(void *video_data, } RARCH_LOG("Successfully initialized D3D9 HLSL fonts.\n"); - return true; + return font; error: RARCH_ERR("Could not initialize D3D9 HLSL fonts.\n"); - return false; + if (font) + free(font); + return NULL; } static void xdk360_free_font(void *data) { - xdk360_video_font_t *font = (xdk360_video_font_t*)m_Font; + xdk360_video_font_t *font = (xdk360_video_font_t*)data; + + if (!font) + return; /* Destroy the font */ font->m_pFontTexture = NULL; @@ -276,9 +276,9 @@ static void xdk360_free_font(void *data) if (m_xprResource.Initialized()) m_xprResource.Destroy(); - if (m_Font) - free(m_Font); - m_Font = NULL; + if (font) + free(font); + font = NULL; } static void xdk360_render_msg_post(xdk360_video_font_t * font) @@ -463,7 +463,7 @@ static void xdk360_render_msg(void *data, const char *str_msg, { float x, y; wchar_t msg[PATH_MAX_LENGTH]; - xdk360_video_font_t *font = (xdk360_video_font_t*)m_Font; + xdk360_video_font_t *font = (xdk360_video_font_t*)data; const struct font_params *params = (const struct font_params*)userdata; if (params) diff --git a/gfx/font_d3d_driver.c b/gfx/font_d3d_driver.c index 7ae803feed..22a67f36e8 100644 --- a/gfx/font_d3d_driver.c +++ b/gfx/font_d3d_driver.c @@ -35,10 +35,13 @@ bool d3d_font_init_first( for (i = 0; i < ARRAY_SIZE(d3d_font_backends); i++) { - if (!d3d_font_backends[i]->init(video_data, font_path, font_size)) - return false; + void *data = d3d_font_backends[i]->init(video_data, font_path, font_size); + + if (!data) + continue; *font_driver = d3d_font_backends[i]; + *font_handle = data; return true; } diff --git a/gfx/font_d3d_driver.h b/gfx/font_d3d_driver.h index 7e2d3c84b9..1615a243d9 100644 --- a/gfx/font_d3d_driver.h +++ b/gfx/font_d3d_driver.h @@ -27,7 +27,7 @@ extern "C" { typedef struct d3d_font_renderer { - bool (*init)(void *data, const char *font_path, unsigned font_size); + void *(*init)(void *data, const char *font_path, unsigned font_size); void (*free)(void *data); void (*render_msg)(void *data, const char *msg, const void *params);