]>
Commit | Line | Data |
---|---|---|
f0cfb703 VS |
1 | /* |
2 | * GRUB -- GRand Unified Bootloader | |
3 | * Copyright (C) 2010 Free Software Foundation, Inc. | |
4 | * | |
5 | * GRUB is free software: you can redistribute it and/or modify | |
6 | * it under the terms of the GNU General Public License as published by | |
7 | * the Free Software Foundation, either version 3 of the License, or | |
8 | * (at your option) any later version. | |
9 | * | |
10 | * GRUB is distributed in the hope that it will be useful, | |
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
13 | * GNU General Public License for more details. | |
14 | * | |
15 | * You should have received a copy of the GNU General Public License | |
16 | * along with GRUB. If not, see <http://www.gnu.org/licenses/>. | |
17 | */ | |
18 | ||
19 | #ifndef GRUB_BIDI_HEADER | |
20 | #define GRUB_BIDI_HEADER 1 | |
21 | ||
22 | #include <grub/types.h> | |
53c648d2 VS |
23 | #include <grub/mm.h> |
24 | #include <grub/misc.h> | |
f0cfb703 | 25 | |
6f5568ed VS |
26 | struct grub_unicode_bidi_pair |
27 | { | |
28 | grub_uint32_t key; | |
29 | grub_uint32_t replace; | |
30 | }; | |
31 | ||
72f12cdc | 32 | struct grub_unicode_compact_range |
f0cfb703 | 33 | { |
5da8dbc5 VS |
34 | unsigned start:21; |
35 | unsigned len:9; | |
36 | unsigned bidi_type:5; | |
37 | unsigned comb_type:8; | |
38 | unsigned bidi_mirror:1; | |
39 | unsigned join_type:3; | |
f0cfb703 VS |
40 | } __attribute__ ((packed)); |
41 | ||
3f11c713 VS |
42 | /* Old-style Arabic shaping. Used for "visual UTF-8" and |
43 | in grub-mkfont to find variant glyphs in absence of GPOS tables. */ | |
44 | struct grub_unicode_arabic_shape | |
45 | { | |
46 | grub_uint32_t code; | |
47 | grub_uint32_t isolated; | |
48 | grub_uint32_t right_linked; | |
49 | grub_uint32_t both_linked; | |
50 | grub_uint32_t left_linked; | |
51 | }; | |
52 | ||
53 | extern struct grub_unicode_arabic_shape grub_unicode_arabic_shapes[]; | |
54 | ||
f0cfb703 VS |
55 | enum grub_bidi_type |
56 | { | |
57 | GRUB_BIDI_TYPE_L = 0, | |
58 | GRUB_BIDI_TYPE_LRE, | |
59 | GRUB_BIDI_TYPE_LRO, | |
60 | GRUB_BIDI_TYPE_R, | |
61 | GRUB_BIDI_TYPE_AL, | |
62 | GRUB_BIDI_TYPE_RLE, | |
63 | GRUB_BIDI_TYPE_RLO, | |
64 | GRUB_BIDI_TYPE_PDF, | |
65 | GRUB_BIDI_TYPE_EN, | |
66 | GRUB_BIDI_TYPE_ES, | |
67 | GRUB_BIDI_TYPE_ET, | |
68 | GRUB_BIDI_TYPE_AN, | |
69 | GRUB_BIDI_TYPE_CS, | |
70 | GRUB_BIDI_TYPE_NSM, | |
71 | GRUB_BIDI_TYPE_BN, | |
72 | GRUB_BIDI_TYPE_B, | |
73 | GRUB_BIDI_TYPE_S, | |
74 | GRUB_BIDI_TYPE_WS, | |
75 | GRUB_BIDI_TYPE_ON | |
76 | }; | |
77 | ||
03e4ef02 VS |
78 | enum grub_join_type |
79 | { | |
80 | GRUB_JOIN_TYPE_NONJOINING = 0, | |
81 | GRUB_JOIN_TYPE_LEFT = 1, | |
82 | GRUB_JOIN_TYPE_RIGHT = 2, | |
83 | GRUB_JOIN_TYPE_DUAL = 3, | |
84 | GRUB_JOIN_TYPE_CAUSING = 4, | |
85 | GRUB_JOIN_TYPE_TRANSPARENT = 5 | |
86 | }; | |
87 | ||
72f12cdc VS |
88 | enum grub_comb_type |
89 | { | |
0a239a82 | 90 | GRUB_UNICODE_COMB_NONE = 0, |
82c5d8dc | 91 | GRUB_UNICODE_COMB_OVERLAY = 1, |
832d1370 VS |
92 | GRUB_UNICODE_COMB_HEBREW_SHEVA = 10, |
93 | GRUB_UNICODE_COMB_HEBREW_HATAF_SEGOL = 11, | |
94 | GRUB_UNICODE_COMB_HEBREW_HATAF_PATAH = 12, | |
95 | GRUB_UNICODE_COMB_HEBREW_HATAF_QAMATS = 13, | |
96 | GRUB_UNICODE_COMB_HEBREW_HIRIQ = 14, | |
97 | GRUB_UNICODE_COMB_HEBREW_TSERE = 15, | |
98 | GRUB_UNICODE_COMB_HEBREW_SEGOL = 16, | |
99 | GRUB_UNICODE_COMB_HEBREW_PATAH = 17, | |
100 | GRUB_UNICODE_COMB_HEBREW_QAMATS = 18, | |
101 | GRUB_UNICODE_COMB_HEBREW_HOLAM = 19, | |
102 | GRUB_UNICODE_COMB_HEBREW_QUBUTS = 20, | |
103 | GRUB_UNICODE_COMB_HEBREW_DAGESH = 21, | |
104 | GRUB_UNICODE_COMB_HEBREW_METEG = 22, | |
105 | GRUB_UNICODE_COMB_HEBREW_RAFE = 23, | |
106 | GRUB_UNICODE_COMB_HEBREW_SHIN_DOT = 24, | |
107 | GRUB_UNICODE_COMB_HEBREW_SIN_DOT = 25, | |
108 | GRUB_UNICODE_COMB_HEBREW_VARIKA = 26, | |
ad109fe0 VS |
109 | GRUB_UNICODE_COMB_ARABIC_FATHATAN = 27, |
110 | GRUB_UNICODE_COMB_ARABIC_DAMMATAN = 28, | |
111 | GRUB_UNICODE_COMB_ARABIC_KASRATAN = 29, | |
112 | GRUB_UNICODE_COMB_ARABIC_FATHAH = 30, | |
113 | GRUB_UNICODE_COMB_ARABIC_DAMMAH = 31, | |
114 | GRUB_UNICODE_COMB_ARABIC_KASRA = 32, | |
115 | GRUB_UNICODE_COMB_ARABIC_SHADDA = 33, | |
116 | GRUB_UNICODE_COMB_ARABIC_SUKUN = 34, | |
e2588ccb VS |
117 | GRUB_UNICODE_COMB_ARABIC_SUPERSCRIPT_ALIF = 35, |
118 | GRUB_UNICODE_COMB_SYRIAC_SUPERSCRIPT_ALAPH = 36, | |
82c5d8dc VS |
119 | GRUB_UNICODE_STACK_ATTACHED_BELOW = 202, |
120 | GRUB_UNICODE_STACK_ATTACHED_ABOVE = 214, | |
4361ca1c | 121 | GRUB_UNICODE_COMB_ATTACHED_ABOVE_RIGHT = 216, |
72f12cdc | 122 | GRUB_UNICODE_STACK_BELOW = 220, |
45511ee9 | 123 | GRUB_UNICODE_COMB_BELOW_RIGHT = 222, |
7624beba | 124 | GRUB_UNICODE_COMB_ABOVE_LEFT = 228, |
72f12cdc | 125 | GRUB_UNICODE_STACK_ABOVE = 230, |
4361ca1c | 126 | GRUB_UNICODE_COMB_ABOVE_RIGHT = 232, |
9d9dca02 | 127 | GRUB_UNICODE_COMB_YPOGEGRAMMENI = 240, |
72f12cdc VS |
128 | /* If combining nature is indicated only by class and |
129 | not "combining type". */ | |
130 | GRUB_UNICODE_COMB_ME = 253, | |
131 | GRUB_UNICODE_COMB_MC = 254, | |
132 | GRUB_UNICODE_COMB_MN = 255, | |
133 | }; | |
134 | ||
135 | /* This structure describes a glyph as opposed to character. */ | |
136 | struct grub_unicode_glyph | |
137 | { | |
138 | grub_uint32_t base; | |
97ea65d4 | 139 | grub_uint16_t variant:9; |
03e4ef02 | 140 | grub_uint8_t attributes:5; |
72f12cdc | 141 | grub_size_t ncomb; |
34f71cb8 | 142 | grub_size_t orig_pos; |
53c648d2 VS |
143 | struct grub_unicode_combining { |
144 | grub_uint32_t code; | |
145 | enum grub_comb_type type; | |
146 | } *combining; | |
50186d82 VS |
147 | /* Hint by unicode subsystem how wide this character usually is. |
148 | Real width is determined by font. Set only in UTF-8 stream. */ | |
149 | int estimated_width; | |
72f12cdc VS |
150 | }; |
151 | ||
97ea65d4 | 152 | #define GRUB_UNICODE_GLYPH_ATTRIBUTE_MIRROR 0x1 |
03e4ef02 VS |
153 | #define GRUB_UNICODE_GLYPH_ATTRIBUTES_JOIN_LEFT_TO_RIGHT_SHIFT 1 |
154 | #define GRUB_UNICODE_GLYPH_ATTRIBUTE_LEFT_JOINED 0x2 | |
155 | #define GRUB_UNICODE_GLYPH_ATTRIBUTE_RIGHT_JOINED \ | |
156 | (GRUB_UNICODE_GLYPH_ATTRIBUTE_LEFT_JOINED \ | |
157 | << GRUB_UNICODE_GLYPH_ATTRIBUTES_JOIN_LEFT_TO_RIGHT_SHIFT) | |
158 | /* Set iff the corresponding joining flags come from ZWJ or ZWNJ. */ | |
159 | #define GRUB_UNICODE_GLYPH_ATTRIBUTE_LEFT_JOINED_EXPLICIT 0x8 | |
160 | #define GRUB_UNICODE_GLYPH_ATTRIBUTE_RIGHT_JOINED_EXPLICIT \ | |
161 | (GRUB_UNICODE_GLYPH_ATTRIBUTE_LEFT_JOINED_EXPLICIT \ | |
162 | << GRUB_UNICODE_GLYPH_ATTRIBUTES_JOIN_LEFT_TO_RIGHT_SHIFT) | |
163 | #define GRUB_UNICODE_GLYPH_ATTRIBUTES_JOIN \ | |
164 | (GRUB_UNICODE_GLYPH_ATTRIBUTE_LEFT_JOINED \ | |
165 | | GRUB_UNICODE_GLYPH_ATTRIBUTE_RIGHT_JOINED \ | |
166 | | GRUB_UNICODE_GLYPH_ATTRIBUTE_LEFT_JOINED_EXPLICIT \ | |
167 | | GRUB_UNICODE_GLYPH_ATTRIBUTE_RIGHT_JOINED_EXPLICIT) | |
168 | ||
483c5e7d VS |
169 | enum |
170 | { | |
4e5a96b0 VS |
171 | GRUB_UNICODE_DOTLESS_LOWERCASE_I = 0x0131, |
172 | GRUB_UNICODE_DOTLESS_LOWERCASE_J = 0x0237, | |
483c5e7d VS |
173 | GRUB_UNICODE_COMBINING_GRAPHEME_JOINER = 0x034f, |
174 | GRUB_UNICODE_HEBREW_WAW = 0x05d5, | |
175 | GRUB_UNICODE_ARABIC_START = 0x0600, | |
176 | GRUB_UNICODE_ARABIC_END = 0x0700, | |
177 | GRUB_UNICODE_THAANA_ABAFILI = 0x07a6, | |
178 | GRUB_UNICODE_THAANA_AABAAFILI = 0x07a7, | |
179 | GRUB_UNICODE_THAANA_IBIFILI = 0x07a8, | |
180 | GRUB_UNICODE_THAANA_EEBEEFILI = 0x07a9, | |
181 | GRUB_UNICODE_THAANA_UBUFILI = 0x07aa, | |
182 | GRUB_UNICODE_THAANA_OOBOOFILI = 0x07ab, | |
183 | GRUB_UNICODE_THAANA_EBEFILI = 0x07ac, | |
184 | GRUB_UNICODE_THAANA_EYBEYFILI = 0x07ad, | |
185 | GRUB_UNICODE_THAANA_OBOFILI = 0x07ae, | |
186 | GRUB_UNICODE_THAANA_OABOAFILI = 0x07af, | |
187 | GRUB_UNICODE_THAANA_SUKUN = 0x07b0, | |
188 | GRUB_UNICODE_ZWNJ = 0x200c, | |
189 | GRUB_UNICODE_ZWJ = 0x200d, | |
34f71cb8 VS |
190 | GRUB_UNICODE_LRM = 0x200e, |
191 | GRUB_UNICODE_RLM = 0x200f, | |
192 | GRUB_UNICODE_LRE = 0x202a, | |
193 | GRUB_UNICODE_RLE = 0x202b, | |
194 | GRUB_UNICODE_PDF = 0x202c, | |
195 | GRUB_UNICODE_LRO = 0x202d, | |
196 | GRUB_UNICODE_RLO = 0x202e, | |
b764bff2 VS |
197 | GRUB_UNICODE_LEFTARROW = 0x2190, |
198 | GRUB_UNICODE_UPARROW = 0x2191, | |
199 | GRUB_UNICODE_RIGHTARROW = 0x2192, | |
200 | GRUB_UNICODE_DOWNARROW = 0x2193, | |
d7fd78dc | 201 | GRUB_UNICODE_LIGHT_HLINE = 0x2500, |
b764bff2 | 202 | GRUB_UNICODE_HLINE = 0x2501, |
d7fd78dc | 203 | GRUB_UNICODE_LIGHT_VLINE = 0x2502, |
b764bff2 | 204 | GRUB_UNICODE_VLINE = 0x2503, |
d7fd78dc | 205 | GRUB_UNICODE_LIGHT_CORNER_UL = 0x250c, |
b764bff2 | 206 | GRUB_UNICODE_CORNER_UL = 0x250f, |
d7fd78dc | 207 | GRUB_UNICODE_LIGHT_CORNER_UR = 0x2510, |
b764bff2 | 208 | GRUB_UNICODE_CORNER_UR = 0x2513, |
d7fd78dc | 209 | GRUB_UNICODE_LIGHT_CORNER_LL = 0x2514, |
b764bff2 | 210 | GRUB_UNICODE_CORNER_LL = 0x2517, |
d7fd78dc | 211 | GRUB_UNICODE_LIGHT_CORNER_LR = 0x2518, |
b764bff2 | 212 | GRUB_UNICODE_CORNER_LR = 0x251b, |
d7fd78dc VS |
213 | GRUB_UNICODE_BLACK_UP_TRIANGLE = 0x25b2, |
214 | GRUB_UNICODE_BLACK_RIGHT_TRIANGLE = 0x25ba, | |
215 | GRUB_UNICODE_BLACK_DOWN_TRIANGLE = 0x25bc, | |
216 | GRUB_UNICODE_BLACK_LEFT_TRIANGLE = 0x25c4, | |
483c5e7d VS |
217 | GRUB_UNICODE_VARIATION_SELECTOR_1 = 0xfe00, |
218 | GRUB_UNICODE_VARIATION_SELECTOR_16 = 0xfe0f, | |
f3cb4a4e VS |
219 | GRUB_UNICODE_TAG_START = 0xe0000, |
220 | GRUB_UNICODE_TAG_END = 0xe007f, | |
483c5e7d | 221 | GRUB_UNICODE_VARIATION_SELECTOR_17 = 0xe0100, |
f3cb4a4e VS |
222 | GRUB_UNICODE_VARIATION_SELECTOR_256 = 0xe01ef, |
223 | GRUB_UNICODE_LAST_VALID = 0x10ffff | |
483c5e7d | 224 | }; |
72f12cdc VS |
225 | |
226 | extern struct grub_unicode_compact_range grub_unicode_compact[]; | |
6f5568ed | 227 | extern struct grub_unicode_bidi_pair grub_unicode_bidi_pairs[]; |
f0cfb703 | 228 | |
72f12cdc | 229 | #define GRUB_UNICODE_MAX_CACHED_CHAR 0x20000 |
f0cfb703 VS |
230 | /* Unicode mandates an arbitrary limit. */ |
231 | #define GRUB_BIDI_MAX_EXPLICIT_LEVEL 61 | |
232 | ||
34f71cb8 VS |
233 | struct grub_term_pos |
234 | { | |
235 | unsigned valid:1; | |
236 | unsigned x:15, y:16; | |
237 | }; | |
238 | ||
0a239a82 VS |
239 | grub_ssize_t |
240 | grub_bidi_logical_to_visual (const grub_uint32_t *logical, | |
241 | grub_size_t logical_len, | |
242 | struct grub_unicode_glyph **visual_out, | |
243 | grub_ssize_t (*getcharwidth) (const struct grub_unicode_glyph *visual), | |
97b3fbb8 | 244 | grub_size_t max_width, |
34f71cb8 VS |
245 | grub_size_t start_width, grub_uint32_t codechar, |
246 | struct grub_term_pos *pos, | |
247 | int primitive_wrap); | |
0a239a82 VS |
248 | |
249 | enum grub_comb_type | |
250 | grub_unicode_get_comb_type (grub_uint32_t c); | |
251 | grub_size_t | |
252 | grub_unicode_aglomerate_comb (const grub_uint32_t *in, grub_size_t inlen, | |
253 | struct grub_unicode_glyph *out); | |
53c648d2 VS |
254 | |
255 | static inline struct grub_unicode_glyph * | |
256 | grub_unicode_glyph_dup (const struct grub_unicode_glyph *in) | |
257 | { | |
258 | struct grub_unicode_glyph *out = grub_malloc (sizeof (*out)); | |
259 | if (!out) | |
260 | return NULL; | |
261 | grub_memcpy (out, in, sizeof (*in)); | |
eaa1f9a6 | 262 | if (in->combining) |
53c648d2 | 263 | { |
e1bd676b | 264 | out->combining = grub_malloc (in->ncomb * sizeof (out->combining[0])); |
eaa1f9a6 VS |
265 | if (!out->combining) |
266 | { | |
267 | grub_free (out); | |
268 | return NULL; | |
269 | } | |
e1bd676b VS |
270 | grub_memcpy (out->combining, in->combining, |
271 | in->ncomb * sizeof (out->combining[0])); | |
53c648d2 | 272 | } |
53c648d2 VS |
273 | return out; |
274 | } | |
275 | ||
276 | static inline struct grub_unicode_glyph * | |
277 | grub_unicode_glyph_from_code (grub_uint32_t code) | |
278 | { | |
279 | struct grub_unicode_glyph *ret; | |
50186d82 | 280 | ret = grub_zalloc (sizeof (*ret)); |
53c648d2 VS |
281 | if (!ret) |
282 | return NULL; | |
283 | ||
284 | ret->base = code; | |
53c648d2 VS |
285 | |
286 | return ret; | |
287 | } | |
0a239a82 | 288 | |
09f9aa3b VS |
289 | grub_uint32_t |
290 | grub_unicode_mirror_code (grub_uint32_t in); | |
a82890ff VS |
291 | grub_uint32_t |
292 | grub_unicode_shape_code (grub_uint32_t in, grub_uint8_t attr); | |
09f9aa3b | 293 | |
34f71cb8 VS |
294 | const grub_uint32_t * |
295 | grub_unicode_get_comb_end (const grub_uint32_t *end, | |
296 | const grub_uint32_t *cur); | |
297 | ||
f0cfb703 | 298 | #endif |