diff options
author | Solomon Peachy <pizza@shaftnet.org> | 2020-07-19 19:38:45 -0400 |
---|---|---|
committer | Solomon Peachy <pizza@shaftnet.org> | 2020-07-24 21:20:13 +0000 |
commit | 0c4f89370d05056faa789aa9cabcccc4e509fb9f (patch) | |
tree | 6ddf7fff0a47564db41d39927ea1acbdb03e74ee /firmware | |
parent | 092c340a2062fa98b7387fc5fd63578ddae7d0b6 (diff) | |
download | rockbox-0c4f89370d05056faa789aa9cabcccc4e509fb9f.tar.gz rockbox-0c4f89370d05056faa789aa9cabcccc4e509fb9f.zip |
[2/4] get rid of HAVE_LCD_CHARCELLS
HAVE_LCD_BITMAP is now redundant.
lcd_bitmap is always-on in features.txt so manual and lang strings
don't have to change
Change-Id: I08eeb20de48099ffc2dc23782711af368c2ec794
Diffstat (limited to 'firmware')
-rw-r--r-- | firmware/SOURCES | 7 | ||||
-rw-r--r-- | firmware/drivers/lcd-charcell.c | 599 | ||||
-rw-r--r-- | firmware/drivers/lcd-charset-player.c | 1321 | ||||
-rw-r--r-- | firmware/drivers/lcd-scroll.c | 17 | ||||
-rw-r--r-- | firmware/export/lcd-charcell.h | 68 | ||||
-rw-r--r-- | firmware/export/lcd.h | 40 | ||||
-rw-r--r-- | firmware/export/scroll_engine.h | 4 | ||||
-rw-r--r-- | firmware/panic.c | 6 | ||||
-rw-r--r-- | firmware/scroll_engine.c | 4 | ||||
-rw-r--r-- | firmware/target/hosted/sdl/button-sdl.c | 1 | ||||
-rw-r--r-- | firmware/target/hosted/sdl/lcd-charcells.c | 206 | ||||
-rw-r--r-- | firmware/target/hosted/sdl/lcd-charcells.h | 34 | ||||
-rw-r--r-- | firmware/target/hosted/sdl/system-sdl.c | 2 |
13 files changed, 4 insertions, 2305 deletions
diff --git a/firmware/SOURCES b/firmware/SOURCES index 90c1f4011c..9cd1a5671c 100644 --- a/firmware/SOURCES +++ b/firmware/SOURCES | |||
@@ -52,8 +52,6 @@ target/hosted/sdl/button-sdl.c | |||
52 | target/hosted/sdl/kernel-sdl.c | 52 | target/hosted/sdl/kernel-sdl.c |
53 | #ifdef HAVE_LCD_BITMAP | 53 | #ifdef HAVE_LCD_BITMAP |
54 | target/hosted/sdl/lcd-bitmap.c | 54 | target/hosted/sdl/lcd-bitmap.c |
55 | #elif defined(HAVE_LCD_CHARCELLS) | ||
56 | target/hosted/sdl/lcd-charcells.c | ||
57 | #endif | 55 | #endif |
58 | #ifdef HAVE_REMOTE_LCD | 56 | #ifdef HAVE_REMOTE_LCD |
59 | target/hosted/sdl/lcd-remote-bitmap.c | 57 | target/hosted/sdl/lcd-remote-bitmap.c |
@@ -255,11 +253,6 @@ common/vuprintf.c | |||
255 | /* Display */ | 253 | /* Display */ |
256 | scroll_engine.c | 254 | scroll_engine.c |
257 | 255 | ||
258 | #ifdef HAVE_LCD_CHARCELLS | ||
259 | drivers/lcd-charcell.c | ||
260 | drivers/lcd-charset-player.c | ||
261 | #endif /* HAVE_LCD_CHARCELLS */ | ||
262 | |||
263 | #ifdef HAVE_LCD_BITMAP | 256 | #ifdef HAVE_LCD_BITMAP |
264 | arabjoin.c | 257 | arabjoin.c |
265 | bidi.c | 258 | bidi.c |
diff --git a/firmware/drivers/lcd-charcell.c b/firmware/drivers/lcd-charcell.c deleted file mode 100644 index b1f0021ff7..0000000000 --- a/firmware/drivers/lcd-charcell.c +++ /dev/null | |||
@@ -1,599 +0,0 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id$ | ||
9 | * | ||
10 | * Copyright (C) 2007 by Jens Arnold | ||
11 | * Based on the work of Alan Korr, Kjell Ericson and others | ||
12 | * | ||
13 | * This program is free software; you can redistribute it and/or | ||
14 | * modify it under the terms of the GNU General Public License | ||
15 | * as published by the Free Software Foundation; either version 2 | ||
16 | * of the License, or (at your option) any later version. | ||
17 | * | ||
18 | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||
19 | * KIND, either express or implied. | ||
20 | * | ||
21 | ****************************************************************************/ | ||
22 | |||
23 | #include <stdio.h> | ||
24 | #include "config.h" | ||
25 | #include "hwcompat.h" | ||
26 | #include "stdarg.h" | ||
27 | #include "lcd.h" | ||
28 | #include "kernel.h" | ||
29 | #include "thread.h" | ||
30 | #include "string-extra.h" | ||
31 | #include <stdlib.h> | ||
32 | #include "debug.h" | ||
33 | #include "file.h" | ||
34 | #include "system.h" | ||
35 | #include "lcd-charcell.h" | ||
36 | #include "rbunicode.h" | ||
37 | #include "scroll_engine.h" | ||
38 | |||
39 | /** definitions **/ | ||
40 | |||
41 | #define VARIABLE_XCHARS 16 /* number of software user-definable characters */ | ||
42 | /* There must be mappings for this many characters in the 0xe000 unicode range | ||
43 | * in lcd-charset-<target>.c */ | ||
44 | |||
45 | #define NO_PATTERN (-1) | ||
46 | |||
47 | static int find_xchar(unsigned long ucs); | ||
48 | |||
49 | /** globals **/ | ||
50 | |||
51 | unsigned char lcd_charbuffer[LCD_HEIGHT][LCD_WIDTH]; /* The "frame"buffer */ | ||
52 | static unsigned char lcd_substbuffer[LCD_HEIGHT][LCD_WIDTH]; | ||
53 | struct pattern_info lcd_patterns[MAX_HW_PATTERNS]; | ||
54 | struct cursor_info lcd_cursor; | ||
55 | |||
56 | static unsigned char xfont_variable[VARIABLE_XCHARS][HW_PATTERN_SIZE]; | ||
57 | static bool xfont_variable_locked[VARIABLE_XCHARS]; | ||
58 | static int xspace; /* stores xhcar id of ' ' - often needed */ | ||
59 | |||
60 | static struct viewport default_vp = | ||
61 | { | ||
62 | .x = 0, | ||
63 | .y = 0, | ||
64 | .width = LCD_WIDTH, | ||
65 | .height = LCD_HEIGHT, | ||
66 | }; | ||
67 | |||
68 | static struct viewport* current_vp = &default_vp; | ||
69 | |||
70 | /* LCD init */ | ||
71 | void lcd_init (void) | ||
72 | { | ||
73 | lcd_init_device(); | ||
74 | lcd_charset_init(); | ||
75 | memset(lcd_patterns, 0, sizeof(lcd_patterns)); | ||
76 | xspace = find_xchar(' '); | ||
77 | memset(lcd_charbuffer, xchar_info[xspace].hw_char, sizeof(lcd_charbuffer)); | ||
78 | scroll_init(); | ||
79 | } | ||
80 | |||
81 | /* Viewports */ | ||
82 | |||
83 | void lcd_set_viewport(struct viewport* vp) | ||
84 | { | ||
85 | if (vp == NULL) | ||
86 | current_vp = &default_vp; | ||
87 | else | ||
88 | current_vp = vp; | ||
89 | |||
90 | #if defined(SIMULATOR) | ||
91 | /* Force the viewport to be within bounds. If this happens it should | ||
92 | * be considered an error - the viewport will not draw as it might be | ||
93 | * expected. | ||
94 | */ | ||
95 | if((unsigned) current_vp->x > (unsigned) LCD_WIDTH | ||
96 | || (unsigned) current_vp->y > (unsigned) LCD_HEIGHT | ||
97 | || current_vp->x + current_vp->width > LCD_WIDTH | ||
98 | || current_vp->y + current_vp->height > LCD_HEIGHT) | ||
99 | { | ||
100 | #if !defined(HAVE_VIEWPORT_CLIP) | ||
101 | DEBUGF("ERROR: " | ||
102 | #else | ||
103 | DEBUGF("NOTE: " | ||
104 | #endif | ||
105 | "set_viewport out of bounds: x: %d y: %d width: %d height:%d\n", | ||
106 | current_vp->x, current_vp->y, | ||
107 | current_vp->width, current_vp->height); | ||
108 | } | ||
109 | |||
110 | #endif | ||
111 | } | ||
112 | |||
113 | struct viewport *lcd_get_viewport(bool *is_default) | ||
114 | { | ||
115 | *is_default = (current_vp == &default_vp); | ||
116 | return current_vp; | ||
117 | } | ||
118 | |||
119 | void lcd_update_viewport(void) | ||
120 | { | ||
121 | lcd_update(); | ||
122 | } | ||
123 | |||
124 | void lcd_update_viewport_rect(int x, int y, int width, int height) | ||
125 | { | ||
126 | (void) x; | ||
127 | (void) y; | ||
128 | (void) width; | ||
129 | (void) height; | ||
130 | lcd_update(); | ||
131 | } | ||
132 | |||
133 | /** parameter handling **/ | ||
134 | |||
135 | int lcd_getwidth(void) | ||
136 | { | ||
137 | return current_vp->width; | ||
138 | } | ||
139 | |||
140 | int lcd_getheight(void) | ||
141 | { | ||
142 | return current_vp->height; | ||
143 | } | ||
144 | |||
145 | int lcd_getstringsize(const unsigned char *str, int *w, int *h) | ||
146 | { | ||
147 | int width = utf8length(str); | ||
148 | |||
149 | if (w) | ||
150 | *w = width; | ||
151 | if (h) | ||
152 | *h = 1; | ||
153 | |||
154 | return width; | ||
155 | } | ||
156 | |||
157 | /** low-level functions **/ | ||
158 | |||
159 | static int find_xchar(unsigned long ucs) | ||
160 | { | ||
161 | int low = 0; | ||
162 | int high = xchar_info_size - 1; | ||
163 | |||
164 | do | ||
165 | { | ||
166 | int probe = (low + high) >> 1; | ||
167 | |||
168 | if (xchar_info[probe].ucs < ucs) | ||
169 | low = probe + 1; | ||
170 | else if (xchar_info[probe].ucs > ucs) | ||
171 | high = probe - 1; | ||
172 | else | ||
173 | return probe; | ||
174 | } | ||
175 | while (low <= high); | ||
176 | |||
177 | /* Not found: return index of no-char symbol (last symbol, hardcoded). */ | ||
178 | return xchar_info_size - 1; | ||
179 | } | ||
180 | |||
181 | static int glyph_to_pat(unsigned glyph) | ||
182 | { | ||
183 | int i; | ||
184 | |||
185 | for (i = 0; i < lcd_pattern_count; i++) | ||
186 | if (lcd_patterns[i].glyph == glyph) | ||
187 | return i; | ||
188 | |||
189 | return NO_PATTERN; | ||
190 | } | ||
191 | |||
192 | static void lcd_free_pat(int pat) | ||
193 | { | ||
194 | int x, y; | ||
195 | |||
196 | if (pat != NO_PATTERN) | ||
197 | { | ||
198 | for (x = 0; x < LCD_WIDTH; x++) | ||
199 | for (y = 0; y < LCD_HEIGHT; y++) | ||
200 | if (pat == lcd_charbuffer[y][x]) | ||
201 | lcd_charbuffer[y][x] = lcd_substbuffer[y][x]; | ||
202 | |||
203 | if (lcd_cursor.enabled && pat == lcd_cursor.hw_char) | ||
204 | lcd_cursor.hw_char = lcd_cursor.subst_char; | ||
205 | |||
206 | lcd_patterns[pat].count = 0; | ||
207 | } | ||
208 | } | ||
209 | |||
210 | static int lcd_get_free_pat(int xchar) | ||
211 | { | ||
212 | static int last_used_pat = 0; | ||
213 | |||
214 | int pat = last_used_pat; /* start from last used pattern */ | ||
215 | int least_pat = pat; /* pattern with least priority */ | ||
216 | int least_priority = lcd_patterns[pat].priority; | ||
217 | int i; | ||
218 | |||
219 | for (i = 0; i < lcd_pattern_count; i++) | ||
220 | { | ||
221 | if (++pat >= lcd_pattern_count) /* Keep 'pat' within limits */ | ||
222 | pat = 0; | ||
223 | |||
224 | if (lcd_patterns[pat].count == 0) | ||
225 | { | ||
226 | last_used_pat = pat; | ||
227 | return pat; | ||
228 | } | ||
229 | if (lcd_patterns[pat].priority < least_priority) | ||
230 | { | ||
231 | least_priority = lcd_patterns[pat].priority; | ||
232 | least_pat = pat; | ||
233 | } | ||
234 | } | ||
235 | if (xchar_info[xchar].priority > least_priority) /* prioritized char */ | ||
236 | { | ||
237 | lcd_free_pat(least_pat); | ||
238 | last_used_pat = least_pat; | ||
239 | return least_pat; | ||
240 | } | ||
241 | return NO_PATTERN; | ||
242 | } | ||
243 | |||
244 | static const unsigned char *glyph_to_pattern(unsigned glyph) | ||
245 | { | ||
246 | if (glyph & 0x8000) | ||
247 | return xfont_variable[glyph & 0x7fff]; | ||
248 | else | ||
249 | return xfont_fixed[glyph]; | ||
250 | } | ||
251 | |||
252 | static int map_xchar(int xchar, unsigned char *substitute) | ||
253 | { | ||
254 | int pat; | ||
255 | unsigned glyph; | ||
256 | |||
257 | if (xchar_info[xchar].priority > 0) /* soft char */ | ||
258 | { | ||
259 | glyph = xchar_info[xchar].glyph; | ||
260 | pat = glyph_to_pat(glyph); | ||
261 | |||
262 | if (pat == NO_PATTERN) /* not yet mapped */ | ||
263 | { | ||
264 | pat = lcd_get_free_pat(xchar); /* try to map */ | ||
265 | |||
266 | if (pat == NO_PATTERN) /* failed: just use substitute */ | ||
267 | return xchar_info[xchar].hw_char; | ||
268 | else | ||
269 | { /* define pattern */ | ||
270 | lcd_patterns[pat].priority = xchar_info[xchar].priority; | ||
271 | lcd_patterns[pat].glyph = glyph; | ||
272 | memcpy(lcd_patterns[pat].pattern, glyph_to_pattern(glyph), | ||
273 | HW_PATTERN_SIZE); | ||
274 | } | ||
275 | } | ||
276 | lcd_patterns[pat].count++; /* increase reference count */ | ||
277 | *substitute = xchar_info[xchar].hw_char; | ||
278 | return pat; | ||
279 | } | ||
280 | else /* hardware char */ | ||
281 | return xchar_info[xchar].hw_char; | ||
282 | } | ||
283 | |||
284 | static void lcd_putxchar(int x, int y, int xchar) | ||
285 | { | ||
286 | int lcd_char; | ||
287 | |||
288 | /* Adjust for viewport */ | ||
289 | x += current_vp->x; | ||
290 | y += current_vp->y; | ||
291 | |||
292 | #if defined(HAVE_VIEWPORT_CLIP) | ||
293 | if((unsigned)x > (unsigned)LCD_WIDTH || (unsigned)y > (unsigned)LCD_HEIGHT) | ||
294 | return; | ||
295 | #endif | ||
296 | |||
297 | lcd_char = lcd_charbuffer[y][x]; | ||
298 | |||
299 | if (lcd_char < lcd_pattern_count) /* old char was soft */ | ||
300 | lcd_patterns[lcd_char].count--; /* decrease old reference count */ | ||
301 | |||
302 | lcd_charbuffer[y][x] = map_xchar(xchar, &lcd_substbuffer[y][x]); | ||
303 | } | ||
304 | |||
305 | /** user-definable pattern handling **/ | ||
306 | |||
307 | unsigned long lcd_get_locked_pattern(void) | ||
308 | { | ||
309 | int i = 0; | ||
310 | |||
311 | for (i = 0; i < VARIABLE_XCHARS; i++) | ||
312 | { | ||
313 | if (!xfont_variable_locked[i]) | ||
314 | { | ||
315 | xfont_variable_locked[i] = true; | ||
316 | return 0xe000 + i; /* hard-coded */ | ||
317 | } | ||
318 | } | ||
319 | return 0; | ||
320 | } | ||
321 | |||
322 | void lcd_unlock_pattern(unsigned long ucs) | ||
323 | { | ||
324 | int xchar = find_xchar(ucs); | ||
325 | unsigned glyph = xchar_info[xchar].glyph; | ||
326 | |||
327 | if (glyph & 0x8000) /* variable extended char */ | ||
328 | { | ||
329 | lcd_free_pat(glyph_to_pat(glyph)); | ||
330 | xfont_variable_locked[glyph & 0x7fff] = false; | ||
331 | } | ||
332 | } | ||
333 | |||
334 | void lcd_define_pattern(unsigned long ucs, const char *pattern) | ||
335 | { | ||
336 | int xchar = find_xchar(ucs); | ||
337 | unsigned glyph = xchar_info[xchar].glyph; | ||
338 | int pat; | ||
339 | |||
340 | if (glyph & 0x8000) /* variable extended char */ | ||
341 | { | ||
342 | memcpy(xfont_variable[glyph & 0x7fff], pattern, HW_PATTERN_SIZE); | ||
343 | pat = glyph_to_pat(glyph); | ||
344 | if (pat != NO_PATTERN) | ||
345 | memcpy(lcd_patterns[pat].pattern, pattern, HW_PATTERN_SIZE); | ||
346 | } | ||
347 | } | ||
348 | |||
349 | /** output functions **/ | ||
350 | |||
351 | /* Clear the whole display */ | ||
352 | void lcd_clear_display(void) | ||
353 | { | ||
354 | int x, y; | ||
355 | struct viewport* old_vp = current_vp; | ||
356 | |||
357 | lcd_scroll_stop(); | ||
358 | lcd_remove_cursor(); | ||
359 | |||
360 | /* Set the default viewport - required for lcd_putxchar */ | ||
361 | current_vp = &default_vp; | ||
362 | |||
363 | for (x = 0; x < LCD_WIDTH; x++) | ||
364 | for (y = 0; y < LCD_HEIGHT; y++) | ||
365 | lcd_putxchar(x, y, xspace); | ||
366 | |||
367 | current_vp = old_vp; | ||
368 | } | ||
369 | |||
370 | /* Clear the current viewport */ | ||
371 | void lcd_clear_viewport(void) | ||
372 | { | ||
373 | int x, y; | ||
374 | |||
375 | if (current_vp == &default_vp) | ||
376 | { | ||
377 | lcd_clear_display(); | ||
378 | } | ||
379 | else | ||
380 | { | ||
381 | /* Remove the cursor if it is within the current viewport */ | ||
382 | if (lcd_cursor.enabled && | ||
383 | (lcd_cursor.x >= current_vp->x) && | ||
384 | (lcd_cursor.x <= current_vp->x + current_vp->width) && | ||
385 | (lcd_cursor.y >= current_vp->y) && | ||
386 | (lcd_cursor.y <= current_vp->y + current_vp->height)) | ||
387 | { | ||
388 | lcd_remove_cursor(); | ||
389 | } | ||
390 | |||
391 | for (x = 0; x < current_vp->width; x++) | ||
392 | for (y = 0; y < current_vp->height; y++) | ||
393 | lcd_putxchar(x, y, xspace); | ||
394 | |||
395 | lcd_scroll_stop_viewport(current_vp); | ||
396 | } | ||
397 | } | ||
398 | |||
399 | /* Put an unicode character at the given position */ | ||
400 | void lcd_putc(int x, int y, unsigned long ucs) | ||
401 | { | ||
402 | if ((unsigned)x >= (unsigned)current_vp->width || | ||
403 | (unsigned)y >= (unsigned)current_vp->height) | ||
404 | return; | ||
405 | |||
406 | lcd_putxchar(x, y, find_xchar(ucs)); | ||
407 | } | ||
408 | |||
409 | /* Show cursor (alternating with existing character) at the given position */ | ||
410 | void lcd_put_cursor(int x, int y, unsigned long cursor_ucs) | ||
411 | { | ||
412 | if ((unsigned)x >= (unsigned)current_vp->width || | ||
413 | (unsigned)y >= (unsigned)current_vp->height || | ||
414 | lcd_cursor.enabled) | ||
415 | return; | ||
416 | |||
417 | lcd_cursor.enabled = true; | ||
418 | lcd_cursor.visible = false; | ||
419 | lcd_cursor.hw_char = map_xchar(find_xchar(cursor_ucs), &lcd_cursor.subst_char); | ||
420 | lcd_cursor.x = current_vp->x + x; | ||
421 | lcd_cursor.y = current_vp->y + y; | ||
422 | lcd_cursor.downcount = 0; | ||
423 | lcd_cursor.divider = MAX((HZ/2) / lcd_scroll_info.ticks, 1); | ||
424 | } | ||
425 | |||
426 | /* Remove the cursor */ | ||
427 | void lcd_remove_cursor(void) | ||
428 | { | ||
429 | if (lcd_cursor.enabled) | ||
430 | { | ||
431 | if (lcd_cursor.hw_char < lcd_pattern_count) /* soft char, unmap */ | ||
432 | lcd_patterns[lcd_cursor.hw_char].count--; | ||
433 | |||
434 | lcd_cursor.enabled = lcd_cursor.visible = false; | ||
435 | } | ||
436 | } | ||
437 | |||
438 | /* Put a string at a given position, skipping first ofs chars */ | ||
439 | static int lcd_putsxyofs(int x, int y, int ofs, const unsigned char *str) | ||
440 | { | ||
441 | unsigned short ucs; | ||
442 | const unsigned char *utf8 = str; | ||
443 | |||
444 | while (*utf8 && x < current_vp->width) | ||
445 | { | ||
446 | utf8 = utf8decode(utf8, &ucs); | ||
447 | |||
448 | if (ofs > 0) | ||
449 | { | ||
450 | ofs--; | ||
451 | continue; | ||
452 | } | ||
453 | lcd_putxchar(x++, y, find_xchar(ucs)); | ||
454 | } | ||
455 | return x; | ||
456 | } | ||
457 | |||
458 | /* Put a string at a given position */ | ||
459 | void lcd_putsxy(int x, int y, const unsigned char *str) | ||
460 | { | ||
461 | if ((unsigned)y >= (unsigned)current_vp->height) | ||
462 | return; | ||
463 | |||
464 | lcd_putsxyofs(x, y, 0, str); | ||
465 | } | ||
466 | |||
467 | /* Formatting version of lcd_putsxy */ | ||
468 | void lcd_putsxyf(int x, int y, const unsigned char *fmt, ...) | ||
469 | { | ||
470 | va_list ap; | ||
471 | char buf[256]; | ||
472 | va_start(ap, fmt); | ||
473 | vsnprintf(buf, sizeof (buf), fmt, ap); | ||
474 | va_end(ap); | ||
475 | lcd_putsxy(x, y, buf); | ||
476 | } | ||
477 | |||
478 | /*** Line oriented text output ***/ | ||
479 | |||
480 | /* Put a string at a given char position, skipping first offset chars */ | ||
481 | void lcd_putsofs(int x, int y, const unsigned char *str, int offset) | ||
482 | { | ||
483 | if ((unsigned)y >= (unsigned)current_vp->height) | ||
484 | return; | ||
485 | |||
486 | /* make sure scrolling is turned off on the line we are updating */ | ||
487 | lcd_scroll_stop_viewport_rect(current_vp, x, y, current_vp->width - x, 1); | ||
488 | |||
489 | x = lcd_putsxyofs(x, y, offset, str); | ||
490 | while (x < current_vp->width) | ||
491 | lcd_putxchar(x++, y, xspace); | ||
492 | } | ||
493 | |||
494 | |||
495 | /* Put a string at a given char position */ | ||
496 | void lcd_puts(int x, int y, const unsigned char *str) | ||
497 | { | ||
498 | lcd_putsofs(x, y, str, 0); | ||
499 | } | ||
500 | |||
501 | /* Formatting version of lcd_puts */ | ||
502 | void lcd_putsf(int x, int y, const unsigned char *fmt, ...) | ||
503 | { | ||
504 | va_list ap; | ||
505 | char buf[256]; | ||
506 | va_start(ap, fmt); | ||
507 | vsnprintf(buf, sizeof (buf), fmt, ap); | ||
508 | va_end(ap); | ||
509 | lcd_puts(x, y, buf); | ||
510 | } | ||
511 | |||
512 | /** scrolling **/ | ||
513 | |||
514 | bool lcd_puts_scroll_worker(int x, int y, const unsigned char *string, | ||
515 | int offset, | ||
516 | void (*scroll_func)(struct scrollinfo *), void *data) | ||
517 | { | ||
518 | struct scrollinfo* s; | ||
519 | int len; | ||
520 | |||
521 | if ((unsigned)y >= (unsigned)current_vp->height) | ||
522 | return false; | ||
523 | |||
524 | /* remove any previously scrolling line at the same location */ | ||
525 | lcd_scroll_stop_viewport_rect(current_vp, x, y, current_vp->width - x, 1); | ||
526 | |||
527 | if (lcd_scroll_info.lines >= LCD_SCROLLABLE_LINES) | ||
528 | return false; | ||
529 | |||
530 | s = &lcd_scroll_info.scroll[lcd_scroll_info.lines]; | ||
531 | |||
532 | s->start_tick = current_tick + lcd_scroll_info.delay; | ||
533 | |||
534 | lcd_putsofs(x, y, string, offset); | ||
535 | len = utf8length(string); | ||
536 | |||
537 | if (current_vp->width - x >= len) | ||
538 | return false; | ||
539 | /* prepare scroll line */ | ||
540 | strlcpy(s->linebuffer, string, sizeof s->linebuffer); | ||
541 | |||
542 | /* scroll bidirectional or forward only depending on the string width */ | ||
543 | if (lcd_scroll_info.bidir_limit) | ||
544 | { | ||
545 | s->bidir = len < (current_vp->width) * | ||
546 | (100 + lcd_scroll_info.bidir_limit) / 100; | ||
547 | } | ||
548 | else | ||
549 | s->bidir = false; | ||
550 | |||
551 | s->scroll_func = scroll_func; | ||
552 | s->userdata = data; | ||
553 | |||
554 | s->vp = current_vp; | ||
555 | s->x = x; | ||
556 | s->y = y; | ||
557 | s->height = 1; | ||
558 | s->width = current_vp->width - x; | ||
559 | s->offset = offset; | ||
560 | s->backward = false; | ||
561 | lcd_scroll_info.lines++; | ||
562 | |||
563 | return true; | ||
564 | } | ||
565 | |||
566 | bool lcd_putsxy_scroll_func(int x, int y, const unsigned char *string, | ||
567 | void (*scroll_func)(struct scrollinfo *), | ||
568 | void *data, int x_offset) | ||
569 | { | ||
570 | bool retval = false; | ||
571 | if (!scroll_func) | ||
572 | lcd_putsxyofs(x, y, x_offset, string); | ||
573 | else | ||
574 | retval = lcd_puts_scroll_worker(x, y, string, x_offset, scroll_func, data); | ||
575 | |||
576 | return retval; | ||
577 | } | ||
578 | |||
579 | static void lcd_scroll_fn(struct scrollinfo* s) | ||
580 | { | ||
581 | /* with line == NULL when scrolling stops. This scroller | ||
582 | * maintains no userdata so there is nothing left to do */ | ||
583 | if (!s->line) | ||
584 | return; | ||
585 | lcd_putsxyofs(s->x, s->y, s->offset, s->line); | ||
586 | if (lcd_cursor.enabled) | ||
587 | { | ||
588 | if (--lcd_cursor.downcount <= 0) | ||
589 | { | ||
590 | lcd_cursor.downcount = lcd_cursor.divider; | ||
591 | lcd_cursor.visible = !lcd_cursor.visible; | ||
592 | } | ||
593 | } | ||
594 | } | ||
595 | |||
596 | bool lcd_puts_scroll(int x, int y, const unsigned char *string) | ||
597 | { | ||
598 | return lcd_puts_scroll_worker(x, y, string, 0, lcd_scroll_fn, NULL); | ||
599 | } | ||
diff --git a/firmware/drivers/lcd-charset-player.c b/firmware/drivers/lcd-charset-player.c deleted file mode 100644 index b1f6f6dae2..0000000000 --- a/firmware/drivers/lcd-charset-player.c +++ /dev/null | |||
@@ -1,1321 +0,0 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id$ | ||
9 | * | ||
10 | * Copyright (C) 2007 by Jens Arnold | ||
11 | * | ||
12 | * This program is free software; you can redistribute it and/or | ||
13 | * modify it under the terms of the GNU General Public License | ||
14 | * as published by the Free Software Foundation; either version 2 | ||
15 | * of the License, or (at your option) any later version. | ||
16 | * | ||
17 | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||
18 | * KIND, either express or implied. | ||
19 | * | ||
20 | ****************************************************************************/ | ||
21 | |||
22 | #include "config.h" | ||
23 | #include "hwcompat.h" | ||
24 | |||
25 | #include "lcd-charcell.h" | ||
26 | |||
27 | int lcd_pattern_count; /* actual number of user-definable hw patterns */ | ||
28 | |||
29 | const struct xchar_info *xchar_info; | ||
30 | int xchar_info_size; /* number of entries */ | ||
31 | |||
32 | enum { | ||
33 | /* Standard ascii */ | ||
34 | XF_BACKSLASH = 0, XF_CIRCUMFLEX, XF_GRAVEACCENT, XF_VERTICALBAR, | ||
35 | XF_TILDE, | ||
36 | #ifndef BOOTLOADER | ||
37 | /* Icons and special symbols */ | ||
38 | XF_ICON_UNKNOWN, XF_ICON_BOOKMARK, XF_ICON_PLUGIN, XF_ICON_FOLDER, | ||
39 | XF_ICON_FIRMWARE, XF_ICON_LANGUAGE, XF_ICON_AUDIO, XF_ICON_WPS, | ||
40 | XF_ICON_PLAYLIST, XF_ICON_TEXTFILE, XF_ICON_CONFIG, | ||
41 | |||
42 | /* Latin1 */ | ||
43 | XF_INVEXCLAMATION, XF_CENTSIGN, XF_POUNDSIGN, XF_CURRENCY, | ||
44 | XF_LEFTDBLANGLEQUOT, XF_MACRON, XF_PLUSMINUS, XF_SUPER2, | ||
45 | XF_SUPER3, XF_MICRO, XF_MIDDLEDOT, XF_RIGHTDBLANGLEQUOT, | ||
46 | XF_ONEQUARTER, XF_ONEHALF, XF_THREEQUARTERS, XF_INVQUESTION, | ||
47 | XF_AGRAVE, XF_AACUTE, XF_ACIRCUMFLEX, XF_ATILDE, | ||
48 | XF_ADIERESIS, XF_ARING, XF_AELIGATURE, XF_CCEDILLA, | ||
49 | XF_EGRAVE, XF_EACUTE, XF_ECIRCUMFLEX, XF_EDIERESIS, | ||
50 | XF_IGRAVE, XF_IACUTE, XF_ICIRCUMFLEX, XF_IDIERESIS, | ||
51 | XF_ETH, XF_NTILDE, XF_OGRAVE, XF_OACUTE, | ||
52 | XF_OCIRCUMFLEX, XF_OTILDE, XF_ODIERESIS, XF_OSTROKE, | ||
53 | XF_UGRAVE, XF_UACUTE, XF_UCIRCUMFLEX, XF_UDIERESIS, | ||
54 | XF_YACUTE, XF_aGRAVE, XF_aACUTE, XF_aCIRCUMFLEX, | ||
55 | XF_aTILDE, XF_aDIERESIS, XF_aRING, XF_aeLIGATURE, | ||
56 | XF_cCEDILLA, XF_eGRAVE, XF_eACUTE, XF_eCIRCUMFLEX, | ||
57 | XF_eDIERESIS, XF_iGRAVE, XF_iACUTE, XF_iCIRCUMFLEX, | ||
58 | XF_iDIERESIS, XF_nTILDE, XF_oGRAVE, XF_oACUTE, | ||
59 | XF_oCIRCUMFLEX, XF_oTILDE, XF_oDIERESIS, XF_DIVISION, | ||
60 | XF_oSLASH, XF_uGRAVE, XF_uACUTE, XF_uCIRCUMFLEX, | ||
61 | XF_uDIERESIS, XF_yACUTE, XF_yDIERESIS, | ||
62 | |||
63 | /* Latin extended A */ | ||
64 | XF_aBREVE, XF_aOGONEK, XF_cACUTE, XF_cCARON, | ||
65 | XF_dCARON, XF_dSTROKE, XF_eOGONEK, XF_eCARON, | ||
66 | XF_GBREVE, XF_gBREVE, XF_IDOT, XF_DOTLESSi, | ||
67 | XF_LSTROKE, XF_lSTROKE, XF_nACUTE, XF_nCARON, | ||
68 | XF_ODBLACUTE, XF_oDBLACUTE, XF_RCARON, XF_rCARON, | ||
69 | XF_sACUTE, XF_SCEDILLA, XF_sCEDILLA, XF_sCARON, | ||
70 | XF_tCEDILLA, XF_tCARON, XF_uRING, XF_UDBLACUTE, | ||
71 | XF_uDBLACUTE, XF_zACUTE, XF_zDOT, XF_zCARON, | ||
72 | #define XF_DSTROKE XF_ETH | ||
73 | #define XF_SACUTE XF_sACUTE | ||
74 | #define XF_SCARON XF_sCARON | ||
75 | |||
76 | /* Greek */ | ||
77 | XF_GR_DELTA, XF_GR_THETA, XF_GR_LAMBDA, XF_GR_XI, | ||
78 | XF_GR_PSI, XF_GR_alpha, XF_GR_alphaTONOS, XF_GR_gamma, | ||
79 | XF_GR_epsilon, XF_GR_epsilonTONOS, XF_GR_zeta, XF_GR_eta, | ||
80 | XF_GR_etaTONOS, XF_GR_iota, XF_GR_lambda, XF_GR_xi, | ||
81 | XF_GR_rho, XF_GR_FINALsigma, XF_GR_sigma, XF_GR_upsilon, | ||
82 | XF_GR_upsilonTONOS, XF_GR_chi, XF_GR_psi, XF_GR_omega, | ||
83 | XF_GR_omegaTONOS, | ||
84 | #define XF_GR_ANOTELEIA XF_MIDDLEDOT | ||
85 | #define XF_GR_GAMMA XF_CYR_GHE | ||
86 | #define XF_GR_PI XF_CYR_PE | ||
87 | #define XF_GR_delta XF_CYR_be | ||
88 | #define XF_GR_iotaTONOS XF_iACUTE | ||
89 | #define XF_GR_iotaDIA XF_iDIERESIS | ||
90 | #define XF_GR_kappa XF_CYR_ka | ||
91 | #define XF_GR_mu XF_MICRO | ||
92 | #define XF_GR_pi XF_CYR_pe | ||
93 | #define XF_GR_omicronTONOS XF_oACUTE | ||
94 | #define XF_GR_tau XF_CYR_te | ||
95 | |||
96 | /* Cyrillic */ | ||
97 | XF_CYR_BE, XF_CYR_GHE, XF_CYR_DE, XF_CYR_ZHE, | ||
98 | XF_CYR_ZE, XF_CYR_I, XF_CYR_SHORTI, XF_CYR_EL, | ||
99 | XF_CYR_PE, XF_CYR_TSE, XF_CYR_CHE, XF_CYR_SHA, | ||
100 | XF_CYR_SHCHA, XF_CYR_HARD, XF_CYR_YERU, XF_CYR_E, | ||
101 | XF_CYR_YU, XF_CYR_YA, XF_CYR_be, XF_CYR_ve, | ||
102 | XF_CYR_ghe, XF_CYR_de, XF_CYR_zhe, XF_CYR_ze, | ||
103 | XF_CYR_i, XF_CYR_SHORTi, XF_CYR_ka, XF_CYR_el, | ||
104 | XF_CYR_em, XF_CYR_en, XF_CYR_pe, XF_CYR_te, | ||
105 | XF_CYR_tse, XF_CYR_che, XF_CYR_sha, XF_CYR_shcha, | ||
106 | XF_CYR_hard, XF_CYR_yeru, XF_CYR_soft, XF_CYR_e, | ||
107 | XF_CYR_yu, XF_CYR_ya, | ||
108 | #define XF_CYR_IEGRAVE XF_EGRAVE | ||
109 | #define XF_CYR_IO XF_EDIERESIS | ||
110 | #define XF_CYR_YI XF_IDIERESIS | ||
111 | #define XF_CYR_ieGRAVE XF_eGRAVE | ||
112 | #define XF_CYR_io XF_eDIERESIS | ||
113 | #define XF_CYR_yi XF_iDIERESIS | ||
114 | |||
115 | #endif | ||
116 | }; | ||
117 | |||
118 | static const struct xchar_info xchar_info_newlcd[] = { | ||
119 | /* Standard ascii */ | ||
120 | { 0x20, 0, 0, 0x20 }, /* */ | ||
121 | { 0x21, 0, 0, 0x21 }, /* ! */ | ||
122 | { 0x22, 0, 0, 0x22 }, /* " */ | ||
123 | { 0x23, 0, 0, 0x23 }, /* # */ | ||
124 | { 0x24, 0, 0, 0x24 }, /* $ */ | ||
125 | { 0x25, 0, 0, 0x25 }, /* % */ | ||
126 | { 0x26, 0, 0, 0x26 }, /* & */ | ||
127 | { 0x27, 0, 0, 0x27 }, /* ' */ | ||
128 | { 0x28, 0, 0, 0x28 }, /* ( */ | ||
129 | { 0x29, 0, 0, 0x29 }, /* ) */ | ||
130 | { 0x2a, 0, 0, 0x2a }, /* * */ | ||
131 | { 0x2b, 0, 0, 0x2b }, /* + */ | ||
132 | { 0x2c, 0, 0, 0x2c }, /* , */ | ||
133 | { 0x2d, 0, 0, 0x2d }, /* - */ | ||
134 | { 0x2e, 0, 0, 0x2e }, /* . */ | ||
135 | { 0x2f, 0, 0, 0x2f }, /* / */ | ||
136 | { 0x30, 0, 0, 0x30 }, /* 0 */ | ||
137 | { 0x31, 0, 0, 0x31 }, /* 1 */ | ||
138 | { 0x32, 0, 0, 0x32 }, /* 2 */ | ||
139 | { 0x33, 0, 0, 0x33 }, /* 3 */ | ||
140 | { 0x34, 0, 0, 0x34 }, /* 4 */ | ||
141 | { 0x35, 0, 0, 0x35 }, /* 5 */ | ||
142 | { 0x36, 0, 0, 0x36 }, /* 6 */ | ||
143 | { 0x37, 0, 0, 0x37 }, /* 7 */ | ||
144 | { 0x38, 0, 0, 0x38 }, /* 8 */ | ||
145 | { 0x39, 0, 0, 0x39 }, /* 9 */ | ||
146 | { 0x3a, 0, 0, 0x3a }, /* : */ | ||
147 | { 0x3b, 0, 0, 0x3b }, /* ; */ | ||
148 | { 0x3c, 0, 0, 0x3c }, /* < */ | ||
149 | { 0x3d, 0, 0, 0x3d }, /* = */ | ||
150 | { 0x3e, 0, 0, 0x3e }, /* > */ | ||
151 | { 0x3f, 0, 0, 0x3f }, /* ? */ | ||
152 | { 0x40, 0, 0, 0x40 }, /* @ */ | ||
153 | { 0x41, 0, 0, 0x41 }, /* A */ | ||
154 | { 0x42, 0, 0, 0x42 }, /* B */ | ||
155 | { 0x43, 0, 0, 0x43 }, /* C */ | ||
156 | { 0x44, 0, 0, 0x44 }, /* D */ | ||
157 | { 0x45, 0, 0, 0x45 }, /* E */ | ||
158 | { 0x46, 0, 0, 0x46 }, /* F */ | ||
159 | { 0x47, 0, 0, 0x47 }, /* G */ | ||
160 | { 0x48, 0, 0, 0x48 }, /* H */ | ||
161 | { 0x49, 0, 0, 0x49 }, /* I */ | ||
162 | { 0x4a, 0, 0, 0x4a }, /* J */ | ||
163 | { 0x4b, 0, 0, 0x4b }, /* K */ | ||
164 | { 0x4c, 0, 0, 0x4c }, /* L */ | ||
165 | { 0x4d, 0, 0, 0x4d }, /* M */ | ||
166 | { 0x4e, 0, 0, 0x4e }, /* N */ | ||
167 | { 0x4f, 0, 0, 0x4f }, /* O */ | ||
168 | { 0x50, 0, 0, 0x50 }, /* P */ | ||
169 | { 0x51, 0, 0, 0x51 }, /* Q */ | ||
170 | { 0x52, 0, 0, 0x52 }, /* R */ | ||
171 | { 0x53, 0, 0, 0x53 }, /* S */ | ||
172 | { 0x54, 0, 0, 0x54 }, /* T */ | ||
173 | { 0x55, 0, 0, 0x55 }, /* U */ | ||
174 | { 0x56, 0, 0, 0x56 }, /* V */ | ||
175 | { 0x57, 0, 0, 0x57 }, /* W */ | ||
176 | { 0x58, 0, 0, 0x58 }, /* X */ | ||
177 | { 0x59, 0, 0, 0x59 }, /* Y */ | ||
178 | { 0x5a, 0, 0, 0x5a }, /* Z */ | ||
179 | { 0x5b, 0, 0, 0x5b }, /* [ */ | ||
180 | { 0x5c, 0, 0, 0x12 }, /* \ */ | ||
181 | { 0x5d, 0, 0, 0x5d }, /* ] */ | ||
182 | { 0x5e, 0, 0, 0x5e }, /* ^ */ | ||
183 | { 0x5f, 0, 0, 0x5f }, /* _ */ | ||
184 | { 0x60, 0, 0, 0x60 }, /* ` */ | ||
185 | { 0x61, 0, 0, 0x61 }, /* a */ | ||
186 | { 0x62, 0, 0, 0x62 }, /* b */ | ||
187 | { 0x63, 0, 0, 0x63 }, /* c */ | ||
188 | { 0x64, 0, 0, 0x64 }, /* d */ | ||
189 | { 0x65, 0, 0, 0x65 }, /* e */ | ||
190 | { 0x66, 0, 0, 0x66 }, /* f */ | ||
191 | { 0x67, 0, 0, 0x67 }, /* g */ | ||
192 | { 0x68, 0, 0, 0x68 }, /* h */ | ||
193 | { 0x69, 0, 0, 0x69 }, /* i */ | ||
194 | { 0x6a, 0, 0, 0x6a }, /* j */ | ||
195 | { 0x6b, 0, 0, 0x6b }, /* k */ | ||
196 | { 0x6c, 0, 0, 0x6c }, /* l */ | ||
197 | { 0x6d, 0, 0, 0x6d }, /* m */ | ||
198 | { 0x6e, 0, 0, 0x6e }, /* n */ | ||
199 | { 0x6f, 0, 0, 0x6f }, /* o */ | ||
200 | { 0x70, 0, 0, 0x70 }, /* p */ | ||
201 | { 0x71, 0, 0, 0x71 }, /* q */ | ||
202 | { 0x72, 0, 0, 0x72 }, /* r */ | ||
203 | { 0x73, 0, 0, 0x73 }, /* s */ | ||
204 | { 0x74, 0, 0, 0x74 }, /* t */ | ||
205 | { 0x75, 0, 0, 0x75 }, /* u */ | ||
206 | { 0x76, 0, 0, 0x76 }, /* v */ | ||
207 | { 0x77, 0, 0, 0x77 }, /* w */ | ||
208 | { 0x78, 0, 0, 0x78 }, /* x */ | ||
209 | { 0x79, 0, 0, 0x79 }, /* y */ | ||
210 | { 0x7a, 0, 0, 0x7a }, /* z */ | ||
211 | { 0x7b, 0, 0, 0x7b }, /* { */ | ||
212 | { 0x7c, 0, 0, 0x7c }, /* | */ | ||
213 | { 0x7d, 0, 0, 0x7d }, /* } */ | ||
214 | { 0x7e, 0, 0, 0xf0 }, /* ~ */ | ||
215 | { 0x7f, 0, 0, 0xfe }, /* (full grid) */ | ||
216 | |||
217 | #ifndef BOOTLOADER /* bootloader only supports pure ASCII */ | ||
218 | /* Latin 1 */ | ||
219 | { 0xa0, 0, 0, 0x20 }, /* (non-breaking space) */ | ||
220 | { 0xa1, XF_INVEXCLAMATION, 1, 0x21 }, /* ¡ (inverted !) */ | ||
221 | { 0xa2, XF_CENTSIGN, 1, 0x63 }, /* ¢ (cent sign) */ | ||
222 | { 0xa3, XF_POUNDSIGN, 1, 0x4c }, /* £ (pound sign) */ | ||
223 | { 0xa4, XF_CURRENCY, 1, 0x6f }, /* ¤ (currency sign) */ | ||
224 | { 0xa5, 0, 0, 0x5c }, /* ¥ (yen sign) */ | ||
225 | |||
226 | { 0xa7, 0, 0, 0x15 }, /* § (paragraph sign) */ | ||
227 | |||
228 | { 0xab, 0, 0, 0x9e }, /* « (left double-angle quotation mark) */ | ||
229 | |||
230 | { 0xad, 0, 0, 0x2d }, /* (soft hyphen) */ | ||
231 | |||
232 | { 0xaf, XF_MACRON, 1, 0x2d }, /* ¯ (macron) */ | ||
233 | |||
234 | { 0xb1, 0, 0, 0x95 }, /* ± (plus-minus sign) */ | ||
235 | { 0xb2, 0, 0, 0x99 }, /* ³ (superscript 2) */ | ||
236 | { 0xb3, 0, 0, 0x9a }, /* ³ (superscript 3) */ | ||
237 | |||
238 | { 0xb5, 0, 0, 0xe6 }, /* µ (micro sign) */ | ||
239 | { 0xb6, 0, 0, 0x14 }, /* ¶ (pilcrow sign) */ | ||
240 | { 0xb7, 0, 0, 0xa5 }, /* · (middle dot) */ | ||
241 | |||
242 | { 0xbb, 0, 0, 0x9f }, /* » (right double-angle quotation mark) */ | ||
243 | { 0xbc, 0, 0, 0x9c }, /* ¼ (one quarter) */ | ||
244 | { 0xbd, 0, 0, 0x9b }, /* ½ (one half) */ | ||
245 | { 0xbe, 0, 0, 0x9d }, /* ¾ (three quarters) */ | ||
246 | { 0xbf, XF_INVQUESTION, 1, 0x3f }, /* ¿ (inverted ?) */ | ||
247 | { 0xc0, XF_AGRAVE, 1, 0x41 }, /* À (A grave) */ | ||
248 | { 0xc1, XF_AACUTE, 1, 0x41 }, /* Á (A acute) */ | ||
249 | { 0xc2, XF_ACIRCUMFLEX, 1, 0x41 }, /* Â (A circumflex) */ | ||
250 | { 0xc3, XF_ATILDE, 1, 0x41 }, /* Ã (A tilde) */ | ||
251 | { 0xc4, XF_ADIERESIS, 1, 0x41 }, /* Ä (A dieresis) */ | ||
252 | { 0xc5, XF_ARING, 1, 0x41 }, /* Å (A with ring above) */ | ||
253 | { 0xc6, XF_AELIGATURE, 1, 0x41 }, /* Æ (AE ligature) */ | ||
254 | { 0xc7, XF_CCEDILLA, 1, 0x43 }, /* Ç (C cedilla) */ | ||
255 | { 0xc8, XF_EGRAVE, 1, 0x45 }, /* È (E grave) */ | ||
256 | { 0xc9, XF_EACUTE, 1, 0x45 }, /* É (E acute) */ | ||
257 | { 0xca, XF_ECIRCUMFLEX, 1, 0x45 }, /* Ê (E circumflex) */ | ||
258 | { 0xcb, XF_EDIERESIS, 1, 0x45 }, /* Ë (E dieresis) */ | ||
259 | { 0xcc, XF_IGRAVE, 1, 0x49 }, /* Ì (I grave) */ | ||
260 | { 0xcd, XF_IACUTE, 1, 0x49 }, /* Í (I acute) */ | ||
261 | { 0xce, XF_ICIRCUMFLEX, 1, 0x49 }, /* Î (I circumflex) */ | ||
262 | { 0xcf, XF_IDIERESIS, 1, 0x49 }, /* Ï (I dieresis) */ | ||
263 | { 0xd0, XF_ETH, 1, 0x44 }, /* Ð (ETH) */ | ||
264 | { 0xd1, XF_NTILDE, 1, 0x4e }, /* Ñ (N tilde) */ | ||
265 | { 0xd2, XF_OGRAVE, 1, 0x4f }, /* Ò (O grave) */ | ||
266 | { 0xd3, XF_OACUTE, 1, 0x4f }, /* Ó (O acute) */ | ||
267 | { 0xd4, XF_OCIRCUMFLEX, 1, 0x4f }, /* Ô (O circumflex) */ | ||
268 | { 0xd5, XF_OTILDE, 1, 0x4f }, /* Õ (O tilde) */ | ||
269 | { 0xd6, XF_ODIERESIS, 1, 0x4f }, /* Ö (O dieresis) */ | ||
270 | { 0xd7, 0, 0, 0x96 }, /* × (multiplication sign) */ | ||
271 | { 0xd8, XF_OSTROKE, 1, 0x30 }, /* Ø (O stroke) */ | ||
272 | { 0xd9, XF_UGRAVE, 1, 0x55 }, /* Ù (U grave) */ | ||
273 | { 0xda, XF_UACUTE, 1, 0x55 }, /* Ú (U acute) */ | ||
274 | { 0xdb, XF_UCIRCUMFLEX, 1, 0x55 }, /* Û (U circumflex) */ | ||
275 | { 0xdc, XF_UDIERESIS, 1, 0x55 }, /* Ü (U dieresis) */ | ||
276 | { 0xdd, XF_YACUTE, 1, 0x59 }, /* Ý (Y acute) */ | ||
277 | |||
278 | { 0xdf, 0, 0, 0xe1 }, /* ß (sharp s) */ | ||
279 | { 0xe0, XF_aGRAVE, 1, 0x61 }, /* à (a grave) */ | ||
280 | { 0xe1, XF_aACUTE, 1, 0x61 }, /* á (a acute) */ | ||
281 | { 0xe2, XF_aCIRCUMFLEX, 1, 0x61 }, /* â (a circumflex) */ | ||
282 | { 0xe3, XF_aTILDE, 1, 0x61 }, /* ã (a tilde) */ | ||
283 | { 0xe4, XF_aDIERESIS, 1, 0x61 }, /* ä (a dieresis) */ | ||
284 | { 0xe5, XF_aRING, 1, 0x61 }, /* å (a with ring above) */ | ||
285 | { 0xe6, XF_aeLIGATURE, 1, 0x61 }, /* æ (ae ligature) */ | ||
286 | { 0xe7, XF_cCEDILLA, 1, 0x63 }, /* ç (c cedilla) */ | ||
287 | { 0xe8, XF_eGRAVE, 1, 0x65 }, /* è (e grave) */ | ||
288 | { 0xe9, XF_eACUTE, 1, 0x65 }, /* é (e acute) */ | ||
289 | { 0xea, XF_eCIRCUMFLEX, 1, 0x65 }, /* ê (e circumflex) */ | ||
290 | { 0xeb, XF_eDIERESIS, 1, 0x65 }, /* ë (e dieresis) */ | ||
291 | { 0xec, XF_iGRAVE, 1, 0x69 }, /* ì (i grave) */ | ||
292 | { 0xed, XF_iACUTE, 1, 0x69 }, /* í (i acute) */ | ||
293 | { 0xee, XF_iCIRCUMFLEX, 1, 0x69 }, /* î (i circumflex) */ | ||
294 | { 0xef, XF_iDIERESIS, 1, 0x69 }, /* ï (i dieresis) */ | ||
295 | |||
296 | { 0xf1, XF_nTILDE, 1, 0x6e }, /* ñ (n tilde) */ | ||
297 | { 0xf2, XF_oGRAVE, 1, 0x6f }, /* ò (o grave) */ | ||
298 | { 0xf3, XF_oACUTE, 1, 0x6f }, /* ó (o acute) */ | ||
299 | { 0xf4, XF_oCIRCUMFLEX, 1, 0x6f }, /* ô (o circumflex) */ | ||
300 | { 0xf5, XF_oTILDE, 1, 0x6f }, /* õ (o tilde) */ | ||
301 | { 0xf6, XF_oDIERESIS, 1, 0x6f }, /* ö (o dieresis) */ | ||
302 | { 0xf7, 0, 0, 0x97 }, /* ÷ (division sign) */ | ||
303 | { 0xf8, XF_oSLASH, 1, 0x6f }, /* ø (o slash) */ | ||
304 | { 0xf9, XF_uGRAVE, 1, 0x75 }, /* ù (u grave) */ | ||
305 | { 0xfa, XF_uACUTE, 1, 0x75 }, /* ú (u acute) */ | ||
306 | { 0xfb, XF_uCIRCUMFLEX, 1, 0x75 }, /* û (u circumflex) */ | ||
307 | { 0xfc, XF_uDIERESIS, 1, 0x75 }, /* ü (u dieresis) */ | ||
308 | { 0xfd, XF_yACUTE, 1, 0x79 }, /* ý (y acute) */ | ||
309 | |||
310 | { 0xff, XF_yDIERESIS, 1, 0x79 }, /* ÿ (y dieresis) */ | ||
311 | |||
312 | /* Latin extended A */ | ||
313 | { 0x0103, XF_aBREVE, 1, 0x61 }, /* a breve */ | ||
314 | { 0x0105, XF_aOGONEK, 1, 0x61 }, /* a ogonek */ | ||
315 | { 0x0107, XF_cACUTE, 1, 0x63 }, /* c acute */ | ||
316 | { 0x010d, XF_cCARON, 1, 0x63 }, /* c caron */ | ||
317 | { 0x010f, XF_dCARON, 1, 0x64 }, /* d caron */ | ||
318 | { 0x0110, XF_DSTROKE, 1, 0x44 }, /* D stroke */ | ||
319 | { 0x0111, XF_dSTROKE, 1, 0x64 }, /* d stroke */ | ||
320 | { 0x0119, XF_eOGONEK, 1, 0x65 }, /* e ogonek */ | ||
321 | { 0x011b, XF_eCARON, 1, 0x65 }, /* e caron */ | ||
322 | { 0x011e, XF_GBREVE, 1, 0x47 }, /* G breve */ | ||
323 | { 0x011f, XF_gBREVE, 1, 0x67 }, /* g breve */ | ||
324 | { 0x0130, XF_IDOT, 1, 0x49 }, /* I with dot above */ | ||
325 | { 0x0131, XF_DOTLESSi, 1, 0x69 }, /* dotless i */ | ||
326 | { 0x0141, XF_LSTROKE, 1, 0x4c }, /* L stroke */ | ||
327 | { 0x0142, XF_lSTROKE, 1, 0x6c }, /* l stroke */ | ||
328 | { 0x0144, XF_nACUTE, 1, 0x6e }, /* n acute */ | ||
329 | { 0x0148, XF_nCARON, 1, 0x6e }, /* n caron */ | ||
330 | { 0x0150, XF_ODBLACUTE, 1, 0x4f }, /* O double acute */ | ||
331 | { 0x0151, XF_oDBLACUTE, 1, 0x6f }, /* o double acute */ | ||
332 | { 0x0158, XF_RCARON, 1, 0x52 }, /* R caron */ | ||
333 | { 0x0159, XF_rCARON, 1, 0x72 }, /* r caron */ | ||
334 | { 0x015a, XF_SACUTE, 1, 0x53 }, /* S acute */ | ||
335 | { 0x015b, XF_sACUTE, 1, 0x73 }, /* s acute */ | ||
336 | { 0x015e, XF_SCEDILLA, 1, 0x53 }, /* S cedilla */ | ||
337 | { 0x015f, XF_sCEDILLA, 1, 0x73 }, /* s cedilla */ | ||
338 | { 0x0160, XF_SCARON, 1, 0x53 }, /* S caron */ | ||
339 | { 0x0161, XF_sCARON, 1, 0x73 }, /* s caron */ | ||
340 | { 0x0163, XF_tCEDILLA, 1, 0x74 }, /* t cedilla */ | ||
341 | { 0x0165, XF_tCARON, 1, 0x74 }, /* t caron */ | ||
342 | { 0x016f, XF_uRING, 1, 0x75 }, /* u with ring above */ | ||
343 | { 0x0170, XF_UDBLACUTE, 1, 0x55 }, /* U double acute */ | ||
344 | { 0x0171, XF_uDBLACUTE, 1, 0x75 }, /* u double acute */ | ||
345 | { 0x017a, XF_zACUTE, 1, 0x7a }, /* z acute */ | ||
346 | { 0x017c, XF_zDOT, 1, 0x7a }, /* z with dot above */ | ||
347 | { 0x017e, XF_zCARON, 1, 0x7a }, /* z caron */ | ||
348 | |||
349 | /* Greek */ | ||
350 | { 0x037e, 0, 0, 0x3b }, /* greek question mark */ | ||
351 | |||
352 | { 0x0386, 0, 0, 0x41 }, /* greek ALPHA with tonos */ | ||
353 | { 0x0387, 0, 0, 0xa5 }, /* greek ano teleia */ | ||
354 | { 0x0388, 0, 0, 0x45 }, /* greek EPSILON with tonos */ | ||
355 | { 0x0389, 0, 0, 0x48 }, /* greek ETA with tonos */ | ||
356 | { 0x038a, 0, 0, 0x49 }, /* greek IOTA with tonos */ | ||
357 | /* reserved */ | ||
358 | { 0x038c, 0, 0, 0x4f }, /* greek OMICRON with tonos */ | ||
359 | /* reserved */ | ||
360 | { 0x038e, 0, 0, 0x59 }, /* greek YPSILON with tonos */ | ||
361 | { 0x038f, 0, 0, 0xea }, /* greek OMEGA with tonos */ | ||
362 | { 0x0390, XF_GR_iotaTONOS, 1, 0x69 }, /* greek iota with dialytica + tonos */ | ||
363 | { 0x0391, 0, 0, 0x41 }, /* greek ALPHA */ | ||
364 | { 0x0392, 0, 0, 0x42 }, /* greek BETA */ | ||
365 | { 0x0393, XF_GR_GAMMA, 2, 0xb2 }, /* greek GAMMA */ | ||
366 | { 0x0394, XF_GR_DELTA, 2, 0x1f }, /* greek DELTA */ | ||
367 | { 0x0395, 0, 0, 0x45 }, /* greek EPSILON */ | ||
368 | { 0x0396, 0, 0, 0x5a }, /* greek ZETA */ | ||
369 | { 0x0397, 0, 0, 0x48 }, /* greek ETA */ | ||
370 | { 0x0398, XF_GR_THETA, 1, 0x30 }, /* greek THETA */ | ||
371 | { 0x0399, 0, 0, 0x49 }, /* greek IOTA */ | ||
372 | { 0x039a, 0, 0, 0x4b }, /* greek KAPPA */ | ||
373 | { 0x039b, XF_GR_LAMBDA, 2, 0x4c }, /* greek LAMBDA */ | ||
374 | { 0x039c, 0, 0, 0x4d }, /* greek MU */ | ||
375 | { 0x039d, 0, 0, 0x4e }, /* greek NU */ | ||
376 | { 0x039e, XF_GR_XI, 2, 0xd0 }, /* greek XI */ | ||
377 | { 0x039f, 0, 0, 0x4f }, /* greek OMICRON */ | ||
378 | { 0x03a0, XF_GR_PI, 1, 0x14 }, /* greek PI */ | ||
379 | { 0x03a1, 0, 0, 0x50 }, /* greek RHO */ | ||
380 | /* reserved */ | ||
381 | { 0x03a3, 0, 0, 0xe4 }, /* greek SIGMA */ | ||
382 | { 0x03a4, 0, 0, 0x54 }, /* greek TAU */ | ||
383 | { 0x03a5, 0, 0, 0x59 }, /* greek UPSILON */ | ||
384 | { 0x03a6, 0, 0, 0xe8 }, /* greek PHI */ | ||
385 | { 0x03a7, 0, 0, 0x58 }, /* greek CHI */ | ||
386 | { 0x03a8, XF_GR_PSI, 2, 0xc2 }, /* greek PSI */ | ||
387 | { 0x03a9, 0, 0, 0xea }, /* greek OMEGA */ | ||
388 | { 0x03aa, 0, 0, 0x49 }, /* greek IOTA with dialytica */ | ||
389 | { 0x03ab, 0, 0, 0x59 }, /* greek UPSILON with dialytica */ | ||
390 | { 0x03ac, XF_GR_alphaTONOS, 1, 0xe0 }, /* greek alpha with tonos */ | ||
391 | { 0x03ad, XF_GR_epsilonTONOS, 1, 0xee }, /* greek epsilon with tonos */ | ||
392 | { 0x03ae, XF_GR_etaTONOS, 1, 0x6e }, /* greek eta with tonos */ | ||
393 | { 0x03af, XF_GR_iotaTONOS, 1, 0x69 }, /* greek iota with tonos */ | ||
394 | { 0x03b0, XF_GR_upsilonTONOS, 1, 0x75 }, /* greek upsilon with dialytica + tonos */ | ||
395 | { 0x03b1, 0, 0, 0xe0 }, /* greek alpha */ | ||
396 | { 0x03b2, 0, 0, 0xe1 }, /* greek beta */ | ||
397 | { 0x03b3, 0, 0, 0xe2 }, /* greek gamma */ | ||
398 | { 0x03b4, 0, 0, 0xeb }, /* greek delta */ | ||
399 | { 0x03b5, XF_GR_epsilon, 1, 0xee }, /* greek epsilon */ | ||
400 | { 0x03b6, XF_GR_zeta, 1, 0x7a }, /* greek zeta */ | ||
401 | { 0x03b7, XF_GR_eta, 1, 0x6e }, /* greek eta */ | ||
402 | { 0x03b8, 0, 0, 0xe9 }, /* greek theta */ | ||
403 | { 0x03b9, XF_GR_iota, 1, 0x69 }, /* greek iota */ | ||
404 | { 0x03ba, XF_GR_kappa, 1, 0x6b }, /* greek kappa */ | ||
405 | { 0x03bb, XF_GR_lambda, 2, 0xca }, /* greek lambda */ | ||
406 | { 0x03bc, 0, 0, 0xe6 }, /* greek mu */ | ||
407 | { 0x03bd, 0, 0, 0x76 }, /* greek nu */ | ||
408 | { 0x03be, XF_GR_xi, 2, 0xd0 }, /* greek xi */ | ||
409 | { 0x03bf, 0, 0, 0x6f }, /* greek omicron */ | ||
410 | { 0x03c0, 0, 0, 0xe3 }, /* greek pi */ | ||
411 | { 0x03c1, XF_GR_rho, 1, 0x70 }, /* greek rho */ | ||
412 | { 0x03c2, XF_GR_FINALsigma, 1, 0x73 }, /* greek final sigma */ | ||
413 | { 0x03c3, 0, 0, 0xe5 }, /* greek sigma */ | ||
414 | { 0x03c4, 0, 0, 0xe7 }, /* greek tau */ | ||
415 | { 0x03c5, XF_GR_upsilon, 1, 0x75 }, /* greek upsilon */ | ||
416 | { 0x03c6, 0, 0, 0xed }, /* greek phi */ | ||
417 | { 0x03c7, XF_GR_chi, 1, 0x78 }, /* greek chi */ | ||
418 | { 0x03c8, XF_GR_psi, 2, 0xc2 }, /* greek psi */ | ||
419 | { 0x03c9, XF_GR_omega, 1, 0x77 }, /* greek omega */ | ||
420 | { 0x03ca, XF_GR_iotaDIA, 1, 0x69 }, /* greek iota with dialytica */ | ||
421 | { 0x03cb, XF_GR_upsilon, 1, 0x75 }, /* greek upsilon with dialytica */ | ||
422 | { 0x03cc, XF_GR_omicronTONOS, 1, 0x6f }, /* greek omicron with tonos */ | ||
423 | { 0x03cd, XF_GR_upsilonTONOS, 1, 0x75 }, /* greek upsilon with tonos */ | ||
424 | { 0x03ce, XF_GR_omegaTONOS, 1, 0x77 }, /* greek omega with tonos */ | ||
425 | |||
426 | { 0x03f3, 0, 0, 0x6a }, /* greek yot */ | ||
427 | |||
428 | /* Cyrillic */ | ||
429 | { 0x0400, XF_CYR_IEGRAVE,1, 0x45 }, /* cyrillic IE grave */ | ||
430 | { 0x0401, XF_CYR_IO, 1, 0x45 }, /* cyrillic IO */ | ||
431 | |||
432 | { 0x0405, 0, 0, 0x53 }, /* cyrillic DZE */ | ||
433 | { 0x0406, 0, 0, 0x49 }, /* cyrillic byeloruss-ukr. I */ | ||
434 | { 0x0407, XF_CYR_YI, 1, 0x49 }, /* cyrillic YI */ | ||
435 | { 0x0408, 0, 0, 0x4a }, /* cyrillic JE */ | ||
436 | |||
437 | { 0x0410, 0, 0, 0x41 }, /* cyrillic A */ | ||
438 | { 0x0411, XF_CYR_BE, 1, 0xeb }, /* cyrillic BE */ | ||
439 | { 0x0412, 0, 0, 0x42 }, /* cyrillic VE */ | ||
440 | { 0x0413, XF_CYR_GHE, 2, 0xb2 }, /* cyrillic GHE */ | ||
441 | { 0x0414, XF_CYR_DE, 2, 0x44 }, /* cyrillic DE */ | ||
442 | { 0x0415, 0, 0, 0x45 }, /* cyrillic IE */ | ||
443 | { 0x0416, XF_CYR_ZHE, 2, 0x2a }, /* cyrillic ZHE */ | ||
444 | { 0x0417, XF_CYR_ZE, 1, 0x33 }, /* cyrillic ZE */ | ||
445 | { 0x0418, XF_CYR_I, 1, 0x55 }, /* cyrillic I */ | ||
446 | { 0x0419, XF_CYR_SHORTI, 1, 0x55 }, /* cyrillic short I */ | ||
447 | { 0x041a, 0, 0, 0x4b }, /* cyrillic K */ | ||
448 | { 0x041b, XF_CYR_EL, 2, 0x4c }, /* cyrillic EL */ | ||
449 | { 0x041c, 0, 0, 0x4d }, /* cyrillic EM */ | ||
450 | { 0x041d, 0, 0, 0x48 }, /* cyrillic EN */ | ||
451 | { 0x041e, 0, 0, 0x4f }, /* cyrillic O */ | ||
452 | { 0x041f, XF_CYR_PE, 1, 0x14 }, /* cyrillic PE */ | ||
453 | { 0x0420, 0, 0, 0x50 }, /* cyrillic ER */ | ||
454 | { 0x0421, 0, 0, 0x43 }, /* cyrillic ES */ | ||
455 | { 0x0422, 0, 0, 0x54 }, /* cyrillic TE */ | ||
456 | { 0x0423, 0, 0, 0x59 }, /* cyrillic U */ | ||
457 | { 0x0424, 0, 0, 0xe8 }, /* cyrillic EF */ | ||
458 | { 0x0425, 0, 0, 0x58 }, /* cyrillic HA */ | ||
459 | { 0x0426, XF_CYR_TSE, 2, 0xd9 }, /* cyrillic TSE */ | ||
460 | { 0x0427, XF_CYR_CHE, 2, 0xd1 }, /* cyrillic CHE */ | ||
461 | { 0x0428, XF_CYR_SHA, 1, 0x57 }, /* cyrillic SHA */ | ||
462 | { 0x0429, XF_CYR_SHCHA, 1, 0x57 }, /* cyrillic SHCHA */ | ||
463 | { 0x042a, XF_CYR_HARD, 1, 0x62 }, /* cyrillic capital hard sign */ | ||
464 | { 0x042b, XF_CYR_YERU, 2, 0x1a }, /* cyrillic YERU */ | ||
465 | { 0x042c, 0, 0, 0x62 }, /* cyrillic capital soft sign */ | ||
466 | { 0x042d, XF_CYR_E, 2, 0xa6 }, /* cyrillic E */ | ||
467 | { 0x042e, XF_CYR_YU, 2, 0x1b }, /* cyrillic YU */ | ||
468 | { 0x042f, XF_CYR_YA, 2, 0xf3 }, /* cyrillic YA */ | ||
469 | { 0x0430, 0, 0, 0x61 }, /* cyrillic a */ | ||
470 | { 0x0431, 0, 0, 0xeb }, /* cyrillic be */ | ||
471 | { 0x0432, XF_CYR_ve, 1, 0xe1 }, /* cyrillic ve */ | ||
472 | { 0x0433, XF_CYR_ghe, 1, 0x72 }, /* cyrillic ghe */ | ||
473 | { 0x0434, XF_CYR_de, 2, 0x1f }, /* cyrillic de */ | ||
474 | { 0x0435, 0, 0, 0x65 }, /* cyrillic ie */ | ||
475 | { 0x0436, XF_CYR_zhe, 1, 0x2a }, /* cyrillic zhe */ | ||
476 | { 0x0437, XF_CYR_ze, 1, 0xae }, /* cyrillic ze */ | ||
477 | { 0x0438, XF_CYR_i, 1, 0x75 }, /* cyrillic i */ | ||
478 | { 0x0439, XF_CYR_SHORTi, 1, 0x75 }, /* cyrillic short i */ | ||
479 | { 0x043a, XF_CYR_ka, 1, 0x6b }, /* cyrillic ka */ | ||
480 | { 0x043b, XF_CYR_el, 2, 0xca }, /* cyrillic el */ | ||
481 | { 0x043c, XF_CYR_em, 1, 0x6d }, /* cyrillic em */ | ||
482 | { 0x043d, XF_CYR_en, 2, 0x48 }, /* cyrillic en */ | ||
483 | { 0x043e, 0, 0, 0x6f }, /* cyrillic o */ | ||
484 | { 0x043f, 0, 0, 0xe3 }, /* cyrillic pe */ | ||
485 | { 0x0440, 0, 0, 0x70 }, /* cyrillic er */ | ||
486 | { 0x0441, 0, 0, 0x63 }, /* cyrillic es */ | ||
487 | { 0x0442, 0, 0, 0xe7 }, /* cyrillic te */ | ||
488 | { 0x0443, 0, 0, 0x79 }, /* cyrillic u */ | ||
489 | { 0x0444, 0, 0, 0xed }, /* cyrillic ef */ | ||
490 | { 0x0445, 0, 0, 0x78 }, /* cyrillic ha */ | ||
491 | { 0x0446, XF_CYR_tse, 2, 0xd9 }, /* cyrillic tse */ | ||
492 | { 0x0447, XF_CYR_che, 2, 0xd1 }, /* cyrillic che */ | ||
493 | { 0x0448, XF_CYR_sha, 1, 0x77 }, /* cyrillic sha */ | ||
494 | { 0x0449, XF_CYR_shcha, 1, 0x77 }, /* cyrillic shcha */ | ||
495 | { 0x044a, XF_CYR_hard, 1, 0x62 }, /* cyrillic small hard sign */ | ||
496 | { 0x044b, XF_CYR_yeru, 2, 0x1a }, /* cyrillic yeru */ | ||
497 | { 0x044c, XF_CYR_soft, 1, 0x62 }, /* cyrillic small soft sign */ | ||
498 | { 0x044d, XF_CYR_e, 2, 0xa7 }, /* cyrillic e */ | ||
499 | { 0x044e, XF_CYR_yu, 2, 0x1b }, /* cyrillic yu */ | ||
500 | { 0x044f, XF_CYR_ya, 2, 0xfb }, /* cyrillic ya */ | ||
501 | { 0x0450, XF_CYR_ieGRAVE,1, 0x65 }, /* cyrillic ie grave */ | ||
502 | { 0x0451, XF_CYR_io, 1, 0x65 }, /* cyrillic io */ | ||
503 | |||
504 | { 0x0455, 0, 0, 0x73 }, /* cyrillic dze */ | ||
505 | { 0x0456, 0, 0, 0x69 }, /* cyrillic byeloruss-ukr. i */ | ||
506 | { 0x0457, XF_CYR_yi, 1, 0x69 }, /* cyrillic yi */ | ||
507 | { 0x0458, 0, 0, 0x6a }, /* cyrillic je */ | ||
508 | |||
509 | /* extra punctuation */ | ||
510 | { 0x2013, 0, 0, 0x2d }, /* en dash */ | ||
511 | { 0x2014, 0, 0, 0x2d }, /* em dash */ | ||
512 | |||
513 | { 0x2018, 0, 0, 0x27 }, /* left single quotation mark */ | ||
514 | { 0x2019, 0, 0, 0x27 }, /* right single quotation mark */ | ||
515 | { 0x201a, 0, 0, 0x2c }, /* single low-9 quotation mark */ | ||
516 | { 0x201b, 0, 0, 0x27 }, /* single high-reversed-9 quotation mark */ | ||
517 | { 0x201c, 0, 0, 0x22 }, /* left double quotation mark */ | ||
518 | { 0x201d, 0, 0, 0x22 }, /* right double quotation mark */ | ||
519 | { 0x201e, 0, 0, 0x22 }, /* double low-9 quotation mark */ | ||
520 | { 0x201f, 0, 0, 0x22 }, /* double high-reversed-9 quotation mark */ | ||
521 | |||
522 | { 0x2022, 0, 0, 0xa5 }, /* bullet */ | ||
523 | |||
524 | { 0x2039, 0, 0, 0x3c }, /* single left-pointing angle quotation mark */ | ||
525 | { 0x203a, 0, 0, 0x3e }, /* single right-pointing angle quotation mark */ | ||
526 | |||
527 | /* Runtime-definable characters */ | ||
528 | { 0xe000, 0x8000, 15, 0x20 }, /* variable character 0 */ | ||
529 | { 0xe001, 0x8001, 15, 0x20 }, /* variable character 1 */ | ||
530 | { 0xe002, 0x8002, 15, 0x20 }, /* variable character 2 */ | ||
531 | { 0xe003, 0x8003, 15, 0x20 }, /* variable character 3 */ | ||
532 | { 0xe004, 0x8004, 15, 0x20 }, /* variable character 4 */ | ||
533 | { 0xe005, 0x8005, 15, 0x20 }, /* variable character 5 */ | ||
534 | { 0xe006, 0x8006, 15, 0x20 }, /* variable character 6 */ | ||
535 | { 0xe007, 0x8007, 15, 0x20 }, /* variable character 7 */ | ||
536 | { 0xe008, 0x8008, 15, 0x20 }, /* variable character 8 */ | ||
537 | { 0xe009, 0x8009, 15, 0x20 }, /* variable character 9 */ | ||
538 | { 0xe00a, 0x800a, 15, 0x20 }, /* variable character 10 */ | ||
539 | { 0xe00b, 0x800b, 15, 0x20 }, /* variable character 11 */ | ||
540 | { 0xe00c, 0x800c, 15, 0x20 }, /* variable character 12 */ | ||
541 | { 0xe00d, 0x800d, 15, 0x20 }, /* variable character 13 */ | ||
542 | { 0xe00e, 0x800e, 15, 0x20 }, /* variable character 14 */ | ||
543 | { 0xe00f, 0x800f, 15, 0x20 }, /* variable character 15 */ | ||
544 | |||
545 | /* Icons and special symbols */ | ||
546 | { 0xe100, XF_ICON_UNKNOWN, 14, 0x3f }, /* unknown icon (mirrored ?) */ | ||
547 | { 0xe101, XF_ICON_BOOKMARK, 14, 0x94 }, /* bookmark icon */ | ||
548 | { 0xe102, XF_ICON_PLUGIN, 14, 0x29 }, /* plugin icon */ | ||
549 | { 0xe103, XF_ICON_FOLDER, 14, 0x91 }, /* folder icon */ | ||
550 | { 0xe104, XF_ICON_FIRMWARE, 14, 0x78 }, /* firmware icon */ | ||
551 | { 0xe105, XF_ICON_LANGUAGE, 14, 0x2b }, /* language icon */ | ||
552 | { 0xe106, XF_ICON_AUDIO, 14, 0x13 }, /* audio icon (note) */ | ||
553 | { 0xe107, XF_ICON_WPS, 14, 0x94 }, /* wps icon */ | ||
554 | { 0xe108, XF_ICON_PLAYLIST, 14, 0xd0 }, /* playlist icon */ | ||
555 | { 0xe109, XF_ICON_TEXTFILE, 14, 0xd0 }, /* text file icon */ | ||
556 | { 0xe10a, XF_ICON_CONFIG, 14, 0xd0 }, /* config icon */ | ||
557 | { 0xe10b, 0, 0, 0x7f }, /* left arrow */ | ||
558 | { 0xe10c, 0, 0, 0x7e }, /* right arrow */ | ||
559 | { 0xe10d, 0, 0, 0x18 }, /* up arrow */ | ||
560 | { 0xe10e, 0, 0, 0x19 }, /* down arrow */ | ||
561 | { 0xe10f, 0, 0, 0x11 }, /* filled left arrow */ | ||
562 | { 0xe110, 0, 0, 0x10 }, /* filled right arrow */ | ||
563 | { 0xe111, 0, 0, 0x1f }, /* filled up arrow */ | ||
564 | { 0xe112, 0, 0, 0x1e }, /* filled down arrow */ | ||
565 | { 0xe113, 0, 0, 0x20 }, /* level 0/7 */ | ||
566 | { 0xe114, 0, 0, 0x80 }, /* level 1/7 */ | ||
567 | { 0xe115, 0, 0, 0x81 }, /* level 2/7 */ | ||
568 | { 0xe116, 0, 0, 0x82 }, /* level 3/7 */ | ||
569 | { 0xe117, 0, 0, 0x83 }, /* level 4/7 */ | ||
570 | { 0xe118, 0, 0, 0x84 }, /* level 5/7 */ | ||
571 | { 0xe119, 0, 0, 0x85 }, /* level 6/7 */ | ||
572 | { 0xe11a, 0, 0, 0x86 }, /* level 7/7 */ | ||
573 | |||
574 | /* Halfwidth CJK punctuation and katakana - new LCD only */ | ||
575 | { 0xff61, 0, 0, 0xa1 }, /* hw ideographic full stop */ | ||
576 | { 0xff62, 0, 0, 0xa2 }, /* hw left corner bracket */ | ||
577 | { 0xff63, 0, 0, 0xa3 }, /* hw right corner bracket */ | ||
578 | { 0xff64, 0, 0, 0xa4 }, /* hw ideographic comma */ | ||
579 | { 0xff65, 0, 0, 0xa5 }, /* hw katakana middle dot */ | ||
580 | { 0xff66, 0, 0, 0xa6 }, /* hw katakana WO */ | ||
581 | { 0xff67, 0, 0, 0xa7 }, /* hw katakana a */ | ||
582 | { 0xff68, 0, 0, 0xa8 }, /* hw katakana i */ | ||
583 | { 0xff69, 0, 0, 0xa9 }, /* hw katakana u */ | ||
584 | { 0xff6a, 0, 0, 0xaa }, /* hw katakana e */ | ||
585 | { 0xff6b, 0, 0, 0xab }, /* hw katakana o */ | ||
586 | { 0xff6c, 0, 0, 0xac }, /* hw katakana ya */ | ||
587 | { 0xff6d, 0, 0, 0xad }, /* hw katakana yu */ | ||
588 | { 0xff6e, 0, 0, 0xae }, /* hw katakana yo */ | ||
589 | { 0xff6f, 0, 0, 0xaf }, /* hw katakana tu */ | ||
590 | { 0xff70, 0, 0, 0xb0 }, /* hw katakana-hiragana prolonged soundmark */ | ||
591 | { 0xff71, 0, 0, 0xb1 }, /* hw katakana A */ | ||
592 | { 0xff72, 0, 0, 0xb2 }, /* hw katakana I */ | ||
593 | { 0xff73, 0, 0, 0xb3 }, /* hw katakana U */ | ||
594 | { 0xff74, 0, 0, 0xb4 }, /* hw katakana E */ | ||
595 | { 0xff75, 0, 0, 0xb5 }, /* hw katakana O */ | ||
596 | { 0xff76, 0, 0, 0xb6 }, /* hw katakana KA */ | ||
597 | { 0xff77, 0, 0, 0xb7 }, /* hw katakana KI */ | ||
598 | { 0xff78, 0, 0, 0xb8 }, /* hw katakana KU */ | ||
599 | { 0xff79, 0, 0, 0xb9 }, /* hw katakana KE */ | ||
600 | { 0xff7a, 0, 0, 0xba }, /* hw katakana KO */ | ||
601 | { 0xff7b, 0, 0, 0xbb }, /* hw katakana SA */ | ||
602 | { 0xff7c, 0, 0, 0xbc }, /* hw katakana SI */ | ||
603 | { 0xff7d, 0, 0, 0xbd }, /* hw katakana SU */ | ||
604 | { 0xff7e, 0, 0, 0xbe }, /* hw katakana SE */ | ||
605 | { 0xff7f, 0, 0, 0xbf }, /* hw katakana SO */ | ||
606 | { 0xff80, 0, 0, 0xc0 }, /* hw katakana TA */ | ||
607 | { 0xff81, 0, 0, 0xc1 }, /* hw katakana TI */ | ||
608 | { 0xff82, 0, 0, 0xc2 }, /* hw katakana TU */ | ||
609 | { 0xff83, 0, 0, 0xc3 }, /* hw katakana TE */ | ||
610 | { 0xff84, 0, 0, 0xc4 }, /* hw katakana TO */ | ||
611 | { 0xff85, 0, 0, 0xc5 }, /* hw katakana NA */ | ||
612 | { 0xff86, 0, 0, 0xc6 }, /* hw katakana NI */ | ||
613 | { 0xff87, 0, 0, 0xc7 }, /* hw katakana NU */ | ||
614 | { 0xff88, 0, 0, 0xc8 }, /* hw katakana NE */ | ||
615 | { 0xff89, 0, 0, 0xc9 }, /* hw katakana NO */ | ||
616 | { 0xff8a, 0, 0, 0xca }, /* hw katakana HA */ | ||
617 | { 0xff8b, 0, 0, 0xcb }, /* hw katakana HI */ | ||
618 | { 0xff8c, 0, 0, 0xcc }, /* hw katakana HU */ | ||
619 | { 0xff8d, 0, 0, 0xcd }, /* hw katakana HE */ | ||
620 | { 0xff8e, 0, 0, 0xce }, /* hw katakana HO */ | ||
621 | { 0xff8f, 0, 0, 0xcf }, /* hw katakana MA */ | ||
622 | { 0xff90, 0, 0, 0xd0 }, /* hw katakana MI */ | ||
623 | { 0xff91, 0, 0, 0xd1 }, /* hw katakana MU */ | ||
624 | { 0xff92, 0, 0, 0xd2 }, /* hw katakana ME */ | ||
625 | { 0xff93, 0, 0, 0xd3 }, /* hw katakana MO */ | ||
626 | { 0xff94, 0, 0, 0xd4 }, /* hw katakana YA */ | ||
627 | { 0xff95, 0, 0, 0xd5 }, /* hw katakana YU */ | ||
628 | { 0xff96, 0, 0, 0xd6 }, /* hw katakana YO */ | ||
629 | { 0xff97, 0, 0, 0xd7 }, /* hw katakana RA */ | ||
630 | { 0xff98, 0, 0, 0xd8 }, /* hw katakana RI */ | ||
631 | { 0xff99, 0, 0, 0xd9 }, /* hw katakana RU */ | ||
632 | { 0xff9a, 0, 0, 0xda }, /* hw katakana RE */ | ||
633 | { 0xff9b, 0, 0, 0xdb }, /* hw katakana RO */ | ||
634 | { 0xff9c, 0, 0, 0xdc }, /* hw katakana WA */ | ||
635 | { 0xff9d, 0, 0, 0xdd }, /* hw katakana N */ | ||
636 | { 0xff9e, 0, 0, 0xde }, /* hw katakana voiced sound mark */ | ||
637 | { 0xff9f, 0, 0, 0xdf }, /* hw katakana semi-voiced sound mark */ | ||
638 | #endif /* !BOOTLOADER */ | ||
639 | |||
640 | /* no-char symbol */ | ||
641 | { 0xfffd, 0, 0, 0x91 }, | ||
642 | }; | ||
643 | |||
644 | static const struct xchar_info xchar_info_oldlcd[] = { | ||
645 | /* Standard ascii */ | ||
646 | { 0x20, 0, 0, 0x24 }, /* */ | ||
647 | { 0x21, 0, 0, 0x25 }, /* ! */ | ||
648 | { 0x22, 0, 0, 0x26 }, /* " */ | ||
649 | { 0x23, 0, 0, 0x27 }, /* # */ | ||
650 | { 0x24, 0, 0, 0x06 }, /* $ */ | ||
651 | { 0x25, 0, 0, 0x29 }, /* % */ | ||
652 | { 0x26, 0, 0, 0x2a }, /* & */ | ||
653 | { 0x27, 0, 0, 0x2b }, /* ' */ | ||
654 | { 0x28, 0, 0, 0x2c }, /* ( */ | ||
655 | { 0x29, 0, 0, 0x2d }, /* ) */ | ||
656 | { 0x2a, 0, 0, 0x2e }, /* * */ | ||
657 | { 0x2b, 0, 0, 0x2f }, /* + */ | ||
658 | { 0x2c, 0, 0, 0x30 }, /* , */ | ||
659 | { 0x2d, 0, 0, 0x31 }, /* - */ | ||
660 | { 0x2e, 0, 0, 0x32 }, /* . */ | ||
661 | { 0x2f, 0, 0, 0x33 }, /* / */ | ||
662 | { 0x30, 0, 0, 0x34 }, /* 0 */ | ||
663 | { 0x31, 0, 0, 0x35 }, /* 1 */ | ||
664 | { 0x32, 0, 0, 0x36 }, /* 2 */ | ||
665 | { 0x33, 0, 0, 0x37 }, /* 3 */ | ||
666 | { 0x34, 0, 0, 0x38 }, /* 4 */ | ||
667 | { 0x35, 0, 0, 0x39 }, /* 5 */ | ||
668 | { 0x36, 0, 0, 0x3a }, /* 6 */ | ||
669 | { 0x37, 0, 0, 0x3b }, /* 7 */ | ||
670 | { 0x38, 0, 0, 0x3c }, /* 8 */ | ||
671 | { 0x39, 0, 0, 0x3d }, /* 9 */ | ||
672 | { 0x3a, 0, 0, 0x3e }, /* : */ | ||
673 | { 0x3b, 0, 0, 0x3f }, /* ; */ | ||
674 | { 0x3c, 0, 0, 0x40 }, /* < */ | ||
675 | { 0x3d, 0, 0, 0x41 }, /* = */ | ||
676 | { 0x3e, 0, 0, 0x42 }, /* > */ | ||
677 | { 0x3f, 0, 0, 0x43 }, /* ? */ | ||
678 | { 0x40, 0, 0, 0x04 }, /* @ */ | ||
679 | { 0x41, 0, 0, 0x45 }, /* A */ | ||
680 | { 0x42, 0, 0, 0x46 }, /* B */ | ||
681 | { 0x43, 0, 0, 0x47 }, /* C */ | ||
682 | { 0x44, 0, 0, 0x48 }, /* D */ | ||
683 | { 0x45, 0, 0, 0x49 }, /* E */ | ||
684 | { 0x46, 0, 0, 0x4a }, /* F */ | ||
685 | { 0x47, 0, 0, 0x4b }, /* G */ | ||
686 | { 0x48, 0, 0, 0x4c }, /* H */ | ||
687 | { 0x49, 0, 0, 0x4d }, /* I */ | ||
688 | { 0x4a, 0, 0, 0x4e }, /* J */ | ||
689 | { 0x4b, 0, 0, 0x4f }, /* K */ | ||
690 | { 0x4c, 0, 0, 0x50 }, /* L */ | ||
691 | { 0x4d, 0, 0, 0x51 }, /* M */ | ||
692 | { 0x4e, 0, 0, 0x52 }, /* N */ | ||
693 | { 0x4f, 0, 0, 0x53 }, /* O */ | ||
694 | { 0x50, 0, 0, 0x54 }, /* P */ | ||
695 | { 0x51, 0, 0, 0x55 }, /* Q */ | ||
696 | { 0x52, 0, 0, 0x56 }, /* R */ | ||
697 | { 0x53, 0, 0, 0x57 }, /* S */ | ||
698 | { 0x54, 0, 0, 0x58 }, /* T */ | ||
699 | { 0x55, 0, 0, 0x59 }, /* U */ | ||
700 | { 0x56, 0, 0, 0x5a }, /* V */ | ||
701 | { 0x57, 0, 0, 0x5b }, /* W */ | ||
702 | { 0x58, 0, 0, 0x5c }, /* X */ | ||
703 | { 0x59, 0, 0, 0x5d }, /* Y */ | ||
704 | { 0x5a, 0, 0, 0x5e }, /* Z */ | ||
705 | { 0x5b, 0, 0, 0xa9 }, /* [ */ | ||
706 | { 0x5c, XF_BACKSLASH, 2, 0x33 }, /* \ */ | ||
707 | { 0x5d, 0, 0, 0xce }, /* ] */ | ||
708 | { 0x5e, XF_CIRCUMFLEX, 2, 0xee }, /* ^ */ | ||
709 | { 0x5f, 0, 0, 0x15 }, /* _ */ | ||
710 | { 0x60, XF_GRAVEACCENT, 2, 0x2b }, /* ` */ | ||
711 | { 0x61, 0, 0, 0x65 }, /* a */ | ||
712 | { 0x62, 0, 0, 0x66 }, /* b */ | ||
713 | { 0x63, 0, 0, 0x67 }, /* c */ | ||
714 | { 0x64, 0, 0, 0x68 }, /* d */ | ||
715 | { 0x65, 0, 0, 0x69 }, /* e */ | ||
716 | { 0x66, 0, 0, 0x6a }, /* f */ | ||
717 | { 0x67, 0, 0, 0x6b }, /* g */ | ||
718 | { 0x68, 0, 0, 0x6c }, /* h */ | ||
719 | { 0x69, 0, 0, 0x6d }, /* i */ | ||
720 | { 0x6a, 0, 0, 0x6e }, /* j */ | ||
721 | { 0x6b, 0, 0, 0x6f }, /* k */ | ||
722 | { 0x6c, 0, 0, 0x70 }, /* l */ | ||
723 | { 0x6d, 0, 0, 0x71 }, /* m */ | ||
724 | { 0x6e, 0, 0, 0x72 }, /* n */ | ||
725 | { 0x6f, 0, 0, 0x73 }, /* o */ | ||
726 | { 0x70, 0, 0, 0x74 }, /* p */ | ||
727 | { 0x71, 0, 0, 0x75 }, /* q */ | ||
728 | { 0x72, 0, 0, 0x76 }, /* r */ | ||
729 | { 0x73, 0, 0, 0x77 }, /* s */ | ||
730 | { 0x74, 0, 0, 0x78 }, /* t */ | ||
731 | { 0x75, 0, 0, 0x79 }, /* u */ | ||
732 | { 0x76, 0, 0, 0x7a }, /* v */ | ||
733 | { 0x77, 0, 0, 0x7b }, /* w */ | ||
734 | { 0x78, 0, 0, 0x7c }, /* x */ | ||
735 | { 0x79, 0, 0, 0x7d }, /* y */ | ||
736 | { 0x7a, 0, 0, 0x7e }, /* z */ | ||
737 | { 0x7b, 0, 0, 0x2c }, /* { (hard-coded ( ) */ | ||
738 | { 0x7c, XF_VERTICALBAR, 2, 0x25 }, /* | */ | ||
739 | { 0x7d, 0, 0, 0x2d }, /* } (hard-coded ) ) */ | ||
740 | { 0x7e, XF_TILDE, 2, 0x31 }, /* ~ */ | ||
741 | { 0x7f, 0, 0, 0x8b }, /* (full grid) */ | ||
742 | |||
743 | #ifndef BOOTLOADER /* bootloader only supports pure ASCII */ | ||
744 | /* Latin 1 */ | ||
745 | { 0xa0, 0, 0, 0x24 }, /* (non-breaking space) */ | ||
746 | { 0xa1, 0, 0, 0x44 }, /* ¡ (inverted !) */ | ||
747 | { 0xa2, 0, 0, 0xa8 }, /* ¢ (cent sign) */ | ||
748 | { 0xa3, 0, 0, 0x05 }, /* £ (pound sign) */ | ||
749 | { 0xa4, 0, 0, 0x28 }, /* ¤ (currency sign) */ | ||
750 | { 0xa5, 0, 0, 0x07 }, /* ¥ (yen sign) */ | ||
751 | |||
752 | { 0xa7, 0, 0, 0x63 }, /* § (paragraph sign) */ | ||
753 | |||
754 | { 0xab, XF_LEFTDBLANGLEQUOT, 1, 0x40 }, /* « (left double-angle quotation mark) */ | ||
755 | |||
756 | { 0xad, 0, 0, 0x31 }, /* (soft hyphen) */ | ||
757 | |||
758 | { 0xaf, 0, 0, 0xee }, /* ¯ (macron) */ | ||
759 | |||
760 | { 0xb1, XF_PLUSMINUS, 1, 0x2f }, /* ± (plus-minus sign) */ | ||
761 | { 0xb2, XF_SUPER2, 1, 0x36 }, /* ³ (superscript 2) */ | ||
762 | { 0xb3, XF_SUPER3, 1, 0x37 }, /* ³ (superscript 3) */ | ||
763 | |||
764 | { 0xb5, XF_MICRO, 1, 0x79 }, /* µ (micro sign) */ | ||
765 | { 0xb6, 0, 0, 0x1a }, /* ¶ (pilcrow sign) */ | ||
766 | { 0xb7, XF_MIDDLEDOT, 1, 0x32 }, /* · (middle dot) */ | ||
767 | |||
768 | { 0xbb, XF_RIGHTDBLANGLEQUOT, 1, 0x42 }, /* » (right double-angle quotation mark) */ | ||
769 | { 0xbc, XF_ONEQUARTER, 1, 0x29 }, /* ¼ (one quarter) */ | ||
770 | { 0xbd, XF_ONEHALF, 1, 0x29 }, /* ½ (one half) */ | ||
771 | { 0xbe, XF_THREEQUARTERS, 1, 0x29 }, /* ¾ (three quarters) */ | ||
772 | { 0xbf, 0, 0, 0x64 }, /* ¿ (inverted ?) */ | ||
773 | { 0xc0, 0, 0, 0x8c }, /* À (A grave) */ | ||
774 | { 0xc1, 0, 0, 0x8d }, /* Á (A acute) */ | ||
775 | { 0xc2, 0, 0, 0x8e }, /* Â (A circumflex) */ | ||
776 | { 0xc3, 0, 0, 0x8f }, /* Ã (A tilde) */ | ||
777 | { 0xc4, 0, 0, 0x5f }, /* Ä (A dieresis) */ | ||
778 | { 0xc5, 0, 0, 0x12 }, /* Å (A with ring above) */ | ||
779 | { 0xc6, 0, 0, 0x20 }, /* Æ (AE ligature) */ | ||
780 | { 0xc7, 0, 0, 0x0d }, /* Ç (C cedilla) */ | ||
781 | { 0xc8, 0, 0, 0x90 }, /* È (E grave) */ | ||
782 | { 0xc9, 0, 0, 0x23 }, /* É (E acute) */ | ||
783 | { 0xca, 0, 0, 0x91 }, /* Ê (E circumflex) */ | ||
784 | { 0xcb, 0, 0, 0x92 }, /* Ë (E dieresis) */ | ||
785 | { 0xcc, 0, 0, 0x93 }, /* Ì (I grave) */ | ||
786 | { 0xcd, 0, 0, 0x94 }, /* Í (I acute) */ | ||
787 | { 0xce, XF_ICIRCUMFLEX, 1, 0x4d }, /* Î (I circumflex) */ | ||
788 | { 0xcf, XF_IDIERESIS, 1, 0x4d }, /* Ï (I dieresis) */ | ||
789 | { 0xd0, 0, 0, 0x95 }, /* Ð (ETH) */ | ||
790 | { 0xd1, 0, 0, 0x61 }, /* Ñ (N tilde) */ | ||
791 | { 0xd2, 0, 0, 0x96 }, /* Ò (O grave) */ | ||
792 | { 0xd3, 0, 0, 0x97 }, /* Ó (O acute) */ | ||
793 | { 0xd4, 0, 0, 0x98 }, /* Ô (O circumflex) */ | ||
794 | { 0xd5, 0, 0, 0x99 }, /* Õ (O tilde) */ | ||
795 | { 0xd6, 0, 0, 0x60 }, /* Ö (O dieresis) */ | ||
796 | { 0xd7, 0, 0, 0xde }, /* × (multiplication sign) */ | ||
797 | { 0xd8, 0, 0, 0x0f }, /* Ø (O stroke) */ | ||
798 | { 0xd9, 0, 0, 0x9a }, /* Ù (U grave) */ | ||
799 | { 0xda, 0, 0, 0x9b }, /* Ú (U acute) */ | ||
800 | { 0xdb, XF_UCIRCUMFLEX, 1, 0x59 }, /* Û (U circumflex) */ | ||
801 | { 0xdc, 0, 0, 0x62 }, /* Ü (U dieresis) */ | ||
802 | { 0xdd, XF_YACUTE, 1, 0x5d }, /* Ý (Y acute) */ | ||
803 | |||
804 | { 0xdf, 0, 0, 0x22 }, /* ß (sharp s) */ | ||
805 | { 0xe0, 0, 0, 0x83 }, /* à (a grave) */ | ||
806 | { 0xe1, 0, 0, 0x9c }, /* á (a acute) */ | ||
807 | { 0xe2, 0, 0, 0x9d }, /* â (a circumflex) */ | ||
808 | { 0xe3, 0, 0, 0x9e }, /* ã (a tilde) */ | ||
809 | { 0xe4, 0, 0, 0x7f }, /* ä (a dieresis) */ | ||
810 | { 0xe5, 0, 0, 0x13 }, /* å (a with ring above) */ | ||
811 | { 0xe6, 0, 0, 0x21 }, /* æ (ae ligature */ | ||
812 | { 0xe7, 0, 0, 0x84 }, /* ç (c cedilla) */ | ||
813 | { 0xe8, 0, 0, 0x08 }, /* è (e grave) */ | ||
814 | { 0xe9, 0, 0, 0x09 }, /* é (e acute) */ | ||
815 | { 0xea, 0, 0, 0x9f }, /* ê (e circumflex) */ | ||
816 | { 0xeb, 0, 0, 0xa0 }, /* ë (e dieresis) */ | ||
817 | { 0xec, XF_iGRAVE, 1, 0x6d }, /* ì (i grave) */ | ||
818 | { 0xed, 0, 0, 0xa1 }, /* í (i acute) */ | ||
819 | { 0xee, 0, 0, 0xa2 }, /* î (i circumflex) */ | ||
820 | { 0xef, 0, 0, 0xa3 }, /* ï (i dieresis) */ | ||
821 | |||
822 | { 0xf1, 0, 0, 0x81 }, /* ñ (n tilde) */ | ||
823 | { 0xf2, 0, 0, 0x0c }, /* ò (o grave) */ | ||
824 | { 0xf3, 0, 0, 0xa4 }, /* ó (o acute) */ | ||
825 | { 0xf4, 0, 0, 0xa5 }, /* ô (o circumflex) */ | ||
826 | { 0xf5, 0, 0, 0xa6 }, /* õ (o tilde) */ | ||
827 | { 0xf6, 0, 0, 0x80 }, /* ö (o dieresis) */ | ||
828 | { 0xf7, XF_DIVISION, 1, 0x2f }, /* ÷ (division sign) */ | ||
829 | { 0xf8, 0, 0, 0x10 }, /* ø (o slash) */ | ||
830 | { 0xf9, 0, 0, 0x0a }, /* ù (u grave) */ | ||
831 | { 0xfa, 0, 0, 0xa7 }, /* ú (u acute) */ | ||
832 | { 0xfb, XF_uCIRCUMFLEX, 1, 0x79 }, /* û (u circumflex) */ | ||
833 | { 0xfc, 0, 0, 0xa2 }, /* ü (u dieresis) */ | ||
834 | { 0xfd, 0, 0, 0xaf }, /* ý (y acute) */ | ||
835 | |||
836 | { 0xff, XF_yDIERESIS, 1, 0x7d }, /* ÿ (y dieresis) */ | ||
837 | |||
838 | /* Latin extended A */ | ||
839 | { 0x0103, 0, 0, 0xe9 }, /* a breve */ | ||
840 | { 0x0105, 0, 0, 0xb3 }, /* a ogonek */ | ||
841 | { 0x0107, 0, 0, 0xb1 }, /* c acute */ | ||
842 | { 0x010d, 0, 0, 0xab }, /* c caron */ | ||
843 | { 0x010f, 0, 0, 0xbc }, /* d caron */ | ||
844 | { 0x0110, 0, 0, 0x95 }, /* D stroke */ | ||
845 | { 0x0111, 0, 0, 0xb0 }, /* d stroke */ | ||
846 | { 0x0119, 0, 0, 0xb2 }, /* e ogonek */ | ||
847 | { 0x011b, 0, 0, 0xad }, /* e caron */ | ||
848 | { 0x011e, 0, 0, 0xc1 }, /* G breve */ | ||
849 | { 0x011f, 0, 0, 0xc2 }, /* g breve */ | ||
850 | { 0x0130, 0, 0, 0xc5 }, /* I with dot above */ | ||
851 | { 0x0131, 0, 0, 0xc6 }, /* dotless i */ | ||
852 | { 0x0141, XF_LSTROKE, 1, 0x50 }, /* L stroke */ | ||
853 | { 0x0142, 0, 0, 0xb8 }, /* l stroke */ | ||
854 | { 0x0144, 0, 0, 0xb7 }, /* n acute */ | ||
855 | { 0x0148, 0, 0, 0xba }, /* n caron */ | ||
856 | { 0x0150, 0, 0, 0xc8 }, /* O double acute */ | ||
857 | { 0x0151, 0, 0, 0xca }, /* o double acute */ | ||
858 | { 0x0158, XF_RCARON, 1, 0x56 }, /* R caron */ | ||
859 | { 0x0159, 0, 0, 0xaa }, /* r caron */ | ||
860 | { 0x015a, 0, 0, 0xb6 }, /* S acute */ | ||
861 | { 0x015b, 0, 0, 0xb6 }, /* s acute */ | ||
862 | { 0x015e, 0, 0, 0xc3 }, /* S cedilla */ | ||
863 | { 0x015f, 0, 0, 0xc4 }, /* s cedilla */ | ||
864 | { 0x0160, 0, 0, 0xac }, /* S caron */ | ||
865 | { 0x0161, 0, 0, 0xac }, /* s caron */ | ||
866 | { 0x0163, 0, 0, 0xd9 }, /* t cedilla */ | ||
867 | { 0x0165, 0, 0, 0xbb }, /* t caron */ | ||
868 | { 0x016f, 0, 0, 0xae }, /* u with ring above */ | ||
869 | { 0x0170, 0, 0, 0xc7 }, /* U double acute */ | ||
870 | { 0x0171, 0, 0, 0xc9 }, /* u double acute */ | ||
871 | { 0x017a, 0, 0, 0xb5 }, /* z acute */ | ||
872 | { 0x017c, 0, 0, 0xb4 }, /* z with dot above */ | ||
873 | { 0x017e, 0, 0, 0xbd }, /* z caron */ | ||
874 | |||
875 | /* Greek */ | ||
876 | { 0x037e, 0, 0, 0x3f }, /* greek question mark */ | ||
877 | |||
878 | { 0x0386, 0, 0, 0x45 }, /* greek ALPHA with tonos */ | ||
879 | { 0x0387, XF_GR_ANOTELEIA,1, 0x32 }, /* greek ano teleia */ | ||
880 | { 0x0388, 0, 0, 0x49 }, /* greek EPSILON with tonos */ | ||
881 | { 0x0389, 0, 0, 0x4c }, /* greek ETA with tonos */ | ||
882 | { 0x038a, 0, 0, 0x4d }, /* greek IOTA with tonos */ | ||
883 | /* reserved */ | ||
884 | { 0x038c, 0, 0, 0x53 }, /* greek OMICRON with tonos */ | ||
885 | /* reserved */ | ||
886 | { 0x038e, 0, 0, 0x5d }, /* greek YPSILON with tonos */ | ||
887 | { 0x038f, 0, 0, 0x19 }, /* greek OMEGA with tonos */ | ||
888 | { 0x0390, 0, 0, 0xa1 }, /* greek iota with dialytica + tonos */ | ||
889 | { 0x0391, 0, 0, 0x45 }, /* greek ALPHA */ | ||
890 | { 0x0392, 0, 0, 0x46 }, /* greek BETA */ | ||
891 | { 0x0393, 0, 0, 0x17 }, /* greek GAMMA */ | ||
892 | { 0x0394, 0, 0, 0x14 }, /* greek DELTA */ | ||
893 | { 0x0395, 0, 0, 0x49 }, /* greek EPSILON */ | ||
894 | { 0x0396, 0, 0, 0x5e }, /* greek ZETA */ | ||
895 | { 0x0397, 0, 0, 0x4c }, /* greek ETA */ | ||
896 | { 0x0398, 0, 0, 0x1d }, /* greek THETA */ | ||
897 | { 0x0399, 0, 0, 0x4d }, /* greek IOTA */ | ||
898 | { 0x039a, 0, 0, 0x4f }, /* greek KAPPA */ | ||
899 | { 0x039b, 0, 0, 0x18 }, /* greek LAMBDA */ | ||
900 | { 0x039c, 0, 0, 0x51 }, /* greek MU */ | ||
901 | { 0x039d, 0, 0, 0x52 }, /* greek NU */ | ||
902 | { 0x039e, 0, 0, 0x1e }, /* greek XI */ | ||
903 | { 0x039f, 0, 0, 0x53 }, /* greek OMICRON */ | ||
904 | { 0x03a0, 0, 0, 0x1a }, /* greek PI */ | ||
905 | { 0x03a1, 0, 0, 0x54 }, /* greek RHO */ | ||
906 | /* reserved */ | ||
907 | { 0x03a3, 0, 0, 0x1c }, /* greek SIGMA */ | ||
908 | { 0x03a4, 0, 0, 0x58 }, /* greek TAU */ | ||
909 | { 0x03a5, 0, 0, 0x5d }, /* greek UPSILON */ | ||
910 | { 0x03a6, 0, 0, 0x16 }, /* greek PHI */ | ||
911 | { 0x03a7, 0, 0, 0x5c }, /* greek CHI */ | ||
912 | { 0x03a8, 0, 0, 0x1b }, /* greek PSI */ | ||
913 | { 0x03a9, 0, 0, 0x19 }, /* greek OMEGA */ | ||
914 | { 0x03aa, 0, 0, 0x4d }, /* greek IOTA with dialytica */ | ||
915 | { 0x03ab, 0, 0, 0x5d }, /* greek UPSILON with dialytica */ | ||
916 | { 0x03ac, XF_GR_alphaTONOS, 1, 0x9c }, /* greek alpha with tonos */ | ||
917 | { 0x03ad, XF_GR_epsilonTONOS, 1, 0x69 }, /* greek epsilon with tonos */ | ||
918 | { 0x03ae, XF_GR_etaTONOS, 1, 0x72 }, /* greek eta with tonos */ | ||
919 | { 0x03af, 0, 0, 0xa1 }, /* greek iota with tonos */ | ||
920 | { 0x03b0, XF_GR_upsilonTONOS, 1, 0xa7 }, /* greek upsilon with dialytica + tonos */ | ||
921 | { 0x03b1, XF_GR_alpha, 1, 0x65 }, /* greek alpha */ | ||
922 | { 0x03b2, 0, 0, 0x22 }, /* greek beta */ | ||
923 | { 0x03b3, XF_GR_gamma, 1, 0x7d }, /* greek gamma */ | ||
924 | { 0x03b4, XF_GR_delta, 2, 0x14 }, /* greek delta */ | ||
925 | { 0x03b5, XF_GR_epsilon, 1, 0x69 }, /* greek epsilon */ | ||
926 | { 0x03b6, XF_GR_zeta, 1, 0x7e }, /* greek zeta */ | ||
927 | { 0x03b7, XF_GR_eta, 1, 0x72 }, /* greek eta */ | ||
928 | { 0x03b8, 0, 0, 0x1d }, /* greek theta */ | ||
929 | { 0x03b9, 0, 0, 0xc6 }, /* greek iota */ | ||
930 | { 0x03ba, XF_GR_kappa, 1, 0x6f }, /* greek kappa */ | ||
931 | { 0x03bb, XF_GR_lambda, 1, 0x18 }, /* greek lambda */ | ||
932 | { 0x03bc, XF_GR_mu, 1, 0x79 }, /* greek mu */ | ||
933 | { 0x03bd, 0, 0, 0x7a }, /* greek nu */ | ||
934 | { 0x03be, XF_GR_xi, 2, 0x1e }, /* greek xi */ | ||
935 | { 0x03bf, 0, 0, 0x73 }, /* greek omicron */ | ||
936 | { 0x03c0, XF_GR_pi, 1, 0x72 }, /* greek pi */ | ||
937 | { 0x03c1, XF_GR_rho, 1, 0x74 }, /* greek rho */ | ||
938 | { 0x03c2, XF_GR_FINALsigma, 1, 0x77 }, /* greek final sigma */ | ||
939 | { 0x03c3, XF_GR_sigma, 1, 0x73 }, /* greek sigma */ | ||
940 | { 0x03c4, XF_GR_tau, 1, 0x78 }, /* greek tau */ | ||
941 | { 0x03c5, XF_GR_upsilon, 1, 0x79 }, /* greel upsilon */ | ||
942 | { 0x03c6, 0, 0, 0x10 }, /* greek phi */ | ||
943 | { 0x03c7, XF_GR_chi, 1, 0x7c }, /* greek chi */ | ||
944 | { 0x03c8, XF_GR_psi, 1, 0x1b }, /* greek psi */ | ||
945 | { 0x03c9, XF_GR_omega, 1, 0x7b }, /* greek omega */ | ||
946 | { 0x03ca, 0, 0, 0xa3 }, /* greek iota with dialytica */ | ||
947 | { 0x03cb, XF_GR_upsilon, 1, 0x82 }, /* greek upsilon with dialytica */ | ||
948 | { 0x03cc, 0, 0, 0xa4 }, /* greek omicron with tonos */ | ||
949 | { 0x03cd, XF_GR_upsilonTONOS, 1, 0xa7 }, /* greek upsilon with tonos */ | ||
950 | { 0x03ce, XF_GR_omegaTONOS, 1, 0x7b }, /* greek omega with tonos */ | ||
951 | |||
952 | { 0x03f3, 0, 0, 0x6e }, /* greek yot */ | ||
953 | |||
954 | /* Cyrillic */ | ||
955 | { 0x0400, 0, 0, 0x90 }, /* cyrillic IE grave */ | ||
956 | { 0x0401, 0, 0, 0x92 }, /* cyrillic IO */ | ||
957 | |||
958 | { 0x0405, 0, 0, 0x57 }, /* cyrillic DZE */ | ||
959 | { 0x0406, 0, 0, 0x4d }, /* cyrillic byeloruss-ukr. I */ | ||
960 | { 0x0407, XF_CYR_YI, 1, 0x4d }, /* cyrillic YI */ | ||
961 | { 0x0408, 0, 0, 0x4e }, /* cyrillic JE */ | ||
962 | |||
963 | { 0x0410, 0, 0, 0x45 }, /* cyrillic A */ | ||
964 | { 0x0411, XF_CYR_BE, 1, 0x3a }, /* cyrillic BE */ | ||
965 | { 0x0412, 0, 0, 0x46 }, /* cyrillic VE */ | ||
966 | { 0x0413, 0, 0, 0x17 }, /* cyrillic GHE */ | ||
967 | { 0x0414, XF_CYR_DE, 1, 0x14 }, /* cyrillic DE */ | ||
968 | { 0x0415, 0, 0, 0x49 }, /* cyrillic IE */ | ||
969 | { 0x0416, XF_CYR_ZHE, 2, 0x2e }, /* cyrillic ZHE */ | ||
970 | { 0x0417, XF_CYR_ZE, 1, 0x37 }, /* cyrillic ZE */ | ||
971 | { 0x0418, XF_CYR_I, 1, 0x59 }, /* cyrillic I */ | ||
972 | { 0x0419, XF_CYR_SHORTI, 1, 0x9b }, /* cyrillic short I */ | ||
973 | { 0x041a, 0, 0, 0x4f }, /* cyrillic K */ | ||
974 | { 0x041b, XF_CYR_EL, 1, 0x18 }, /* cyrillic EL */ | ||
975 | { 0x041c, 0, 0, 0x51 }, /* cyrillic EM */ | ||
976 | { 0x041d, 0, 0, 0x4c }, /* cyrillic EN */ | ||
977 | { 0x041e, 0, 0, 0x53 }, /* cyrillic O */ | ||
978 | { 0x041f, 0, 0, 0x1a }, /* cyrillic PE */ | ||
979 | { 0x0420, 0, 0, 0x54 }, /* cyrillic ER */ | ||
980 | { 0x0421, 0, 0, 0x47 }, /* cyrillic ES */ | ||
981 | { 0x0422, 0, 0, 0x58 }, /* cyrillic TE */ | ||
982 | { 0x0423, 0, 0, 0x5d }, /* cyrillic U */ | ||
983 | { 0x0424, 0, 0, 0x16 }, /* cyrillic EF */ | ||
984 | { 0x0425, 0, 0, 0x5c }, /* cyrillic HA */ | ||
985 | { 0x0426, XF_CYR_TSE, 2, 0x5e }, /* cyrillic TSE */ | ||
986 | { 0x0427, XF_CYR_CHE, 2, 0x0e }, /* cyrillic CHE */ | ||
987 | { 0x0428, XF_CYR_SHA, 1, 0x5b }, /* cyrillic SHA */ | ||
988 | { 0x0429, XF_CYR_SHCHA, 1, 0x5b }, /* cyrillic SHCHA */ | ||
989 | { 0x042a, XF_CYR_HARD, 1, 0x66 }, /* cyrillic capital hard sign */ | ||
990 | { 0x042b, XF_CYR_YERU, 2, 0x66 }, /* cyrillic YERU */ | ||
991 | { 0x042c, 0, 0, 0x66 }, /* cyrillic capital soft sign */ | ||
992 | { 0x042d, XF_CYR_E, 2, 0x89 }, /* cyrillic E */ | ||
993 | { 0x042e, XF_CYR_YU, 2, 0x95 }, /* cyrillic YU */ | ||
994 | { 0x042f, XF_CYR_YA, 1, 0x0d }, /* cyrillic YA */ | ||
995 | { 0x0430, 0, 0, 0x65 }, /* cyrillic a */ | ||
996 | { 0x0431, XF_CYR_be, 1, 0x97 }, /* cyrillic be */ | ||
997 | { 0x0432, XF_CYR_ve, 1, 0x22 }, /* cyrillic ve */ | ||
998 | { 0x0433, XF_CYR_ghe, 1, 0x76 }, /* cyrillic ghe */ | ||
999 | { 0x0434, XF_CYR_de, 2, 0x14 }, /* cyrillic de */ | ||
1000 | { 0x0435, 0, 0, 0x69 }, /* cyrillic ie */ | ||
1001 | { 0x0436, XF_CYR_zhe, 1, 0x2e }, /* cyrillic zhe */ | ||
1002 | { 0x0437, XF_CYR_ze, 1, 0x37 }, /* cyrillic ze */ | ||
1003 | { 0x0438, XF_CYR_i, 1, 0x79 }, /* cyrillic i */ | ||
1004 | { 0x0439, XF_CYR_SHORTi, 1, 0xa7 }, /* cyrillic short i */ | ||
1005 | { 0x043a, XF_CYR_ka, 1, 0x6f }, /* cyrillic ka */ | ||
1006 | { 0x043b, XF_CYR_el, 1, 0x18 }, /* cyrillic el */ | ||
1007 | { 0x043c, XF_CYR_em, 1, 0x71 }, /* cyrillic em */ | ||
1008 | { 0x043d, XF_CYR_en, 2, 0x4c }, /* cyrillic en */ | ||
1009 | { 0x043e, 0, 0, 0x73 }, /* cyrillic o */ | ||
1010 | { 0x043f, XF_CYR_pe, 1, 0x72 }, /* cyrillic pe */ | ||
1011 | { 0x0440, 0, 0, 0x74 }, /* cyrillic er */ | ||
1012 | { 0x0441, 0, 0, 0x67 }, /* cyrillic es */ | ||
1013 | { 0x0442, XF_CYR_te, 1, 0x78 }, /* cyrillic te */ | ||
1014 | { 0x0443, 0, 0, 0x7d }, /* cyrillic u */ | ||
1015 | { 0x0444, 0, 0, 0x10 }, /* cyrillic ef */ | ||
1016 | { 0x0445, 0, 0, 0x7c }, /* cyrillic ha */ | ||
1017 | { 0x0446, XF_CYR_tse, 2, 0x7e }, /* cyrillic tse */ | ||
1018 | { 0x0447, XF_CYR_che, 2, 0x0e }, /* cyrillic che */ | ||
1019 | { 0x0448, XF_CYR_sha, 1, 0x7b }, /* cyrillic sha */ | ||
1020 | { 0x0449, XF_CYR_shcha, 1, 0x7b }, /* cyrillic shcha */ | ||
1021 | { 0x044a, XF_CYR_hard, 1, 0x66 }, /* cyrillic small hard sign */ | ||
1022 | { 0x044b, XF_CYR_yeru, 2, 0x66 }, /* cyrillic yeru */ | ||
1023 | { 0x044c, XF_CYR_soft, 1, 0x66 }, /* cyrillic small soft sign */ | ||
1024 | { 0x044d, XF_CYR_e, 2, 0x89 }, /* cyrillic e */ | ||
1025 | { 0x044e, XF_CYR_yu, 2, 0x95 }, /* cyrillic yu */ | ||
1026 | { 0x044f, XF_CYR_ya, 2, 0x84 }, /* cyrillic ya */ | ||
1027 | { 0x0450, 0, 0, 0x08 }, /* cyrillic ie grave */ | ||
1028 | { 0x0451, 0, 0, 0xa0 }, /* cyrillic io */ | ||
1029 | |||
1030 | { 0x0455, 0, 0, 0x77 }, /* cyrillic dze */ | ||
1031 | { 0x0456, 0, 0, 0x6d }, /* cyrillic byeloruss-ukr. i */ | ||
1032 | { 0x0457, 0, 0, 0xa3 }, /* cyrillic yi */ | ||
1033 | { 0x0458, 0, 0, 0x6e }, /* cyrillic je */ | ||
1034 | |||
1035 | /* extra punctuation */ | ||
1036 | { 0x2013, 0, 0, 0x31 }, /* en dash */ | ||
1037 | { 0x2014, 0, 0, 0x31 }, /* em dash */ | ||
1038 | |||
1039 | { 0x2018, 0, 0, 0x2b }, /* left single quotation mark */ | ||
1040 | { 0x2019, 0, 0, 0x2b }, /* right single quotation mark */ | ||
1041 | { 0x201a, 0, 0, 0x30 }, /* single low-9 quotation mark */ | ||
1042 | { 0x201b, 0, 0, 0x2b }, /* single high-reversed-9 quotation mark */ | ||
1043 | { 0x201c, 0, 0, 0x26 }, /* left double quotation mark */ | ||
1044 | { 0x201d, 0, 0, 0x26 }, /* right double quotation mark */ | ||
1045 | { 0x201e, 0, 0, 0x26 }, /* double low-9 quotation mark */ | ||
1046 | { 0x201f, 0, 0, 0x26 }, /* double high-reversed-9 quotation mark */ | ||
1047 | |||
1048 | { 0x2022, XF_MIDDLEDOT, 1, 0x32 }, /* bullet */ | ||
1049 | |||
1050 | { 0x2039, 0, 0, 0x40 }, /* single left-pointing angle quotation mark */ | ||
1051 | { 0x203a, 0, 0, 0x42 }, /* single right-pointing angle quotation mark */ | ||
1052 | |||
1053 | /* Runtime-definable characters */ | ||
1054 | { 0xe000, 0x8000, 15, 0x24 }, /* variable character 0 */ | ||
1055 | { 0xe001, 0x8001, 15, 0x24 }, /* variable character 1 */ | ||
1056 | { 0xe002, 0x8002, 15, 0x24 }, /* variable character 2 */ | ||
1057 | { 0xe003, 0x8003, 15, 0x24 }, /* variable character 3 */ | ||
1058 | { 0xe004, 0x8004, 15, 0x24 }, /* variable character 4 */ | ||
1059 | { 0xe005, 0x8005, 15, 0x24 }, /* variable character 5 */ | ||
1060 | { 0xe006, 0x8006, 15, 0x24 }, /* variable character 6 */ | ||
1061 | { 0xe007, 0x8007, 15, 0x24 }, /* variable character 7 */ | ||
1062 | { 0xe008, 0x8008, 15, 0x24 }, /* variable character 8 */ | ||
1063 | { 0xe009, 0x8009, 15, 0x24 }, /* variable character 9 */ | ||
1064 | { 0xe00a, 0x800a, 15, 0x24 }, /* variable character 10 */ | ||
1065 | { 0xe00b, 0x800b, 15, 0x24 }, /* variable character 11 */ | ||
1066 | { 0xe00c, 0x800c, 15, 0x24 }, /* variable character 12 */ | ||
1067 | { 0xe00d, 0x800d, 15, 0x24 }, /* variable character 13 */ | ||
1068 | { 0xe00e, 0x800e, 15, 0x24 }, /* variable character 14 */ | ||
1069 | { 0xe00f, 0x800f, 15, 0x24 }, /* variable character 15 */ | ||
1070 | |||
1071 | /* Icons and special symbols */ | ||
1072 | { 0xe100, XF_ICON_UNKNOWN, 14, 0x43 }, /* unknown icon (mirrored ?) */ | ||
1073 | { 0xe101, XF_ICON_BOOKMARK, 14, 0xd4 }, /* bookmark icon */ | ||
1074 | { 0xe102, XF_ICON_PLUGIN, 14, 0x2d }, /* plugin icon */ | ||
1075 | { 0xe103, XF_ICON_FOLDER, 14, 0x34 }, /* folder icon */ | ||
1076 | { 0xe104, XF_ICON_FIRMWARE, 14, 0x7c }, /* firmware icon */ | ||
1077 | { 0xe105, XF_ICON_LANGUAGE, 14, 0x2f }, /* language icon */ | ||
1078 | { 0xe106, 0, 0, 0xfc }, /* audio icon (note) */ | ||
1079 | { 0xe107, XF_ICON_WPS, 14, 0xd4 }, /* wps icon */ | ||
1080 | { 0xe108, XF_ICON_PLAYLIST, 14, 0xfa }, /* playlist icon */ | ||
1081 | { 0xe109, XF_ICON_TEXTFILE, 14, 0xfa }, /* text file icon */ | ||
1082 | { 0xe10a, XF_ICON_CONFIG, 14, 0xfa }, /* config icon */ | ||
1083 | { 0xe10b, 0, 0, 0x88 }, /* left arrow */ | ||
1084 | { 0xe10c, 0, 0, 0x89 }, /* right arrow */ | ||
1085 | { 0xe10d, 0, 0, 0x86 }, /* up arrow */ | ||
1086 | { 0xe10e, 0, 0, 0x87 }, /* down arrow */ | ||
1087 | { 0xe10f, 0, 0, 0x88 }, /* filled left arrow */ | ||
1088 | { 0xe110, 0, 0, 0x89 }, /* filled right arrow */ | ||
1089 | { 0xe111, 0, 0, 0x86 }, /* filled up arrow */ | ||
1090 | { 0xe112, 0, 0, 0x87 }, /* filled down arrow */ | ||
1091 | { 0xe113, 0, 0, 0x24 }, /* level 0/7 */ | ||
1092 | { 0xe114, 0, 0, 0x15 }, /* level 1/7 */ | ||
1093 | { 0xe115, 0, 0, 0xdf }, /* level 2/7 */ | ||
1094 | { 0xe116, 0, 0, 0xe0 }, /* level 3/7 */ | ||
1095 | { 0xe117, 0, 0, 0xe1 }, /* level 4/7 */ | ||
1096 | { 0xe118, 0, 0, 0xe2 }, /* level 5/7 */ | ||
1097 | { 0xe119, 0, 0, 0xe3 }, /* level 6/7 */ | ||
1098 | { 0xe11a, 0, 0, 0xec }, /* level 7/7 */ | ||
1099 | #endif /* !BOOTLOADER */ | ||
1100 | |||
1101 | /* no-char symbol */ | ||
1102 | { 0xfffd, 0, 0, 0xd8 }, | ||
1103 | }; | ||
1104 | |||
1105 | const unsigned char xfont_fixed[][HW_PATTERN_SIZE] = { | ||
1106 | /* Standard ascii */ | ||
1107 | [XF_BACKSLASH] = { 0x00, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00}, /* \ */ | ||
1108 | [XF_CIRCUMFLEX] = { 0x04, 0x0a, 0x11, 0x00, 0x00, 0x00, 0x00}, /* ^ */ | ||
1109 | [XF_GRAVEACCENT] = { 0x08, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00}, /* ` */ | ||
1110 | [XF_VERTICALBAR] = { 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04}, /* | */ | ||
1111 | [XF_TILDE] = { 0x00, 0x00, 0x08, 0x15, 0x02, 0x00, 0x00}, /* ~ */ | ||
1112 | |||
1113 | #ifndef BOOTLOADER /* bootloader only supports pure ASCII */ | ||
1114 | /* Icons and special symbols */ | ||
1115 | [XF_ICON_UNKNOWN] = { 0x0c, 0x12, 0x12, 0x08, 0x08, 0x00, 0x08}, | ||
1116 | [XF_ICON_BOOKMARK] = { 0x00, 0x03, 0x07, 0x0e, 0x1c, 0x08, 0x00}, | ||
1117 | [XF_ICON_PLUGIN] = { 0x04, 0x1e, 0x07, 0x1f, 0x05, 0x01, 0x06}, | ||
1118 | [XF_ICON_FOLDER] = { 0x0c, 0x13, 0x11, 0x11, 0x11, 0x11, 0x1f}, | ||
1119 | [XF_ICON_FIRMWARE] = { 0x1f, 0x11, 0x1b, 0x15, 0x1b, 0x11, 0x1f}, | ||
1120 | [XF_ICON_LANGUAGE] = { 0x00, 0x1f, 0x15, 0x1f, 0x15, 0x1f, 0x00}, | ||
1121 | [XF_ICON_AUDIO] = { 0x03, 0x05, 0x09, 0x09, 0x0b, 0x1b, 0x18}, | ||
1122 | [XF_ICON_WPS] = { 0x01, 0x01, 0x02, 0x02, 0x14, 0x0c, 0x04}, | ||
1123 | [XF_ICON_PLAYLIST] = { 0x17, 0x00, 0x17, 0x00, 0x17, 0x00, 0x17}, | ||
1124 | [XF_ICON_TEXTFILE] = { 0x1f, 0x00, 0x1f, 0x00, 0x1f, 0x00, 0x1f}, | ||
1125 | [XF_ICON_CONFIG] = { 0x0b, 0x10, 0x0b, 0x00, 0x1f, 0x00, 0x1f}, | ||
1126 | /* Latin 1 */ | ||
1127 | [XF_INVEXCLAMATION]= { 0x04, 0x00, 0x04, 0x04, 0x04, 0x04, 0x04}, /* ¡ */ | ||
1128 | [XF_CENTSIGN] = { 0x04, 0x04, 0x0f, 0x10, 0x10, 0x0f, 0x04}, /* ¢ */ | ||
1129 | [XF_POUNDSIGN] = { 0x06, 0x09, 0x08, 0x1e, 0x08, 0x08, 0x1f}, /* £ */ | ||
1130 | [XF_CURRENCY] = { 0x00, 0x11, 0x0e, 0x0a, 0x0e, 0x11, 0x00}, /* ¤ */ | ||
1131 | [XF_LEFTDBLANGLEQUOT] = { 0x00, 0x05, 0x0a, 0x14, 0x0a, 0x05, 0x00}, /* « */ | ||
1132 | [XF_MACRON] = { 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* ¯ */ | ||
1133 | [XF_PLUSMINUS] = { 0x04, 0x04, 0x1f, 0x04, 0x04, 0x00, 0x1f}, /* ± */ | ||
1134 | [XF_SUPER2] = { 0x1c, 0x04, 0x1c, 0x10, 0x1c, 0x00, 0x00}, /* ³ */ | ||
1135 | [XF_SUPER3] = { 0x1c, 0x04, 0x1c, 0x04, 0x1c, 0x00, 0x00}, /* ³ */ | ||
1136 | [XF_MICRO] = { 0x00, 0x09, 0x09, 0x09, 0x0f, 0x08, 0x10}, /* µ */ | ||
1137 | [XF_MIDDLEDOT] = { 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00}, /* · */ | ||
1138 | [XF_RIGHTDBLANGLEQUOT] = { 0x00, 0x14, 0x0a, 0x05, 0x0a, 0x14, 0x00}, /* » */ | ||
1139 | [XF_ONEQUARTER] = { 0x11, 0x12, 0x14, 0x09, 0x13, 0x07, 0x01}, /* ¼ */ | ||
1140 | [XF_ONEHALF] = { 0x11, 0x12, 0x17, 0x09, 0x17, 0x04, 0x07}, /* ½ */ | ||
1141 | [XF_THREEQUARTERS] = { 0x18, 0x09, 0x1a, 0x0d, 0x1b, 0x17, 0x01}, /* ¾ */ | ||
1142 | [XF_INVQUESTION] = { 0x04, 0x00, 0x04, 0x08, 0x10, 0x11, 0x0e}, /* ¿ */ | ||
1143 | [XF_AGRAVE] = { 0x08, 0x04, 0x0e, 0x11, 0x1f, 0x11, 0x11}, /* À */ | ||
1144 | [XF_AACUTE] = { 0x02, 0x04, 0x0e, 0x11, 0x1f, 0x11, 0x11}, /* Á */ | ||
1145 | [XF_ACIRCUMFLEX] = { 0x04, 0x0a, 0x0e, 0x11, 0x1f, 0x11, 0x11}, /* Â */ | ||
1146 | [XF_ATILDE] = { 0x0d, 0x12, 0x0e, 0x11, 0x1f, 0x11, 0x11}, /* Ã */ | ||
1147 | [XF_ADIERESIS] = { 0x0a, 0x00, 0x04, 0x0a, 0x11, 0x1f, 0x11}, /* Ä */ | ||
1148 | [XF_ARING] = { 0x04, 0x0a, 0x04, 0x0e, 0x11, 0x1f, 0x11}, /* Å */ | ||
1149 | [XF_AELIGATURE] = { 0x0f, 0x14, 0x14, 0x1f, 0x14, 0x14, 0x17}, /* Æ */ | ||
1150 | [XF_CCEDILLA] = { 0x0f, 0x10, 0x10, 0x10, 0x0f, 0x02, 0x0e}, /* Ç */ | ||
1151 | [XF_EGRAVE] = { 0x08, 0x04, 0x1f, 0x10, 0x1e, 0x10, 0x1f}, /* È */ | ||
1152 | [XF_EACUTE] = { 0x02, 0x04, 0x1f, 0x10, 0x1c, 0x10, 0x1f}, /* É */ | ||
1153 | [XF_ECIRCUMFLEX] = { 0x04, 0x0a, 0x1f, 0x10, 0x1c, 0x10, 0x1f}, /* Ê */ | ||
1154 | [XF_EDIERESIS] = { 0x0a, 0x00, 0x1f, 0x10, 0x1c, 0x10, 0x1f}, /* Ë */ | ||
1155 | [XF_IGRAVE] = { 0x08, 0x04, 0x0e, 0x04, 0x04, 0x04, 0x0e}, /* Ì */ | ||
1156 | [XF_IACUTE] = { 0x02, 0x04, 0x0e, 0x04, 0x04, 0x04, 0x0e}, /* Í */ | ||
1157 | [XF_ICIRCUMFLEX] = { 0x04, 0x0a, 0x0e, 0x04, 0x04, 0x04, 0x0e}, /* Î */ | ||
1158 | [XF_IDIERESIS] = { 0x0a, 0x00, 0x0e, 0x04, 0x04, 0x04, 0x0e}, /* Ï */ | ||
1159 | [XF_ETH] = { 0x0c, 0x0a, 0x09, 0x1d, 0x09, 0x0a, 0x0c}, /* Ð */ | ||
1160 | [XF_NTILDE] = { 0x0d, 0x12, 0x00, 0x19, 0x15, 0x13, 0x11}, /* Ñ */ | ||
1161 | [XF_OGRAVE] = { 0x08, 0x04, 0x0e, 0x11, 0x11, 0x11, 0x0e}, /* Ò */ | ||
1162 | [XF_OACUTE] = { 0x02, 0x04, 0x0e, 0x11, 0x11, 0x11, 0x0e}, /* Ó */ | ||
1163 | [XF_OCIRCUMFLEX] = { 0x04, 0x0a, 0x0e, 0x11, 0x11, 0x11, 0x0e}, /* Ô */ | ||
1164 | [XF_OTILDE] = { 0x0d, 0x12, 0x0e, 0x11, 0x11, 0x11, 0x0e}, /* Õ */ | ||
1165 | [XF_ODIERESIS] = { 0x0a, 0x00, 0x0e, 0x11, 0x11, 0x11, 0x0e}, /* Ö */ | ||
1166 | [XF_OSTROKE] = { 0x01, 0x0e, 0x13, 0x15, 0x19, 0x0e, 0x10}, /* Ø */ | ||
1167 | [XF_UGRAVE] = { 0x08, 0x04, 0x11, 0x11, 0x11, 0x11, 0x0e}, /* Ù */ | ||
1168 | [XF_UACUTE] = { 0x02, 0x04, 0x11, 0x11, 0x11, 0x11, 0x0e}, /* Ú */ | ||
1169 | [XF_UCIRCUMFLEX] = { 0x04, 0x0a, 0x11, 0x11, 0x11, 0x11, 0x0e}, /* Û */ | ||
1170 | [XF_UDIERESIS] = { 0x0a, 0x00, 0x11, 0x11, 0x11, 0x11, 0x0e}, /* Ü */ | ||
1171 | [XF_YACUTE] = { 0x02, 0x04, 0x11, 0x11, 0x0a, 0x04, 0x04}, /* Ý */ | ||
1172 | [XF_aGRAVE] = { 0x08, 0x04, 0x0e, 0x01, 0x0f, 0x11, 0x0f}, /* à */ | ||
1173 | [XF_aACUTE] = { 0x02, 0x04, 0x0e, 0x01, 0x0f, 0x11, 0x0f}, /* á */ | ||
1174 | [XF_aCIRCUMFLEX] = { 0x04, 0x0a, 0x0e, 0x01, 0x0f, 0x11, 0x0f}, /* â */ | ||
1175 | [XF_aTILDE] = { 0x0d, 0x12, 0x0e, 0x01, 0x0f, 0x11, 0x0f}, /* ã */ | ||
1176 | [XF_aDIERESIS] = { 0x0a, 0x00, 0x0e, 0x01, 0x0f, 0x11, 0x0f}, /* ä */ | ||
1177 | [XF_aRING] = { 0x04, 0x0a, 0x0e, 0x01, 0x0f, 0x11, 0x0f}, /* å */ | ||
1178 | [XF_aeLIGATURE] = { 0x00, 0x00, 0x1a, 0x05, 0x0f, 0x14, 0x0f}, /* æ */ | ||
1179 | [XF_cCEDILLA] = { 0x00, 0x0f, 0x10, 0x10, 0x0f, 0x02, 0x04}, /* ç */ | ||
1180 | [XF_eGRAVE] = { 0x08, 0x04, 0x0e, 0x11, 0x1f, 0x10, 0x0e}, /* è */ | ||
1181 | [XF_eACUTE] = { 0x02, 0x04, 0x0e, 0x11, 0x1f, 0x10, 0x0e}, /* é */ | ||
1182 | [XF_eCIRCUMFLEX] = { 0x04, 0x0a, 0x0e, 0x11, 0x1f, 0x10, 0x0e}, /* ê */ | ||
1183 | [XF_eDIERESIS] = { 0x0a, 0x00, 0x0e, 0x11, 0x1f, 0x10, 0x0e}, /* ë */ | ||
1184 | [XF_iGRAVE] = { 0x08, 0x04, 0x00, 0x0c, 0x04, 0x04, 0x0e}, /* ì */ | ||
1185 | [XF_iACUTE] = { 0x02, 0x04, 0x00, 0x0c, 0x04, 0x04, 0x0e}, /* í */ | ||
1186 | [XF_iCIRCUMFLEX] = { 0x04, 0x0a, 0x00, 0x0c, 0x04, 0x04, 0x0e}, /* î */ | ||
1187 | [XF_iDIERESIS] = { 0x0a, 0x00, 0x00, 0x0c, 0x04, 0x04, 0x0e}, /* ï */ | ||
1188 | [XF_nTILDE] = { 0x0d, 0x12, 0x00, 0x16, 0x19, 0x11, 0x11}, /* ñ */ | ||
1189 | [XF_oGRAVE] = { 0x08, 0x04, 0x00, 0x0e, 0x11, 0x11, 0x0e}, /* ò */ | ||
1190 | [XF_oACUTE] = { 0x02, 0x04, 0x00, 0x0e, 0x11, 0x11, 0x0e}, /* ó */ | ||
1191 | [XF_oCIRCUMFLEX] = { 0x04, 0x0a, 0x00, 0x0e, 0x11, 0x11, 0x0e}, /* ô */ | ||
1192 | [XF_oTILDE] = { 0x0d, 0x12, 0x00, 0x0e, 0x11, 0x11, 0x0e}, /* õ */ | ||
1193 | [XF_oDIERESIS] = { 0x00, 0x0a, 0x00, 0x0e, 0x11, 0x11, 0x0e}, /* ö */ | ||
1194 | [XF_DIVISION] = { 0x00, 0x04, 0x00, 0x1f, 0x00, 0x04, 0x00}, /* ÷ */ | ||
1195 | [XF_oSLASH] = { 0x00, 0x02, 0x0e, 0x15, 0x15, 0x0e, 0x08}, /* ø */ | ||
1196 | [XF_uGRAVE] = { 0x08, 0x04, 0x00, 0x11, 0x11, 0x13, 0x0d}, /* ù */ | ||
1197 | [XF_uACUTE] = { 0x02, 0x04, 0x00, 0x11, 0x11, 0x13, 0x0d}, /* ú */ | ||
1198 | [XF_uCIRCUMFLEX] = { 0x04, 0x0a, 0x00, 0x11, 0x11, 0x13, 0x0d}, /* û */ | ||
1199 | [XF_uDIERESIS] = { 0x00, 0x0a, 0x00, 0x11, 0x11, 0x13, 0x0d}, /* ü */ | ||
1200 | [XF_yACUTE] = { 0x02, 0x04, 0x11, 0x11, 0x0f, 0x01, 0x0e}, /* ý */ | ||
1201 | [XF_yDIERESIS] = { 0x0a, 0x00, 0x11, 0x11, 0x0f, 0x01, 0x0e}, /* ÿ */ | ||
1202 | /* Latin extended A */ | ||
1203 | [XF_aBREVE] = { 0x09, 0x06, 0x0e, 0x01, 0x0f, 0x11, 0x0f}, | ||
1204 | [XF_aOGONEK] = { 0x0e, 0x01, 0x0f, 0x11, 0x0f, 0x02, 0x03}, | ||
1205 | [XF_cACUTE] = { 0x02, 0x04, 0x0f, 0x10, 0x10, 0x10, 0x0f}, | ||
1206 | [XF_cCARON] = { 0x0a, 0x04, 0x0f, 0x10, 0x10, 0x10, 0x0f}, | ||
1207 | [XF_dCARON] = { 0x05, 0x05, 0x0c, 0x14, 0x14, 0x14, 0x0c}, | ||
1208 | [XF_dSTROKE] = { 0x02, 0x0f, 0x02, 0x0e, 0x12, 0x12, 0x0e}, | ||
1209 | [XF_eOGONEK] = { 0x0e, 0x11, 0x1f, 0x10, 0x0e, 0x04, 0x06}, | ||
1210 | [XF_eCARON] = { 0x0a, 0x04, 0x0e, 0x11, 0x1f, 0x10, 0x0e}, | ||
1211 | [XF_GBREVE] = { 0x1f, 0x00, 0x0e, 0x10, 0x17, 0x11, 0x0e}, | ||
1212 | [XF_gBREVE] = { 0x1f, 0x00, 0x0f, 0x11, 0x0f, 0x01, 0x0e}, | ||
1213 | [XF_IDOT] = { 0x04, 0x00, 0x0e, 0x04, 0x04, 0x04, 0x0e}, | ||
1214 | [XF_DOTLESSi] = { 0x00, 0x00, 0x0c, 0x04, 0x04, 0x04, 0x0e}, | ||
1215 | [XF_LSTROKE] = { 0x10, 0x10, 0x14, 0x18, 0x10, 0x10, 0x1f}, | ||
1216 | [XF_lSTROKE] = { 0x0c, 0x04, 0x06, 0x0c, 0x04, 0x04, 0x0e}, | ||
1217 | [XF_nACUTE] = { 0x02, 0x04, 0x16, 0x19, 0x11, 0x11, 0x11}, | ||
1218 | [XF_nCARON] = { 0x0a, 0x04, 0x16, 0x19, 0x11, 0x11, 0x11}, | ||
1219 | [XF_ODBLACUTE] = { 0x09, 0x12, 0x0e, 0x11, 0x11, 0x11, 0x0e}, | ||
1220 | [XF_oDBLACUTE] = { 0x09, 0x12, 0x00, 0x0e, 0x11, 0x11, 0x0e}, | ||
1221 | [XF_RCARON] = { 0x0a, 0x04, 0x1e, 0x11, 0x1e, 0x12, 0x11}, | ||
1222 | [XF_rCARON] = { 0x0a, 0x04, 0x0b, 0x0c, 0x08, 0x08, 0x08}, | ||
1223 | [XF_sACUTE] = { 0x02, 0x04, 0x0e, 0x10, 0x0e, 0x01, 0x1e}, | ||
1224 | [XF_SCEDILLA] = { 0x0e, 0x10, 0x0e, 0x01, 0x0e, 0x04, 0x0c}, | ||
1225 | [XF_sCEDILLA] = { 0x00, 0x0e, 0x10, 0x0e, 0x01, 0x0e, 0x04}, | ||
1226 | [XF_sCARON] = { 0x0a, 0x04, 0x0e, 0x10, 0x0e, 0x01, 0x1e}, | ||
1227 | [XF_tCEDILLA] = { 0x04, 0x0f, 0x04, 0x04, 0x04, 0x03, 0x06}, | ||
1228 | [XF_tCARON] = { 0x09, 0x09, 0x08, 0x1e, 0x08, 0x08, 0x06}, | ||
1229 | [XF_uRING] = { 0x04, 0x0a, 0x04, 0x11, 0x11, 0x13, 0x0d}, | ||
1230 | [XF_UDBLACUTE] = { 0x05, 0x0a, 0x11, 0x11, 0x11, 0x11, 0x0e}, | ||
1231 | [XF_uDBLACUTE] = { 0x09, 0x12, 0x00, 0x11, 0x11, 0x13, 0x0d}, | ||
1232 | [XF_zACUTE] = { 0x02, 0x04, 0x1f, 0x02, 0x04, 0x08, 0x1f}, | ||
1233 | [XF_zDOT] = { 0x04, 0x00, 0x1f, 0x02, 0x04, 0x08, 0x1f}, | ||
1234 | [XF_zCARON] = { 0x0a, 0x04, 0x1f, 0x02, 0x04, 0x08, 0x1f}, | ||
1235 | /* Greek */ | ||
1236 | [XF_GR_DELTA] = { 0x04, 0x04, 0x0a, 0x0a, 0x11, 0x11, 0x1f}, | ||
1237 | [XF_GR_THETA] = { 0x0e, 0x11, 0x11, 0x1f, 0x11, 0x11, 0x0e}, | ||
1238 | [XF_GR_LAMBDA] = { 0x04, 0x04, 0x0a, 0x0a, 0x11, 0x11, 0x11}, | ||
1239 | [XF_GR_XI] = { 0x1f, 0x11, 0x00, 0x0e, 0x00, 0x11, 0x1f}, | ||
1240 | [XF_GR_PSI] = { 0x15, 0x15, 0x15, 0x15, 0x0e, 0x04, 0x04}, | ||
1241 | [XF_GR_alpha] = { 0x00, 0x00, 0x09, 0x15, 0x12, 0x12, 0x0d}, | ||
1242 | [XF_GR_alphaTONOS] = { 0x02, 0x04, 0x09, 0x15, 0x12, 0x12, 0x0d}, | ||
1243 | [XF_GR_gamma] = { 0x00, 0x11, 0x0a, 0x0a, 0x04, 0x04, 0x08}, | ||
1244 | [XF_GR_epsilon] = { 0x00, 0x00, 0x0f, 0x10, 0x0e, 0x10, 0x0f}, | ||
1245 | [XF_GR_epsilonTONOS] = { 0x02, 0x04, 0x0f, 0x10, 0x0e, 0x10, 0x0f}, | ||
1246 | [XF_GR_zeta] = { 0x1e, 0x08, 0x10, 0x10, 0x0e, 0x01, 0x06}, | ||
1247 | [XF_GR_eta] = { 0x00, 0x16, 0x19, 0x11, 0x11, 0x11, 0x01}, | ||
1248 | [XF_GR_etaTONOS] = { 0x02, 0x04, 0x16, 0x19, 0x11, 0x11, 0x01}, | ||
1249 | [XF_GR_iota] = { 0x00, 0x00, 0x04, 0x04, 0x04, 0x04, 0x02}, | ||
1250 | [XF_GR_lambda] = { 0x88, 0x04, 0x04, 0x0a, 0x0a, 0x11, 0x11}, | ||
1251 | [XF_GR_xi] = { 0x0c, 0x10, 0x0c, 0x10, 0x0e, 0x01, 0x06}, | ||
1252 | [XF_GR_rho] = { 0x00, 0x0e, 0x11, 0x11, 0x19, 0x16, 0x10}, | ||
1253 | [XF_GR_FINALsigma] = { 0x00, 0x0e, 0x10, 0x10, 0x0e, 0x01, 0x06}, | ||
1254 | [XF_GR_sigma] = { 0x00, 0x00, 0x0f, 0x14, 0x12, 0x11, 0x0e}, | ||
1255 | [XF_GR_upsilon] = { 0x00, 0x00, 0x11, 0x09, 0x09, 0x09, 0x06}, | ||
1256 | [XF_GR_upsilonTONOS] = { 0x02, 0x04, 0x11, 0x09, 0x09, 0x09, 0x06}, | ||
1257 | [XF_GR_chi] = { 0x00, 0x12, 0x0a, 0x04, 0x04, 0x0a, 0x09}, | ||
1258 | [XF_GR_psi] = { 0x00, 0x15, 0x15, 0x15, 0x0e, 0x04, 0x04}, | ||
1259 | [XF_GR_omega] = { 0x00, 0x00, 0x0a, 0x11, 0x15, 0x15, 0x0a}, | ||
1260 | [XF_GR_omegaTONOS] = { 0x02, 0x04, 0x0a, 0x11, 0x15, 0x15, 0x0a}, | ||
1261 | /* Cyrillic */ | ||
1262 | [XF_CYR_BE] = { 0x1f, 0x10, 0x10, 0x1e, 0x11, 0x11, 0x1e}, | ||
1263 | [XF_CYR_GHE] = { 0x1f, 0x11, 0x10, 0x10, 0x10, 0x10, 0x10}, | ||
1264 | [XF_CYR_DE] = { 0x07, 0x09, 0x09, 0x09, 0x09, 0x1f, 0x11}, | ||
1265 | [XF_CYR_ZHE] = { 0x15, 0x15, 0x0e, 0x04, 0x0e, 0x15, 0x15}, | ||
1266 | [XF_CYR_ZE] = { 0x0e, 0x11, 0x01, 0x0e, 0x01, 0x11, 0x0e}, | ||
1267 | [XF_CYR_I] = { 0x11, 0x11, 0x13, 0x15, 0x19, 0x11, 0x11}, | ||
1268 | [XF_CYR_SHORTI] = { 0x0a, 0x04, 0x11, 0x13, 0x15, 0x19, 0x11}, | ||
1269 | [XF_CYR_EL] = { 0x0f, 0x09, 0x09, 0x09, 0x09, 0x09, 0x11}, | ||
1270 | [XF_CYR_PE] = { 0x1f, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11}, | ||
1271 | [XF_CYR_TSE] = { 0x11, 0x11, 0x11, 0x11, 0x11, 0x1f, 0x01}, | ||
1272 | [XF_CYR_CHE] = { 0x11, 0x11, 0x11, 0x0f, 0x01, 0x01, 0x01}, | ||
1273 | [XF_CYR_SHA] = { 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x1f}, | ||
1274 | [XF_CYR_SHCHA] = { 0x15, 0x15, 0x15, 0x15, 0x15, 0x1f, 0x01}, | ||
1275 | [XF_CYR_HARD] = { 0x18, 0x08, 0x0e, 0x09, 0x09, 0x09, 0x0e}, | ||
1276 | [XF_CYR_YERU] = { 0x11, 0x11, 0x19, 0x15, 0x15, 0x15, 0x19}, | ||
1277 | [XF_CYR_E] = { 0x0e, 0x11, 0x01, 0x07, 0x01, 0x11, 0x0e}, | ||
1278 | [XF_CYR_YU] = { 0x12, 0x15, 0x15, 0x1d, 0x15, 0x15, 0x12}, | ||
1279 | [XF_CYR_YA] = { 0x0f, 0x11, 0x11, 0x0f, 0x05, 0x09, 0x11}, | ||
1280 | [XF_CYR_be] = { 0x0f, 0x10, 0x0e, 0x11, 0x11, 0x11, 0x0e}, | ||
1281 | [XF_CYR_ve] = { 0x00, 0x00, 0x1e, 0x11, 0x1e, 0x11, 0x1e}, | ||
1282 | [XF_CYR_ghe] = { 0x00, 0x00, 0x1f, 0x10, 0x10, 0x10, 0x10}, | ||
1283 | [XF_CYR_de] = { 0x00, 0x00, 0x06, 0x0a, 0x0a, 0x1f, 0x11}, | ||
1284 | [XF_CYR_zhe] = { 0x00, 0x00, 0x15, 0x0e, 0x04, 0x0e, 0x15}, | ||
1285 | [XF_CYR_ze] = { 0x00, 0x00, 0x1e, 0x01, 0x0e, 0x01, 0x1e}, | ||
1286 | [XF_CYR_i] = { 0x00, 0x00, 0x11, 0x13, 0x15, 0x19, 0x11}, | ||
1287 | [XF_CYR_SHORTi] = { 0x0a, 0x04, 0x00, 0x11, 0x13, 0x15, 0x19}, | ||
1288 | [XF_CYR_ka] = { 0x00, 0x00, 0x11, 0x12, 0x1c, 0x12, 0x11}, | ||
1289 | [XF_CYR_el] = { 0x00, 0x00, 0x0f, 0x09, 0x09, 0x09, 0x11}, | ||
1290 | [XF_CYR_em] = { 0x00, 0x00, 0x11, 0x1b, 0x15, 0x11, 0x11}, | ||
1291 | [XF_CYR_en] = { 0x00, 0x00, 0x11, 0x11, 0x1f, 0x11, 0x11}, | ||
1292 | [XF_CYR_pe] = { 0x00, 0x00, 0x1f, 0x11, 0x11, 0x11, 0x11}, | ||
1293 | [XF_CYR_te] = { 0x00, 0x00, 0x1f, 0x04, 0x04, 0x04, 0x02}, | ||
1294 | [XF_CYR_tse] = { 0x00, 0x00, 0x11, 0x11, 0x11, 0x1f, 0x01}, | ||
1295 | [XF_CYR_che] = { 0x00, 0x00, 0x11, 0x11, 0x0f, 0x01, 0x01}, | ||
1296 | [XF_CYR_sha] = { 0x00, 0x00, 0x15, 0x15, 0x15, 0x15, 0x1f}, | ||
1297 | [XF_CYR_shcha] = { 0x00, 0x00, 0x15, 0x15, 0x15, 0x1f, 0x01}, | ||
1298 | [XF_CYR_hard] = { 0x00, 0x00, 0x18, 0x0e, 0x09, 0x09, 0x0e}, | ||
1299 | [XF_CYR_yeru] = { 0x00, 0x00, 0x11, 0x19, 0x15, 0x15, 0x19}, | ||
1300 | [XF_CYR_soft] = { 0x00, 0x00, 0x08, 0x0e, 0x09, 0x09, 0x0e}, | ||
1301 | [XF_CYR_e] = { 0x00, 0x00, 0x0e, 0x11, 0x03, 0x11, 0x0e}, | ||
1302 | [XF_CYR_yu] = { 0x00, 0x00, 0x12, 0x15, 0x1d, 0x15, 0x12}, | ||
1303 | [XF_CYR_ya] = { 0x00, 0x00, 0x0f, 0x11, 0x0f, 0x09, 0x11}, | ||
1304 | #endif /* !BOOTLOADER */ | ||
1305 | }; | ||
1306 | |||
1307 | void lcd_charset_init(void) | ||
1308 | { | ||
1309 | if (is_new_player()) | ||
1310 | { | ||
1311 | lcd_pattern_count = 8; | ||
1312 | xchar_info = xchar_info_newlcd; | ||
1313 | xchar_info_size = sizeof(xchar_info_newlcd)/sizeof(struct xchar_info); | ||
1314 | } | ||
1315 | else /* old lcd */ | ||
1316 | { | ||
1317 | lcd_pattern_count = 4; | ||
1318 | xchar_info = xchar_info_oldlcd; | ||
1319 | xchar_info_size = sizeof(xchar_info_oldlcd)/sizeof(struct xchar_info); | ||
1320 | } | ||
1321 | } | ||
diff --git a/firmware/drivers/lcd-scroll.c b/firmware/drivers/lcd-scroll.c index 0e17303bd3..7916556dfb 100644 --- a/firmware/drivers/lcd-scroll.c +++ b/firmware/drivers/lcd-scroll.c | |||
@@ -42,10 +42,6 @@ struct scroll_screen_info LCDFN(scroll_info) = | |||
42 | #ifdef HAVE_LCD_BITMAP | 42 | #ifdef HAVE_LCD_BITMAP |
43 | .step = 6, | 43 | .step = 6, |
44 | #endif | 44 | #endif |
45 | #ifdef HAVE_LCD_CHARCELLS | ||
46 | .jump_scroll_delay = HZ/4, | ||
47 | .jump_scroll = 0, | ||
48 | #endif | ||
49 | }; | 45 | }; |
50 | 46 | ||
51 | 47 | ||
@@ -121,17 +117,6 @@ void LCDFN(bidir_scroll)(int percent) | |||
121 | LCDFN(scroll_info).bidir_limit = percent; | 117 | LCDFN(scroll_info).bidir_limit = percent; |
122 | } | 118 | } |
123 | 119 | ||
124 | #ifdef HAVE_LCD_CHARCELLS | ||
125 | void LCDFN(jump_scroll)(int mode) /* 0=off, 1=once, ..., JUMP_SCROLL_ALWAYS */ | ||
126 | { | ||
127 | LCDFN(scroll_info).jump_scroll = mode; | ||
128 | } | ||
129 | |||
130 | void LCDFN(jump_scroll_delay)(int ms) | ||
131 | { | ||
132 | LCDFN(scroll_info).jump_scroll_delay = ms / (HZ / 10); | ||
133 | } | ||
134 | #endif | ||
135 | 120 | ||
136 | /* This renders the scrolling line described by s immediatly. | 121 | /* This renders the scrolling line described by s immediatly. |
137 | * This can be called to update a scrolling line if the text has changed | 122 | * This can be called to update a scrolling line if the text has changed |
@@ -201,7 +186,7 @@ bool LCDFN(scroll_now)(struct scrollinfo *s) | |||
201 | return ended; | 186 | return ended; |
202 | } | 187 | } |
203 | 188 | ||
204 | #if !defined(BOOTLOADER) || defined(HAVE_REMOTE_LCD) || defined(HAVE_LCD_CHARCELLS) | 189 | #if !defined(BOOTLOADER) || defined(HAVE_REMOTE_LCD) |
205 | static void LCDFN(scroll_worker)(void) | 190 | static void LCDFN(scroll_worker)(void) |
206 | { | 191 | { |
207 | int index; | 192 | int index; |
diff --git a/firmware/export/lcd-charcell.h b/firmware/export/lcd-charcell.h deleted file mode 100644 index 8dace07d8e..0000000000 --- a/firmware/export/lcd-charcell.h +++ /dev/null | |||
@@ -1,68 +0,0 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id$ | ||
9 | * | ||
10 | * Copyright (C) 2007 by Jens Arnold | ||
11 | * | ||
12 | * This program is free software; you can redistribute it and/or | ||
13 | * modify it under the terms of the GNU General Public License | ||
14 | * as published by the Free Software Foundation; either version 2 | ||
15 | * of the License, or (at your option) any later version. | ||
16 | * | ||
17 | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||
18 | * KIND, either express or implied. | ||
19 | * | ||
20 | ****************************************************************************/ | ||
21 | |||
22 | #include "config.h" | ||
23 | |||
24 | /* target dependent - to be adjusted for other charcell targets */ | ||
25 | #define HW_PATTERN_SIZE 7 /* number of bytes per pattern */ | ||
26 | #define MAX_HW_PATTERNS 8 /* max. number of user-definable hw patterns */ | ||
27 | |||
28 | struct cursor_info { | ||
29 | unsigned char hw_char; | ||
30 | unsigned char subst_char; | ||
31 | bool enabled; | ||
32 | bool visible; | ||
33 | int x; | ||
34 | int y; | ||
35 | int divider; | ||
36 | int downcount; | ||
37 | }; | ||
38 | |||
39 | /* map unicode characters to hardware or extended lcd characters */ | ||
40 | struct xchar_info { | ||
41 | unsigned short ucs; | ||
42 | unsigned short glyph; | ||
43 | /* 0x0000..0x7fff: fixed extended characters | ||
44 | * 0x8000..0xffff: variable extended characters | ||
45 | * Dontcare if priority == 0 */ | ||
46 | unsigned char priority; | ||
47 | unsigned char hw_char; /* direct or substitute */ | ||
48 | }; | ||
49 | |||
50 | /* track usage of user-definable characters */ | ||
51 | struct pattern_info { | ||
52 | short count; | ||
53 | unsigned short glyph; | ||
54 | unsigned char priority; | ||
55 | unsigned char pattern[HW_PATTERN_SIZE]; | ||
56 | }; | ||
57 | |||
58 | extern int lcd_pattern_count; /* actual number of user-definable hw patterns */ | ||
59 | |||
60 | extern unsigned char lcd_charbuffer[LCD_HEIGHT][LCD_WIDTH]; | ||
61 | extern struct pattern_info lcd_patterns[MAX_HW_PATTERNS]; | ||
62 | extern struct cursor_info lcd_cursor; | ||
63 | |||
64 | extern const struct xchar_info *xchar_info; | ||
65 | extern int xchar_info_size; /* number of entries */ | ||
66 | extern const unsigned char xfont_fixed[][HW_PATTERN_SIZE]; | ||
67 | |||
68 | void lcd_charset_init(void); | ||
diff --git a/firmware/export/lcd.h b/firmware/export/lcd.h index 80ef45a573..0975df4c79 100644 --- a/firmware/export/lcd.h +++ b/firmware/export/lcd.h | |||
@@ -144,9 +144,6 @@ typedef unsigned long fb_data; | |||
144 | #endif | 144 | #endif |
145 | #define FB_DATA_SZ 4 | 145 | #define FB_DATA_SZ 4 |
146 | #endif /* LCD_DEPTH */ | 146 | #endif /* LCD_DEPTH */ |
147 | |||
148 | #else /* LCD_CHARCELLS */ | ||
149 | typedef unsigned char fb_data; | ||
150 | #endif | 147 | #endif |
151 | 148 | ||
152 | #if defined(HAVE_LCD_MODES) | 149 | #if defined(HAVE_LCD_MODES) |
@@ -226,43 +223,6 @@ extern void lcd_remote_update_rect(int x, int y, int width, int height); | |||
226 | #endif /* HAVE_REMOTE_LCD */ | 223 | #endif /* HAVE_REMOTE_LCD */ |
227 | #endif /* HAVE_LCD_BITMAP */ | 224 | #endif /* HAVE_LCD_BITMAP */ |
228 | 225 | ||
229 | #ifdef HAVE_LCD_CHARCELLS | ||
230 | |||
231 | /* Icon definitions for lcd_icon() */ | ||
232 | enum | ||
233 | { | ||
234 | ICON_BATTERY = 0, | ||
235 | ICON_BATTERY_1, | ||
236 | ICON_BATTERY_2, | ||
237 | ICON_BATTERY_3, | ||
238 | ICON_USB, | ||
239 | ICON_PLAY, | ||
240 | ICON_RECORD, | ||
241 | ICON_PAUSE, | ||
242 | ICON_AUDIO, | ||
243 | ICON_REPEAT, | ||
244 | ICON_1, | ||
245 | ICON_VOLUME, | ||
246 | ICON_VOLUME_1, | ||
247 | ICON_VOLUME_2, | ||
248 | ICON_VOLUME_3, | ||
249 | ICON_VOLUME_4, | ||
250 | ICON_VOLUME_5, | ||
251 | ICON_PARAM | ||
252 | }; | ||
253 | |||
254 | void lcd_icon(int icon, bool enable); | ||
255 | void lcd_double_height(bool on); | ||
256 | void lcd_define_pattern(unsigned long ucs, const char *pattern); | ||
257 | unsigned long lcd_get_locked_pattern(void); | ||
258 | void lcd_unlock_pattern(unsigned long ucs); | ||
259 | void lcd_put_cursor(int x, int y, unsigned long cursor_ucs); | ||
260 | void lcd_remove_cursor(void); | ||
261 | #define JUMP_SCROLL_ALWAYS 5 | ||
262 | extern void lcd_jump_scroll(int mode); /* 0=off, 1=once, ..., ALWAYS */ | ||
263 | extern void lcd_jump_scroll_delay(int ms); | ||
264 | #endif /* HAVE_LCD_CHARCELLS */ | ||
265 | |||
266 | /* Bitmap formats */ | 226 | /* Bitmap formats */ |
267 | enum | 227 | enum |
268 | { | 228 | { |
diff --git a/firmware/export/scroll_engine.h b/firmware/export/scroll_engine.h index 1326812265..051e367506 100644 --- a/firmware/export/scroll_engine.h +++ b/firmware/export/scroll_engine.h | |||
@@ -95,10 +95,6 @@ struct scroll_screen_info | |||
95 | long ticks; /* # of ticks between updates*/ | 95 | long ticks; /* # of ticks between updates*/ |
96 | long delay; /* ticks delay before start */ | 96 | long delay; /* ticks delay before start */ |
97 | int bidir_limit; /* percent */ | 97 | int bidir_limit; /* percent */ |
98 | #ifdef HAVE_LCD_CHARCELLS | ||
99 | long jump_scroll_delay; /* delay between jump scroll jumps */ | ||
100 | int jump_scroll; /* 0=off, 1=once, ..., JUMP_SCROLL_ALWAYS */ | ||
101 | #endif | ||
102 | #if defined(HAVE_LCD_BITMAP) || defined(HAVE_REMOTE_LCD) | 98 | #if defined(HAVE_LCD_BITMAP) || defined(HAVE_REMOTE_LCD) |
103 | int step; /* pixels per scroll step */ | 99 | int step; /* pixels per scroll step */ |
104 | #endif | 100 | #endif |
diff --git a/firmware/panic.c b/firmware/panic.c index 90e727d5e4..358be42924 100644 --- a/firmware/panic.c +++ b/firmware/panic.c | |||
@@ -86,11 +86,7 @@ void panicf( const char *fmt, ...) | |||
86 | 86 | ||
87 | lcd_set_viewport(NULL); | 87 | lcd_set_viewport(NULL); |
88 | 88 | ||
89 | #ifdef HAVE_LCD_CHARCELLS | 89 | #if defined(HAVE_LCD_BITMAP) |
90 | lcd_double_height(false); | ||
91 | lcd_puts(0, 0, "*PANIC*"); | ||
92 | lcd_puts(0, 1, panic_buf); | ||
93 | #elif defined(HAVE_LCD_BITMAP) | ||
94 | int y = 1; | 90 | int y = 1; |
95 | 91 | ||
96 | #if LCD_DEPTH > 1 | 92 | #if LCD_DEPTH > 1 |
diff --git a/firmware/scroll_engine.c b/firmware/scroll_engine.c index aacaa496e7..b584345a9a 100644 --- a/firmware/scroll_engine.c +++ b/firmware/scroll_engine.c | |||
@@ -185,12 +185,12 @@ static void scroll_thread(void) | |||
185 | while (1) | 185 | while (1) |
186 | { | 186 | { |
187 | sleep(lcd_scroll_info.ticks); | 187 | sleep(lcd_scroll_info.ticks); |
188 | #if !defined(BOOTLOADER) || defined(HAVE_LCD_CHARCELLS) | 188 | #if !defined(BOOTLOADER) |
189 | #if defined(HAVE_LCD_ENABLE) || defined(HAVE_LCD_SLEEP) | 189 | #if defined(HAVE_LCD_ENABLE) || defined(HAVE_LCD_SLEEP) |
190 | if (lcd_active()) | 190 | if (lcd_active()) |
191 | #endif | 191 | #endif |
192 | lcd_scroll_worker(); | 192 | lcd_scroll_worker(); |
193 | #endif /*!BOOTLOADER\HAVE_LCD_CHARCELLS*/ | 193 | #endif /* !BOOTLOADER */ |
194 | } | 194 | } |
195 | } | 195 | } |
196 | #endif /* HAVE_REMOTE_LCD */ | 196 | #endif /* HAVE_REMOTE_LCD */ |
diff --git a/firmware/target/hosted/sdl/button-sdl.c b/firmware/target/hosted/sdl/button-sdl.c index 8c716bc7b9..beb84ee77f 100644 --- a/firmware/target/hosted/sdl/button-sdl.c +++ b/firmware/target/hosted/sdl/button-sdl.c | |||
@@ -22,7 +22,6 @@ | |||
22 | #include <math.h> | 22 | #include <math.h> |
23 | #include <stdlib.h> /* EXIT_SUCCESS */ | 23 | #include <stdlib.h> /* EXIT_SUCCESS */ |
24 | #include "sim-ui-defines.h" | 24 | #include "sim-ui-defines.h" |
25 | #include "lcd-charcells.h" | ||
26 | #ifdef HAVE_REMOTE_LCD | 25 | #ifdef HAVE_REMOTE_LCD |
27 | #include "lcd-remote.h" | 26 | #include "lcd-remote.h" |
28 | #endif | 27 | #endif |
diff --git a/firmware/target/hosted/sdl/lcd-charcells.c b/firmware/target/hosted/sdl/lcd-charcells.c deleted file mode 100644 index 1020e7269a..0000000000 --- a/firmware/target/hosted/sdl/lcd-charcells.c +++ /dev/null | |||
@@ -1,206 +0,0 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id$ | ||
9 | * | ||
10 | * Copyright (C) 2006 Dan Everton | ||
11 | * | ||
12 | * This program is free software; you can redistribute it and/or | ||
13 | * modify it under the terms of the GNU General Public License | ||
14 | * as published by the Free Software Foundation; either version 2 | ||
15 | * of the License, or (at your option) any later version. | ||
16 | * | ||
17 | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||
18 | * KIND, either express or implied. | ||
19 | * | ||
20 | ****************************************************************************/ | ||
21 | |||
22 | #include <string.h> | ||
23 | #include <unistd.h> | ||
24 | #include <fcntl.h> | ||
25 | #include "system.h" | ||
26 | #include "debug.h" | ||
27 | #include "lcd.h" | ||
28 | #include "lcd-charcell.h" | ||
29 | #include "screendump.h" | ||
30 | #include "general.h" | ||
31 | |||
32 | #include "lcd-playersim.h" | ||
33 | #include "sim-ui-defines.h" | ||
34 | #include "lcd-sdl.h" | ||
35 | |||
36 | /* can't include file.h here */ | ||
37 | #ifndef MAX_PATH | ||
38 | #define MAX_PATH 260 | ||
39 | #endif | ||
40 | |||
41 | /* extern functions, needed for screendump() */ | ||
42 | extern int sim_creat(const char *name, mode_t mode); | ||
43 | |||
44 | SDL_Surface* lcd_surface; | ||
45 | |||
46 | SDL_Color lcd_bl_color_dark = {RED_CMP(LCD_BL_DARKCOLOR), | ||
47 | GREEN_CMP(LCD_BL_DARKCOLOR), | ||
48 | BLUE_CMP(LCD_BL_DARKCOLOR), 0}; | ||
49 | SDL_Color lcd_bl_color_bright = {RED_CMP(LCD_BL_BRIGHTCOLOR), | ||
50 | GREEN_CMP(LCD_BL_BRIGHTCOLOR), | ||
51 | BLUE_CMP(LCD_BL_BRIGHTCOLOR), 0}; | ||
52 | SDL_Color lcd_color_dark = {RED_CMP(LCD_DARKCOLOR), | ||
53 | GREEN_CMP(LCD_DARKCOLOR), | ||
54 | BLUE_CMP(LCD_DARKCOLOR), 0}; | ||
55 | SDL_Color lcd_color_bright = {RED_CMP(LCD_BRIGHTCOLOR), | ||
56 | GREEN_CMP(LCD_BRIGHTCOLOR), | ||
57 | BLUE_CMP(LCD_BRIGHTCOLOR), 0}; | ||
58 | |||
59 | |||
60 | static unsigned long get_lcd_pixel(int x, int y) | ||
61 | { | ||
62 | return sim_lcd_framebuffer[y][x]; | ||
63 | } | ||
64 | |||
65 | void sim_lcd_update_rect(int x_start, int y_start, int width, int height) | ||
66 | { | ||
67 | sdl_update_rect(lcd_surface, x_start, y_start, width, height, | ||
68 | SIM_LCD_WIDTH, SIM_LCD_HEIGHT, get_lcd_pixel); | ||
69 | sdl_gui_update(lcd_surface, x_start, y_start, width, height, | ||
70 | SIM_LCD_WIDTH, SIM_LCD_HEIGHT, | ||
71 | background ? UI_LCD_POSX : 0, background ? UI_LCD_POSY : 0); | ||
72 | } | ||
73 | |||
74 | void lcd_update(void) | ||
75 | { | ||
76 | int x, y; | ||
77 | |||
78 | for (y = 0; y < lcd_pattern_count; y++) | ||
79 | if (lcd_patterns[y].count > 0) | ||
80 | sim_lcd_define_pattern(y, lcd_patterns[y].pattern); | ||
81 | |||
82 | for (y = 0; y < LCD_HEIGHT; y++) | ||
83 | for (x = 0; x < LCD_WIDTH; x++) | ||
84 | lcd_print_char(x, y, lcd_charbuffer[y][x]); | ||
85 | |||
86 | if (lcd_cursor.visible) | ||
87 | lcd_print_char(lcd_cursor.x, lcd_cursor.y, lcd_cursor.hw_char); | ||
88 | |||
89 | sim_lcd_update_rect(0, ICON_HEIGHT, SIM_LCD_WIDTH, | ||
90 | LCD_HEIGHT*CHAR_HEIGHT*CHAR_PIXEL); | ||
91 | } | ||
92 | |||
93 | #ifdef HAVE_BACKLIGHT | ||
94 | void sim_backlight(int value) | ||
95 | { | ||
96 | if (value > 0) { | ||
97 | sdl_set_gradient(lcd_surface, &lcd_bl_color_bright, | ||
98 | &lcd_bl_color_dark, 0, (1<<LCD_DEPTH)); | ||
99 | } else { | ||
100 | sdl_set_gradient(lcd_surface, &lcd_color_bright, | ||
101 | &lcd_color_dark, 0, (1<<LCD_DEPTH)); | ||
102 | } | ||
103 | |||
104 | sim_lcd_update_rect(0, 0, SIM_LCD_WIDTH, SIM_LCD_HEIGHT); | ||
105 | } | ||
106 | #endif | ||
107 | |||
108 | /* initialise simulator lcd driver */ | ||
109 | void lcd_init_device(void) | ||
110 | { | ||
111 | lcd_surface = SDL_CreateRGBSurface(SDL_SWSURFACE, | ||
112 | SIM_LCD_WIDTH * display_zoom, | ||
113 | SIM_LCD_HEIGHT * display_zoom, | ||
114 | 8, 0, 0, 0, 0); | ||
115 | |||
116 | sdl_set_gradient(lcd_surface, &lcd_bl_color_bright, | ||
117 | &lcd_bl_color_dark, 0, (1<<LCD_DEPTH)); | ||
118 | } | ||
119 | |||
120 | #define BMP_COMPRESSION 0 /* BI_RGB */ | ||
121 | #define BMP_NUMCOLORS (1 << LCD_DEPTH) | ||
122 | #define BMP_BPP 1 | ||
123 | #define BMP_LINESIZE (((SIM_LCD_WIDTH + 31) / 32) * 4) | ||
124 | |||
125 | #define BMP_HEADERSIZE (54 + 4 * BMP_NUMCOLORS) | ||
126 | #define BMP_DATASIZE (BMP_LINESIZE * SIM_LCD_HEIGHT) | ||
127 | #define BMP_TOTALSIZE (BMP_HEADERSIZE + BMP_DATASIZE) | ||
128 | |||
129 | #define LE16_CONST(x) (x)&0xff, ((x)>>8)&0xff | ||
130 | #define LE32_CONST(x) (x)&0xff, ((x)>>8)&0xff, ((x)>>16)&0xff, ((x)>>24)&0xff | ||
131 | |||
132 | static const unsigned char bmpheader[] = | ||
133 | { | ||
134 | 0x42, 0x4d, /* 'BM' */ | ||
135 | LE32_CONST(BMP_TOTALSIZE), /* Total file size */ | ||
136 | 0x00, 0x00, 0x00, 0x00, /* Reserved */ | ||
137 | LE32_CONST(BMP_HEADERSIZE), /* Offset to start of pixel data */ | ||
138 | |||
139 | 0x28, 0x00, 0x00, 0x00, /* Size of (2nd) header */ | ||
140 | LE32_CONST(SIM_LCD_WIDTH), /* Width in pixels */ | ||
141 | LE32_CONST(SIM_LCD_HEIGHT), /* Height in pixels */ | ||
142 | 0x01, 0x00, /* Number of planes (always 1) */ | ||
143 | LE16_CONST(BMP_BPP), /* Bits per pixel 1/4/8/16/24 */ | ||
144 | LE32_CONST(BMP_COMPRESSION),/* Compression mode */ | ||
145 | LE32_CONST(BMP_DATASIZE), /* Size of bitmap data */ | ||
146 | 0xc4, 0x0e, 0x00, 0x00, /* Horizontal resolution (pixels/meter) */ | ||
147 | 0xc4, 0x0e, 0x00, 0x00, /* Vertical resolution (pixels/meter) */ | ||
148 | LE32_CONST(BMP_NUMCOLORS), /* Number of used colours */ | ||
149 | LE32_CONST(BMP_NUMCOLORS), /* Number of important colours */ | ||
150 | |||
151 | BMP_COLOR(LCD_BL_BRIGHTCOLOR), | ||
152 | BMP_COLOR(LCD_BL_DARKCOLOR) | ||
153 | }; | ||
154 | |||
155 | void screen_dump(void) | ||
156 | { | ||
157 | int fd; | ||
158 | char filename[MAX_PATH]; | ||
159 | int x, y; | ||
160 | static unsigned char line[BMP_LINESIZE]; | ||
161 | |||
162 | create_numbered_filename(filename, "", "dump_", ".bmp", 4 | ||
163 | IF_CNFN_NUM_(, NULL)); | ||
164 | DEBUGF("screen_dump\n"); | ||
165 | |||
166 | fd = sim_creat(filename, 0666); | ||
167 | if (fd < 0) | ||
168 | return; | ||
169 | |||
170 | if(write(fd, bmpheader, sizeof(bmpheader)) != sizeof(bmpheader)) | ||
171 | { | ||
172 | close(fd); | ||
173 | return; | ||
174 | } | ||
175 | SDL_LockSurface(lcd_surface); | ||
176 | |||
177 | /* BMP image goes bottom up */ | ||
178 | for (y = SIM_LCD_HEIGHT - 1; y >= 0; y--) | ||
179 | { | ||
180 | Uint8 *src = (Uint8 *)lcd_surface->pixels | ||
181 | + y * SIM_LCD_WIDTH * (int)display_zoom * (int)display_zoom; | ||
182 | unsigned char *dst = line; | ||
183 | unsigned dst_mask = 0x80; | ||
184 | |||
185 | memset(line, 0, sizeof(line)); | ||
186 | for (x = SIM_LCD_WIDTH; x > 0; x--) | ||
187 | { | ||
188 | if (*src) | ||
189 | *dst |= dst_mask; | ||
190 | src += (int)display_zoom; | ||
191 | dst_mask >>= 1; | ||
192 | if (dst_mask == 0) | ||
193 | { | ||
194 | dst++; | ||
195 | dst_mask = 0x80; | ||
196 | } | ||
197 | } | ||
198 | if(write(fd, line, sizeof(line)) != sizeof(line)) | ||
199 | { | ||
200 | close(fd); | ||
201 | return; | ||
202 | } | ||
203 | } | ||
204 | SDL_UnlockSurface(lcd_surface); | ||
205 | close(fd); | ||
206 | } | ||
diff --git a/firmware/target/hosted/sdl/lcd-charcells.h b/firmware/target/hosted/sdl/lcd-charcells.h deleted file mode 100644 index 890594f766..0000000000 --- a/firmware/target/hosted/sdl/lcd-charcells.h +++ /dev/null | |||
@@ -1,34 +0,0 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id$ | ||
9 | * | ||
10 | * Copyright (C) 2006 Dan Everton | ||
11 | * | ||
12 | * This program is free software; you can redistribute it and/or | ||
13 | * modify it under the terms of the GNU General Public License | ||
14 | * as published by the Free Software Foundation; either version 2 | ||
15 | * of the License, or (at your option) any later version. | ||
16 | * | ||
17 | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||
18 | * KIND, either express or implied. | ||
19 | * | ||
20 | ****************************************************************************/ | ||
21 | |||
22 | #ifndef __LCDCHARCELL_H__ | ||
23 | #define __LCDCHARCELL_H__ | ||
24 | |||
25 | #include "lcd.h" | ||
26 | #include "SDL.h" | ||
27 | |||
28 | #ifdef HAVE_LCD_CHARCELLS | ||
29 | void sim_lcd_init(void); | ||
30 | void screen_dump(void); | ||
31 | #endif | ||
32 | |||
33 | #endif /* #ifndef __LCDCHARCELL_H__ */ | ||
34 | |||
diff --git a/firmware/target/hosted/sdl/system-sdl.c b/firmware/target/hosted/sdl/system-sdl.c index 37580ede7d..6aaab6e8a5 100644 --- a/firmware/target/hosted/sdl/system-sdl.c +++ b/firmware/target/hosted/sdl/system-sdl.c | |||
@@ -35,8 +35,6 @@ | |||
35 | #include "lcd-sdl.h" | 35 | #include "lcd-sdl.h" |
36 | #ifdef HAVE_LCD_BITMAP | 36 | #ifdef HAVE_LCD_BITMAP |
37 | #include "lcd-bitmap.h" | 37 | #include "lcd-bitmap.h" |
38 | #elif defined(HAVE_LCD_CHARCELLS) | ||
39 | #include "lcd-charcells.h" | ||
40 | #endif | 38 | #endif |
41 | #ifdef HAVE_REMOTE_LCD | 39 | #ifdef HAVE_REMOTE_LCD |
42 | #include "lcd-remote-bitmap.h" | 40 | #include "lcd-remote-bitmap.h" |