diff options
Diffstat (limited to 'src/libjin/Graphics/Font.h')
-rw-r--r-- | src/libjin/Graphics/Font.h | 103 |
1 files changed, 62 insertions, 41 deletions
diff --git a/src/libjin/Graphics/Font.h b/src/libjin/Graphics/Font.h index 10fd242..2bd51a5 100644 --- a/src/libjin/Graphics/Font.h +++ b/src/libjin/Graphics/Font.h @@ -1,79 +1,100 @@ #ifndef __LIBJIN_FONT_H #define __LIBJIN_FONT_H -#include "../modules.h" +#include "../jin_configuration.h" #if LIBJIN_MODULES_RENDER #include <vector> #include <map> #include "drawable.h" -#include "../3rdparty/stb/stb_truetype.h" +#include "FontData.h" #include "../math/quad.h" namespace jin { namespace graphics { - /** - * original from love2d font and graphics modules - * the basic idea is storing glyphs in several mipmap - * http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html - */ - + struct GlyphVertex { - float x, y; // screen coordinates - float u, v; // texture coordinates + int x, y; // screen coordinates + float u, v; // texture uv }; - /* track when to change texutre binded in render array */ - /* casue switch texture is expensive */ - /* std::vector<GlyphVertex> list */ struct GlyphArrayDrawInfo { - GLuint texture; - int startvertex; - int vertexcount; + GLuint texture; // atlas + unsigned int start; // glyph vertex indecies + unsigned int count; // glyph vertex count }; - /* glyph texture */ struct Glyph { - GLuint texture; // texture where this glyph rendered - int spacing; // spacing of glyph - GlyphVertex vertices[4]; // quad of glyph render region + GLuint atlas; + /* normalized coordinates */ + struct Bbox + { + float x, y; + float width, height; + } bbox; + /* glyph size in pixel */ + unsigned int width, height; + }; + + struct Page + { + std::vector<GlyphArrayDrawInfo> glyphinfolist; + std::vector<GlyphVertex> glyphvertices; + int width, height; }; class Font { - public: - static Font* createFont(const char* file); - static Font* createFont(const char* data, size_t size); + public: + typedef unsigned int Codepoint; + + static Font* createFont(FontData* fontData, unsigned int fontSzie); + static void destroyFont(Font* font); - void print(const char* text, int x, int y); + Page* typeset(const char* text, int lineheight, int spacing); + void print(const char* text, int x, int y, int lineheight, int spacing = 0); + void print(const Page* page, int x, int y); + //Bitmap* bake(const char* text); +#if defined(font_debug) + void drawAtlas(); +#endif + ~Font(); private: - /* font atlas levels */ static const int TEXTURE_SIZE_LEVELS_COUNT = 7; static const int TEXTURE_SIZE_LEVEL_MAX = TEXTURE_SIZE_LEVELS_COUNT - 1; static const int TEXTURE_WIDTHS[TEXTURE_SIZE_LEVELS_COUNT]; static const int TEXTURE_HEIGHTS[TEXTURE_SIZE_LEVELS_COUNT]; - static const int SPACES_PER_TAB = 4; - - /* create a new mipmap to render glyph and push it on textures */ - bool createTexture(); - /* create a glyph for a unicode and return it */ - Glyph* addGlyph(unsigned int character); - /* find glyph by unicode */ - Glyph* findGlyph(unsigned int character); - - /* list of textures where glyphs rendered, always operate the last one */ - /* map character to its render area */ - std::vector<GLuint> textures; - std::map<unsigned int, Glyph*> glyphs; - /* mipmap size level */ - int textureLevel; - int textureWidth; + + Font(FontData* font, Codepoint fontSize); + + void estimateSize(); + GLuint createAtlas(); + Glyph* bakeGlyph(Codepoint character); + Glyph* findGlyph(Codepoint character); + + int getCharWidth(int c); + int getCharHeight(int c); + int getTextWidth(const char* text, int spacing = 0); + int getTextHeight(const char* text, int lineheight); + void getTextBox(const char* text, int* w, int* h, int lineheight, int spacing = 0); + + int textureWidth; int textureHeight; + std::vector<GLuint> atlases; + /* map unicode codepoint to glyph */ + std::map<Codepoint, Glyph*> glyphs; + FontData* font; + const unsigned int fontsize; + int baseline; + int descent; + + /* cursor helped render to texture */ + math::Vector2<float> cursor; }; |