Enable UTF-8 support in FATFS for all targets
9e53e09c113a0dad9cb1fae5029bac667a60b76e
This commit is contained in:
parent
5a99511264
commit
6e52462319
@ -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
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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
|
||||
|
||||
#
|
||||
|
||||
@ -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
|
||||
|
||||
#
|
||||
|
||||
@ -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
|
||||
|
||||
#
|
||||
|
||||
@ -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
|
||||
|
||||
#
|
||||
|
||||
@ -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
|
||||
|
||||
#
|
||||
|
||||
@ -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
|
||||
|
||||
#
|
||||
|
||||
@ -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
|
||||
|
||||
#
|
||||
|
||||
@ -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
|
||||
|
||||
#
|
||||
|
||||
@ -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
|
||||
|
||||
#
|
||||
|
||||
@ -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
|
||||
|
||||
#
|
||||
|
||||
@ -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
|
||||
|
||||
#
|
||||
|
||||
@ -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
|
||||
|
||||
#
|
||||
|
||||
@ -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);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user