aboutsummaryrefslogtreecommitdiff
path: root/src/libjin/Graphics/Font.h
blob: 0cb07de407862c939f1c4139321764f244d696de (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#ifndef __LIBJIN_FONT_H
#define __LIBJIN_FONT_H
#include "../jin_configuration.h"
#if LIBJIN_MODULES_RENDER

#include <vector>
#include <map>
#include "drawable.h"
#include "FontData.h"
#include "../math/quad.h"

namespace jin
{
namespace graphics
{  
    
    struct GlyphVertex
    {
        int x, y;   // screen coordinates
        float u, v; // texture uv
    };

    struct GlyphArrayDrawInfo
    {
        GLuint texture;     // atlas
        unsigned int start; // glyph vertex indecies
        unsigned int count; // glyph vertex count 
    };

    struct Glyph
    {
        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:
        typedef unsigned int Codepoint;

        static Font* createFont(FontData* fontData, unsigned int fontSzie);

        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:
        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];

        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;

    };

} // graphics
} // jin

#endif // LIBJIN_MODULES_RENDER
#endif // __LIBJIN_FONT_H