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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
|
#ifndef __FONT_H
#define __FONT_H
#ifndef SWIG
#include <ft2build.h>
#include FT_FREETYPE_H
#include FT_CACHE_H
#include FT_CACHE_IMAGE_H
#include FT_CACHE_SMALL_BITMAPS_H
#ifdef HAVE_FREETYPE2
typedef FTC_ImageCache FTC_Image_Cache;
typedef FTC_ImageTypeRec FTC_Image_Desc;
typedef FTC_SBitCache FTC_SBit_Cache;
#endif
#include <vector>
#include <list>
#include <lib/gdi/fb.h>
#include <lib/gdi/esize.h>
#include <lib/gdi/epoint.h>
#include <lib/gdi/erect.h>
#include <string>
#include <lib/base/object.h>
#include <set>
class FontRenderClass;
class Font;
class gDC;
class gFont;
class gRGB;
#endif
class fontRenderClass
{
#ifndef SWIG
friend class Font;
friend class eTextPara;
fbClass *fb;
struct fontListEntry
{
std::string filename, face;
int scale; // 100 is 1:1
fontListEntry *next;
~fontListEntry();
} *font;
FT_Library library;
FTC_Manager cacheManager; /* the cache manager */
FTC_Image_Cache imageCache; /* the glyph image cache */
FTC_SBit_Cache sbitsCache; /* the glyph small bitmaps cache */
FTC_FaceID getFaceID(const std::string &face);
FT_Error getGlyphBitmap(FTC_Image_Desc *font, FT_ULong glyph_index, FTC_SBit *sbit);
static fontRenderClass *instance;
#else
fontRenderClass();
~fontRenderClass();
#endif
public:
float getLineHeight(const gFont& font);
static fontRenderClass *getInstance();
#ifndef SWIG
std::string AddFont(const std::string &filename, const std::string &name, int scale);
FT_Error FTC_Face_Requester(FTC_FaceID face_id, FT_Face* aface);
int getFont(ePtr<Font> &font, const std::string &face, int size, int tabwidth=-1);
fontRenderClass();
~fontRenderClass();
#endif
};
#ifndef SWIG
#define RS_WRAP 1
#define RS_DOT 2
#define RS_DIRECT 4
#define RS_FADE 8
#define GS_ISSPACE 1
#define GS_ISFIRST 2
#define GS_USED 4
#define GS_INVERT 8
#define GS_SOFTHYPHEN 16
#define GS_HYPHEN 32
#define GS_CANBREAK (GS_ISSPACE|GS_SOFTHYPHEN|GS_HYPHEN)
struct pGlyph
{
int x, y, w;
ePtr<Font> font;
FT_ULong glyph_index;
int flags;
eRect bbox;
};
typedef std::vector<pGlyph> glyphString;
class Font;
class eLCD;
class eTextPara: public iObject
{
DECLARE_REF(eTextPara);
ePtr<Font> current_font, replacement_font;
FT_Face current_face, replacement_face;
int use_kerning;
int previous;
static std::string replacement_facename;
static std::set<int> forced_replaces;
eRect area;
ePoint cursor;
eSize maximum;
int left;
glyphString glyphs;
std::list<int> lineOffsets;
std::list<int> lineChars;
int charCount;
bool doTopBottomReordering;
int appendGlyph(Font *current_font, FT_Face current_face, FT_UInt glyphIndex, int flags, int rflags);
void newLine(int flags);
void setFont(Font *font, Font *replacement_font);
eRect boundBox;
void calc_bbox();
int bboxValid;
void clear();
public:
eTextPara(eRect area, ePoint start=ePoint(-1, -1))
:current_font(0), replacement_font(0), current_face(0), replacement_face(0)
,area(area), cursor(start), maximum(0, 0), left(start.x()), charCount(0)
,doTopBottomReordering(false), bboxValid(0)
{
}
virtual ~eTextPara();
static void setReplacementFont(std::string font) { replacement_facename=font; }
static void forceReplacementGlyph(int unicode) { forced_replaces.insert(unicode); }
void setFont(const gFont *font);
int renderString(const char *string, int flags=0);
void blit(gDC &dc, const ePoint &offset, const gRGB &background, const gRGB &foreground);
enum
{
dirLeft, dirRight, dirCenter, dirBlock
};
void realign(int dir);
const eRect & getBoundBox()
{
if (!bboxValid)
calc_bbox();
return boundBox;
}
const int size() const
{
return glyphs.size();
}
const eRect& getGlyphBBox(int num) const
{
ASSERT(num >= 0);
ASSERT(num < (int)glyphs.size());
return glyphs[num].bbox;
}
void setGlyphFlag(int g, int f)
{
ASSERT(g >= 0);
ASSERT(g < (int)glyphs.size());
glyphs[g].flags |= f;
}
void clearGlyphFlag(int g, int f)
{
ASSERT(g >= 0);
ASSERT(g < (int)glyphs.size());
glyphs[g].flags |= f;
}
};
class Font: public iObject
{
DECLARE_REF(Font);
public:
#ifdef HAVE_FREETYPE2
FTC_ScalerRec scaler;
#endif
FTC_Image_Desc font;
fontRenderClass *renderer;
FT_Error getGlyphBitmap(FT_ULong glyph_index, FTC_SBit *sbit);
FT_Face face;
FT_Size size;
int tabwidth;
int height;
Font(fontRenderClass *render, FTC_FaceID faceid, int isize, int tabwidth);
virtual ~Font();
};
extern fontRenderClass *font;
#endif // !SWIG
#endif
|