matra_group = M N? H?;
syllable_tail = SM? (VD VD?)?;
-action found_consonant_syllable { found_consonant_syllable (map, buffer, mask_array, last, p); }
-action found_vowel_syllable { found_vowel_syllable (map, buffer, mask_array, last, p); }
-action found_standalone_cluster { found_standalone_cluster (map, buffer, mask_array, last, p); }
-action found_non_indic { found_non_indic (map, buffer, mask_array, last, p); }
-
-action next_syllable { buffer->merge_clusters (last, p); last = p; }
+action found_consonant_syllable { initial_reordering_consonant_syllable (map, buffer, mask_array, last, p); }
+action found_vowel_syllable { initial_reordering_vowel_syllable (map, buffer, mask_array, last, p); }
+action found_standalone_cluster { initial_reordering_standalone_cluster (map, buffer, mask_array, last, p); }
+action found_non_indic { initial_reordering_non_indic (map, buffer, mask_array, last, p); }
+
+action next_syllable {
+ for (unsigned int i = last; i < p; i++)
+ info[i].indic_syllable() = syllable_serial;
+ last = p;
+ syllable_serial++;
+}
consonant_syllable = (c.N? (H.z?|z.H))* c.N? A? (H.z? | matra_group*)? syllable_tail %(found_consonant_syllable);
vowel_syllable = (Ra H)? V N? (z?.H.c | ZWJ.c)? matra_group* syllable_tail %(found_vowel_syllable);
{
unsigned int p, pe, eof;
int cs;
+ hb_glyph_info_t *info = buffer->info;
%%{
write init;
- getkey buffer->info[p].indic_category();
+ getkey info[p].indic_category();
}%%
p = 0;
pe = eof = buffer->len;
unsigned int last = 0;
+ uint8_t syllable_serial = 0;
%%{
write exec;
}%%
{
HB_BUFFER_ALLOCATE_VAR (buffer, indic_category);
HB_BUFFER_ALLOCATE_VAR (buffer, indic_position);
+ HB_BUFFER_ALLOCATE_VAR (buffer, indic_syllable);
/* We cannot setup masks here. We save information about characters
* and setup masks later on in a pause-callback. */
}
static void
-found_consonant_syllable (const hb_ot_map_t *map, hb_buffer_t *buffer, hb_mask_t *mask_array,
- unsigned int start, unsigned int end)
+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 i;
hb_glyph_info_t *info = buffer->info;
static void
-found_vowel_syllable (const hb_ot_map_t *map, hb_buffer_t *buffer, hb_mask_t *mask_array,
- unsigned int start, unsigned int end)
+initial_reordering_vowel_syllable (const hb_ot_map_t *map, hb_buffer_t *buffer, hb_mask_t *mask_array,
+ unsigned int start, unsigned int end)
{
/* TODO
* Not clear to me how this should work. Do the matras move to before the
}
static void
-found_standalone_cluster (const hb_ot_map_t *map, hb_buffer_t *buffer, hb_mask_t *mask_array,
- unsigned int start, unsigned int end)
+initial_reordering_standalone_cluster (const hb_ot_map_t *map, hb_buffer_t *buffer, hb_mask_t *mask_array,
+ unsigned int start, unsigned int end)
{
/* TODO
* Easiest thing to do here is to convert the NBSP to consonant and
- * call found_consonant_syllable.
+ * call initial_reordering_consonant_syllable.
*/
}
static void
-found_non_indic (const hb_ot_map_t *map, hb_buffer_t *buffer, hb_mask_t *mask_array,
+initial_reordering_non_indic (const hb_ot_map_t *map, hb_buffer_t *buffer, hb_mask_t *mask_array,
unsigned int start, unsigned int end)
{
/* Nothing to do right now. If we ever switch to using the output
}
static void
-final_reordering (const hb_ot_map_t *map,
- hb_face_t *face,
- hb_buffer_t *buffer,
- void *user_data HB_UNUSED)
+final_reordering_syllable (hb_buffer_t *buffer,
+ unsigned int start, unsigned int end)
{
/* 4. Final reordering:
*
*/
/* TODO */
+ buffer->merge_clusters (start, end);
+}
+static void
+final_reordering (const hb_ot_map_t *map,
+ hb_face_t *face,
+ hb_buffer_t *buffer,
+ void *user_data HB_UNUSED)
+{
+ unsigned int count = buffer->len;
+ if (!count) return;
+
+ hb_glyph_info_t *info = buffer->info;
+ unsigned int last = 0;
+ unsigned int last_syllable = info[0].indic_syllable();
+ for (unsigned int i = 1; i < count; i++)
+ if (last_syllable != info[i].indic_syllable()) {
+ final_reordering_syllable (buffer, last, i);
+ last = i;
+ last_syllable = info[last].indic_syllable();
+ }
+ final_reordering_syllable (buffer, last, count);
+ HB_BUFFER_DEALLOCATE_VAR (buffer, indic_syllable);
HB_BUFFER_DEALLOCATE_VAR (buffer, indic_category);
HB_BUFFER_DEALLOCATE_VAR (buffer, indic_position);
}