|
|
|
@ -59,11 +59,12 @@ |
|
|
|
|
|
|
|
|
|
/* Internal API */ |
|
|
|
|
|
|
|
|
|
/*static XXX */ HB_Error |
|
|
|
|
hb_buffer_ensure( HB_Buffer buffer, |
|
|
|
|
HB_UInt size ) |
|
|
|
|
/*static XXX */ void |
|
|
|
|
hb_buffer_ensure (hb_buffer_t *buffer, |
|
|
|
|
unsigned int size) |
|
|
|
|
{ |
|
|
|
|
HB_UInt new_allocated = buffer->allocated; |
|
|
|
|
/* XXX err handling */ |
|
|
|
|
|
|
|
|
|
if (size > new_allocated) |
|
|
|
|
{ |
|
|
|
@ -72,52 +73,39 @@ hb_buffer_ensure( HB_Buffer buffer, |
|
|
|
|
while (size > new_allocated) |
|
|
|
|
new_allocated += (new_allocated >> 1) + 8; |
|
|
|
|
|
|
|
|
|
if ( buffer->positions ) |
|
|
|
|
{ |
|
|
|
|
if ( REALLOC_ARRAY( buffer->positions, new_allocated, HB_PositionRec ) ) |
|
|
|
|
return error; |
|
|
|
|
} |
|
|
|
|
if (buffer->positions) |
|
|
|
|
buffer->positions = realloc (buffer->positions, new_allocated * sizeof (buffer->positions[0])); |
|
|
|
|
|
|
|
|
|
if ( REALLOC_ARRAY( buffer->in_string, new_allocated, HB_GlyphItemRec ) ) |
|
|
|
|
return error; |
|
|
|
|
buffer->in_string = realloc (buffer->in_string, new_allocated * sizeof (buffer->in_string[0])); |
|
|
|
|
|
|
|
|
|
if ( buffer->separate_out ) |
|
|
|
|
if (buffer->separate_out) |
|
|
|
|
{ |
|
|
|
|
if ( REALLOC_ARRAY( buffer->alt_string, new_allocated, HB_GlyphItemRec ) ) |
|
|
|
|
return error; |
|
|
|
|
|
|
|
|
|
buffer->alt_string = realloc (buffer->alt_string, new_allocated * sizeof (buffer->alt_string[0])); |
|
|
|
|
buffer->out_string = buffer->alt_string; |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
buffer->out_string = buffer->in_string; |
|
|
|
|
|
|
|
|
|
if ( buffer->alt_string ) |
|
|
|
|
if (buffer->alt_string) |
|
|
|
|
{ |
|
|
|
|
if ( REALLOC_ARRAY( buffer->alt_string, new_allocated, HB_GlyphItemRec ) ) |
|
|
|
|
return error; |
|
|
|
|
free (buffer->alt_string); |
|
|
|
|
buffer->alt_string = NULL; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
buffer->allocated = new_allocated; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return HB_Err_Ok; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static HB_Error |
|
|
|
|
hb_buffer_duplicate_out_buffer( HB_Buffer buffer ) |
|
|
|
|
hb_buffer_duplicate_out_buffer (HB_Buffer buffer) |
|
|
|
|
{ |
|
|
|
|
if ( !buffer->alt_string ) |
|
|
|
|
{ |
|
|
|
|
HB_Error error; |
|
|
|
|
|
|
|
|
|
if ( ALLOC_ARRAY( buffer->alt_string, buffer->allocated, HB_GlyphItemRec ) ) |
|
|
|
|
return error; |
|
|
|
|
} |
|
|
|
|
if (!buffer->alt_string) |
|
|
|
|
buffer->alt_string = malloc (buffer->allocated * sizeof (buffer->alt_string[0])); |
|
|
|
|
|
|
|
|
|
buffer->out_string = buffer->alt_string; |
|
|
|
|
memcpy( buffer->out_string, buffer->in_string, buffer->out_length * sizeof (buffer->out_string[0]) ); |
|
|
|
|
memcpy (buffer->out_string, buffer->in_string, buffer->out_length * sizeof (buffer->out_string[0])); |
|
|
|
|
buffer->separate_out = TRUE; |
|
|
|
|
|
|
|
|
|
return HB_Err_Ok; |
|
|
|
@ -125,39 +113,36 @@ hb_buffer_duplicate_out_buffer( HB_Buffer buffer ) |
|
|
|
|
|
|
|
|
|
/* Public API */ |
|
|
|
|
|
|
|
|
|
HB_Error |
|
|
|
|
hb_buffer_new( HB_Buffer *pbuffer ) |
|
|
|
|
hb_buffer_t * |
|
|
|
|
hb_buffer_new (void) |
|
|
|
|
{ |
|
|
|
|
HB_Buffer buffer; |
|
|
|
|
HB_Error error; |
|
|
|
|
|
|
|
|
|
if ( ALLOC( buffer, sizeof( HB_BufferRec ) ) ) |
|
|
|
|
return error; |
|
|
|
|
hb_buffer_t *buffer; |
|
|
|
|
|
|
|
|
|
buffer = malloc (sizeof (hb_buffer_t)); |
|
|
|
|
if (HB_UNLIKELY (!buffer)) |
|
|
|
|
return NULL; |
|
|
|
|
|
|
|
|
|
buffer->allocated = 0; |
|
|
|
|
buffer->in_string = NULL; |
|
|
|
|
buffer->alt_string = NULL; |
|
|
|
|
buffer->positions = NULL; |
|
|
|
|
|
|
|
|
|
hb_buffer_clear( buffer ); |
|
|
|
|
hb_buffer_clear (buffer); |
|
|
|
|
|
|
|
|
|
*pbuffer = buffer; |
|
|
|
|
|
|
|
|
|
return HB_Err_Ok; |
|
|
|
|
return buffer; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
hb_buffer_free( HB_Buffer buffer ) |
|
|
|
|
hb_buffer_free (HB_Buffer buffer) |
|
|
|
|
{ |
|
|
|
|
FREE( buffer->in_string ); |
|
|
|
|
FREE( buffer->alt_string ); |
|
|
|
|
buffer->out_string = NULL; |
|
|
|
|
FREE( buffer->positions ); |
|
|
|
|
FREE( buffer ); |
|
|
|
|
free (buffer->in_string); |
|
|
|
|
free (buffer->alt_string); |
|
|
|
|
free (buffer->positions); |
|
|
|
|
free (buffer); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
hb_buffer_clear( HB_Buffer buffer ) |
|
|
|
|
hb_buffer_clear (HB_Buffer buffer) |
|
|
|
|
{ |
|
|
|
|
buffer->in_length = 0; |
|
|
|
|
buffer->out_length = 0; |
|
|
|
@ -168,18 +153,16 @@ hb_buffer_clear( HB_Buffer buffer ) |
|
|
|
|
buffer->max_ligID = 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
HB_Error |
|
|
|
|
hb_buffer_add_glyph( HB_Buffer buffer, |
|
|
|
|
void |
|
|
|
|
hb_buffer_add_glyph (HB_Buffer buffer, |
|
|
|
|
HB_UInt glyph_index, |
|
|
|
|
HB_UInt properties, |
|
|
|
|
HB_UInt cluster ) |
|
|
|
|
HB_UInt cluster) |
|
|
|
|
{ |
|
|
|
|
HB_Error error; |
|
|
|
|
HB_GlyphItem glyph; |
|
|
|
|
|
|
|
|
|
error = hb_buffer_ensure( buffer, buffer->in_length + 1 ); |
|
|
|
|
if ( error ) |
|
|
|
|
return error; |
|
|
|
|
hb_buffer_ensure (buffer, buffer->in_length + 1); |
|
|
|
|
|
|
|
|
|
glyph = &buffer->in_string[buffer->in_length]; |
|
|
|
|
glyph->gindex = glyph_index; |
|
|
|
@ -188,16 +171,14 @@ hb_buffer_add_glyph( HB_Buffer buffer, |
|
|
|
|
glyph->component = 0; |
|
|
|
|
glyph->ligID = 0; |
|
|
|
|
glyph->gproperty = HB_GLYPH_PROPERTY_UNKNOWN; |
|
|
|
|
|
|
|
|
|
buffer->in_length++; |
|
|
|
|
|
|
|
|
|
return HB_Err_Ok; |
|
|
|
|
buffer->in_length++; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* HarfBuzz-Internal API */ |
|
|
|
|
|
|
|
|
|
HB_INTERNAL void |
|
|
|
|
_hb_buffer_clear_output( HB_Buffer buffer ) |
|
|
|
|
_hb_buffer_clear_output (HB_Buffer buffer) |
|
|
|
|
{ |
|
|
|
|
buffer->out_length = 0; |
|
|
|
|
buffer->out_pos = 0; |
|
|
|
@ -206,17 +187,12 @@ _hb_buffer_clear_output( HB_Buffer buffer ) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
HB_INTERNAL HB_Error |
|
|
|
|
_hb_buffer_clear_positions( HB_Buffer buffer ) |
|
|
|
|
_hb_buffer_clear_positions (HB_Buffer buffer) |
|
|
|
|
{ |
|
|
|
|
_hb_buffer_clear_output (buffer); |
|
|
|
|
|
|
|
|
|
if ( !buffer->positions ) |
|
|
|
|
{ |
|
|
|
|
HB_Error error; |
|
|
|
|
|
|
|
|
|
if ( ALLOC_ARRAY( buffer->positions, buffer->allocated, HB_PositionRec ) ) |
|
|
|
|
return error; |
|
|
|
|
} |
|
|
|
|
if (!buffer->positions) |
|
|
|
|
buffer->positions = malloc (buffer->allocated * sizeof (buffer->positions[0])); |
|
|
|
|
|
|
|
|
|
memset (buffer->positions, 0, sizeof (buffer->positions[0]) * buffer->in_length); |
|
|
|
|
|
|
|
|
@ -224,13 +200,13 @@ _hb_buffer_clear_positions( HB_Buffer buffer ) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
HB_INTERNAL void |
|
|
|
|
_hb_buffer_swap( HB_Buffer buffer ) |
|
|
|
|
_hb_buffer_swap (HB_Buffer buffer) |
|
|
|
|
{ |
|
|
|
|
HB_GlyphItem tmp_string; |
|
|
|
|
int tmp_length; |
|
|
|
|
int tmp_pos; |
|
|
|
|
|
|
|
|
|
if ( buffer->separate_out ) |
|
|
|
|
if (buffer->separate_out) |
|
|
|
|
{ |
|
|
|
|
tmp_string = buffer->in_string; |
|
|
|
|
buffer->in_string = buffer->out_string; |
|
|
|
@ -267,37 +243,35 @@ _hb_buffer_swap( HB_Buffer buffer ) |
|
|
|
|
The cluster value for the glyph at position buffer->in_pos is used |
|
|
|
|
for all replacement glyphs */ |
|
|
|
|
HB_INTERNAL HB_Error |
|
|
|
|
_hb_buffer_add_output_glyphs( HB_Buffer buffer, |
|
|
|
|
_hb_buffer_add_output_glyphs (HB_Buffer buffer, |
|
|
|
|
HB_UShort num_in, |
|
|
|
|
HB_UShort num_out, |
|
|
|
|
HB_UShort *glyph_data, |
|
|
|
|
HB_UShort component, |
|
|
|
|
HB_UShort ligID ) |
|
|
|
|
HB_UShort ligID) |
|
|
|
|
{ |
|
|
|
|
HB_Error error; |
|
|
|
|
HB_UShort i; |
|
|
|
|
HB_UInt properties; |
|
|
|
|
HB_UInt cluster; |
|
|
|
|
|
|
|
|
|
error = hb_buffer_ensure( buffer, buffer->out_pos + num_out ); |
|
|
|
|
if ( error ) |
|
|
|
|
return error; |
|
|
|
|
hb_buffer_ensure (buffer, buffer->out_pos + num_out); |
|
|
|
|
|
|
|
|
|
if ( !buffer->separate_out ) |
|
|
|
|
if (!buffer->separate_out) |
|
|
|
|
{ |
|
|
|
|
error = hb_buffer_duplicate_out_buffer( buffer ); |
|
|
|
|
if ( error ) |
|
|
|
|
error = hb_buffer_duplicate_out_buffer (buffer); |
|
|
|
|
if (error) |
|
|
|
|
return error; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
properties = buffer->in_string[buffer->in_pos].properties; |
|
|
|
|
cluster = buffer->in_string[buffer->in_pos].cluster; |
|
|
|
|
if ( component == 0xFFFF ) |
|
|
|
|
if (component == 0xFFFF) |
|
|
|
|
component = buffer->in_string[buffer->in_pos].component; |
|
|
|
|
if ( ligID == 0xFFFF ) |
|
|
|
|
if (ligID == 0xFFFF) |
|
|
|
|
ligID = buffer->in_string[buffer->in_pos].ligID; |
|
|
|
|
|
|
|
|
|
for ( i = 0; i < num_out; i++ ) |
|
|
|
|
for (i = 0; i < num_out; i++) |
|
|
|
|
{ |
|
|
|
|
HB_GlyphItem item = &buffer->out_string[buffer->out_pos + i]; |
|
|
|
|
|
|
|
|
@ -318,27 +292,25 @@ _hb_buffer_add_output_glyphs( HB_Buffer buffer, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
HB_INTERNAL HB_Error |
|
|
|
|
_hb_buffer_add_output_glyph( HB_Buffer buffer, |
|
|
|
|
_hb_buffer_add_output_glyph (HB_Buffer buffer, |
|
|
|
|
HB_UInt glyph_index, |
|
|
|
|
HB_UShort component, |
|
|
|
|
HB_UShort ligID ) |
|
|
|
|
HB_UShort ligID) |
|
|
|
|
{ |
|
|
|
|
HB_UShort glyph_data = glyph_index; |
|
|
|
|
|
|
|
|
|
return _hb_buffer_add_output_glyphs ( buffer, 1, 1, |
|
|
|
|
&glyph_data, component, ligID ); |
|
|
|
|
return _hb_buffer_add_output_glyphs (buffer, 1, 1, |
|
|
|
|
&glyph_data, component, ligID); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
HB_INTERNAL HB_Error |
|
|
|
|
_hb_buffer_next_glyph ( HB_Buffer buffer ) |
|
|
|
|
_hb_buffer_next_glyph (HB_Buffer buffer) |
|
|
|
|
{ |
|
|
|
|
HB_Error error; |
|
|
|
|
|
|
|
|
|
if ( buffer->separate_out ) |
|
|
|
|
if (buffer->separate_out) |
|
|
|
|
{ |
|
|
|
|
error = hb_buffer_ensure( buffer, buffer->out_pos + 1 ); |
|
|
|
|
if ( error ) |
|
|
|
|
return error; |
|
|
|
|
hb_buffer_ensure (buffer, buffer->out_pos + 1); |
|
|
|
|
|
|
|
|
|
buffer->out_string[buffer->out_pos] = buffer->in_string[buffer->in_pos]; |
|
|
|
|
} |
|
|
|
@ -351,10 +323,10 @@ _hb_buffer_next_glyph ( HB_Buffer buffer ) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
HB_INTERNAL HB_Error |
|
|
|
|
_hb_buffer_replace_glyph( HB_Buffer buffer, |
|
|
|
|
HB_UInt glyph_index ) |
|
|
|
|
_hb_buffer_replace_glyph (HB_Buffer buffer, |
|
|
|
|
HB_UInt glyph_index) |
|
|
|
|
{ |
|
|
|
|
if ( !buffer->separate_out ) |
|
|
|
|
if (!buffer->separate_out) |
|
|
|
|
{ |
|
|
|
|
buffer->out_string[buffer->out_pos].gindex = glyph_index; |
|
|
|
|
|
|
|
|
@ -364,14 +336,14 @@ _hb_buffer_replace_glyph( HB_Buffer buffer, |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
return _hb_buffer_add_output_glyph( buffer, glyph_index, 0xFFFF, 0xFFFF ); |
|
|
|
|
return _hb_buffer_add_output_glyph (buffer, glyph_index, 0xFFFF, 0xFFFF); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return HB_Err_Ok; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
HB_INTERNAL HB_UShort |
|
|
|
|
_hb_buffer_allocate_ligid( HB_Buffer buffer ) |
|
|
|
|
_hb_buffer_allocate_ligid (HB_Buffer buffer) |
|
|
|
|
{ |
|
|
|
|
return ++buffer->max_ligID; |
|
|
|
|
} |
|
|
|
|