This commit is contained in:
Behdad Esfahbod 2012-05-11 16:23:38 +02:00
parent c071b99f15
commit 3c2ea9481b
1 changed files with 38 additions and 37 deletions

View File

@ -213,7 +213,6 @@ static void
initial_reordering_consonant_syllable (const hb_ot_map_t *map, hb_buffer_t *buffer, hb_mask_t *mask_array, initial_reordering_consonant_syllable (const hb_ot_map_t *map, hb_buffer_t *buffer, hb_mask_t *mask_array,
unsigned int start, unsigned int end) unsigned int start, unsigned int end)
{ {
unsigned int i;
hb_glyph_info_t *info = buffer->info; hb_glyph_info_t *info = buffer->info;
/* Comments from: /* Comments from:
@ -251,37 +250,39 @@ initial_reordering_consonant_syllable (const hb_ot_map_t *map, hb_buffer_t *buff
has_reph = true; has_reph = true;
}; };
/* -> starting from the end of the syllable, move backwards */ {
i = end; /* -> starting from the end of the syllable, move backwards */
do { unsigned int i = end;
i--; do {
/* -> until a consonant is found */ i--;
if (is_consonant (info[i])) /* -> until a consonant is found */
{ if (is_consonant (info[i]))
/* -> that does not have a below-base or post-base form
* (post-base forms have to follow below-base forms), */
if (info[i].indic_position() != POS_BELOW_C &&
info[i].indic_position() != POS_POST_C)
{ {
base = i; /* -> that does not have a below-base or post-base form
break; * (post-base forms have to follow below-base forms), */
if (info[i].indic_position() != POS_BELOW_C &&
info[i].indic_position() != POS_POST_C)
{
base = i;
break;
}
/* -> or that is not a pre-base reordering Ra,
*
* TODO
*/
/* -> or arrive at the first consonant. The consonant stopped at will
* be the base. */
base = i;
} }
else
/* -> or that is not a pre-base reordering Ra, if (is_joiner (info[i]))
* break;
* TODO } while (i > limit);
*/ if (base < start)
base = start; /* Just in case... */
/* -> or arrive at the first consonant. The consonant stopped at will }
* be the base. */
base = i;
}
else
if (is_joiner (info[i]))
break;
} while (i > limit);
if (base < start)
base = start; /* Just in case... */
/* -> If the syllable starts with Ra + Halant (in a script that has Reph) /* -> If the syllable starts with Ra + Halant (in a script that has Reph)
* and has more than one consonant, Ra is excluded from candidates for * and has more than one consonant, Ra is excluded from candidates for
@ -326,7 +327,7 @@ initial_reordering_consonant_syllable (const hb_ot_map_t *map, hb_buffer_t *buff
/* Reorder characters */ /* Reorder characters */
for (i = start; i < base; i++) for (unsigned int i = start; i < base; i++)
info[i].indic_position() = POS_PRE_C; info[i].indic_position() = POS_PRE_C;
info[base].indic_position() = POS_BASE_C; info[base].indic_position() = POS_BASE_C;
@ -338,7 +339,7 @@ initial_reordering_consonant_syllable (const hb_ot_map_t *map, hb_buffer_t *buff
* last consonant. */ * last consonant. */
if ((map->get_chosen_script (0) & 0x000000FF) != '2') { if ((map->get_chosen_script (0) & 0x000000FF) != '2') {
/* We should only do this for Indic scripts which have a version two I guess. */ /* We should only do this for Indic scripts which have a version two I guess. */
for (i = base + 1; i < end; i++) for (unsigned int i = base + 1; i < end; i++)
if (info[i].indic_category() == OT_H) { if (info[i].indic_category() == OT_H) {
unsigned int j; unsigned int j;
for (j = end - 1; j > i; j--) for (j = end - 1; j > i; j--)
@ -355,7 +356,7 @@ initial_reordering_consonant_syllable (const hb_ot_map_t *map, hb_buffer_t *buff
} }
/* Attach ZWJ, ZWNJ, nukta, and halant to previous char to move with them. */ /* Attach ZWJ, ZWNJ, nukta, and halant to previous char to move with them. */
for (i = start + 1; i < end; i++) for (unsigned int i = start + 1; i < end; i++)
if ((FLAG (info[i].indic_category()) & if ((FLAG (info[i].indic_category()) &
(FLAG (OT_ZWNJ) | FLAG (OT_ZWJ) | FLAG (OT_N) | FLAG (OT_H)))) (FLAG (OT_ZWNJ) | FLAG (OT_ZWJ) | FLAG (OT_N) | FLAG (OT_H))))
info[i].indic_position() = info[i - 1].indic_position(); info[i].indic_position() = info[i - 1].indic_position();
@ -367,7 +368,7 @@ initial_reordering_consonant_syllable (const hb_ot_map_t *map, hb_buffer_t *buff
hb_bubble_sort (info + start, end - start, compare_indic_order); hb_bubble_sort (info + start, end - start, compare_indic_order);
/* Find base again */ /* Find base again */
base = end; base = end;
for (i = start; i < end; i++) for (unsigned int i = start; i < end; i++)
if (info[i].indic_position() == POS_BASE_C) { if (info[i].indic_position() == POS_BASE_C) {
base = i; base = i;
break; break;
@ -385,19 +386,19 @@ initial_reordering_consonant_syllable (const hb_ot_map_t *map, hb_buffer_t *buff
/* Pre-base */ /* Pre-base */
mask = mask_array[HALF] | mask_array[AKHN] | mask_array[CJCT]; mask = mask_array[HALF] | mask_array[AKHN] | mask_array[CJCT];
for (i = start; i < base; i++) for (unsigned int i = start; i < base; i++)
info[i].mask |= mask; info[i].mask |= mask;
/* Base */ /* Base */
mask = mask_array[AKHN] | mask_array[CJCT]; mask = mask_array[AKHN] | mask_array[CJCT];
info[base].mask |= mask; info[base].mask |= mask;
/* Post-base */ /* Post-base */
mask = mask_array[BLWF] | mask_array[PSTF] | mask_array[CJCT]; mask = mask_array[BLWF] | mask_array[PSTF] | mask_array[CJCT];
for (i = base + 1; i < end; i++) for (unsigned int i = base + 1; i < end; i++)
info[i].mask |= mask; info[i].mask |= mask;
} }
/* Apply ZWJ/ZWNJ effects */ /* Apply ZWJ/ZWNJ effects */
for (i = start + 1; i < end; i++) for (unsigned int i = start + 1; i < end; i++)
if (is_joiner (info[i])) { if (is_joiner (info[i])) {
bool non_joiner = info[i].indic_category() == OT_ZWNJ; bool non_joiner = info[i].indic_category() == OT_ZWNJ;
unsigned int j = i; unsigned int j = i;