Allocate buffer->positions lazily.

2007-10-11  Behdad Esfahbod  <behdad@gnome.org>

        * pango/opentype/*: Allocate buffer->positions lazily.
This commit is contained in:
Behdad Esfahbod 2007-10-11 07:05:09 +00:00 committed by Behdad Esfahbod
parent fc3d6f5758
commit 06003908cc
4 changed files with 37 additions and 9 deletions

View File

@ -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 )
{ {

View File

@ -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,

View File

@ -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 )

View File

@ -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;