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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
#ifndef __LIBJINTTF_H
#define __LIBJIN_TTF_H
#include "../../jin_configuration.h"
#if LIBJIN_MODULES_RENDER
#include <vector>
#include <map>
#include "../../3rdparty/stb/stb_truetype.h"
#include "../../math/quad.h"
#include "../Color.h"
#include "../drawable.h"
#include "Page.h"
#include "Font.h"
#include "Text.h"
namespace jin
{
namespace graphics
{
class TTF;
/**
* TTFData
* |- TTF(14px)
* |- TTF(15px)
* .
* .
* .
*/
class TTFData
{
public:
static TTFData* createTTFData(const unsigned char* data, unsigned int size);
~TTFData();
TTF* createTTF(unsigned ttfsize);
void pushTTFsize(unsigned ttfsize);
void popTTFsize();
Channel* getCodepointBitmapAlpha(unsigned int codepoint, int* width, int* height, int* xoff, int* yoff) const;
Color* getCodepointBitmap(unsigned int codepoint, int* width, int* height, int* xoff, int* yoff) const;
void getVMetrics(int* baseline, int* descent);
void getHMetrics(unsigned int codepoint, int* advanceWidth, int* leftSideBearing);
private:
static const unsigned int FONT_SIZE = 12;
TTFData(const unsigned char* data, unsigned int size);
stbtt_fontinfo info;
struct
{
unsigned char* data;
unsigned int size;
} raw;
std::vector<float> scales;
};
class TTF : public Font
{
public:
static TTF* createTTF(TTFData* ttfData, unsigned ttfSzie);
Page* typeset(const Text& text, int lineheight, int spacing = 0) override;
Page* typeset(const Content& text, int lineheight, int spacing = 0) override;
void print(const Text& text, int x, int y, int lineheight, int spacing = 0) override;
void print(const Content& text, int x, int y, int lineheight, int spacing = 0) override;
void print(const Page* page, int x, int y) override;
~TTF();
private:
friend class TTFData;
struct TTFGlyph
{
GLuint atlas;
/* normalized coordinates */
struct Bbox
{
float x, y;
float w, h;
} bbox;
/* glyph size in pixel */
unsigned int width, height;
};
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];
TTF(TTFData* ttf, Codepoint ttfSize);
void estimateSize();
GLuint createAtlas();
TTFGlyph& bakeGlyph(Codepoint character);
TTFGlyph& findGlyph(Codepoint character);
int getCharWidth(int c);
int getCharHeight(int c);
int getTextWidth(const Content& text, int spacing = 0);
int getTextHeight(const Content& text, int lineheight);
void getTextBox(const Content& text, int* w, int* h, int lineheight, int spacing = 0);
int textureWidth;
int textureHeight;
std::vector<GLuint> atlases;
std::map<Codepoint, TTFGlyph> glyphs;
TTFData* ttf;
int baseline;
int descent;
/* cursor helped render to texture */
math::Vector2<float> cursor;
};
} // graphics
} // jin
#endif // LIBJIN_MODULES_RENDER
#endif // __LIBJIN_FONT_H
|