@ -360,7 +360,7 @@ clear_substitution_flags (const hb_ot_shape_plan_t *plan,
hb_glyph_info_t * info = buffer - > info ;
hb_glyph_info_t * info = buffer - > info ;
unsigned int count = buffer - > len ;
unsigned int count = buffer - > len ;
for ( unsigned int i = 0 ; i < count ; i + + )
for ( unsigned int i = 0 ; i < count ; i + + )
_hb_glyph_info_clear_substituted_and_ligated_and_multiplied ( & info [ i ] ) ;
_hb_glyph_info_clear_substituted ( & info [ i ] ) ;
}
}
static void
static void
@ -405,6 +405,12 @@ record_pref (const hb_ot_shape_plan_t *plan,
}
}
}
}
static inline bool
is_halant ( const hb_glyph_info_t & info )
{
return info . use_category ( ) = = USE_H & & ! _hb_glyph_info_ligated ( & info ) ;
}
static void
static void
reorder_syllable ( hb_buffer_t * buffer , unsigned int start , unsigned int end )
reorder_syllable ( hb_buffer_t * buffer , unsigned int start , unsigned int end )
{
{
@ -420,7 +426,6 @@ reorder_syllable (hb_buffer_t *buffer, unsigned int start, unsigned int end)
hb_glyph_info_t * info = buffer - > info ;
hb_glyph_info_t * info = buffer - > info ;
# define HALANT_FLAGS FLAG(USE_H)
# define BASE_FLAGS (FLAG (USE_B) | FLAG (USE_GB) | FLAG (USE_IV))
# define BASE_FLAGS (FLAG (USE_B) | FLAG (USE_GB) | FLAG (USE_IV))
/* Move things forward. */
/* Move things forward. */
@ -428,12 +433,12 @@ reorder_syllable (hb_buffer_t *buffer, unsigned int start, unsigned int end)
{
{
/* Got a repha. Reorder it to after first base, before first halant. */
/* Got a repha. Reorder it to after first base, before first halant. */
for ( unsigned int i = start + 1 ; i < end ; i + + )
for ( unsigned int i = start + 1 ; i < end ; i + + )
if ( FLAG_UNSAFE ( info [ i ] . use_category ( ) ) & ( HALANT_FLAGS | BASE_FLAGS ) )
if ( ( FLAG_UNSAFE ( info [ i ] . use_category ( ) ) & ( BASE_FLAGS ) ) | | is_halant ( info [ i ] ) )
{
{
/* If we hit a halant, move before it; otherwise it's a base: move to it's
/* If we hit a halant, move before it; otherwise it's a base: move to it's
* place , and shift things in between backward . */
* place , and shift things in between backward . */
if ( info [ i ] . use_category ( ) = = USE_H )
if ( is_halant ( info [ i ] ) )
i - - ;
i - - ;
buffer - > merge_clusters ( start , i + 1 ) ;
buffer - > merge_clusters ( start , i + 1 ) ;
@ -450,11 +455,11 @@ reorder_syllable (hb_buffer_t *buffer, unsigned int start, unsigned int end)
for ( unsigned int i = start ; i < end ; i + + )
for ( unsigned int i = start ; i < end ; i + + )
{
{
uint32_t flag = FLAG_UNSAFE ( info [ i ] . use_category ( ) ) ;
uint32_t flag = FLAG_UNSAFE ( info [ i ] . use_category ( ) ) ;
if ( flag & ( HALANT_FLAGS | BASE_FLAGS ) )
if ( ( flag & ( BASE_FLAGS ) ) | | is_halant ( info [ i ] ) )
{
{
/* If we hit a halant, move before it; otherwise it's a base: move to it's
/* If we hit a halant, move after it; otherwise it's a base: move to it's
* place , and shift things in between backward . */
* place , and shift things in between backward . */
if ( info [ i ] . use_category ( ) = = USE_H )
if ( is_halant ( info [ i ] ) )
j = i + 1 ;
j = i + 1 ;
else
else
j = i ;
j = i ;