Arabic diacritics support
This commit is contained in:
parent
a82890fffc
commit
ad109fe056
3 changed files with 39 additions and 6 deletions
12
font/font.c
12
font/font.c
|
@ -1248,6 +1248,13 @@ blit_comb (const struct grub_unicode_glyph *glyph_id,
|
||||||
min_devwidth = combining_glyphs[i]->width;
|
min_devwidth = combining_glyphs[i]->width;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
/* TODO: Put dammah and fathah nearer to shadda. */
|
||||||
|
case GRUB_UNICODE_COMB_ARABIC_DAMMAH:
|
||||||
|
case GRUB_UNICODE_COMB_ARABIC_DAMMATAN:
|
||||||
|
case GRUB_UNICODE_COMB_ARABIC_FATHATAN:
|
||||||
|
case GRUB_UNICODE_COMB_ARABIC_FATHAH:
|
||||||
|
case GRUB_UNICODE_COMB_ARABIC_SUKUN:
|
||||||
|
case GRUB_UNICODE_COMB_ARABIC_SHADDA:
|
||||||
case GRUB_UNICODE_COMB_HEBREW_RAFE:
|
case GRUB_UNICODE_COMB_HEBREW_RAFE:
|
||||||
case GRUB_UNICODE_STACK_ABOVE:
|
case GRUB_UNICODE_STACK_ABOVE:
|
||||||
space = combining_glyphs[i]->offset_y
|
space = combining_glyphs[i]->offset_y
|
||||||
|
@ -1276,12 +1283,15 @@ blit_comb (const struct grub_unicode_glyph *glyph_id,
|
||||||
case GRUB_UNICODE_COMB_HEBREW_PATAH:
|
case GRUB_UNICODE_COMB_HEBREW_PATAH:
|
||||||
case GRUB_UNICODE_COMB_HEBREW_QUBUTS:
|
case GRUB_UNICODE_COMB_HEBREW_QUBUTS:
|
||||||
case GRUB_UNICODE_COMB_HEBREW_METEG:
|
case GRUB_UNICODE_COMB_HEBREW_METEG:
|
||||||
|
/* TODO: Put kasra and kasratan under shadda. */
|
||||||
|
case GRUB_UNICODE_COMB_ARABIC_KASRA:
|
||||||
|
case GRUB_UNICODE_COMB_ARABIC_KASRATAN:
|
||||||
/* I don't know how ypogegrammeni differs from subscript. */
|
/* I don't know how ypogegrammeni differs from subscript. */
|
||||||
case GRUB_UNICODE_COMB_YPOGEGRAMMENI:
|
case GRUB_UNICODE_COMB_YPOGEGRAMMENI:
|
||||||
case GRUB_UNICODE_STACK_BELOW:
|
case GRUB_UNICODE_STACK_BELOW:
|
||||||
space = -(combining_glyphs[i]->offset_y
|
space = -(combining_glyphs[i]->offset_y
|
||||||
+ combining_glyphs[i]->height);
|
+ combining_glyphs[i]->height);
|
||||||
if (space < 0)
|
if (space <= 0)
|
||||||
space = 1 + (grub_font_get_xheight (main_glyph->font)) / 8;
|
space = 1 + (grub_font_get_xheight (main_glyph->font)) / 8;
|
||||||
|
|
||||||
case GRUB_UNICODE_STACK_ATTACHED_BELOW:
|
case GRUB_UNICODE_STACK_ATTACHED_BELOW:
|
||||||
|
|
|
@ -106,6 +106,14 @@ enum grub_comb_type
|
||||||
GRUB_UNICODE_COMB_HEBREW_SHIN_DOT = 24,
|
GRUB_UNICODE_COMB_HEBREW_SHIN_DOT = 24,
|
||||||
GRUB_UNICODE_COMB_HEBREW_SIN_DOT = 25,
|
GRUB_UNICODE_COMB_HEBREW_SIN_DOT = 25,
|
||||||
GRUB_UNICODE_COMB_HEBREW_VARIKA = 26,
|
GRUB_UNICODE_COMB_HEBREW_VARIKA = 26,
|
||||||
|
GRUB_UNICODE_COMB_ARABIC_FATHATAN = 27,
|
||||||
|
GRUB_UNICODE_COMB_ARABIC_DAMMATAN = 28,
|
||||||
|
GRUB_UNICODE_COMB_ARABIC_KASRATAN = 29,
|
||||||
|
GRUB_UNICODE_COMB_ARABIC_FATHAH = 30,
|
||||||
|
GRUB_UNICODE_COMB_ARABIC_DAMMAH = 31,
|
||||||
|
GRUB_UNICODE_COMB_ARABIC_KASRA = 32,
|
||||||
|
GRUB_UNICODE_COMB_ARABIC_SHADDA = 33,
|
||||||
|
GRUB_UNICODE_COMB_ARABIC_SUKUN = 34,
|
||||||
GRUB_UNICODE_STACK_ATTACHED_BELOW = 202,
|
GRUB_UNICODE_STACK_ATTACHED_BELOW = 202,
|
||||||
GRUB_UNICODE_STACK_ATTACHED_ABOVE = 214,
|
GRUB_UNICODE_STACK_ATTACHED_ABOVE = 214,
|
||||||
GRUB_UNICODE_COMB_ATTACHED_ABOVE_RIGHT = 216,
|
GRUB_UNICODE_COMB_ATTACHED_ABOVE_RIGHT = 216,
|
||||||
|
|
|
@ -28,9 +28,8 @@
|
||||||
- Indic languages
|
- Indic languages
|
||||||
- non-Semitic shaping (rarely used)
|
- non-Semitic shaping (rarely used)
|
||||||
- Zl and Zp characters
|
- Zl and Zp characters
|
||||||
- Combining characters of types 7, 8, 9, 21, 27, 28, 29, 30, 31,
|
- Combining characters of types 7, 8, 9, 21, 35, 36, 84, 91, 103, 107,
|
||||||
32, 33, 34, 35, 36, 84, 91, 103, 107, 118, 122, 129, 130, 132,
|
118, 122, 129, 130, 132, 218, 224, 226, 233, 234
|
||||||
218, 224, 226, 233, 234
|
|
||||||
- Private use characters (not really a problem)
|
- Private use characters (not really a problem)
|
||||||
- Variations (no font support)
|
- Variations (no font support)
|
||||||
- Vertical text
|
- Vertical text
|
||||||
|
@ -40,7 +39,7 @@
|
||||||
- Justification data
|
- Justification data
|
||||||
- Glyph posititioning
|
- Glyph posititioning
|
||||||
- Baseline data
|
- Baseline data
|
||||||
TODO: Use form characters of Unicode as last resort Arabic shaping.
|
Most underline diacritics aren't displayed in gfxterm
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Convert a (possibly null-terminated) UTF-8 string of at most SRCSIZE
|
/* Convert a (possibly null-terminated) UTF-8 string of at most SRCSIZE
|
||||||
|
@ -550,6 +549,22 @@ grub_unicode_estimate_width (const struct grub_unicode_glyph *c)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
is_type_after (enum grub_comb_type a, enum grub_comb_type b)
|
||||||
|
{
|
||||||
|
/* Shadda is numerically higher than most of Arabic diacritics but has
|
||||||
|
to be rendered before them. */
|
||||||
|
if (a == GRUB_UNICODE_COMB_ARABIC_SHADDA
|
||||||
|
&& b <= GRUB_UNICODE_COMB_ARABIC_KASRA
|
||||||
|
&& b >= GRUB_UNICODE_COMB_ARABIC_FATHATAN)
|
||||||
|
return 0;
|
||||||
|
if (b == GRUB_UNICODE_COMB_ARABIC_SHADDA
|
||||||
|
&& a <= GRUB_UNICODE_COMB_ARABIC_KASRA
|
||||||
|
&& a >= GRUB_UNICODE_COMB_ARABIC_FATHATAN)
|
||||||
|
return 1;
|
||||||
|
return a > b;
|
||||||
|
}
|
||||||
|
|
||||||
grub_size_t
|
grub_size_t
|
||||||
grub_unicode_aglomerate_comb (const grub_uint32_t *in, grub_size_t inlen,
|
grub_unicode_aglomerate_comb (const grub_uint32_t *in, grub_size_t inlen,
|
||||||
struct grub_unicode_glyph *out)
|
struct grub_unicode_glyph *out)
|
||||||
|
@ -605,7 +620,7 @@ grub_unicode_aglomerate_comb (const grub_uint32_t *in, grub_size_t inlen,
|
||||||
out->combining = n;
|
out->combining = n;
|
||||||
|
|
||||||
for (j = last_comb_pointer; j < out->ncomb; j++)
|
for (j = last_comb_pointer; j < out->ncomb; j++)
|
||||||
if (out->combining[j].type > comb_type)
|
if (is_type_after (out->combining[j].type, comb_type))
|
||||||
break;
|
break;
|
||||||
grub_memmove (out->combining + j + 1,
|
grub_memmove (out->combining + j + 1,
|
||||||
out->combining + j,
|
out->combining + j,
|
||||||
|
|
Loading…
Reference in a new issue