#pragma once #include #include #include #include #include #include "typedefs.hpp" #include "FontMetics.hpp" #include "data/dv_fwd.hpp" #include "../commons/FontStyle.hpp" class Texture; class Batch2D; class Batch3D; class Camera; class ImageData; class Font; namespace vector_fonts { class FontFile; } struct Glyph { int yOffset; int xAdvance; int xOffset = 0; }; class Font { public: Font( std::vector> pages, std::vector glyphs, int lineHeight, int yoffset, std::optional> fontFile = std::nullopt ); ~Font(); bool isMonospace() const; int getLineHeight() const; int getYOffset() const; /// @brief Calculate text width in pixels /// @param text selected text /// @param length max substring length (default: no limit) /// @return pixel width of the substring int calcWidth(std::wstring_view text, size_t length=-1) const; /// @brief Calculate text width in pixels /// @param text selected text /// @param offset start of the substring /// @param length max substring length /// @return pixel width of the substring int calcWidth(std::wstring_view text, size_t offset, size_t length) const; /// @brief Get the horizontal advance of a character in pixels /// @param codepoint character unicode codepoint int getAdvance(uint codepoint) const; /// @brief Check if character is visible (non-whitespace) /// @param codepoint character unicode codepoint bool isPrintableChar(uint codepoint) const; void draw( Batch2D& batch, std::wstring_view text, int x, int y, const FontStylesScheme* styles, size_t styleMapOffset, float scale = 1 ); void draw( Batch3D& batch, std::wstring_view text, const FontStylesScheme* styles, size_t styleMapOffset, const glm::vec3& pos, const glm::vec3& right={1, 0, 0}, const glm::vec3& up={0, 1, 0} ); const Texture* getPage(int page) const; FontMetrics getMetrics() const { return {std::nullopt, lineHeight, yoffset, glyphInterval}; } const Glyph* getGlyph(int codepoint) const; static std::unique_ptr createBitmapFont( std::vector> pages ); private: int lineHeight; int yoffset; int glyphInterval; bool monospace = true; mutable std::vector> pages; mutable std::vector glyphs; std::optional> fontFile; };