diff options
Diffstat (limited to 'src/resource_loader.c')
-rw-r--r-- | src/resource_loader.c | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/src/resource_loader.c b/src/resource_loader.c new file mode 100644 index 0000000..d589373 --- /dev/null +++ b/src/resource_loader.c @@ -0,0 +1,82 @@ +#include "../include/resource_loader.h" +#include "../include/alloc.h" +#include <mgl/system/fileutils.h> +#include <mgl/graphics/font.h> +#include <stdio.h> + +/* Note: max font size: 100 */ +static mgl_memory_mapped_file *font_file_cache[4]; +static mgl_font *font_cache[4][100]; + +/* TODO: If font fails to load, then create a new font with only a squares that represents all glyphs */ +/* TODO: Load default system font from fontconfig files */ +mgl_font* mgui_get_font(mgui_font_type type, unsigned int character_size) { + if(character_size > 0) + --character_size; + + /* TODO: Make this work for character size >= 100 */ + if(character_size >= 100) + character_size = 99; + + mgl_memory_mapped_file *font_file = font_file_cache[type]; + if(!font_file) { + const char *font_paths[2]; + size_t num_font_paths = 0; + + switch(type) { + case MGUI_FONT_LATIN: { + font_paths[0] = "/usr/share/fonts/noto/NotoSans-Regular.ttf"; + font_paths[1] = "/usr/share/fonts/truetype/noto/NotoSans-Regular.ttf"; + num_font_paths = 2; + break; + } + case MGUI_FONT_LATIN_BOLD: { + font_paths[0] = "/usr/share/fonts/noto/NotoSans-Bold.ttf"; + font_paths[1] = "/usr/share/fonts/truetype/noto/NotoSans-Bold.ttf"; + num_font_paths = 2; + break; + } + case MGUI_FONT_CJK: { + font_paths[0] = "/usr/share/fonts/noto-cjk/NotoSansCJK-Regular.ttf"; + font_paths[1] = "/usr/share/fonts/truetype/noto-cjk/NotoSansCJK-Regular.ttf"; + num_font_paths = 2; + break; + } + } + + mgl_memory_mapped_file *new_font_file = mgui_alloc(sizeof(mgl_memory_mapped_file)); + + mgl_memory_mapped_file_load_options load_options = { + .readable = true, + .writable = false + }; + + bool successfully_loaded_file = false; + for(size_t i = 0; i < num_font_paths; ++i) { + if(mgl_mapped_file_load(font_paths[i], new_font_file, &load_options) == 0) { + successfully_loaded_file = true; + break; + } + } + + if(!successfully_loaded_file) + fprintf(stderr, "mgui warning: mgui_get_font failed to load font %d\n", (int)type); + + font_file_cache[type] = new_font_file; + font_file = new_font_file; + } + + if(!font_file) + return NULL; + + mgl_font *font = font_cache[type][character_size]; + if(!font) { + mgl_font *new_font = mgui_alloc(sizeof(mgl_font)); + if(mgl_font_load_from_file(new_font, font_file, character_size) != 0) + fprintf(stderr, "mgui warning: mgui_get_font failed to load font %d\n", (int)type); + + font_cache[type][character_size] = new_font; + font = new_font; + } + return font; +} |