Context-ize GL font rendering.

This commit is contained in:
Themaister 2012-12-15 00:07:31 +01:00
parent fcb31db218
commit b239785038
6 changed files with 78 additions and 15 deletions

View File

@ -162,7 +162,7 @@ ifeq ($(HAVE_SDL), 1)
endif
ifeq ($(HAVE_OPENGL), 1)
OBJ += gfx/gl.o gfx/gfx_context.o gfx/fonts/gl_font.o gfx/math/matrix.o
OBJ += gfx/gl.o gfx/gfx_context.o gfx/gl_font.o gfx/fonts/gl_font.o gfx/math/matrix.o
ifeq ($(HAVE_KMS), 1)
OBJ += gfx/context/drm_egl_ctx.o

View File

@ -16,10 +16,10 @@
#include "../gl_common.h"
void gl_init_font(void *data, const char *font_path, unsigned font_size)
static bool gl_init_font(void *data, const char *font_path, unsigned font_size)
{
if (!g_settings.video.font_enable)
return;
return false;
gl_t *gl = (gl_t*)data;
@ -34,7 +34,10 @@ void gl_init_font(void *data, const char *font_path, unsigned font_size)
glBindTexture(GL_TEXTURE_2D, gl->texture[gl->tex_index]);
}
else
{
RARCH_WARN("Couldn't init font renderer.\n");
return false;
}
for (unsigned i = 0; i < 4; i++)
{
@ -50,6 +53,8 @@ void gl_init_font(void *data, const char *font_path, unsigned font_size)
gl->font_color_dark[4 * i + j] = 0.3 * gl->font_color[4 * i + j];
gl->font_color_dark[4 * i + 3] = 1.0;
}
return true;
}
void gl_deinit_font(void *data)
@ -291,7 +296,7 @@ static void setup_font(void *data, const char *msg, GLfloat scale, GLfloat pos_x
gl_set_projection(gl, &ortho, true);
}
void gl_render_msg(void *data, const char *msg)
static void gl_render_msg(void *data, const char *msg)
{
(void)data;
(void)msg;
@ -302,7 +307,7 @@ void gl_render_msg(void *data, const char *msg)
g_settings.video.msg_pos_x, g_settings.video.msg_pos_y);
}
void gl_render_msg_place(void *data, float pos_x, float pos_y, float scale, uint32_t color, const char *msg)
static void gl_render_msg_place(void *data, float pos_x, float pos_y, float scale, uint32_t color, const char *msg)
{
(void)data;
(void)msg;
@ -312,3 +317,12 @@ void gl_render_msg_place(void *data, float pos_x, float pos_y, float scale, uint
setup_font(data, msg, scale, pos_x, pos_y);
#endif
}
const gl_font_renderer_t gl_raster_font = {
gl_init_font,
gl_deinit_font,
gl_render_msg,
gl_render_msg_place,
"GL raster",
};

View File

@ -1174,12 +1174,13 @@ static bool gl_frame(void *data, const void *frame, unsigned width, unsigned hei
{
char fps_txt[128];
gfx_fps_title(fps_txt, sizeof(fps_txt));
gl_render_msg_place(gl, g_settings.video.msg_pos_x, 0.56f, 1.04f, WHITE, fps_txt);
if (gl->font_ctx)
gl->font_ctx->render_msg_place(gl, g_settings.video.msg_pos_x, 0.56f, 1.04f, WHITE, fps_txt);
}
#endif
if (msg)
gl_render_msg(gl, msg);
if (msg && gl->font_ctx)
gl->font_ctx->render_msg(gl, msg);
#if !defined(RARCH_CONSOLE)
context_update_window_title_func(false);
@ -1223,7 +1224,8 @@ static void gl_free(void *data)
gl_t *gl = (gl_t*)data;
gl_deinit_font(gl);
if (gl->font_ctx)
gl->font_ctx->deinit(gl);
gl_shader_deinit(gl);
#ifndef NO_GL_FF_VERTEX
@ -1541,7 +1543,8 @@ static void *gl_init(const video_info_t *video, const input_driver_t **input, vo
gl_init_textures_data(gl);
context_input_driver_func(input, input_data);
gl_init_font(gl, g_settings.video.font_path, g_settings.video.font_size);
gl->font_ctx = gl_font_init_first(gl, g_settings.video.font_path, g_settings.video.font_size);
gl_init_pbo_readback(gl);

View File

@ -21,6 +21,7 @@
#include "math/matrix.h"
#include "gfx_context.h"
#include "scaler/scaler.h"
#include "gl_font.h"
#ifdef HAVE_CONFIG_H
#include "../config.h"
@ -266,6 +267,7 @@ typedef struct gl
// Fonts
void *font;
const gl_font_renderer_t *font_ctx;
const font_renderer_driver_t *font_driver;
GLuint font_tex;
int font_tex_w, font_tex_h;

33
gfx/gl_font.c Normal file
View File

@ -0,0 +1,33 @@
/* RetroArch - A frontend for libretro.
* Copyright (C) 2010-2012 - Hans-Kristian Arntzen
*
* RetroArch is free software: you can redistribute it and/or modify it under the terms
* of the GNU General Public License as published by the Free Software Found-
* ation, either version 3 of the License, or (at your option) any later version.
*
* RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with RetroArch.
* If not, see <http://www.gnu.org/licenses/>.
*/
#include "gl_font.h"
#include "../general.h"
static const gl_font_renderer_t *backends[] = {
&gl_raster_font,
};
const gl_font_renderer_t *gl_font_init_first(void *data, const char *font_path, unsigned font_size)
{
for (unsigned i = 0; i < ARRAY_SIZE(backends); i++)
{
if (backends[i]->init(data, font_path, font_size))
return backends[i];
}
return NULL;
}

View File

@ -16,12 +16,23 @@
#ifndef GL_FONT_H__
#define GL_FONT_H__
#include "gl_common.h"
#include <stdint.h>
#include "../boolean.h"
void gl_init_font(void *data, const char *font_path, unsigned font_size);
void gl_deinit_font(void *data);
void gl_render_msg(void *data, const char *msg);
void gl_render_msg_place(void *data, float x, float y, float scale, uint32_t color, const char *msg);
typedef struct gl_font_renderer
{
bool (*init)(void *data, const char *font_path, unsigned font_size);
void (*deinit)(void *data);
void (*render_msg)(void *data, const char *msg);
void (*render_msg_place)(void *data, float x, float y,
float scale, uint32_t color, const char *msg);
const char *ident;
} gl_font_renderer_t;
extern const gl_font_renderer_t gl_raster_font;
const gl_font_renderer_t *gl_font_init_first(void *data,
const char *font_path, unsigned font_size);
#endif