This source file includes following definitions.
- new_font
- init_fonts
- alloc_cTable
- code_page_char
- rbf_font_char
- font_read
- rbf_font_load
- rbf_load_symbol
- rbf_load_from_file
- rbf_set_codepage
- rbf_font_height
- rbf_symbol_height
- rbf_char_width
- rbf_symbol_width
- rbf_str_width
- rbf_str_clipped_width
- font_draw_char
- rbf_draw_char
- rbf_draw_symbol
- rbf_draw_string_c
- rbf_draw_string
- rbf_enable_cursor
- rbf_disable_cursor
- rbf_draw_clipped_string
- rbf_draw_string_len
- rbf_draw_string_right_len
- rbf_draw_menu_header
1 #include "camera_info.h"
2 #include "stdlib.h"
3 #include "conf.h"
4 #include "gui.h"
5 #include "gui_draw.h"
6 #include "font.h"
7
8
9 #define RBF_MAX_NAME 64
10 #define UBUFFER_SIZE 256
11
12 static int RBF_HDR_MAGIC1 = 0x0DF00EE0;
13 static int RBF_HDR_MAGIC2 = 0x00000003;
14
15
16
17 typedef struct {
18 int magic1, magic2;
19 char name[RBF_MAX_NAME];
20 int charSize;
21 int points;
22 int height;
23 int maxWidth;
24 int charFirst;
25 int charLast;
26 int _unknown4;
27 int _wmapAddr;
28 int _cmapAddr;
29 int descent;
30 int intline;
31 } font_hdr;
32
33 typedef struct _font {
34 font_hdr hdr;
35
36
37 int charCount;
38 int width;
39
40
41
42 char wTable[256];
43
44
45
46 char *cTable;
47
48
49 int usingFont8x16;
50
51
52 int cTableSize;
53 int cTableSizeMax;
54 } font;
55
56 static unsigned char *ubuffer = 0;
57 static font *rbf_symbol_font = 0, *rbf_font = 0;
58 static int rbf_codepage = FONT_CP_WIN;
59
60
61
62 font *new_font() {
63
64 font *f = malloc(sizeof(font));
65 if (f) {
66 memset(f,0,sizeof(font));
67
68 return f;
69 }
70
71
72 return 0;
73 }
74
75 void init_fonts()
76 {
77
78 if (rbf_font == 0) rbf_font = new_font();
79 if (rbf_symbol_font == 0) rbf_symbol_font = new_font();
80
81
82 ubuffer = umalloc(UBUFFER_SIZE);
83 }
84
85 void alloc_cTable(font *f) {
86
87
88 if (f->usingFont8x16) {
89 f->width = FONT_WIDTH;
90 }
91 else {
92 f->width = 8 * f->hdr.charSize / f->hdr.height;
93 }
94 f->charCount = f->hdr.charLast - f->hdr.charFirst + 1;
95
96
97 memset(f->wTable, f->width, 256);
98
99
100
101
102
103
104 if ((f->cTable != 0) && (f->cTableSizeMax < (f->charCount*f->hdr.charSize))) {
105 free(f->cTable);
106 f->cTable = 0;
107 f->cTableSizeMax = 0;
108 }
109
110
111 if (f->cTable == 0 && !f->usingFont8x16) {
112
113 f->cTable = malloc(f->charCount*f->hdr.charSize);
114
115
116 f->cTableSize = f->charCount*f->hdr.charSize;
117 if (f->cTableSizeMax == 0) f->cTableSizeMax = f->cTableSize;
118 }
119 }
120
121
122 static const char tbl_dos2win[] = {
123 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,
124 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,
125 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
126 0x2D, 0x2D, 0x2D, 0xA6, 0x2B, 0xA6, 0xA6, 0xAC, 0xAC, 0xA6, 0xA6, 0xAC, 0x2D, 0x2D, 0x2D, 0xAC,
127 0x4C, 0x2B, 0x54, 0x2B, 0x2D, 0x2B, 0xA6, 0xA6, 0x4C, 0xE3, 0xA6, 0x54, 0xA6, 0x3D, 0x2B, 0xA6,
128 0xA6, 0x54, 0x54, 0x4C, 0x4C, 0x2D, 0xE3, 0x2B, 0x2B, 0x2D, 0x2D, 0x2D, 0x2D, 0xA6, 0xA6, 0x2D,
129 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF,
130 0xA8, 0xB8, 0xAA, 0xBA, 0xAF, 0xBF, 0xA1, 0xA2, 0xB0, 0x95, 0xB7, 0x76, 0xB9, 0xA4, 0xA6, 0xA0
131 };
132
133 int code_page_char(int ch)
134 {
135
136 if ((rbf_codepage == FONT_CP_DOS) && (ch >= 128) && (ch < 256)) {
137
138 ch = tbl_dos2win[ch-128];
139 }
140 return ch;
141 }
142
143
144
145 char* rbf_font_char(font* f, int ch)
146 {
147 if (f && (ch >= f->hdr.charFirst) && (ch <= f->hdr.charLast))
148 {
149 return &f->cTable[(ch-f->hdr.charFirst)*f->hdr.charSize];
150 }
151
152 return 0;
153 }
154
155
156
157 int font_read(int fd, unsigned char *dest, int len)
158 {
159
160 int bytes_read = 0;
161
162 if (ubuffer)
163 {
164
165 while (len)
166 {
167
168 int to_read = UBUFFER_SIZE;
169 if (to_read > len) to_read = len;
170
171
172 bytes_read += read(fd, ubuffer, to_read);
173 memcpy(dest, ubuffer, to_read);
174
175
176 dest += to_read;
177 len -= to_read;
178 }
179 }
180
181 return bytes_read;
182 }
183
184
185 int rbf_font_load(char *file, font* f, int maxchar)
186 {
187 int i;
188 int rv = 0;
189
190
191 if ((f == 0) || (*file == 0)) return 0;
192
193
194 f->usingFont8x16 = 0;
195
196
197 int fd = open(file, O_RDONLY, 0777);
198 if (fd >= 0) {
199
200 i = font_read(fd, (unsigned char*)&f->hdr, sizeof(font_hdr));
201
202
203 if ((i == sizeof(font_hdr)) && (f->hdr.magic1 == RBF_HDR_MAGIC1) && (f->hdr.magic2 == RBF_HDR_MAGIC2)) {
204
205 if (maxchar != 0) {
206 f->hdr.charLast = maxchar;
207 }
208
209 alloc_cTable(f);
210
211
212 lseek(fd, f->hdr._wmapAddr, SEEK_SET);
213 font_read(fd, (unsigned char*)&f->wTable[f->hdr.charFirst], f->charCount);
214
215
216 lseek(fd, f->hdr._cmapAddr, SEEK_SET);
217 font_read(fd, (unsigned char*)f->cTable, f->charCount*f->hdr.charSize);
218
219
220 if (conf.menu_symbol_enable && rbf_font && rbf_symbol_font)
221 conf.menu_symbol_enable=(rbf_font->hdr.height>=rbf_symbol_font->hdr.height);
222
223 rv = 1;
224 }
225
226 close(fd);
227 }
228
229 return rv;
230 }
231
232
233 #define maxSymbols 128
234 int rbf_load_symbol(char *file) {
235
236 init_fonts();
237
238 return rbf_font_load(file, rbf_symbol_font, maxSymbols+32);
239 }
240
241
242
243 void rbf_load_from_file(char *file, int codepage)
244 {
245
246 init_fonts();
247
248 if (!rbf_font_load(file, rbf_font, 0))
249 {
250
251 rbf_font->hdr.charSize = FONT_HEIGHT;
252 rbf_font->hdr.height = FONT_HEIGHT;
253 rbf_font->hdr.maxWidth = FONT_WIDTH;
254 rbf_font->hdr.charFirst = 0;
255 rbf_font->hdr.charLast = 255;
256
257
258
259
260 rbf_font->usingFont8x16 = 1;
261
262 alloc_cTable(rbf_font);
263 }
264
265 rbf_set_codepage(codepage);
266 }
267
268
269 void rbf_set_codepage(int codepage) {
270 rbf_codepage = codepage;
271 }
272
273
274 int rbf_font_height() {
275 return rbf_font->hdr.height;
276 }
277
278 int rbf_symbol_height() {
279 return rbf_symbol_font->hdr.height;
280 }
281
282
283 int rbf_char_width(int ch) {
284 return rbf_font->wTable[code_page_char(ch)];
285 }
286
287
288 int rbf_symbol_width(int ch) {
289 return rbf_symbol_font->wTable[ch];
290 }
291
292
293 int rbf_str_width(const char *str) {
294 int l=0;
295
296
297 while (*str)
298 l+=rbf_char_width(*str++);
299
300 return l;
301 }
302
303 int rbf_str_clipped_width(const char *str, int l, int maxlen) {
304
305 while (*str && l+rbf_char_width(*str)<=maxlen)
306 l+=rbf_char_width(*str++);
307
308 return l;
309 }
310
311
312 void font_draw_char(int x, int y, char *cdata, int width, int height, int pixel_width, twoColors cl) {
313 int xx, yy;
314
315
316 if (cdata)
317 for (yy=0; yy<height; ++yy)
318 for (xx=0; xx<pixel_width; ++xx)
319 draw_pixel(x+xx ,y+yy, (cdata[yy*width/8+xx/8] & (1<<(xx%8))) ? FG_COLOR(cl) : BG_COLOR(cl));
320 }
321
322
323 int rbf_draw_char(int x, int y, int ch, twoColors cl) {
324
325 ch = code_page_char(ch);
326
327
328 char* cdata = rbf_font_char(rbf_font, ch);
329
330
331 if (rbf_font->usingFont8x16 || !cdata)
332 draw_char(x,y,ch,cl);
333 else
334 font_draw_char(x, y, cdata, rbf_font->width, rbf_font->hdr.height, rbf_font->wTable[ch], cl);
335
336 return rbf_font->wTable[ch];
337 }
338
339
340 int rbf_draw_symbol(int x, int y, int ch, twoColors cl) {
341 int space=0, pixel_width, sym_height, txt_height;
342
343
344 if (rbf_font->hdr.height<rbf_symbol_font->hdr.height || ch==0x0) return 0;
345
346
347 pixel_width = rbf_symbol_width(ch);
348
349 sym_height = rbf_symbol_font->hdr.height;
350
351 txt_height = rbf_font->hdr.height;
352
353
354 char* cdata = rbf_font_char(rbf_symbol_font, ch);
355
356 if (cdata) {
357
358 if (txt_height > sym_height) {
359 space = (txt_height - sym_height)/2;
360 draw_rectangle(x, y, x+pixel_width, y+space, MAKE_COLOR(BG_COLOR(cl), BG_COLOR(cl)), RECT_BORDER0|DRAW_FILLED);
361 y+=space;
362 }
363
364
365 font_draw_char(x, y, cdata, rbf_symbol_font->width, sym_height, pixel_width, cl);
366
367
368 if (txt_height > sym_height)
369 draw_rectangle(x, y+sym_height, x+pixel_width, y-space+txt_height-1, MAKE_COLOR(BG_COLOR(cl), BG_COLOR(cl)), RECT_BORDER0|DRAW_FILLED);
370 }
371
372 return pixel_width;
373 }
374
375
376
377 int rbf_draw_string_c(int x, int y, const char *str, twoColors c1, int c, twoColors c2) {
378 int l=0, i=0;
379
380 while (*str) {
381 l+=rbf_draw_char(x+l, y, *str++, (i==c)?c2:c1);
382 ++i;
383 }
384 return l;
385 }
386
387
388 int rbf_draw_string(int x, int y, const char *str, twoColors cl) {
389 return rbf_draw_string_c(x, y, str, cl, -1, MAKE_COLOR(0,0));
390 }
391
392
393 static int cursor_on = 0;
394 static int cursor_start = 0;
395 static int cursor_end = 0;
396
397 void rbf_enable_cursor(int s, int e)
398 {
399 cursor_on = 1;
400 cursor_start = s;
401 cursor_end = e;
402 }
403
404 void rbf_disable_cursor()
405 {
406 cursor_on = 0;
407 }
408
409 int rbf_draw_clipped_string(int x, int y, const char *str, twoColors cl, int l, int maxlen)
410 {
411 int i = 0;
412 twoColors inv_cl = MAKE_COLOR(FG_COLOR(cl), BG_COLOR(cl));
413
414
415 while (*str && l+rbf_char_width(*str)<=maxlen)
416 {
417 if (cursor_on && (cursor_start <= i) && (i <= cursor_end))
418 l+=rbf_draw_char(x+l, y, *str++, inv_cl);
419 else
420 l+=rbf_draw_char(x+l, y, *str++, cl);
421 i++;
422 }
423
424 return l;
425 }
426
427
428 int rbf_draw_string_len(int x, int y, int len, const char *str, twoColors cl) {
429
430 int l = rbf_draw_clipped_string(x, y, str, cl, 0, len);
431
432
433 if (l < len)
434 draw_rectangle(x+l, y, x+len-1, y+rbf_font->hdr.height-1, MAKE_COLOR(BG_COLOR(cl), BG_COLOR(cl)), RECT_BORDER0|DRAW_FILLED);
435
436 return len;
437 }
438
439
440 int rbf_draw_string_right_len(int x, int y, int len, const char *str, twoColors cl) {
441
442 int l = len - rbf_str_clipped_width(str, 0, len);
443
444
445 if (l > 0)
446 draw_rectangle(x, y, x+l-1, y+rbf_font->hdr.height-1, MAKE_COLOR(BG_COLOR(cl), BG_COLOR(cl)), RECT_BORDER0|DRAW_FILLED);
447
448
449 l = rbf_draw_clipped_string(x, y, str, cl, l, len);
450
451 return l;
452 }
453
454
455 int rbf_draw_menu_header(int x, int y, int len, char symbol, const char *str, twoColors cl) {
456 int l=0, i, ll, lr;
457
458
459 if (symbol!=0x0 && conf.menu_symbol_enable && rbf_font_height()>=rbf_symbol_height()) {
460 l += rbf_symbol_width(symbol);
461 l += rbf_char_width(' ');
462 }
463
464
465 l = rbf_str_clipped_width(str, l, len);
466
467
468 ll = 8;
469 lr = len-l-ll;
470
471 int right = x+len-1, bottom = y+rbf_font_height()-1;
472
473
474 for (i=0; i<=l && i<3; i++) {
475 if (i < 2) {
476
477 draw_line(x+i, y+2-i, x+i, bottom, BG_COLOR(cl));
478 draw_line(right-i, y+2-i, right-i, bottom, BG_COLOR(cl));
479 }
480 else {
481
482 draw_rectangle(x+i, y, x+ll-1, bottom, MAKE_COLOR(BG_COLOR(cl), BG_COLOR(cl)), RECT_BORDER0|DRAW_FILLED);
483 draw_rectangle(right-lr, y, right-i, bottom, MAKE_COLOR(BG_COLOR(cl), BG_COLOR(cl)), RECT_BORDER0|DRAW_FILLED);
484 }
485 }
486
487
488 if (symbol!=0x0 && conf.menu_symbol_enable && rbf_font_height()>=rbf_symbol_height()) {
489 ll += rbf_draw_symbol(x+ll, y, symbol, cl);
490 ll += rbf_draw_char(x+ll, y, ' ', cl);
491 }
492
493
494 ll = rbf_draw_clipped_string(x, y, str, cl, ll, len);
495
496 return ll;
497 }
498
499