diff --git a/console/font.h b/console/font.h
new file mode 100644
index 0000000000..55e8ebdf2a
--- /dev/null
+++ b/console/font.h
@@ -0,0 +1,27 @@
+/* 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 .
+ */
+
+#ifndef _CONSOLE_FONT_H
+#define _CONSOLE_FONT_H
+
+#define FONT_WIDTH 5
+#define FONT_HEIGHT 10
+
+#define FONT_OFFSET(x) ((x) * ((FONT_HEIGHT * FONT_WIDTH + 7) / 8))
+
+//extern uint8_t _binary_console_font_bmp_start[];
+extern uint8_t _binary_console_font_bin_start[];
+
+#endif
diff --git a/console/rgui/rgui.c b/console/rgui/rgui.c
index fd2dd1ffb2..31b920cf49 100644
--- a/console/rgui/rgui.c
+++ b/console/rgui/rgui.c
@@ -16,6 +16,7 @@
#include "rgui.h"
#include "list.h"
#include "../rarch_console_video.h"
+#include "../font.h"
#include "../../screenshot.h"
#include
#include
@@ -23,8 +24,6 @@
#include
#include
-#define FONT_WIDTH 5
-#define FONT_HEIGHT 10
#define FONT_WIDTH_STRIDE (FONT_WIDTH + 1)
#define FONT_HEIGHT_STRIDE (FONT_HEIGHT + 1)
@@ -55,7 +54,8 @@ struct rgui_handle
char path_buf[PATH_MAX];
- uint8_t font[256][(FONT_HEIGHT * FONT_WIDTH + 7) / 8];
+ uint8_t *font;
+ bool alloc_font;
};
static const char *rgui_device_labels[] = {
@@ -94,8 +94,7 @@ static inline bool rgui_is_viewport_menu(rgui_file_type_t menu_type)
return (menu_type == RGUI_SETTINGS_CUSTOM_VIEWPORT || menu_type == RGUI_SETTINGS_CUSTOM_VIEWPORT_2);
}
-static void copy_glyph(uint8_t glyph[(FONT_HEIGHT * FONT_WIDTH + 7) / 8],
- const uint8_t *buf)
+static void copy_glyph(uint8_t *glyph, const uint8_t *buf)
{
for (int y = 0; y < FONT_HEIGHT; y++)
{
@@ -117,18 +116,20 @@ static void copy_glyph(uint8_t glyph[(FONT_HEIGHT * FONT_WIDTH + 7) / 8],
static void init_font(rgui_handle_t *rgui, const uint8_t *font_bmp_buf)
{
+ rgui->font = (uint8_t *) calloc(1, FONT_OFFSET(256));
+ rgui->alloc_font = true;
for (unsigned i = 0; i < 256; i++)
{
unsigned y = i / 16;
unsigned x = i % 16;
- copy_glyph(rgui->font[i],
+ copy_glyph(&rgui->font[FONT_OFFSET(i)],
font_bmp_buf + 54 + 3 * (256 * (255 - 16 * y) + 16 * x));
}
}
rgui_handle_t *rgui_init(const char *base_path,
uint16_t *framebuf, size_t framebuf_pitch,
- const uint8_t *font_bmp_buf, const uint8_t *font_bin_buf,
+ const uint8_t *font_bmp_buf, uint8_t *font_bin_buf,
rgui_folder_enum_cb_t folder_cb, void *userdata)
{
rgui_handle_t *rgui = (rgui_handle_t*)calloc(1, sizeof(*rgui));
@@ -146,7 +147,7 @@ rgui_handle_t *rgui_init(const char *base_path,
if (font_bmp_buf)
init_font(rgui, font_bmp_buf);
else if (font_bin_buf)
- memcpy(rgui->font, font_bin_buf, sizeof(rgui->font));
+ rgui->font = font_bin_buf;
else
{
RARCH_ERR("no font bmp or bin, abort");
@@ -160,6 +161,8 @@ void rgui_free(rgui_handle_t *rgui)
{
rgui_list_free(rgui->path_stack);
rgui_list_free(rgui->folder_buf);
+ if (rgui->alloc_font)
+ free(rgui->font);
free(rgui);
}
@@ -200,7 +203,7 @@ static void blit_line(rgui_handle_t *rgui,
{
uint8_t rem = 1 << ((i + j * FONT_WIDTH) & 7);
unsigned offset = (i + j * FONT_WIDTH) >> 3;
- bool col = (rgui->font[(unsigned char)*message][offset] & rem);
+ bool col = (rgui->font[FONT_OFFSET((unsigned char)*message) + offset] & rem);
if (col)
rgui->frame_buf[(y + j) * (rgui->frame_buf_pitch >> 2) + (x + i)] = green ?
diff --git a/console/rgui/rgui.h b/console/rgui/rgui.h
index 7ce3eb79f7..201b20fb2b 100644
--- a/console/rgui/rgui.h
+++ b/console/rgui/rgui.h
@@ -104,7 +104,7 @@ typedef bool (*rgui_folder_enum_cb_t)(const char *directory,
rgui_handle_t *rgui_init(const char *base_path,
uint16_t *framebuf, size_t framebuf_pitch,
- const uint8_t *font_bmp_buf, const uint8_t *font_bin_buf,
+ const uint8_t *font_bmp_buf, uint8_t *font_bin_buf,
rgui_folder_enum_cb_t folder_cb, void *userdata);
void rgui_iterate(rgui_handle_t *rgui, rgui_action_t action);
diff --git a/gx/frontend/main.c b/gx/frontend/main.c
index 887fbdc4cf..f61c3de9a5 100644
--- a/gx/frontend/main.c
+++ b/gx/frontend/main.c
@@ -22,6 +22,7 @@
#include "../../libretro.h"
#include "../../console/rgui/rgui.h"
+#include "../../console/font.h"
#include "../../console/rarch_console_exec.h"
#include "../../console/rarch_console_input.h"
@@ -130,9 +131,6 @@ enum
GX_DEVICE_NAV_LAST
};
-//extern uint8_t _binary_console_font_bmp_start[];
-extern uint8_t _binary_console_font_bin_start[];
-
static bool folder_cb(const char *directory, rgui_file_enum_cb_t file_cb,
void *userdata, void *ctx)
{
@@ -322,7 +320,7 @@ static void menu_init(void)
{
rgui = rgui_init("",
menu_framebuf, RGUI_WIDTH * sizeof(uint32_t),
- NULL, _binary_console_font_bin_start, folder_cb, NULL);
+ NULL /* _binary_console_font_bmp_start */, _binary_console_font_bin_start, folder_cb, NULL);
rgui_iterate(rgui, RGUI_ACTION_REFRESH);
g_console.mode_switch = MODE_MENU;