Arabic diacritics support

This commit is contained in:
Vladimir 'phcoder' Serbinenko 2010-03-29 04:11:14 +02:00
parent a82890fffc
commit ad109fe056
3 changed files with 39 additions and 6 deletions

View file

@ -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:

View file

@ -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,

View file

@ -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,