GameApi 28
Library used by GameApi Builder tool
Loading...
Searching...
No Matches
Font.hh
Go to the documentation of this file.
1
2#ifndef FONT_HH
3#define FONT_HH
4
5#include "Effect.hh"
6#include "GraphI.hh"
7#include <vector>
8
9using namespace std;
10struct Path3d2
11{
12 std::vector<Point> vec;
13};
14struct Path2d2
15{
16 std::vector<Point2d> vec;
17};
18
19class Visitor2;
20
28
30{
31public:
32 virtual void visit(bool &b)=0;
33 virtual void visit(int &a)=0; // 0
34 virtual void visit(float &b)=0; // 1
35 virtual void visit(Point2d &p)=0; // 2
36 virtual void visit(Point &p)=0; //3
37 virtual void visit(VectorArray<Loop2> *array)=0; // 4
38 virtual void visit(VectorArray<Point2d> *array)=0; // 5
39};
40
41
42class Parser {
43public:
44 Parser() : currentptr(0), size(0) { }
45 int ParseInt(std::string s, bool &success);
46 int ParseEnum(std::string *strings, int size, std::string s, bool &success);
47 bool ParseBool(std::string s, bool &success);
48 float ParseFloat(std::string s, bool &success);
49 Point2d ParsePoint2d(std::string s, bool &success);
50 Point ParsePoint(std::string s, bool &success);
51 template<class T>
52 VectorArray<T> *ParseArray(std::string s, bool &success);
53 template<class T>
54 T ParseStruct(std::string s, bool &success);
55
56 Loop2 ParseLoop(std::string s, bool &success)
57 {
58 Loop2 l = ParseStruct<Loop2>(s,success);
59 return l;
60 }
61 Path3d2 ParsePath3d(std::string s, bool &success);
62 Path2d2 ParsePath2d(std::string s, bool &success);
63public: // these parse without {}'s.
64 template<class T>
65 T ParseStruct2(std::string s, bool &success);
66 template<class T>
67 VectorArray<T> *ParseArray2(std::string s, bool &success);
68private:
69 template<class T>
70 T *Alloc()
71 {
72 //delete[] currentptr;
73 T *obj = new T;
74 currentptr = (char*)obj;
75 //currentptr = new char[sizeof(T)];
76 //new(currentptr)T;
77 size = sizeof(T);
78 return obj;
79 }
80private:
81 char *currentptr;
82 int size;
83};
84
85
86
88{
89public:
90 virtual int NumLoops() const=0;
91 virtual int NumPoints(int loop) const=0;
92 virtual Point2d LoopPoint(int loop, int point) const=0;
93 virtual bool Inverse(int loop) const=0;
94
95 virtual float Advance() const=0;
96 virtual Point2d PosTL() const=0; // from 0,0
97 virtual Point2d PosBR() const=0; // from 0,0
98};
99
100class Font
101{
102public:
103 virtual int NumCharacters() const=0;
104 virtual const FontCharacter *FontGlyph(int ch) const=0;
105
106 virtual int Character(int ch) const=0;
107 virtual int FindCharacter(int character) const=0;
108
109 virtual float BaseLine() const=0; // from TL to Baseline
110 virtual float Height() const=0;
111};
112
114{
115public:
116 virtual void AddLoop()=0;
117 virtual void AddPoint(int loop, Point2d pos)=0;
118 virtual void MovePoint(int loop, int point, Point2d newpos)=0;
119 virtual void ToggleInverse(int loop)=0;
120 virtual void SetAdvance(float val)=0;
121 virtual void SetTL(Point2d p)=0;
122 virtual void SetBR(Point2d p)=0;
123};
124
126{
127public:
128 DynamicFontCharacter() : numloops(0) { }
129 virtual int NumLoops() const { return numloops; }
130 virtual int NumPoints(int loop) const { return numpoints[loop]; }
131 virtual Point2d LoopPoint(int loop, int point) const { return find(loop,point); }
132 virtual bool Inverse(int loop) const { return inverse[loop]; }
133
134 virtual float Advance() const { return advance; }
135 virtual Point2d PosTL() const { return tl; }
136 virtual Point2d PosBR() const { return br; }
137public:
138 virtual void AddLoop() { numloops++; numpoints.push_back(0); inverse.push_back(false); }
139 virtual void AddPoint(int loop, Point2d pos) { numpoints[loop]++; Data d = { loop, numpoints[loop]-1, pos }; points.push_back(d); }
140 virtual void MovePoint(int loop, int point, Point2d newpos) { Point2d &p = find(loop, point); p=newpos; }
141 virtual void ToggleInverse(int loop) { inverse[loop] = !inverse[loop]; }
142 virtual void SetAdvance(float val) { advance = val; }
143 virtual void SetTL(Point2d p) { tl = p; }
144 virtual void SetBR(Point2d p) { br = p; }
145 struct Data
146 {
147 int loop;
148 int point;
150 };
151 Point2d &find(int loop, int point) const
152 {
153 int s = points.size();
154 for(int i=0;i<s;i++)
155 {
156 Data &d = points[i];
157 if (d.loop==loop && d.point==point)
158 {
159 //std::cout << "Returning " << d.pos.x << " " << d.pos.y << std::endl;
160 return d.pos;
161 }
162 }
163 std::cout << "DUMMY RETURNED" << std::endl;
164 return dummy;
165 }
166private:
167 int numloops;
168 std::vector<int> numpoints;
169 mutable std::vector<Data> points;
170 std::vector<bool> inverse;
171 float advance;
172 Point2d tl,br;
173 mutable Point2d dummy;
174};
175
176class DynamicFont : public Font
177{
178public:
179 virtual int NumCharacters() const { return chars.size(); }
180 virtual const FontCharacter *FontGlyph(int ch) const { return &chars[ch].ch; }
181
182 virtual int Character(int ch) const
183 {
184 return chars[ch].character;
185 }
186 virtual int FindCharacter(int character) const
187 {
188 int s = chars.size();
189 for(int i=0;i<s;i++)
190 {
191 const Data &d = chars[i];
192 if (d.character == character) return i;
193 }
194 return -1;
195 }
196
197 virtual float BaseLine() const { return baseline; }
198 virtual float Height() const { return height; }
204public:
205 std::vector<Data> chars;
206 float baseline;
207 float height;
208};
209
210
211#if 0
212class GlyphToPointCollection : public PointCollection2d
213{
214public:
215 GlyphToPointCollection(const FontCharacter &ch, int loop) : ch(ch), loop(loop) { }
216 int Size() const { return ch.NumPoints(loop); }
217 Point2d Index(int i) const
218 {
219 //std::cout << "GlyphToPointCollection" << i << std::endl;
220 return ch.LoopPoint(loop, i);
221 }
222private:
223 const FontCharacter &ch;
224 int loop;
225};
226#endif
227class ChooseColorFunction : public Function<bool, Color>
228{
229public:
230 ChooseColorFunction(Color c1, Color c2) : c1(c1), c2(c2) { }
231 Color Index(bool b) const
232 {
233 if (b) return c1;
234 return c2;
235 }
236private:
237 Color c1,c2;
238};
239
240BufferRef RenderFont(Font *font, Array<int, int> &text, int zoomlevel);
241
242#if 0
243class ScaleFontCharacter : public FontCharacter
244{
245public:
246 ScaleFontCharacter(const FontCharacter &orig, float scalex, float scaley) : orig(orig), scalex(scalex), scaley(scaley) { }
247 virtual ~ScaleFontCharacter() { }
248 virtual int NumLoops() const { return orig.NumLoops(); }
249 virtual int NumPoints(int loop) const { return orig.NumPoints(loop); }
250 virtual Point2d LoopPoint(int loop, int point) const
251 {
252 Point2d p = orig.LoopPoint(loop, point);
253 p.x *= scalex;
254 p.y *= scaley;
255 return p;
256 }
257 virtual bool Inverse(int loop) const { return orig.Inverse(loop); }
258
259 virtual float Advance() const { return orig.Advance()*scalex; }
260 virtual Point2d PosTL() const
261 {
262 Point2d p = orig.PosTL();
263 p.x *= scalex;
264 p.y *= scaley;
265 return p;
266 }
267
268 virtual Point2d PosBR() const
269 {
270 Point2d p = orig.PosBR();
271 p.x *= scalex;
272 p.y *= scaley;
273 return p;
274 }
275
276private:
277 const FontCharacter &orig;
278 float scalex, scaley;
279
280};
281#endif
282class ScaleFont : public Font
283{
284public:
285 ScaleFont(Font &f, float scalex, float scaley) : f(f), scalex(scalex), scaley(scaley) /*, ptr(0)*/ { }
286 virtual int NumCharacters() const { return f.NumCharacters(); }
287 virtual const FontCharacter *FontGlyph(int ch) const
288 {
289 const FontCharacter* cha = f.FontGlyph(ch);
290 //delete ptr;
291 //ptr = new ScaleFontCharacter(*cha, scalex, scaley);
292 //return ptr;
293 return 0;
294 }
295
296 virtual int Character(int ch) const { return f.Character(ch); }
297 virtual int FindCharacter(int character) const { return f.FindCharacter(character); }
298
299 virtual float BaseLine() const { return f.BaseLine() * scaley; }
300 virtual float Height() const { return f.Height() * scaley; }
301
302private:
303 Font &f;
304 float scalex, scaley;
305 //mutable ScaleFontCharacter *ptr;
306};
307
308
310{
311 FontCharacterImpl(std::string text)
312 : success(false)
313 {
314 Parse(text, success);
315 }
316 virtual int NumLoops() const
317 {
318 if (!success) return 0;
319 std::cout << fd.vec << std::endl;
320 return fd.vec->Size();
321 }
322 virtual int NumPoints(int loop) const
323 {
324 if (!success) return 0;
325 return fd.vec->Index(loop).points->Size();
326 }
327 virtual Point2d LoopPoint(int loop, int point) const
328 {
329 if (!success) return Point2d();
330 return fd.vec->Index(loop).points->Index(point);
331 }
332 virtual bool Inverse(int loop) const
333 {
334 if (!success) return false;
335 return fd.vec->Index(loop).inverse ==1;
336 }
337
338 virtual float Advance() const { return fd.advance; }
339 virtual Point2d PosTL() const { return fd.tl; } // from 0,0
340 virtual Point2d PosBR() const { return fd.br; } // from 0,0
341private:
342 Parser p;
343 bool success;
344 struct FontData
345 {
346 float advance;
347 Point2d tl;
348 Point2d br;
350 void init()
351 {
352 advance=1.0;
353 Point2d p = { 0.0,0.0 };
354 tl = p;
355 br = p;
356 vec=new VectorArray<Loop2>;
357 }
358 void visit(Visitor2 &v)
359 {
360 v.visit(advance);
361 v.visit(tl);
362 v.visit(br);
363 v.visit(vec);
364 }
365 };
366 FontData fd;
367private:
368 void Parse(std::string s, bool &success)
369 {
370 //std::cout << "Font Parse data: '" << s << "'" << std::endl;
371 fd = p.ParseStruct<FontData>(s,success);
372 //std::cout << "Advance: " << fd.advance << std::endl;
373 //std::cout << "tl: " << fd.tl.x << " " << fd.tl.y << std::endl;
374 //std::cout << "br: " << fd.br.x << " " << fd.br.y << std::endl;
375 //std::cout << "vec:" << fd.vec << std::endl;
376 }
377
378};
379
380#endif
BufferRef RenderFont(Font *font, Array< int, int > &text, int zoomlevel)
Definition Font.cc:9
Definition EffectI.hh:22
virtual int Size() const=0
Color Index(bool b) const
Definition Font.hh:231
ChooseColorFunction(Color c1, Color c2)
Definition Font.hh:230
Definition VectorTools.hh:380
Definition Font.hh:126
virtual void SetTL(Point2d p)
Definition Font.hh:143
virtual bool Inverse(int loop) const
Definition Font.hh:132
virtual void AddLoop()
Definition Font.hh:138
virtual void ToggleInverse(int loop)
Definition Font.hh:141
virtual float Advance() const
Definition Font.hh:134
virtual void MovePoint(int loop, int point, Point2d newpos)
Definition Font.hh:140
DynamicFontCharacter()
Definition Font.hh:128
virtual int NumPoints(int loop) const
Definition Font.hh:130
virtual int NumLoops() const
Definition Font.hh:129
virtual void SetBR(Point2d p)
Definition Font.hh:144
virtual Point2d LoopPoint(int loop, int point) const
Definition Font.hh:131
virtual void SetAdvance(float val)
Definition Font.hh:142
virtual Point2d PosBR() const
Definition Font.hh:136
Point2d & find(int loop, int point) const
Definition Font.hh:151
virtual Point2d PosTL() const
Definition Font.hh:135
virtual void AddPoint(int loop, Point2d pos)
Definition Font.hh:139
Definition Font.hh:177
std::vector< Data > chars
Definition Font.hh:205
virtual int FindCharacter(int character) const
Definition Font.hh:186
virtual float BaseLine() const
Definition Font.hh:197
virtual int Character(int ch) const
Definition Font.hh:182
virtual const FontCharacter * FontGlyph(int ch) const
Definition Font.hh:180
virtual float Height() const
Definition Font.hh:198
float baseline
Definition Font.hh:206
float height
Definition Font.hh:207
virtual int NumCharacters() const
Definition Font.hh:179
Definition Font.hh:114
virtual void SetBR(Point2d p)=0
virtual void ToggleInverse(int loop)=0
virtual void AddPoint(int loop, Point2d pos)=0
virtual void MovePoint(int loop, int point, Point2d newpos)=0
virtual void AddLoop()=0
virtual void SetTL(Point2d p)=0
virtual void SetAdvance(float val)=0
Definition Font.hh:88
virtual float Advance() const =0
virtual int NumLoops() const =0
virtual bool Inverse(int loop) const =0
virtual Point2d PosBR() const =0
virtual Point2d PosTL() const =0
virtual Point2d LoopPoint(int loop, int point) const =0
virtual int NumPoints(int loop) const =0
Definition Font.hh:101
virtual int NumCharacters() const =0
virtual int Character(int ch) const =0
virtual float BaseLine() const =0
virtual float Height() const =0
virtual int FindCharacter(int character) const =0
virtual const FontCharacter * FontGlyph(int ch) const =0
Definition EffectI.hh:11
virtual Point2d Index(int a) const=0
Definition Font.hh:42
int ParseEnum(std::string *strings, int size, std::string s, bool &success)
Parser()
Definition Font.hh:44
bool ParseBool(std::string s, bool &success)
Path2d2 ParsePath2d(std::string s, bool &success)
int ParseInt(std::string s, bool &success)
float ParseFloat(std::string s, bool &success)
VectorArray< T > * ParseArray2(std::string s, bool &success)
Loop2 ParseLoop(std::string s, bool &success)
Definition Font.hh:56
VectorArray< T > * ParseArray(std::string s, bool &success)
T ParseStruct(std::string s, bool &success)
Path3d2 ParsePath3d(std::string s, bool &success)
Point ParsePoint(std::string s, bool &success)
T ParseStruct2(std::string s, bool &success)
Point2d ParsePoint2d(std::string s, bool &success)
Definition Effect.hh:2663
virtual int NumCharacters() const
Definition Font.hh:286
virtual const FontCharacter * FontGlyph(int ch) const
Definition Font.hh:287
virtual int FindCharacter(int character) const
Definition Font.hh:297
ScaleFont(Font &f, float scalex, float scaley)
Definition Font.hh:285
virtual int Character(int ch) const
Definition Font.hh:296
virtual float Height() const
Definition Font.hh:300
virtual float BaseLine() const
Definition Font.hh:299
Definition Effect.hh:1122
Definition Font.hh:30
virtual void visit(int &a)=0
virtual void visit(VectorArray< Point2d > *array)=0
virtual void visit(Point &p)=0
virtual void visit(Point2d &p)=0
virtual void visit(float &b)=0
virtual void visit(bool &b)=0
virtual void visit(VectorArray< Loop2 > *array)=0
d
Definition meshpage.php:3895
n< br > font size
Definition meshpage.php:3536
STL namespace.
double f(const std::string &, double, bool) noexcept
Definition profile_cpp_calls_2.cpp:4
Definition Buffer.hh:32
Definition Font.hh:146
Point2d pos
Definition Font.hh:149
int loop
Definition Font.hh:147
int point
Definition Font.hh:148
Definition Font.hh:200
DynamicFontCharacter ch
Definition Font.hh:201
int character
Definition Font.hh:202
virtual bool Inverse(int loop) const
Definition Font.hh:332
virtual Point2d LoopPoint(int loop, int point) const
Definition Font.hh:327
virtual float Advance() const
Definition Font.hh:338
FontCharacterImpl(std::string text)
Definition Font.hh:311
virtual Point2d PosBR() const
Definition Font.hh:340
virtual int NumLoops() const
Definition Font.hh:316
virtual int NumPoints(int loop) const
Definition Font.hh:322
virtual Point2d PosTL() const
Definition Font.hh:339
Definition Font.hh:22
int inverse
Definition Font.hh:23
void init()
Definition Font.hh:26
void visit(Visitor2 &v)
VectorArray< Point2d > * points
Definition Font.hh:24
Definition Font.hh:15
std::vector< Point2d > vec
Definition Font.hh:16
Definition Font.hh:11
std::vector< Point > vec
Definition Font.hh:12
Definition VectorTools.hh:910
float x
Definition VectorTools.hh:911
float y
Definition VectorTools.hh:911
Definition Parser.cc:60
Definition GameApi.h:42