2 * GRUB -- GRand Unified Bootloader
3 * Copyright (C) 2010 Free Software Foundation, Inc.
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.
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.
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/>.
19 #ifndef GRUB_BIDI_HEADER
20 #define GRUB_BIDI_HEADER 1
22 #include <grub/types.h>
24 #include <grub/misc.h>
26 struct grub_unicode_bidi_pair
29 grub_uint32_t replace
;
32 struct grub_unicode_compact_range
38 unsigned bidi_mirror
:1;
40 } __attribute__ ((packed
));
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
47 grub_uint32_t isolated
;
48 grub_uint32_t right_linked
;
49 grub_uint32_t both_linked
;
50 grub_uint32_t left_linked
;
53 extern struct grub_unicode_arabic_shape grub_unicode_arabic_shapes
[];
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
90 GRUB_UNICODE_COMB_NONE
= 0,
91 GRUB_UNICODE_COMB_OVERLAY
= 1,
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,
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,
117 GRUB_UNICODE_COMB_ARABIC_SUPERSCRIPT_ALIF
= 35,
118 GRUB_UNICODE_COMB_SYRIAC_SUPERSCRIPT_ALAPH
= 36,
119 GRUB_UNICODE_STACK_ATTACHED_BELOW
= 202,
120 GRUB_UNICODE_STACK_ATTACHED_ABOVE
= 214,
121 GRUB_UNICODE_COMB_ATTACHED_ABOVE_RIGHT
= 216,
122 GRUB_UNICODE_STACK_BELOW
= 220,
123 GRUB_UNICODE_COMB_BELOW_RIGHT
= 222,
124 GRUB_UNICODE_COMB_ABOVE_LEFT
= 228,
125 GRUB_UNICODE_STACK_ABOVE
= 230,
126 GRUB_UNICODE_COMB_ABOVE_RIGHT
= 232,
127 GRUB_UNICODE_COMB_YPOGEGRAMMENI
= 240,
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,
135 /* This structure describes a glyph as opposed to character. */
136 struct grub_unicode_glyph
139 grub_uint16_t variant
:9;
140 grub_uint8_t attributes
:5;
142 grub_size_t orig_pos
;
143 struct grub_unicode_combining
{
145 enum grub_comb_type type
;
147 /* Hint by unicode subsystem how wide this character usually is.
148 Real width is determined by font. Set only in UTF-8 stream. */
152 #define GRUB_UNICODE_GLYPH_ATTRIBUTE_MIRROR 0x1
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)
171 GRUB_UNICODE_DOTLESS_LOWERCASE_I
= 0x0131,
172 GRUB_UNICODE_DOTLESS_LOWERCASE_J
= 0x0237,
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,
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,
197 GRUB_UNICODE_LEFTARROW
= 0x2190,
198 GRUB_UNICODE_UPARROW
= 0x2191,
199 GRUB_UNICODE_RIGHTARROW
= 0x2192,
200 GRUB_UNICODE_DOWNARROW
= 0x2193,
201 GRUB_UNICODE_LIGHT_HLINE
= 0x2500,
202 GRUB_UNICODE_HLINE
= 0x2501,
203 GRUB_UNICODE_LIGHT_VLINE
= 0x2502,
204 GRUB_UNICODE_VLINE
= 0x2503,
205 GRUB_UNICODE_LIGHT_CORNER_UL
= 0x250c,
206 GRUB_UNICODE_CORNER_UL
= 0x250f,
207 GRUB_UNICODE_LIGHT_CORNER_UR
= 0x2510,
208 GRUB_UNICODE_CORNER_UR
= 0x2513,
209 GRUB_UNICODE_LIGHT_CORNER_LL
= 0x2514,
210 GRUB_UNICODE_CORNER_LL
= 0x2517,
211 GRUB_UNICODE_LIGHT_CORNER_LR
= 0x2518,
212 GRUB_UNICODE_CORNER_LR
= 0x251b,
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,
217 GRUB_UNICODE_VARIATION_SELECTOR_1
= 0xfe00,
218 GRUB_UNICODE_VARIATION_SELECTOR_16
= 0xfe0f,
219 GRUB_UNICODE_TAG_START
= 0xe0000,
220 GRUB_UNICODE_TAG_END
= 0xe007f,
221 GRUB_UNICODE_VARIATION_SELECTOR_17
= 0xe0100,
222 GRUB_UNICODE_VARIATION_SELECTOR_256
= 0xe01ef,
223 GRUB_UNICODE_LAST_VALID
= 0x10ffff
226 extern struct grub_unicode_compact_range grub_unicode_compact
[];
227 extern struct grub_unicode_bidi_pair grub_unicode_bidi_pairs
[];
229 #define GRUB_UNICODE_MAX_CACHED_CHAR 0x20000
230 /* Unicode mandates an arbitrary limit. */
231 #define GRUB_BIDI_MAX_EXPLICIT_LEVEL 61
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
),
244 grub_size_t max_width
,
245 grub_size_t start_width
, grub_uint32_t codechar
,
246 struct grub_term_pos
*pos
,
250 grub_unicode_get_comb_type (grub_uint32_t c
);
252 grub_unicode_aglomerate_comb (const grub_uint32_t
*in
, grub_size_t inlen
,
253 struct grub_unicode_glyph
*out
);
255 static inline struct grub_unicode_glyph
*
256 grub_unicode_glyph_dup (const struct grub_unicode_glyph
*in
)
258 struct grub_unicode_glyph
*out
= grub_malloc (sizeof (*out
));
261 grub_memcpy (out
, in
, sizeof (*in
));
264 out
->combining
= grub_malloc (in
->ncomb
* sizeof (out
->combining
[0]));
270 grub_memcpy (out
->combining
, in
->combining
,
271 in
->ncomb
* sizeof (out
->combining
[0]));
276 static inline struct grub_unicode_glyph
*
277 grub_unicode_glyph_from_code (grub_uint32_t code
)
279 struct grub_unicode_glyph
*ret
;
280 ret
= grub_zalloc (sizeof (*ret
));
290 grub_unicode_mirror_code (grub_uint32_t in
);
292 grub_unicode_shape_code (grub_uint32_t in
, grub_uint8_t attr
);
294 const grub_uint32_t
*
295 grub_unicode_get_comb_end (const grub_uint32_t
*end
,
296 const grub_uint32_t
*cur
);