Enable UTF-8 support in FATFS for all targets

9e53e09c113a0dad9cb1fae5029bac667a60b76e
This commit is contained in:
Alex Duchesne 2025-11-07 15:34:31 -05:00
parent 5a99511264
commit 6e52462319
16 changed files with 80 additions and 9 deletions

View File

@ -364,7 +364,7 @@ rg_rect_t rg_gui_draw_text(int x_pos, int y_pos, int width, const char *text, //
int line_width = padding * 2;
for (const char *ptr = text; *ptr;)
{
int chr = rg_utf8_get_codepoint(&ptr);
int chr = rg_utf8_decode(&ptr);
line_width += monospace ?: get_glyph(NULL, font, font_height, chr);
if (chr == '\n' || *ptr == 0)
@ -398,7 +398,7 @@ rg_rect_t rg_gui_draw_text(int x_pos, int y_pos, int width, const char *text, //
const char *line = ptr;
while (x_offset < draw_width && *line && *line != '\n')
{
int chr = rg_utf8_get_codepoint(&line);
int chr = rg_utf8_decode(&line);
int width = monospace ?: get_glyph(NULL, font, font_height, chr);
if (draw_width - x_offset < width) // Do not truncate glyphs
break;
@ -419,7 +419,7 @@ rg_rect_t rg_gui_draw_text(int x_pos, int y_pos, int width, const char *text, //
{
uint32_t bitmap[font_height];
const char *prev_ptr = ptr;
int glyph_width = get_glyph(bitmap, font, font_height, rg_utf8_get_codepoint(&ptr));
int glyph_width = get_glyph(bitmap, font, font_height, rg_utf8_decode(&ptr));
int width = monospace ?: glyph_width;
if (draw_width - x_offset < width) // Do not truncate glyphs

View File

@ -48,7 +48,7 @@ char *rg_json_fixup(char *json)
return json;
}
int rg_utf8_get_codepoint(const char **ptr)
int rg_utf8_decode(const char **ptr)
{
// This implementation is based solely on https://en.wikipedia.org/wiki/UTF-8#Description
// It's probably wrong in many ways but I'm sure it'll be good enough for us :)
@ -102,6 +102,38 @@ int rg_utf8_get_codepoint(const char **ptr)
return codepoint;
}
size_t rg_utf8_encode(char *output, int codepoint)
{
if (codepoint <= 0x7F) // 1 byte
{
output[0] = codepoint & 0xFF;
return 1;
}
else if (codepoint <= 0x7FF) // 2 bytes
{
output[0] = 0xC0 | ((codepoint >> 6) & 0x1F);
output[1] = 0x80 | (codepoint & 0x3F);
return 2;
}
else if (codepoint <= 0xFFFF) // 3 bytes
{
output[0] = 0xE0 | ((codepoint >> 12) & 0x0F);
output[1] = 0x80 | ((codepoint >> 6) & 0x3F);
output[2] = 0x80 | (codepoint & 0x3F);
return 3;
}
else if (codepoint <= 0x10FFFF) // 4 bytes
{
output[0] = 0xF0 | ((codepoint >> 18) & 0x07);
output[1] = 0x80 | ((codepoint >> 12) & 0x3F);
output[2] = 0x80 | ((codepoint >> 6) & 0x3F);
output[3] = 0x80 | (codepoint & 0x3F);
return 4;
}
RG_LOGD("Out of range codepoint 0x%X", codepoint);
return 0;
}
size_t rg_utf8_strlen(const char *str)
{
if (!str)
@ -110,8 +142,8 @@ size_t rg_utf8_strlen(const char *str)
size_t length = 0;
while (*str)
{
rg_utf8_get_codepoint(&str);
length++;
if (rg_utf8_decode(&str) > 0)
length++;
}
return length;
}

View File

@ -55,9 +55,12 @@ char *rg_json_fixup(char *json);
/* UTF-8 */
// Parse the next codepoint and advance ptr
int rg_utf8_get_codepoint(const char **ptr);
// Count the codepoints in a string
int rg_utf8_decode(const char **ptr);
// size_t rg_utf8_encode(char **ptr, int codepoint);
size_t rg_utf8_encode(char *ptr, int codepoint);
size_t rg_utf8_strlen(const char *str);
// size_t rg_utf8_get_codepoint(const char *str, int *codepoint);
// size_t rg_utf8_put_codepoint(char *str, int codepoint);
/* Paths functions */
const char *rg_dirname(const char *path);

View File

@ -100,6 +100,9 @@ CONFIG_FATFS_LFN_NONE=n
CONFIG_FATFS_LFN_HEAP=y
CONFIG_FATFS_LFN_STACK=n
CONFIG_FATFS_MAX_LFN=255
CONFIG_FATFS_API_ENCODING_ANSI_OEM=n
CONFIG_FATFS_API_ENCODING_UTF_16=n
CONFIG_FATFS_API_ENCODING_UTF_8=y
CONFIG_FATFS_USE_FASTSEEK=y
#

View File

@ -96,6 +96,9 @@ CONFIG_FATFS_LFN_NONE=n
CONFIG_FATFS_LFN_HEAP=y
CONFIG_FATFS_LFN_STACK=n
CONFIG_FATFS_MAX_LFN=255
CONFIG_FATFS_API_ENCODING_ANSI_OEM=n
CONFIG_FATFS_API_ENCODING_UTF_16=n
CONFIG_FATFS_API_ENCODING_UTF_8=y
CONFIG_FATFS_USE_FASTSEEK=y
#

View File

@ -102,6 +102,9 @@ CONFIG_FATFS_LFN_NONE=n
CONFIG_FATFS_LFN_HEAP=y
CONFIG_FATFS_LFN_STACK=n
CONFIG_FATFS_MAX_LFN=255
CONFIG_FATFS_API_ENCODING_ANSI_OEM=n
CONFIG_FATFS_API_ENCODING_UTF_16=n
CONFIG_FATFS_API_ENCODING_UTF_8=y
CONFIG_FATFS_USE_FASTSEEK=y
#

View File

@ -101,6 +101,9 @@ CONFIG_FATFS_LFN_NONE=n
CONFIG_FATFS_LFN_HEAP=y
CONFIG_FATFS_LFN_STACK=n
CONFIG_FATFS_MAX_LFN=255
CONFIG_FATFS_API_ENCODING_ANSI_OEM=n
CONFIG_FATFS_API_ENCODING_UTF_16=n
CONFIG_FATFS_API_ENCODING_UTF_8=y
CONFIG_FATFS_USE_FASTSEEK=y
#

View File

@ -102,6 +102,9 @@ CONFIG_FATFS_LFN_NONE=n
CONFIG_FATFS_LFN_HEAP=y
CONFIG_FATFS_LFN_STACK=n
CONFIG_FATFS_MAX_LFN=255
CONFIG_FATFS_API_ENCODING_ANSI_OEM=n
CONFIG_FATFS_API_ENCODING_UTF_16=n
CONFIG_FATFS_API_ENCODING_UTF_8=y
CONFIG_FATFS_USE_FASTSEEK=y
#

View File

@ -102,6 +102,9 @@ CONFIG_FATFS_LFN_NONE=n
CONFIG_FATFS_LFN_HEAP=y
CONFIG_FATFS_LFN_STACK=n
CONFIG_FATFS_MAX_LFN=255
CONFIG_FATFS_API_ENCODING_ANSI_OEM=n
CONFIG_FATFS_API_ENCODING_UTF_16=n
CONFIG_FATFS_API_ENCODING_UTF_8=y
CONFIG_FATFS_USE_FASTSEEK=y
#

View File

@ -100,6 +100,9 @@ CONFIG_FATFS_LFN_NONE=n
CONFIG_FATFS_LFN_HEAP=y
CONFIG_FATFS_LFN_STACK=n
CONFIG_FATFS_MAX_LFN=255
CONFIG_FATFS_API_ENCODING_ANSI_OEM=n
CONFIG_FATFS_API_ENCODING_UTF_16=n
CONFIG_FATFS_API_ENCODING_UTF_8=y
CONFIG_FATFS_USE_FASTSEEK=y
#

View File

@ -116,6 +116,9 @@ CONFIG_FATFS_LFN_NONE=n
CONFIG_FATFS_LFN_HEAP=y
CONFIG_FATFS_LFN_STACK=n
CONFIG_FATFS_MAX_LFN=255
CONFIG_FATFS_API_ENCODING_ANSI_OEM=n
CONFIG_FATFS_API_ENCODING_UTF_16=n
CONFIG_FATFS_API_ENCODING_UTF_8=y
CONFIG_FATFS_USE_FASTSEEK=y
#

View File

@ -102,6 +102,9 @@ CONFIG_FATFS_LFN_NONE=n
CONFIG_FATFS_LFN_HEAP=y
CONFIG_FATFS_LFN_STACK=n
CONFIG_FATFS_MAX_LFN=255
CONFIG_FATFS_API_ENCODING_ANSI_OEM=n
CONFIG_FATFS_API_ENCODING_UTF_16=n
CONFIG_FATFS_API_ENCODING_UTF_8=y
CONFIG_FATFS_USE_FASTSEEK=y
#

View File

@ -102,6 +102,9 @@ CONFIG_FATFS_LFN_NONE=n
CONFIG_FATFS_LFN_HEAP=y
CONFIG_FATFS_LFN_STACK=n
CONFIG_FATFS_MAX_LFN=255
CONFIG_FATFS_API_ENCODING_ANSI_OEM=n
CONFIG_FATFS_API_ENCODING_UTF_16=n
CONFIG_FATFS_API_ENCODING_UTF_8=y
CONFIG_FATFS_USE_FASTSEEK=y
#

View File

@ -96,6 +96,9 @@ CONFIG_FATFS_LFN_NONE=n
CONFIG_FATFS_LFN_HEAP=y
CONFIG_FATFS_LFN_STACK=n
CONFIG_FATFS_MAX_LFN=255
CONFIG_FATFS_API_ENCODING_ANSI_OEM=n
CONFIG_FATFS_API_ENCODING_UTF_16=n
CONFIG_FATFS_API_ENCODING_UTF_8=y
CONFIG_FATFS_USE_FASTSEEK=y
#

View File

@ -100,6 +100,9 @@ CONFIG_FATFS_LFN_NONE=n
CONFIG_FATFS_LFN_HEAP=y
CONFIG_FATFS_LFN_STACK=n
CONFIG_FATFS_MAX_LFN=255
CONFIG_FATFS_API_ENCODING_ANSI_OEM=n
CONFIG_FATFS_API_ENCODING_UTF_16=n
CONFIG_FATFS_API_ENCODING_UTF_8=y
CONFIG_FATFS_USE_FASTSEEK=y
#

View File

@ -48,7 +48,7 @@ static bool save_state_handler(const char *filename)
static bool load_state_handler(const char *filename)
{
FILE* f = fopen(filename, "r");
FILE* f = fopen(filename, "rb");
if (f)
{
system_load_state(f);