@ -887,3 +887,79 @@ hb_buffer_add_utf32 (hb_buffer_t *buffer,
}
static int
compare_info_codepoint ( const hb_glyph_info_t * pa ,
const hb_glyph_info_t * pb )
{
return ( int ) pb - > codepoint - ( int ) pa - > codepoint ;
}
static inline void
normalize_glyphs_cluster ( hb_buffer_t * buffer ,
unsigned int start ,
unsigned int end ,
bool backward )
{
hb_glyph_position_t * pos = buffer - > pos ;
/* Total cluster advance */
hb_position_t total_x_advance = 0 , total_y_advance = 0 ;
for ( unsigned int i = start ; i < end ; i + + )
{
total_x_advance + = pos [ i ] . x_advance ;
total_y_advance + = pos [ i ] . y_advance ;
}
hb_position_t x_advance = 0 , y_advance = 0 ;
for ( unsigned int i = start ; i < end ; i + + )
{
pos [ i ] . x_offset + = x_advance ;
pos [ i ] . y_offset + = y_advance ;
x_advance + = pos [ i ] . x_advance ;
y_advance + = pos [ i ] . y_advance ;
pos [ i ] . x_advance = 0 ;
pos [ i ] . y_advance = 0 ;
}
if ( backward )
{
/* Transfer all cluster advance to the last glyph. */
pos [ end - 1 ] . x_advance = total_x_advance ;
pos [ end - 1 ] . y_advance = total_y_advance ;
hb_bubble_sort ( buffer - > info + start , end - start - 1 , compare_info_codepoint , buffer - > pos + start ) ;
} else {
/* Transfer all cluster advance to the first glyph. */
pos [ start ] . x_advance + = total_x_advance ;
pos [ start ] . y_advance + = total_y_advance ;
for ( unsigned int i = start + 1 ; i < end ; i + + ) {
pos [ i ] . x_offset - = total_x_advance ;
pos [ i ] . y_offset - = total_y_advance ;
}
hb_bubble_sort ( buffer - > info + start + 1 , end - start - 1 , compare_info_codepoint , buffer - > pos + start + 1 ) ;
}
}
void
hb_buffer_normalize_glyphs ( hb_buffer_t * buffer )
{
assert ( buffer - > have_positions ) ;
/* XXX assert (buffer->have_glyphs); */
bool backward = HB_DIRECTION_IS_BACKWARD ( buffer - > props . direction ) ;
unsigned int count = buffer - > len ;
if ( unlikely ( ! count ) ) return ;
hb_glyph_info_t * info = buffer - > info ;
unsigned int start = 0 ;
unsigned int end ;
for ( end = start + 1 ; end < count ; end + + )
if ( info [ start ] . cluster ! = info [ end ] . cluster ) {
normalize_glyphs_cluster ( buffer , start , end , backward ) ;
start = end ;
}
normalize_glyphs_cluster ( buffer , start , end , backward ) ;
}