From 44e66882f6e517b06522cb1e510ed9dea7574273 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Sat, 21 Nov 2020 18:20:00 +0100 Subject: Render emoji in text, do not show notification count for cache sync, lazy load 4chan board --- src/ResourceLoader.cpp | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 src/ResourceLoader.cpp (limited to 'src/ResourceLoader.cpp') diff --git a/src/ResourceLoader.cpp b/src/ResourceLoader.cpp new file mode 100644 index 0000000..9a6060d --- /dev/null +++ b/src/ResourceLoader.cpp @@ -0,0 +1,79 @@ +#include "../include/ResourceLoader.hpp" +#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; + } +} + +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_cache[(size_t)font_type] = std::move(new_font); + font = font_cache[(size_t)font_type].get(); + } + 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); + texture_cache[str] = std::move(new_texture); + return result; + } +} \ No newline at end of file -- cgit v1.2.3