Allocate buffer->positions lazily.
2007-10-11 Behdad Esfahbod <behdad@gnome.org> * pango/opentype/*: Allocate buffer->positions lazily.
This commit is contained in:
parent
fc3d6f5758
commit
06003908cc
|
@ -51,10 +51,15 @@ hb_buffer_ensure( HB_Buffer buffer,
|
||||||
while (size > new_allocated)
|
while (size > new_allocated)
|
||||||
new_allocated += (new_allocated >> 1) + 8;
|
new_allocated += (new_allocated >> 1) + 8;
|
||||||
|
|
||||||
if ( REALLOC_ARRAY( buffer->positions, new_allocated, HB_PositionRec ) )
|
if ( buffer->positions )
|
||||||
return error;
|
{
|
||||||
|
if ( REALLOC_ARRAY( buffer->positions, new_allocated, HB_PositionRec ) )
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
if ( REALLOC_ARRAY( buffer->in_string, new_allocated, HB_GlyphItemRec ) )
|
if ( REALLOC_ARRAY( buffer->in_string, new_allocated, HB_GlyphItemRec ) )
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
if ( buffer->inplace )
|
if ( buffer->inplace )
|
||||||
{
|
{
|
||||||
buffer->out_string = buffer->in_string;
|
buffer->out_string = buffer->in_string;
|
||||||
|
@ -121,6 +126,22 @@ hb_buffer_new( HB_Buffer *buffer )
|
||||||
return HB_Err_Ok;
|
return HB_Err_Ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HB_Error
|
||||||
|
hb_buffer_clear_positions( HB_Buffer buffer )
|
||||||
|
{
|
||||||
|
if ( !buffer->positions )
|
||||||
|
{
|
||||||
|
HB_Error error;
|
||||||
|
|
||||||
|
if ( ALLOC_ARRAY( buffer->positions, buffer->allocated, HB_PositionRec ) )
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset (buffer->positions, 0, sizeof (buffer->positions[0]) * buffer->in_length);
|
||||||
|
|
||||||
|
return HB_Err_Ok;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
hb_buffer_clear_output( HB_Buffer buffer )
|
hb_buffer_clear_output( HB_Buffer buffer )
|
||||||
{
|
{
|
||||||
|
|
|
@ -78,6 +78,9 @@ hb_buffer_clear( HB_Buffer buffer );
|
||||||
void
|
void
|
||||||
hb_buffer_clear_output( HB_Buffer buffer );
|
hb_buffer_clear_output( HB_Buffer buffer );
|
||||||
|
|
||||||
|
HB_Error
|
||||||
|
hb_buffer_clear_positions( HB_Buffer buffer );
|
||||||
|
|
||||||
HB_Error
|
HB_Error
|
||||||
hb_buffer_add_glyph( HB_Buffer buffer,
|
hb_buffer_add_glyph( HB_Buffer buffer,
|
||||||
FT_UInt glyph_index,
|
FT_UInt glyph_index,
|
||||||
|
|
|
@ -6091,7 +6091,7 @@ HB_Error HB_GPOS_Apply_String( FT_Face face,
|
||||||
{
|
{
|
||||||
HB_Error error, retError = HB_Err_Not_Covered;
|
HB_Error error, retError = HB_Err_Not_Covered;
|
||||||
GPOS_Instance gpi;
|
GPOS_Instance gpi;
|
||||||
FT_UShort i, j, lookup_count;
|
int i, j, lookup_count, num_features;
|
||||||
|
|
||||||
if ( !face || !gpos || !buffer )
|
if ( !face || !gpos || !buffer )
|
||||||
return HB_Err_Invalid_Argument;
|
return HB_Err_Invalid_Argument;
|
||||||
|
@ -6106,13 +6106,16 @@ HB_Error HB_GPOS_Apply_String( FT_Face face,
|
||||||
gpi.dvi = dvi;
|
gpi.dvi = dvi;
|
||||||
|
|
||||||
lookup_count = gpos->LookupList.LookupCount;
|
lookup_count = gpos->LookupList.LookupCount;
|
||||||
|
num_features = gpos->FeatureList.ApplyCount;
|
||||||
|
|
||||||
if ( gpos->FeatureList.ApplyCount )
|
if ( num_features )
|
||||||
{
|
{
|
||||||
memset (buffer->positions, 0, sizeof (buffer->positions[0]) * buffer->in_length);
|
error = hb_buffer_clear_positions( buffer );
|
||||||
|
if ( error )
|
||||||
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
for ( i = 0; i < gpos->FeatureList.ApplyCount; i++ )
|
for ( i = 0; i < num_features; i++ )
|
||||||
{
|
{
|
||||||
FT_UShort feature_index = gpos->FeatureList.ApplyOrder[i];
|
FT_UShort feature_index = gpos->FeatureList.ApplyOrder[i];
|
||||||
HB_Feature feature = gpos->FeatureList.FeatureRecord[feature_index].Feature;
|
HB_Feature feature = gpos->FeatureList.FeatureRecord[feature_index].Feature;
|
||||||
|
@ -6136,7 +6139,7 @@ HB_Error HB_GPOS_Apply_String( FT_Face face,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( gpos->FeatureList.ApplyCount )
|
if ( num_features )
|
||||||
{
|
{
|
||||||
error = Position_CursiveChain ( buffer );
|
error = Position_CursiveChain ( buffer );
|
||||||
if ( error )
|
if ( error )
|
||||||
|
|
|
@ -4319,7 +4319,7 @@ HB_Error HB_GSUB_Apply_String( HB_GSUBHeader* gsub,
|
||||||
HB_Buffer buffer )
|
HB_Buffer buffer )
|
||||||
{
|
{
|
||||||
HB_Error error, retError = HB_Err_Not_Covered;
|
HB_Error error, retError = HB_Err_Not_Covered;
|
||||||
FT_UShort i, j, lookup_count;
|
int i, j, lookup_count, num_features;
|
||||||
|
|
||||||
if ( !gsub ||
|
if ( !gsub ||
|
||||||
!buffer)
|
!buffer)
|
||||||
|
@ -4329,8 +4329,9 @@ HB_Error HB_GSUB_Apply_String( HB_GSUBHeader* gsub,
|
||||||
return retError;
|
return retError;
|
||||||
|
|
||||||
lookup_count = gsub->LookupList.LookupCount;
|
lookup_count = gsub->LookupList.LookupCount;
|
||||||
|
num_features = gsub->FeatureList.ApplyCount;
|
||||||
|
|
||||||
for ( i = 0; i < gsub->FeatureList.ApplyCount; i++)
|
for ( i = 0; i < num_features; i++)
|
||||||
{
|
{
|
||||||
FT_UShort feature_index = gsub->FeatureList.ApplyOrder[i];
|
FT_UShort feature_index = gsub->FeatureList.ApplyOrder[i];
|
||||||
HB_Feature feature = gsub->FeatureList.FeatureRecord[feature_index].Feature;
|
HB_Feature feature = gsub->FeatureList.FeatureRecord[feature_index].Feature;
|
||||||
|
|
Loading…
Reference in New Issue