]> git.proxmox.com Git - grub2.git/blame - include/grub/unicode.h
Improve bidi handling in entry editor.
[grub2.git] / include / grub / unicode.h
CommitLineData
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
26struct grub_unicode_bidi_pair
27{
28 grub_uint32_t key;
29 grub_uint32_t replace;
30};
31
72f12cdc 32struct 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. */
44struct 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
53extern struct grub_unicode_arabic_shape grub_unicode_arabic_shapes[];
54
f0cfb703
VS
55enum 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
78enum 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
88enum 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. */
136struct 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
169enum
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
226extern struct grub_unicode_compact_range grub_unicode_compact[];
6f5568ed 227extern 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
233struct grub_term_pos
234{
235 unsigned valid:1;
236 unsigned x:15, y:16;
237};
238
0a239a82
VS
239grub_ssize_t
240grub_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
249enum grub_comb_type
250grub_unicode_get_comb_type (grub_uint32_t c);
251grub_size_t
252grub_unicode_aglomerate_comb (const grub_uint32_t *in, grub_size_t inlen,
253 struct grub_unicode_glyph *out);
53c648d2
VS
254
255static inline struct grub_unicode_glyph *
256grub_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
276static inline struct grub_unicode_glyph *
277grub_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
289grub_uint32_t
290grub_unicode_mirror_code (grub_uint32_t in);
a82890ff
VS
291grub_uint32_t
292grub_unicode_shape_code (grub_uint32_t in, grub_uint8_t attr);
09f9aa3b 293
34f71cb8
VS
294const grub_uint32_t *
295grub_unicode_get_comb_end (const grub_uint32_t *end,
296 const grub_uint32_t *cur);
297
f0cfb703 298#endif