summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--firmware/drivers/diacritic.c610
-rw-r--r--firmware/drivers/lcd-bitmap-common.c33
-rw-r--r--firmware/include/diacritic.h2
3 files changed, 326 insertions, 319 deletions
diff --git a/firmware/drivers/diacritic.c b/firmware/drivers/diacritic.c
index 728492a06e..576fe174e6 100644
--- a/firmware/drivers/diacritic.c
+++ b/firmware/drivers/diacritic.c
@@ -26,309 +26,319 @@
26#include "diacritic.h" 26#include "diacritic.h"
27#include "system.h" 27#include "system.h"
28 28
29#define DIAC_FLAG_DIACRITIC (1 << 31) 29#define DIAC_FLAG_NONE 0
30#define DIAC_FLAG_RTL (1 << 30) 30#define DIAC_FLAG_DIACRITIC (1 << 0)
31#define DIAC_MASK 0x000FFFFF 31#define DIAC_FLAG_RTL (1 << 1)
32 32
33#define DIAC_VAL(i) (diac_range[(i)] & DIAC_MASK) 33#define DIAC_VAL(i) (diac_ranges[(i)].last)
34#define DIAC_IS_DIACRITIC(i) ((diac_range[(i)] & DIAC_FLAG_DIACRITIC) ? 1 : 0) 34#define DIAC_IS_DIACRITIC(i) (diac_ranges[(i)].flags & DIAC_FLAG_DIACRITIC)
35#define DIAC_IS_RTL(i) ((diac_range[(i)] & DIAC_FLAG_RTL) ? 1 : 0) 35#define DIAC_IS_RTL(i) (diac_ranges[(i)].flags & DIAC_FLAG_RTL)
36#define DIAC_NUM_RANGES (ARRAYLEN(diac_range)) 36#define DIAC_NUM_RANGES (ARRAYLEN(diac_ranges))
37
38struct diac_range
39{
40 unsigned short last;
41 unsigned char flags;
42};
37 43
38/* Sorted by Unicode value */ 44/* Sorted by Unicode value */
39static const int diac_range[] = 45static const struct diac_range diac_ranges[] =
40{ 46{
41 0x00000, 47 { 0x0000, DIAC_FLAG_NONE },
42 0x002ff, 48 { 0x02ff, DIAC_FLAG_NONE },
43 0x0036f | DIAC_FLAG_DIACRITIC, /* Combining Diacritical Marks */ 49 { 0x036f, DIAC_FLAG_DIACRITIC }, /* Combining Diacritical Marks */
44 0x00482, 50 { 0x0482, DIAC_FLAG_NONE },
45 0x00489 | DIAC_FLAG_DIACRITIC, /* Cyrillic */ 51 { 0x0489, DIAC_FLAG_DIACRITIC }, /* Cyrillic */
46 0x00590, 52 { 0x0590, DIAC_FLAG_NONE },
47 0x005bd | DIAC_FLAG_DIACRITIC | DIAC_FLAG_RTL, /* Hebrew */ 53 { 0x05bd, DIAC_FLAG_DIACRITIC | DIAC_FLAG_RTL }, /* Hebrew */
48 0x005be | DIAC_FLAG_RTL, 54 { 0x05be, DIAC_FLAG_RTL },
49 0x005bf | DIAC_FLAG_DIACRITIC | DIAC_FLAG_RTL, /* Hebrew */ 55 { 0x05bf, DIAC_FLAG_DIACRITIC | DIAC_FLAG_RTL }, /* Hebrew */
50 0x005c0 | DIAC_FLAG_RTL, 56 { 0x05c0, DIAC_FLAG_RTL },
51 0x005c2 | DIAC_FLAG_DIACRITIC | DIAC_FLAG_RTL, /* Hebrew */ 57 { 0x05c2, DIAC_FLAG_DIACRITIC | DIAC_FLAG_RTL }, /* Hebrew */
52 0x005c3 | DIAC_FLAG_RTL, 58 { 0x05c3, DIAC_FLAG_RTL },
53 0x005c5 | DIAC_FLAG_DIACRITIC | DIAC_FLAG_RTL, /* Hebrew */ 59 { 0x05c5, DIAC_FLAG_DIACRITIC | DIAC_FLAG_RTL }, /* Hebrew */
54 0x005c6 | DIAC_FLAG_RTL, 60 { 0x05c6, DIAC_FLAG_RTL },
55 0x005c7 | DIAC_FLAG_DIACRITIC | DIAC_FLAG_RTL, /* Hebrew */ 61 { 0x05c7, DIAC_FLAG_DIACRITIC | DIAC_FLAG_RTL }, /* Hebrew */
56 0x0060f | DIAC_FLAG_RTL, 62 { 0x060f, DIAC_FLAG_RTL },
57 0x0061a | DIAC_FLAG_DIACRITIC | DIAC_FLAG_RTL, /* Arabic */ 63 { 0x061a, DIAC_FLAG_DIACRITIC | DIAC_FLAG_RTL }, /* Arabic */
58 0x0064a | DIAC_FLAG_RTL, 64 { 0x064a, DIAC_FLAG_RTL },
59 0x0065e | DIAC_FLAG_DIACRITIC | DIAC_FLAG_RTL, /* Arabic */ 65 { 0x065e, DIAC_FLAG_DIACRITIC | DIAC_FLAG_RTL }, /* Arabic */
60 0x0066f | DIAC_FLAG_RTL, 66 { 0x066f, DIAC_FLAG_RTL },
61 0x00670 | DIAC_FLAG_DIACRITIC | DIAC_FLAG_RTL, /* Arabic */ 67 { 0x0670, DIAC_FLAG_DIACRITIC | DIAC_FLAG_RTL }, /* Arabic */
62 0x006d5 | DIAC_FLAG_RTL, 68 { 0x06d5, DIAC_FLAG_RTL },
63 0x006dc | DIAC_FLAG_DIACRITIC | DIAC_FLAG_RTL, /* Arabic */ 69 { 0x06dc, DIAC_FLAG_DIACRITIC | DIAC_FLAG_RTL }, /* Arabic */
64 0x006de | DIAC_FLAG_RTL, 70 { 0x06de, DIAC_FLAG_RTL },
65 0x006e4 | DIAC_FLAG_DIACRITIC | DIAC_FLAG_RTL, /* Arabic */ 71 { 0x06e4, DIAC_FLAG_DIACRITIC | DIAC_FLAG_RTL }, /* Arabic */
66 0x006e6 | DIAC_FLAG_RTL, 72 { 0x06e6, DIAC_FLAG_RTL },
67 0x006e8 | DIAC_FLAG_DIACRITIC | DIAC_FLAG_RTL, /* Arabic */ 73 { 0x06e8, DIAC_FLAG_DIACRITIC | DIAC_FLAG_RTL }, /* Arabic */
68 0x006e9 | DIAC_FLAG_RTL, 74 { 0x06e9, DIAC_FLAG_RTL },
69 0x006ed | DIAC_FLAG_DIACRITIC | DIAC_FLAG_RTL, /* Arabic */ 75 { 0x06ed, DIAC_FLAG_DIACRITIC | DIAC_FLAG_RTL }, /* Arabic */
70 0x00710 | DIAC_FLAG_RTL, 76 { 0x0710, DIAC_FLAG_RTL },
71 0x00711 | DIAC_FLAG_DIACRITIC | DIAC_FLAG_RTL, /* Syriac */ 77 { 0x0711, DIAC_FLAG_DIACRITIC | DIAC_FLAG_RTL }, /* Syriac */
72 0x0072f | DIAC_FLAG_RTL, 78 { 0x072f, DIAC_FLAG_RTL },
73 0x0074a | DIAC_FLAG_DIACRITIC | DIAC_FLAG_RTL, /* Syriac */ 79 { 0x074a, DIAC_FLAG_DIACRITIC | DIAC_FLAG_RTL }, /* Syriac */
74 0x007a5 | DIAC_FLAG_RTL, 80 { 0x07a5, DIAC_FLAG_RTL },
75 0x007b0 | DIAC_FLAG_DIACRITIC | DIAC_FLAG_RTL, /* Thaana */ 81 { 0x07b0, DIAC_FLAG_DIACRITIC | DIAC_FLAG_RTL }, /* Thaana */
76 0x007c0 | DIAC_FLAG_RTL, 82 { 0x07c0, DIAC_FLAG_RTL },
77 0x007ea, 83 { 0x07ea, DIAC_FLAG_NONE },
78 0x007f3 | DIAC_FLAG_DIACRITIC, /* NKo */ 84 { 0x07f3, DIAC_FLAG_DIACRITIC }, /* NKo */
79 0x00815, 85 { 0x0815, DIAC_FLAG_NONE },
80 0x00819 | DIAC_FLAG_DIACRITIC, /* Samaritan */ 86 { 0x0819, DIAC_FLAG_DIACRITIC }, /* Samaritan */
81 0x0081a, 87 { 0x081a, DIAC_FLAG_NONE },
82 0x00823 | DIAC_FLAG_DIACRITIC, /* Samaritan */ 88 { 0x0823, DIAC_FLAG_DIACRITIC }, /* Samaritan */
83 0x00824, 89 { 0x0824, DIAC_FLAG_NONE },
84 0x00827 | DIAC_FLAG_DIACRITIC, /* Samaritan */ 90 { 0x0827, DIAC_FLAG_DIACRITIC }, /* Samaritan */
85 0x00828, 91 { 0x0828, DIAC_FLAG_NONE },
86 0x0082d | DIAC_FLAG_DIACRITIC, /* Samaritan */ 92 { 0x082d, DIAC_FLAG_DIACRITIC }, /* Samaritan */
87 0x008ff, 93 { 0x08ff, DIAC_FLAG_NONE },
88 0x00903 | DIAC_FLAG_DIACRITIC, /* Devanagari */ 94 { 0x0903, DIAC_FLAG_DIACRITIC }, /* Devanagari */
89 0x0093b, 95 { 0x093b, DIAC_FLAG_NONE },
90 0x0093c | DIAC_FLAG_DIACRITIC, /* Devanagari */ 96 { 0x093c, DIAC_FLAG_DIACRITIC }, /* Devanagari */
91 0x0093d, 97 { 0x093d, DIAC_FLAG_NONE },
92 0x0094e | DIAC_FLAG_DIACRITIC, /* Devanagari */ 98 { 0x094e, DIAC_FLAG_DIACRITIC }, /* Devanagari */
93 0x00950, 99 { 0x0950, DIAC_FLAG_NONE },
94 0x00955 | DIAC_FLAG_DIACRITIC, /* Devanagari */ 100 { 0x0955, DIAC_FLAG_DIACRITIC }, /* Devanagari */
95 0x00961, 101 { 0x0961, DIAC_FLAG_NONE },
96 0x00963 | DIAC_FLAG_DIACRITIC, /* Devanagari */ 102 { 0x0963, DIAC_FLAG_DIACRITIC }, /* Devanagari */
97 0x00980, 103 { 0x0980, DIAC_FLAG_NONE },
98 0x00983 | DIAC_FLAG_DIACRITIC, /* Bengali */ 104 { 0x0983, DIAC_FLAG_DIACRITIC }, /* Bengali */
99 0x009bb, 105 { 0x09bb, DIAC_FLAG_NONE },
100 0x009bc | DIAC_FLAG_DIACRITIC, /* Bengali */ 106 { 0x09bc, DIAC_FLAG_DIACRITIC }, /* Bengali */
101 0x009bd, 107 { 0x09bd, DIAC_FLAG_NONE },
102 0x009cd | DIAC_FLAG_DIACRITIC, /* Bengali */ 108 { 0x09cd, DIAC_FLAG_DIACRITIC }, /* Bengali */
103 0x009d6, 109 { 0x09d6, DIAC_FLAG_NONE },
104 0x009d7 | DIAC_FLAG_DIACRITIC, /* Bengali */ 110 { 0x09d7, DIAC_FLAG_DIACRITIC }, /* Bengali */
105 0x009e1, 111 { 0x09e1, DIAC_FLAG_NONE },
106 0x009e3 | DIAC_FLAG_DIACRITIC, /* Bengali */ 112 { 0x09e3, DIAC_FLAG_DIACRITIC }, /* Bengali */
107 0x00a00, 113 { 0x0a00, DIAC_FLAG_NONE },
108 0x00a03 | DIAC_FLAG_DIACRITIC, /* Gurmukhi */ 114 { 0x0a03, DIAC_FLAG_DIACRITIC }, /* Gurmukhi */
109 0x00a3b, 115 { 0x0a3b, DIAC_FLAG_NONE },
110 0x00a51 | DIAC_FLAG_DIACRITIC, /* Gurmukhi */ 116 { 0x0a51, DIAC_FLAG_DIACRITIC }, /* Gurmukhi */
111 0x00a6f, 117 { 0x0a6f, DIAC_FLAG_NONE },
112 0x00a71 | DIAC_FLAG_DIACRITIC, /* Gurmukhi */ 118 { 0x0a71, DIAC_FLAG_DIACRITIC }, /* Gurmukhi */
113 0x00a74, 119 { 0x0a74, DIAC_FLAG_NONE },
114 0x00a75 | DIAC_FLAG_DIACRITIC, /* Gurmukhi */ 120 { 0x0a75, DIAC_FLAG_DIACRITIC }, /* Gurmukhi */
115 0x00a80, 121 { 0x0a80, DIAC_FLAG_NONE },
116 0x00a83 | DIAC_FLAG_DIACRITIC, /* Gujarati */ 122 { 0x0a83, DIAC_FLAG_DIACRITIC }, /* Gujarati */
117 0x00abb, 123 { 0x0abb, DIAC_FLAG_NONE },
118 0x00abc | DIAC_FLAG_DIACRITIC, /* Gujarati */ 124 { 0x0abc, DIAC_FLAG_DIACRITIC }, /* Gujarati */
119 0x00abd, 125 { 0x0abd, DIAC_FLAG_NONE },
120 0x00acd | DIAC_FLAG_DIACRITIC, /* Gujarati */ 126 { 0x0acd, DIAC_FLAG_DIACRITIC }, /* Gujarati */
121 0x00ae1, 127 { 0x0ae1, DIAC_FLAG_NONE },
122 0x00ae3 | DIAC_FLAG_DIACRITIC, /* Gujarati */ 128 { 0x0ae3, DIAC_FLAG_DIACRITIC }, /* Gujarati */
123 0x00b00, 129 { 0x0b00, DIAC_FLAG_NONE },
124 0x00b03 | DIAC_FLAG_DIACRITIC, /* Oriya */ 130 { 0x0b03, DIAC_FLAG_DIACRITIC }, /* Oriya */
125 0x00b3b, 131 { 0x0b3b, DIAC_FLAG_NONE },
126 0x00b3c | DIAC_FLAG_DIACRITIC, /* Oriya */ 132 { 0x0b3c, DIAC_FLAG_DIACRITIC }, /* Oriya */
127 0x00b3d, 133 { 0x0b3d, DIAC_FLAG_NONE },
128 0x00b57 | DIAC_FLAG_DIACRITIC, /* Oriya */ 134 { 0x0b57, DIAC_FLAG_DIACRITIC }, /* Oriya */
129 0x00b81, 135 { 0x0b81, DIAC_FLAG_NONE },
130 0x00b82 | DIAC_FLAG_DIACRITIC, /* Tamil */ 136 { 0x0b82, DIAC_FLAG_DIACRITIC }, /* Tamil */
131 0x00bbd, 137 { 0x0bbd, DIAC_FLAG_NONE },
132 0x00bcd | DIAC_FLAG_DIACRITIC, /* Tamil */ 138 { 0x0bcd, DIAC_FLAG_DIACRITIC }, /* Tamil */
133 0x00bd6, 139 { 0x0bd6, DIAC_FLAG_NONE },
134 0x00bd7 | DIAC_FLAG_DIACRITIC, /* Tamil */ 140 { 0x0bd7, DIAC_FLAG_DIACRITIC }, /* Tamil */
135 0x00c00, 141 { 0x0c00, DIAC_FLAG_NONE },
136 0x00c03 | DIAC_FLAG_DIACRITIC, /* Telugu */ 142 { 0x0c03, DIAC_FLAG_DIACRITIC }, /* Telugu */
137 0x00c3d, 143 { 0x0c3d, DIAC_FLAG_NONE },
138 0x00c56 | DIAC_FLAG_DIACRITIC, /* Telugu */ 144 { 0x0c56, DIAC_FLAG_DIACRITIC }, /* Telugu */
139 0x00c61, 145 { 0x0c61, DIAC_FLAG_NONE },
140 0x00c63 | DIAC_FLAG_DIACRITIC, /* Telugu */ 146 { 0x0c63, DIAC_FLAG_DIACRITIC }, /* Telugu */
141 0x00c81, 147 { 0x0c81, DIAC_FLAG_NONE },
142 0x00c83 | DIAC_FLAG_DIACRITIC, /* Kannada */ 148 { 0x0c83, DIAC_FLAG_DIACRITIC }, /* Kannada */
143 0x00cbb, 149 { 0x0cbb, DIAC_FLAG_NONE },
144 0x00cbc | DIAC_FLAG_DIACRITIC, /* Kannada */ 150 { 0x0cbc, DIAC_FLAG_DIACRITIC }, /* Kannada */
145 0x00cbd, 151 { 0x0cbd, DIAC_FLAG_NONE },
146 0x00cd6 | DIAC_FLAG_DIACRITIC, /* Kannada */ 152 { 0x0cd6, DIAC_FLAG_DIACRITIC }, /* Kannada */
147 0x00ce1, 153 { 0x0ce1, DIAC_FLAG_NONE },
148 0x00ce3 | DIAC_FLAG_DIACRITIC, /* Kannada */ 154 { 0x0ce3, DIAC_FLAG_DIACRITIC }, /* Kannada */
149 0x00d01, 155 { 0x0d01, DIAC_FLAG_NONE },
150 0x00d03 | DIAC_FLAG_DIACRITIC, /* Malayalam */ 156 { 0x0d03, DIAC_FLAG_DIACRITIC }, /* Malayalam */
151 0x00d3d, 157 { 0x0d3d, DIAC_FLAG_NONE },
152 0x00d57 | DIAC_FLAG_DIACRITIC, /* Malayalam */ 158 { 0x0d57, DIAC_FLAG_DIACRITIC }, /* Malayalam */
153 0x00d61, 159 { 0x0d61, DIAC_FLAG_NONE },
154 0x00d63 | DIAC_FLAG_DIACRITIC, /* Malayalam */ 160 { 0x0d63, DIAC_FLAG_DIACRITIC }, /* Malayalam */
155 0x00d81, 161 { 0x0d81, DIAC_FLAG_NONE },
156 0x00d83 | DIAC_FLAG_DIACRITIC, /* Sinhala */ 162 { 0x0d83, DIAC_FLAG_DIACRITIC }, /* Sinhala */
157 0x00dc9, 163 { 0x0dc9, DIAC_FLAG_NONE },
158 0x00df3 | DIAC_FLAG_DIACRITIC, /* Sinhala */ 164 { 0x0df3, DIAC_FLAG_DIACRITIC }, /* Sinhala */
159 0x00e30, 165 { 0x0e30, DIAC_FLAG_NONE },
160 0x00e31 | DIAC_FLAG_DIACRITIC, /* Thai */ 166 { 0x0e31, DIAC_FLAG_DIACRITIC }, /* Thai */
161 0x00e33, 167 { 0x0e33, DIAC_FLAG_NONE },
162 0x00e3a | DIAC_FLAG_DIACRITIC, /* Thai */ 168 { 0x0e3a, DIAC_FLAG_DIACRITIC }, /* Thai */
163 0x00e46, 169 { 0x0e46, DIAC_FLAG_NONE },
164 0x00e4e | DIAC_FLAG_DIACRITIC, /* Thai */ 170 { 0x0e4e, DIAC_FLAG_DIACRITIC }, /* Thai */
165 0x00eb0, 171 { 0x0eb0, DIAC_FLAG_NONE },
166 0x00eb1 | DIAC_FLAG_DIACRITIC, /* Lao */ 172 { 0x0eb1, DIAC_FLAG_DIACRITIC }, /* Lao */
167 0x00eb3, 173 { 0x0eb3, DIAC_FLAG_NONE },
168 0x00ebc | DIAC_FLAG_DIACRITIC, /* Lao */ 174 { 0x0ebc, DIAC_FLAG_DIACRITIC }, /* Lao */
169 0x00ec7, 175 { 0x0ec7, DIAC_FLAG_NONE },
170 0x00ecd | DIAC_FLAG_DIACRITIC, /* Lao */ 176 { 0x0ecd, DIAC_FLAG_DIACRITIC }, /* Lao */
171 0x00f17, 177 { 0x0f17, DIAC_FLAG_NONE },
172 0x00f19 | DIAC_FLAG_DIACRITIC, /* Tibetan */ 178 { 0x0f19, DIAC_FLAG_DIACRITIC }, /* Tibetan */
173 0x00f34, 179 { 0x0f34, DIAC_FLAG_NONE },
174 0x00f35 | DIAC_FLAG_DIACRITIC, /* Tibetan */ 180 { 0x0f35, DIAC_FLAG_DIACRITIC }, /* Tibetan */
175 0x00f36, 181 { 0x0f36, DIAC_FLAG_NONE },
176 0x00f37 | DIAC_FLAG_DIACRITIC, /* Tibetan */ 182 { 0x0f37, DIAC_FLAG_DIACRITIC }, /* Tibetan */
177 0x00f38, 183 { 0x0f38, DIAC_FLAG_NONE },
178 0x00f39 | DIAC_FLAG_DIACRITIC, /* Tibetan */ 184 { 0x0f39, DIAC_FLAG_DIACRITIC }, /* Tibetan */
179 0x00f3d, 185 { 0x0f3d, DIAC_FLAG_NONE },
180 0x00f3f | DIAC_FLAG_DIACRITIC, /* Tibetan */ 186 { 0x0f3f, DIAC_FLAG_DIACRITIC }, /* Tibetan */
181 0x00f70, 187 { 0x0f70, DIAC_FLAG_NONE },
182 0x00f84 | DIAC_FLAG_DIACRITIC, /* Tibetan */ 188 { 0x0f84, DIAC_FLAG_DIACRITIC }, /* Tibetan */
183 0x00f85, 189 { 0x0f85, DIAC_FLAG_NONE },
184 0x00f87 | DIAC_FLAG_DIACRITIC, /* Tibetan */ 190 { 0x0f87, DIAC_FLAG_DIACRITIC }, /* Tibetan */
185 0x00f8f, 191 { 0x0f8f, DIAC_FLAG_NONE },
186 0x00fbc | DIAC_FLAG_DIACRITIC, /* Tibetan */ 192 { 0x0fbc, DIAC_FLAG_DIACRITIC }, /* Tibetan */
187 0x0102a, 193 { 0x102a, DIAC_FLAG_NONE },
188 0x0103e | DIAC_FLAG_DIACRITIC, /* Myanmar */ 194 { 0x103e, DIAC_FLAG_DIACRITIC }, /* Myanmar */
189 0x01055, 195 { 0x1055, DIAC_FLAG_NONE },
190 0x01059 | DIAC_FLAG_DIACRITIC, /* Myanmar */ 196 { 0x1059, DIAC_FLAG_DIACRITIC }, /* Myanmar */
191 0x0105d, 197 { 0x105d, DIAC_FLAG_NONE },
192 0x01060 | DIAC_FLAG_DIACRITIC, /* Myanmar */ 198 { 0x1060, DIAC_FLAG_DIACRITIC }, /* Myanmar */
193 0x01061, 199 { 0x1061, DIAC_FLAG_NONE },
194 0x01064 | DIAC_FLAG_DIACRITIC, /* Myanmar */ 200 { 0x1064, DIAC_FLAG_DIACRITIC }, /* Myanmar */
195 0x01066, 201 { 0x1066, DIAC_FLAG_NONE },
196 0x0106d | DIAC_FLAG_DIACRITIC, /* Myanmar */ 202 { 0x106d, DIAC_FLAG_DIACRITIC }, /* Myanmar */
197 0x01070, 203 { 0x1070, DIAC_FLAG_NONE },
198 0x01074 | DIAC_FLAG_DIACRITIC, /* Myanmar */ 204 { 0x1074, DIAC_FLAG_DIACRITIC }, /* Myanmar */
199 0x01081, 205 { 0x1081, DIAC_FLAG_NONE },
200 0x0108d | DIAC_FLAG_DIACRITIC, /* Myanmar */ 206 { 0x108d, DIAC_FLAG_DIACRITIC }, /* Myanmar */
201 0x0108e, 207 { 0x108e, DIAC_FLAG_NONE },
202 0x0108f | DIAC_FLAG_DIACRITIC, /* Myanmar */ 208 { 0x108f, DIAC_FLAG_DIACRITIC }, /* Myanmar */
203 0x01099, 209 { 0x1099, DIAC_FLAG_NONE },
204 0x0109d | DIAC_FLAG_DIACRITIC, /* Myanmar */ 210 { 0x109d, DIAC_FLAG_DIACRITIC }, /* Myanmar */
205 0x0135e, 211 { 0x135e, DIAC_FLAG_NONE },
206 0x0135f | DIAC_FLAG_DIACRITIC, /* Ethiopic */ 212 { 0x135f, DIAC_FLAG_DIACRITIC }, /* Ethiopic */
207 0x01711, 213 { 0x1711, DIAC_FLAG_NONE },
208 0x01714 | DIAC_FLAG_DIACRITIC, /* Tagalog */ 214 { 0x1714, DIAC_FLAG_DIACRITIC }, /* Tagalog */
209 0x01731, 215 { 0x1731, DIAC_FLAG_NONE },
210 0x01734 | DIAC_FLAG_DIACRITIC, /* Hanunoo */ 216 { 0x1734, DIAC_FLAG_DIACRITIC }, /* Hanunoo */
211 0x01751, 217 { 0x1751, DIAC_FLAG_NONE },
212 0x01753 | DIAC_FLAG_DIACRITIC, /* Buhid */ 218 { 0x1753, DIAC_FLAG_DIACRITIC }, /* Buhid */
213 0x01771, 219 { 0x1771, DIAC_FLAG_NONE },
214 0x01773 | DIAC_FLAG_DIACRITIC, /* Tagbanwa */ 220 { 0x1773, DIAC_FLAG_DIACRITIC }, /* Tagbanwa */
215 0x017b5, 221 { 0x17b5, DIAC_FLAG_NONE },
216 0x017d3 | DIAC_FLAG_DIACRITIC, /* Khmer */ 222 { 0x17d3, DIAC_FLAG_DIACRITIC }, /* Khmer */
217 0x017dc, 223 { 0x17dc, DIAC_FLAG_NONE },
218 0x017dd | DIAC_FLAG_DIACRITIC, /* Khmer */ 224 { 0x17dd, DIAC_FLAG_DIACRITIC }, /* Khmer */
219 0x018a8, 225 { 0x18a8, DIAC_FLAG_NONE },
220 0x018a9 | DIAC_FLAG_DIACRITIC, /* Mongolian */ 226 { 0x18a9, DIAC_FLAG_DIACRITIC }, /* Mongolian */
221 0x0191f, 227 { 0x191f, DIAC_FLAG_NONE },
222 0x0193b | DIAC_FLAG_DIACRITIC, /* Limbu */ 228 { 0x193b, DIAC_FLAG_DIACRITIC }, /* Limbu */
223 0x019af, 229 { 0x19af, DIAC_FLAG_NONE },
224 0x019c0 | DIAC_FLAG_DIACRITIC, /* New Tai Lue */ 230 { 0x19c0, DIAC_FLAG_DIACRITIC }, /* New Tai Lue */
225 0x019c7, 231 { 0x19c7, DIAC_FLAG_NONE },
226 0x019c9 | DIAC_FLAG_DIACRITIC, /* New Tai Lue */ 232 { 0x19c9, DIAC_FLAG_DIACRITIC }, /* New Tai Lue */
227 0x01a16, 233 { 0x1a16, DIAC_FLAG_NONE },
228 0x01a1b | DIAC_FLAG_DIACRITIC, /* Buginese */ 234 { 0x1a1b, DIAC_FLAG_DIACRITIC }, /* Buginese */
229 0x01a54, 235 { 0x1a54, DIAC_FLAG_NONE },
230 0x01a7f | DIAC_FLAG_DIACRITIC, /* Tai Tham */ 236 { 0x1a7f, DIAC_FLAG_DIACRITIC }, /* Tai Tham */
231 0x01aff, 237 { 0x1aff, DIAC_FLAG_NONE },
232 0x01b04 | DIAC_FLAG_DIACRITIC, /* Balinese */ 238 { 0x1b04, DIAC_FLAG_DIACRITIC }, /* Balinese */
233 0x01b33, 239 { 0x1b33, DIAC_FLAG_NONE },
234 0x01b44 | DIAC_FLAG_DIACRITIC, /* Balinese */ 240 { 0x1b44, DIAC_FLAG_DIACRITIC }, /* Balinese */
235 0x01b6a, 241 { 0x1b6a, DIAC_FLAG_NONE },
236 0x01b73 | DIAC_FLAG_DIACRITIC, /* Balinese */ 242 { 0x1b73, DIAC_FLAG_DIACRITIC }, /* Balinese */
237 0x01b7f, 243 { 0x1b7f, DIAC_FLAG_NONE },
238 0x01b82 | DIAC_FLAG_DIACRITIC, /* Sundanese */ 244 { 0x1b82, DIAC_FLAG_DIACRITIC }, /* Sundanese */
239 0x01ba0, 245 { 0x1ba0, DIAC_FLAG_NONE },
240 0x01baa | DIAC_FLAG_DIACRITIC, /* Sundanese */ 246 { 0x1baa, DIAC_FLAG_DIACRITIC }, /* Sundanese */
241 0x01c23, 247 { 0x1c23, DIAC_FLAG_NONE },
242 0x01c37 | DIAC_FLAG_DIACRITIC, /* Lepcha */ 248 { 0x1c37, DIAC_FLAG_DIACRITIC }, /* Lepcha */
243 0x01ccf, 249 { 0x1ccf, DIAC_FLAG_NONE },
244 0x01cd2 | DIAC_FLAG_DIACRITIC, /* Vedic Extensions */ 250 { 0x1cd2, DIAC_FLAG_DIACRITIC }, /* Vedic Extensions */
245 0x01cd3, 251 { 0x1cd3, DIAC_FLAG_NONE },
246 0x01ce8 | DIAC_FLAG_DIACRITIC, /* Vedic Extensions */ 252 { 0x1ce8, DIAC_FLAG_DIACRITIC }, /* Vedic Extensions */
247 0x01cec, 253 { 0x1cec, DIAC_FLAG_NONE },
248 0x01ced | DIAC_FLAG_DIACRITIC, /* Vedic Extensions */ 254 { 0x1ced, DIAC_FLAG_DIACRITIC }, /* Vedic Extensions */
249 0x01cf1, 255 { 0x1cf1, DIAC_FLAG_NONE },
250 0x01cf2 | DIAC_FLAG_DIACRITIC, /* Vedic Extensions */ 256 { 0x1cf2, DIAC_FLAG_DIACRITIC }, /* Vedic Extensions */
251 0x01dbf, 257 { 0x1dbf, DIAC_FLAG_NONE },
252 0x01dff | DIAC_FLAG_DIACRITIC, /* Combining Diacritical Marks Supplement */ 258 { 0x1dff, DIAC_FLAG_DIACRITIC }, /* Combining Diacritical Marks Supplement */
253 0x020cf, 259 { 0x20cf, DIAC_FLAG_NONE },
254 0x020f0 | DIAC_FLAG_DIACRITIC, /* Combining Diacritical Marks for Symbols */ 260 { 0x20f0, DIAC_FLAG_DIACRITIC }, /* Combining Diacritical Marks for Symbols */
255 0x02cee, 261 { 0x2cee, DIAC_FLAG_NONE },
256 0x02cf1 | DIAC_FLAG_DIACRITIC, /* Coptic */ 262 { 0x2cf1, DIAC_FLAG_DIACRITIC }, /* Coptic */
257 0x02ddf, 263 { 0x2ddf, DIAC_FLAG_NONE },
258 0x02dff | DIAC_FLAG_DIACRITIC, /* Coptic */ 264 { 0x2dff, DIAC_FLAG_DIACRITIC }, /* Coptic */
259 0x03029, 265 { 0x3029, DIAC_FLAG_NONE },
260 0x0302f | DIAC_FLAG_DIACRITIC, /* CJK Symbols and Punctuation */ 266 { 0x302f, DIAC_FLAG_DIACRITIC }, /* CJK Symbols and Punctuation */
261 0x03098, 267 { 0x3098, DIAC_FLAG_NONE },
262 0x0309a | DIAC_FLAG_DIACRITIC, /* Hiragana */ 268 { 0x309a, DIAC_FLAG_DIACRITIC }, /* Hiragana */
263 0x0a66e, 269 { 0xa66e, DIAC_FLAG_NONE },
264 0x0a672 | DIAC_FLAG_DIACRITIC, /* Hiragana */ 270 { 0xa672, DIAC_FLAG_DIACRITIC }, /* Hiragana */
265 0x0a67b, 271 { 0xa67b, DIAC_FLAG_NONE },
266 0x0a67d | DIAC_FLAG_DIACRITIC, /* Hiragana */ 272 { 0xa67d, DIAC_FLAG_DIACRITIC }, /* Hiragana */
267 0x0a6ef, 273 { 0xa6ef, DIAC_FLAG_NONE },
268 0x0a6f1 | DIAC_FLAG_DIACRITIC, /* Bamum */ 274 { 0xa6f1, DIAC_FLAG_DIACRITIC }, /* Bamum */
269 0x0a801, 275 { 0xa801, DIAC_FLAG_NONE },
270 0x0a802 | DIAC_FLAG_DIACRITIC, /* Syloti Nagri */ 276 { 0xa802, DIAC_FLAG_DIACRITIC }, /* Syloti Nagri */
271 0x0a805, 277 { 0xa805, DIAC_FLAG_NONE },
272 0x0a806 | DIAC_FLAG_DIACRITIC, /* Syloti Nagri */ 278 { 0xa806, DIAC_FLAG_DIACRITIC }, /* Syloti Nagri */
273 0x0a80a, 279 { 0xa80a, DIAC_FLAG_NONE },
274 0x0a80b | DIAC_FLAG_DIACRITIC, /* Syloti Nagri */ 280 { 0xa80b, DIAC_FLAG_DIACRITIC }, /* Syloti Nagri */
275 0x0a822, 281 { 0xa822, DIAC_FLAG_NONE },
276 0x0a827 | DIAC_FLAG_DIACRITIC, /* Syloti Nagri */ 282 { 0xa827, DIAC_FLAG_DIACRITIC }, /* Syloti Nagri */
277 0x0a87f, 283 { 0xa87f, DIAC_FLAG_NONE },
278 0x0a881 | DIAC_FLAG_DIACRITIC, /* Saurashtra */ 284 { 0xa881, DIAC_FLAG_DIACRITIC }, /* Saurashtra */
279 0x0a8b3, 285 { 0xa8b3, DIAC_FLAG_NONE },
280 0x0a8c4 | DIAC_FLAG_DIACRITIC, /* Saurashtra */ 286 { 0xa8c4, DIAC_FLAG_DIACRITIC }, /* Saurashtra */
281 0x0a8df, 287 { 0xa8df, DIAC_FLAG_NONE },
282 0x0a8f1 | DIAC_FLAG_DIACRITIC, /* Devanagari Extended */ 288 { 0xa8f1, DIAC_FLAG_DIACRITIC }, /* Devanagari Extended */
283 0x0a925, 289 { 0xa925, DIAC_FLAG_NONE },
284 0x0a92d | DIAC_FLAG_DIACRITIC, /* Kayah Li */ 290 { 0xa92d, DIAC_FLAG_DIACRITIC }, /* Kayah Li */
285 0x0a946, 291 { 0xa946, DIAC_FLAG_NONE },
286 0x0a953 | DIAC_FLAG_DIACRITIC, /* Rejang */ 292 { 0xa953, DIAC_FLAG_DIACRITIC }, /* Rejang */
287 0x0a97f, 293 { 0xa97f, DIAC_FLAG_NONE },
288 0x0a983 | DIAC_FLAG_DIACRITIC, /* Javanese */ 294 { 0xa983, DIAC_FLAG_DIACRITIC }, /* Javanese */
289 0x0a9b2, 295 { 0xa9b2, DIAC_FLAG_NONE },
290 0x0a9c0 | DIAC_FLAG_DIACRITIC, /* Javanese */ 296 { 0xa9c0, DIAC_FLAG_DIACRITIC }, /* Javanese */
291 0x0aa28, 297 { 0xaa28, DIAC_FLAG_NONE },
292 0x0aa36 | DIAC_FLAG_DIACRITIC, /* Cham */ 298 { 0xaa36, DIAC_FLAG_DIACRITIC }, /* Cham */
293 0x0aa42, 299 { 0xaa42, DIAC_FLAG_NONE },
294 0x0aa43 | DIAC_FLAG_DIACRITIC, /* Cham */ 300 { 0xaa43, DIAC_FLAG_DIACRITIC }, /* Cham */
295 0x0aa4b, 301 { 0xaa4b, DIAC_FLAG_NONE },
296 0x0aa4d | DIAC_FLAG_DIACRITIC, /* Cham */ 302 { 0xaa4d, DIAC_FLAG_DIACRITIC }, /* Cham */
297 0x0aa7a, 303 { 0xaa7a, DIAC_FLAG_NONE },
298 0x0aa7b | DIAC_FLAG_DIACRITIC, /* Cham */ 304 { 0xaa7b, DIAC_FLAG_DIACRITIC }, /* Cham */
299 0x0aaaf, 305 { 0xaaaf, DIAC_FLAG_NONE },
300 0x0aab0 | DIAC_FLAG_DIACRITIC, /* Tai Viet */ 306 { 0xaab0, DIAC_FLAG_DIACRITIC }, /* Tai Viet */
301 0x0aab1, 307 { 0xaab1, DIAC_FLAG_NONE },
302 0x0aab4 | DIAC_FLAG_DIACRITIC, /* Tai Viet */ 308 { 0xaab4, DIAC_FLAG_DIACRITIC }, /* Tai Viet */
303 0x0aab6, 309 { 0xaab6, DIAC_FLAG_NONE },
304 0x0aab8 | DIAC_FLAG_DIACRITIC, /* Tai Viet */ 310 { 0xaab8, DIAC_FLAG_DIACRITIC }, /* Tai Viet */
305 0x0aabd, 311 { 0xaabd, DIAC_FLAG_NONE },
306 0x0aabf | DIAC_FLAG_DIACRITIC, /* Tai Viet */ 312 { 0xaabf, DIAC_FLAG_DIACRITIC }, /* Tai Viet */
307 0x0aac0, 313 { 0xaac0, DIAC_FLAG_NONE },
308 0x0aac1 | DIAC_FLAG_DIACRITIC, /* Tai Viet */ 314 { 0xaac1, DIAC_FLAG_DIACRITIC }, /* Tai Viet */
309 0x0abe2, 315 { 0xabe2, DIAC_FLAG_NONE },
310 0x0abea | DIAC_FLAG_DIACRITIC, /* Meetei Mayek */ 316 { 0xabea, DIAC_FLAG_DIACRITIC }, /* Meetei Mayek */
311 0x0abeb, 317 { 0xabeb, DIAC_FLAG_NONE },
312 0x0abed | DIAC_FLAG_DIACRITIC, /* Meetei Mayek */ 318 { 0xabed, DIAC_FLAG_DIACRITIC }, /* Meetei Mayek */
313 0x0fb1d, 319 { 0xfb1d, DIAC_FLAG_NONE },
314 0x0fb1e | DIAC_FLAG_DIACRITIC, /* Alphabetic Presentation Forms */ 320 { 0xfb1e, DIAC_FLAG_DIACRITIC }, /* Alphabetic Presentation Forms */
315 0x0fe1f, 321 { 0xfe1f, DIAC_FLAG_NONE },
316 0x0fe26 | DIAC_FLAG_DIACRITIC, /* Combining Half Marks */ 322 { 0xfe26, DIAC_FLAG_DIACRITIC }, /* Combining Half Marks */
317 0x1107f, 323 /* Currently we don't support chars above U-FFFF */
318 0x11082 | DIAC_FLAG_DIACRITIC, /* Kaithi */ 324 { 0xffff, DIAC_FLAG_NONE },
319 0x110af, 325#if 0
320 0x110ba | DIAC_FLAG_DIACRITIC, /* Kaithi */ 326 { 0x1107f, DIAC_FLAG_NONE },
321 0x1d164, 327 { 0x11082, DIAC_FLAG_DIACRITIC }, /* Kaithi */
322 0x1d169 | DIAC_FLAG_DIACRITIC, /* Musical Symbols */ 328 { 0x110af, DIAC_FLAG_NONE },
323 0x1d16c, 329 { 0x110ba, DIAC_FLAG_DIACRITIC }, /* Kaithi */
324 0x1d182 | DIAC_FLAG_DIACRITIC, /* Musical Symbols */ 330 { 0x1d164, DIAC_FLAG_NONE },
325 0x1d184, 331 { 0x1d169, DIAC_FLAG_DIACRITIC }, /* Musical Symbols */
326 0x1d18b | DIAC_FLAG_DIACRITIC, /* Musical Symbols */ 332 { 0x1d16c, DIAC_FLAG_NONE },
327 0x1d1a9, 333 { 0x1d182, DIAC_FLAG_DIACRITIC }, /* Musical Symbols */
328 0x1d1ad | DIAC_FLAG_DIACRITIC, /* Musical Symbols */ 334 { 0x1d184, DIAC_FLAG_NONE },
329 0x1d241, 335 { 0x1d18b, DIAC_FLAG_DIACRITIC }, /* Musical Symbols */
330 0x1d244 | DIAC_FLAG_DIACRITIC, /* Ancient Greek Musical Notation */ 336 { 0x1d1a9, DIAC_FLAG_NONE },
331 0xe01ef, 337 { 0x1d1ad, DIAC_FLAG_DIACRITIC }, /* Musical Symbols */
338 { 0x1d241, DIAC_FLAG_NONE },
339 { 0x1d244, DIAC_FLAG_DIACRITIC }, /* Ancient Greek Musical Notation */
340 { 0xe01ef, DIAC_FLAG_NONE },
341#endif
332}; 342};
333 343
334#define MRU_MAX_LEN 32 344#define MRU_MAX_LEN 32
@@ -336,7 +346,7 @@ static const int diac_range[] =
336static unsigned short mru_len = 0; 346static unsigned short mru_len = 0;
337static unsigned short diacritic_mru[MRU_MAX_LEN]; 347static unsigned short diacritic_mru[MRU_MAX_LEN];
338 348
339int is_diacritic(unsigned short char_code, bool *is_rtl) 349int is_diacritic(const unsigned short char_code, bool *is_rtl)
340{ 350{
341 unsigned short mru, i; 351 unsigned short mru, i;
342 352
diff --git a/firmware/drivers/lcd-bitmap-common.c b/firmware/drivers/lcd-bitmap-common.c
index 4a711d5378..78ceb848d5 100644
--- a/firmware/drivers/lcd-bitmap-common.c
+++ b/firmware/drivers/lcd-bitmap-common.c
@@ -83,11 +83,10 @@ static void lcd_gradient_rect(int x1, int x2, int y, unsigned h,
83/* put a string at a given pixel position, skipping first ofs pixel columns */ 83/* put a string at a given pixel position, skipping first ofs pixel columns */
84static void LCDFN(putsxyofs)(int x, int y, int ofs, const unsigned char *str) 84static void LCDFN(putsxyofs)(int x, int y, int ofs, const unsigned char *str)
85{ 85{
86 unsigned short ch, *ucs; 86 unsigned short *ucs;
87 struct font* pf = font_get(current_vp->font); 87 struct font* pf = font_get(current_vp->font);
88 int vp_flags = current_vp->flags; 88 int vp_flags = current_vp->flags;
89 unsigned i; 89 int rtl_next_non_diac_width, last_non_diacritic_width;
90 static int rtl_next_non_diacritic_width, last_non_diacritic_width;
91 90
92 if ((vp_flags & VP_FLAG_ALIGNMENT_MASK) != 0) 91 if ((vp_flags & VP_FLAG_ALIGNMENT_MASK) != 0)
93 { 92 {
@@ -109,25 +108,23 @@ static void LCDFN(putsxyofs)(int x, int y, int ofs, const unsigned char *str)
109 } 108 }
110 } 109 }
111 110
112 ucs = bidi_l2v(str, 1); 111 rtl_next_non_diac_width = 0;
113
114 rtl_next_non_diacritic_width = 0;
115 last_non_diacritic_width = 0; 112 last_non_diacritic_width = 0;
116 /* Mark diacritic and rtl flags for each character */ 113 /* Mark diacritic and rtl flags for each character */
117 for (i = 0; i < SCROLL_LINE_SIZE && (ch = ucs[i]); i++) 114 for (ucs = bidi_l2v(str, 1); *ucs; ucs++)
118 { 115 {
119 bool is_rtl, is_diac; 116 bool is_rtl, is_diac;
120 const unsigned char *bits; 117 const unsigned char *bits;
121 int width, base_width, drawmode = 0, base_ofs = 0; 118 int width, base_width, drawmode = 0, base_ofs = 0;
122 unsigned short next_ch = ucs[i + 1]; 119 const unsigned short next_ch = ucs[1];
123 120
124 if (x >= current_vp->width) 121 if (x >= current_vp->width)
125 break; 122 break;
126 123
127 is_diac = is_diacritic(ch, &is_rtl); 124 is_diac = is_diacritic(*ucs, &is_rtl);
128 125
129 /* Get proportional width and glyph bits */ 126 /* Get proportional width and glyph bits */
130 width = font_get_width(pf, ch); 127 width = font_get_width(pf, *ucs);
131 128
132 /* Calculate base width */ 129 /* Calculate base width */
133 if (is_rtl) 130 if (is_rtl)
@@ -135,20 +132,20 @@ static void LCDFN(putsxyofs)(int x, int y, int ofs, const unsigned char *str)
135 /* Forward-seek the next non-diacritic character for base width */ 132 /* Forward-seek the next non-diacritic character for base width */
136 if (is_diac) 133 if (is_diac)
137 { 134 {
138 if (!rtl_next_non_diacritic_width) 135 if (!rtl_next_non_diac_width)
139 { 136 {
140 unsigned j; 137 const unsigned short *u;
141 138
142 /* Jump to next non-diacritic char, and calc its width */ 139 /* Jump to next non-diacritic char, and calc its width */
143 for (j = i + 1; ucs[j] && is_diacritic(ucs[j], NULL); j++); 140 for (u = &ucs[1]; *u && is_diacritic(*u, NULL); u++);
144 rtl_next_non_diacritic_width = ucs[j] ? 141
145 font_get_width(pf, ucs[j]) : 0; 142 rtl_next_non_diac_width = *u ? font_get_width(pf, *u) : 0;
146 } 143 }
147 base_width = rtl_next_non_diacritic_width; 144 base_width = rtl_next_non_diac_width;
148 } 145 }
149 else 146 else
150 { 147 {
151 rtl_next_non_diacritic_width = 0; /* Mark */ 148 rtl_next_non_diac_width = 0; /* Mark */
152 base_width = width; 149 base_width = width;
153 } 150 }
154 } 151 }
@@ -188,7 +185,7 @@ static void LCDFN(putsxyofs)(int x, int y, int ofs, const unsigned char *str)
188 base_ofs = (base_width - width) / 2; 185 base_ofs = (base_width - width) / 2;
189 } 186 }
190 187
191 bits = font_get_bits(pf, ch); 188 bits = font_get_bits(pf, *ucs);
192 LCDFN(mono_bitmap_part)(bits, ofs, 0, width, MAX(x + base_ofs, 0), y, 189 LCDFN(mono_bitmap_part)(bits, ofs, 0, width, MAX(x + base_ofs, 0), y,
193 width - ofs, pf->height); 190 width - ofs, pf->height);
194 191
diff --git a/firmware/include/diacritic.h b/firmware/include/diacritic.h
index ebcb3bb79a..5bc275ab9b 100644
--- a/firmware/include/diacritic.h
+++ b/firmware/include/diacritic.h
@@ -22,5 +22,5 @@
22#define _DIACRITIC_H_ 22#define _DIACRITIC_H_
23#include "system.h" 23#include "system.h"
24 24
25int is_diacritic(unsigned short char_code, bool *is_rtl); 25int is_diacritic(const unsigned short char_code, bool *is_rtl);
26#endif 26#endif