#include "../include/ResourceLoader.hpp" #include #include #include #include #include #include static std::string resource_root; static std::array, 3> font_cache; static std::unordered_map> texture_cache; namespace QuickMedia { void set_resource_loader_root_path(const char *new_resource_root) { resource_root = new_resource_root; } const char* get_resource_loader_root_path() { return resource_root.c_str(); } } namespace QuickMedia::FontLoader { sf::Font* get_font(FontType font_type) { sf::Font *font = font_cache[(size_t)font_type].get(); if(!font) { auto new_font = std::make_unique(); std::vector noto_directories; std::string font_file_name; switch(font_type) { case FontType::LATIN: { noto_directories.push_back("/usr/share/fonts/noto"); noto_directories.push_back("/usr/share/fonts/truetype/noto"); font_file_name = "NotoSans-Regular.ttf"; break; } case FontType::LATIN_BOLD: { noto_directories.push_back("/usr/share/fonts/noto"); noto_directories.push_back("/usr/share/fonts/truetype/noto"); font_file_name = "NotoSans-Bold.ttf"; break; } case FontType::CJK: { noto_directories.push_back("/usr/share/fonts/noto-cjk"); noto_directories.push_back("/usr/share/fonts/truetype/noto-cjk"); font_file_name = "NotoSansCJK-Regular.ttc"; break; } case FontType::EMOJI: { noto_directories.push_back("/usr/share/fonts/noto"); noto_directories.push_back("/usr/share/fonts/truetype/noto"); font_file_name = "NotoColorEmoji.ttf"; break; } } for(const std::string ¬o_dir : noto_directories) { if(new_font->loadFromFile(noto_dir + "/" + font_file_name)) break; } font = new_font.get(); font_cache[(size_t)font_type] = std::move(new_font); malloc_trim(0); } return font; } } namespace QuickMedia::TextureLoader { sf::Texture* get_texture(const char *filepath) { assert(!resource_root.empty()); std::string str = filepath; auto it = texture_cache.find(str); if(it != texture_cache.end()) return it->second.get(); auto new_texture = std::make_unique(); sf::Texture *result = new_texture.get(); if(!new_texture->loadFromFile(resource_root + str)) fprintf(stderr, "Failed to load image: %s%s\n", resource_root.c_str(), filepath); new_texture->setSmooth(true); texture_cache[str] = std::move(new_texture); malloc_trim(0); return result; } }