#ifndef __SCOP_FONT__ #define __SCOP_FONT__ #include #include #include #include #include namespace Scop { constexpr const int RANGE = 1024; class Font { public: Font(const std::filesystem::path& path, float scale) : m_build_data(path), m_name(path.string()), m_scale(scale) {} Font(const std::string& name, const std::vector& ttf_data, float scale) : m_build_data(ttf_data), m_name(name), m_scale(scale) {} void BuildFont(); void Destroy(); inline const std::string& GetName() const { return m_name; } inline float GetScale() const noexcept { return m_scale; } inline const std::array& GetCharData() const { return m_cdata; } inline const Texture& GetTexture() const noexcept { return m_atlas; } inline bool operator==(const Font& rhs) const { return rhs.m_name == m_name && rhs.m_scale == m_scale; } inline bool operator!=(const Font& rhs) const { return rhs.m_name != m_name || rhs.m_scale != m_scale; } inline ~Font() { Destroy(); } private: std::array m_cdata; Texture m_atlas; std::variant> m_build_data; std::string m_name; float m_scale; }; class FontRegistry { public: FontRegistry() = default; inline void RegisterFont(std::shared_ptr font); inline void UnregisterFont(std::shared_ptr font); inline std::shared_ptr GetFont(const std::filesystem::path& name, float scale); inline void Reset(); ~FontRegistry() = default; private: std::unordered_set> m_fonts_registry; }; } #include #endif