2N/A/*
2N/A * GRUB -- GRand Unified Bootloader
2N/A * Copyright (C) 2010 Free Software Foundation, Inc.
2N/A *
2N/A * GRUB is free software: you can redistribute it and/or modify
2N/A * it under the terms of the GNU General Public License as published by
2N/A * the Free Software Foundation, either version 3 of the License, or
2N/A * (at your option) any later version.
2N/A *
2N/A * GRUB is distributed in the hope that it will be useful,
2N/A * but WITHOUT ANY WARRANTY; without even the implied warranty of
2N/A * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2N/A * GNU General Public License for more details.
2N/A *
2N/A * You should have received a copy of the GNU General Public License
2N/A * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
2N/A */
2N/A
2N/A#ifndef GRUB_BIDI_HEADER
2N/A#define GRUB_BIDI_HEADER 1
2N/A
2N/A#include <grub/types.h>
2N/A#include <grub/mm.h>
2N/A#include <grub/misc.h>
2N/A
2N/Astruct grub_unicode_bidi_pair
2N/A{
2N/A grub_uint32_t key;
2N/A grub_uint32_t replace;
2N/A};
2N/A
2N/Astruct grub_unicode_compact_range
2N/A{
2N/A unsigned start:21;
2N/A unsigned len:9;
2N/A unsigned bidi_type:5;
2N/A unsigned comb_type:8;
2N/A unsigned bidi_mirror:1;
2N/A unsigned join_type:3;
2N/A} __attribute__ ((packed));
2N/A
2N/A/* Old-style Arabic shaping. Used for "visual UTF-8" and
2N/A in grub-mkfont to find variant glyphs in absence of GPOS tables. */
2N/Astruct grub_unicode_arabic_shape
2N/A{
2N/A grub_uint32_t code;
2N/A grub_uint32_t isolated;
2N/A grub_uint32_t right_linked;
2N/A grub_uint32_t both_linked;
2N/A grub_uint32_t left_linked;
2N/A};
2N/A
2N/Aextern struct grub_unicode_arabic_shape grub_unicode_arabic_shapes[];
2N/A
2N/Aenum grub_bidi_type
2N/A {
2N/A GRUB_BIDI_TYPE_L = 0,
2N/A GRUB_BIDI_TYPE_LRE,
2N/A GRUB_BIDI_TYPE_LRO,
2N/A GRUB_BIDI_TYPE_R,
2N/A GRUB_BIDI_TYPE_AL,
2N/A GRUB_BIDI_TYPE_RLE,
2N/A GRUB_BIDI_TYPE_RLO,
2N/A GRUB_BIDI_TYPE_PDF,
2N/A GRUB_BIDI_TYPE_EN,
2N/A GRUB_BIDI_TYPE_ES,
2N/A GRUB_BIDI_TYPE_ET,
2N/A GRUB_BIDI_TYPE_AN,
2N/A GRUB_BIDI_TYPE_CS,
2N/A GRUB_BIDI_TYPE_NSM,
2N/A GRUB_BIDI_TYPE_BN,
2N/A GRUB_BIDI_TYPE_B,
2N/A GRUB_BIDI_TYPE_S,
2N/A GRUB_BIDI_TYPE_WS,
2N/A GRUB_BIDI_TYPE_ON
2N/A };
2N/A
2N/Aenum grub_join_type
2N/A {
2N/A GRUB_JOIN_TYPE_NONJOINING = 0,
2N/A GRUB_JOIN_TYPE_LEFT = 1,
2N/A GRUB_JOIN_TYPE_RIGHT = 2,
2N/A GRUB_JOIN_TYPE_DUAL = 3,
2N/A GRUB_JOIN_TYPE_CAUSING = 4,
2N/A GRUB_JOIN_TYPE_TRANSPARENT = 5
2N/A };
2N/A
2N/Aenum grub_comb_type
2N/A {
2N/A GRUB_UNICODE_COMB_NONE = 0,
2N/A GRUB_UNICODE_COMB_OVERLAY = 1,
2N/A GRUB_UNICODE_COMB_HEBREW_SHEVA = 10,
2N/A GRUB_UNICODE_COMB_HEBREW_HATAF_SEGOL = 11,
2N/A GRUB_UNICODE_COMB_HEBREW_HATAF_PATAH = 12,
2N/A GRUB_UNICODE_COMB_HEBREW_HATAF_QAMATS = 13,
2N/A GRUB_UNICODE_COMB_HEBREW_HIRIQ = 14,
2N/A GRUB_UNICODE_COMB_HEBREW_TSERE = 15,
2N/A GRUB_UNICODE_COMB_HEBREW_SEGOL = 16,
2N/A GRUB_UNICODE_COMB_HEBREW_PATAH = 17,
2N/A GRUB_UNICODE_COMB_HEBREW_QAMATS = 18,
2N/A GRUB_UNICODE_COMB_HEBREW_HOLAM = 19,
2N/A GRUB_UNICODE_COMB_HEBREW_QUBUTS = 20,
2N/A GRUB_UNICODE_COMB_HEBREW_DAGESH = 21,
2N/A GRUB_UNICODE_COMB_HEBREW_METEG = 22,
2N/A GRUB_UNICODE_COMB_HEBREW_RAFE = 23,
2N/A GRUB_UNICODE_COMB_HEBREW_SHIN_DOT = 24,
2N/A GRUB_UNICODE_COMB_HEBREW_SIN_DOT = 25,
2N/A GRUB_UNICODE_COMB_HEBREW_VARIKA = 26,
2N/A GRUB_UNICODE_COMB_ARABIC_FATHATAN = 27,
2N/A GRUB_UNICODE_COMB_ARABIC_DAMMATAN = 28,
2N/A GRUB_UNICODE_COMB_ARABIC_KASRATAN = 29,
2N/A GRUB_UNICODE_COMB_ARABIC_FATHAH = 30,
2N/A GRUB_UNICODE_COMB_ARABIC_DAMMAH = 31,
2N/A GRUB_UNICODE_COMB_ARABIC_KASRA = 32,
2N/A GRUB_UNICODE_COMB_ARABIC_SHADDA = 33,
2N/A GRUB_UNICODE_COMB_ARABIC_SUKUN = 34,
2N/A GRUB_UNICODE_COMB_ARABIC_SUPERSCRIPT_ALIF = 35,
2N/A GRUB_UNICODE_COMB_SYRIAC_SUPERSCRIPT_ALAPH = 36,
2N/A GRUB_UNICODE_STACK_ATTACHED_BELOW = 202,
2N/A GRUB_UNICODE_STACK_ATTACHED_ABOVE = 214,
2N/A GRUB_UNICODE_COMB_ATTACHED_ABOVE_RIGHT = 216,
2N/A GRUB_UNICODE_STACK_BELOW = 220,
2N/A GRUB_UNICODE_COMB_BELOW_RIGHT = 222,
2N/A GRUB_UNICODE_COMB_ABOVE_LEFT = 228,
2N/A GRUB_UNICODE_STACK_ABOVE = 230,
2N/A GRUB_UNICODE_COMB_ABOVE_RIGHT = 232,
2N/A GRUB_UNICODE_COMB_YPOGEGRAMMENI = 240,
2N/A /* If combining nature is indicated only by class and
2N/A not "combining type". */
2N/A GRUB_UNICODE_COMB_ME = 253,
2N/A GRUB_UNICODE_COMB_MC = 254,
2N/A GRUB_UNICODE_COMB_MN = 255,
2N/A };
2N/A
2N/A/* This structure describes a glyph as opposed to character. */
2N/Astruct grub_unicode_glyph
2N/A{
2N/A grub_uint32_t base;
2N/A grub_uint16_t variant:9;
2N/A grub_uint8_t attributes:5;
2N/A grub_size_t ncomb;
2N/A struct grub_unicode_combining {
2N/A grub_uint32_t code;
2N/A enum grub_comb_type type;
2N/A } *combining;
2N/A /* Hint by unicode subsystem how wide this character usually is.
2N/A Real width is determined by font. Set only in UTF-8 stream. */
2N/A int estimated_width;
2N/A};
2N/A
2N/A#define GRUB_UNICODE_GLYPH_ATTRIBUTE_MIRROR 0x1
2N/A#define GRUB_UNICODE_GLYPH_ATTRIBUTES_JOIN_LEFT_TO_RIGHT_SHIFT 1
2N/A#define GRUB_UNICODE_GLYPH_ATTRIBUTE_LEFT_JOINED 0x2
2N/A#define GRUB_UNICODE_GLYPH_ATTRIBUTE_RIGHT_JOINED \
2N/A (GRUB_UNICODE_GLYPH_ATTRIBUTE_LEFT_JOINED \
2N/A << GRUB_UNICODE_GLYPH_ATTRIBUTES_JOIN_LEFT_TO_RIGHT_SHIFT)
2N/A/* Set iff the corresponding joining flags come from ZWJ or ZWNJ. */
2N/A#define GRUB_UNICODE_GLYPH_ATTRIBUTE_LEFT_JOINED_EXPLICIT 0x8
2N/A#define GRUB_UNICODE_GLYPH_ATTRIBUTE_RIGHT_JOINED_EXPLICIT \
2N/A (GRUB_UNICODE_GLYPH_ATTRIBUTE_LEFT_JOINED_EXPLICIT \
2N/A << GRUB_UNICODE_GLYPH_ATTRIBUTES_JOIN_LEFT_TO_RIGHT_SHIFT)
2N/A#define GRUB_UNICODE_GLYPH_ATTRIBUTES_JOIN \
2N/A (GRUB_UNICODE_GLYPH_ATTRIBUTE_LEFT_JOINED \
2N/A | GRUB_UNICODE_GLYPH_ATTRIBUTE_RIGHT_JOINED \
2N/A | GRUB_UNICODE_GLYPH_ATTRIBUTE_LEFT_JOINED_EXPLICIT \
2N/A | GRUB_UNICODE_GLYPH_ATTRIBUTE_RIGHT_JOINED_EXPLICIT)
2N/A
2N/Aenum
2N/A {
2N/A GRUB_UNICODE_COMBINING_GRAPHEME_JOINER = 0x034f,
2N/A GRUB_UNICODE_HEBREW_WAW = 0x05d5,
2N/A GRUB_UNICODE_ARABIC_START = 0x0600,
2N/A GRUB_UNICODE_ARABIC_END = 0x0700,
2N/A GRUB_UNICODE_THAANA_ABAFILI = 0x07a6,
2N/A GRUB_UNICODE_THAANA_AABAAFILI = 0x07a7,
2N/A GRUB_UNICODE_THAANA_IBIFILI = 0x07a8,
2N/A GRUB_UNICODE_THAANA_EEBEEFILI = 0x07a9,
2N/A GRUB_UNICODE_THAANA_UBUFILI = 0x07aa,
2N/A GRUB_UNICODE_THAANA_OOBOOFILI = 0x07ab,
2N/A GRUB_UNICODE_THAANA_EBEFILI = 0x07ac,
2N/A GRUB_UNICODE_THAANA_EYBEYFILI = 0x07ad,
2N/A GRUB_UNICODE_THAANA_OBOFILI = 0x07ae,
2N/A GRUB_UNICODE_THAANA_OABOAFILI = 0x07af,
2N/A GRUB_UNICODE_THAANA_SUKUN = 0x07b0,
2N/A GRUB_UNICODE_ZWNJ = 0x200c,
2N/A GRUB_UNICODE_ZWJ = 0x200d,
2N/A GRUB_UNICODE_LEFTARROW = 0x2190,
2N/A GRUB_UNICODE_UPARROW = 0x2191,
2N/A GRUB_UNICODE_RIGHTARROW = 0x2192,
2N/A GRUB_UNICODE_DOWNARROW = 0x2193,
2N/A GRUB_UNICODE_LIGHT_HLINE = 0x2500,
2N/A GRUB_UNICODE_HLINE = 0x2501,
2N/A GRUB_UNICODE_LIGHT_VLINE = 0x2502,
2N/A GRUB_UNICODE_VLINE = 0x2503,
2N/A GRUB_UNICODE_LIGHT_CORNER_UL = 0x250c,
2N/A GRUB_UNICODE_CORNER_UL = 0x250f,
2N/A GRUB_UNICODE_LIGHT_CORNER_UR = 0x2510,
2N/A GRUB_UNICODE_CORNER_UR = 0x2513,
2N/A GRUB_UNICODE_LIGHT_CORNER_LL = 0x2514,
2N/A GRUB_UNICODE_CORNER_LL = 0x2517,
2N/A GRUB_UNICODE_LIGHT_CORNER_LR = 0x2518,
2N/A GRUB_UNICODE_CORNER_LR = 0x251b,
2N/A GRUB_UNICODE_BLACK_UP_TRIANGLE = 0x25b2,
2N/A GRUB_UNICODE_BLACK_RIGHT_TRIANGLE = 0x25ba,
2N/A GRUB_UNICODE_BLACK_DOWN_TRIANGLE = 0x25bc,
2N/A GRUB_UNICODE_BLACK_LEFT_TRIANGLE = 0x25c4,
2N/A GRUB_UNICODE_VARIATION_SELECTOR_1 = 0xfe00,
2N/A GRUB_UNICODE_VARIATION_SELECTOR_16 = 0xfe0f,
2N/A GRUB_UNICODE_TAG_START = 0xe0000,
2N/A GRUB_UNICODE_TAG_END = 0xe007f,
2N/A GRUB_UNICODE_VARIATION_SELECTOR_17 = 0xe0100,
2N/A GRUB_UNICODE_VARIATION_SELECTOR_256 = 0xe01ef,
2N/A GRUB_UNICODE_LAST_VALID = 0x10ffff
2N/A };
2N/A
2N/Aextern struct grub_unicode_compact_range grub_unicode_compact[];
2N/Aextern struct grub_unicode_bidi_pair grub_unicode_bidi_pairs[];
2N/A
2N/A#define GRUB_UNICODE_MAX_CACHED_CHAR 0x20000
2N/A/* Unicode mandates an arbitrary limit. */
2N/A#define GRUB_BIDI_MAX_EXPLICIT_LEVEL 61
2N/A
2N/Agrub_ssize_t
2N/Agrub_bidi_logical_to_visual (const grub_uint32_t *logical,
2N/A grub_size_t logical_len,
2N/A struct grub_unicode_glyph **visual_out,
2N/A grub_ssize_t (*getcharwidth) (const struct grub_unicode_glyph *visual),
2N/A grub_size_t max_width,
2N/A grub_size_t start_width);
2N/A
2N/Aenum grub_comb_type
2N/Agrub_unicode_get_comb_type (grub_uint32_t c);
2N/Agrub_size_t
2N/Agrub_unicode_aglomerate_comb (const grub_uint32_t *in, grub_size_t inlen,
2N/A struct grub_unicode_glyph *out);
2N/A
2N/Astatic inline struct grub_unicode_glyph *
2N/Agrub_unicode_glyph_dup (const struct grub_unicode_glyph *in)
2N/A{
2N/A struct grub_unicode_glyph *out = grub_malloc (sizeof (*out));
2N/A if (!out)
2N/A return NULL;
2N/A grub_memcpy (out, in, sizeof (*in));
2N/A if (in->combining)
2N/A {
2N/A out->combining = grub_malloc (in->ncomb * sizeof (*in));
2N/A if (!out->combining)
2N/A {
2N/A grub_free (out);
2N/A return NULL;
2N/A }
2N/A grub_memcpy (out->combining, in->combining, in->ncomb * sizeof (*in));
2N/A }
2N/A return out;
2N/A}
2N/A
2N/Astatic inline struct grub_unicode_glyph *
2N/Agrub_unicode_glyph_from_code (grub_uint32_t code)
2N/A{
2N/A struct grub_unicode_glyph *ret;
2N/A ret = grub_zalloc (sizeof (*ret));
2N/A if (!ret)
2N/A return NULL;
2N/A
2N/A ret->base = code;
2N/A
2N/A return ret;
2N/A}
2N/A
2N/Agrub_uint32_t
2N/Agrub_unicode_mirror_code (grub_uint32_t in);
2N/Agrub_uint32_t
2N/Agrub_unicode_shape_code (grub_uint32_t in, grub_uint8_t attr);
2N/A
2N/A#endif