Allocate buffer->positions lazily.
authorBehdad Esfahbod <behdad@gnome.org>
Thu, 11 Oct 2007 07:05:09 +0000 (07:05 +0000)
committerBehdad Esfahbod <behdad@src.gnome.org>
Thu, 11 Oct 2007 07:05:09 +0000 (07:05 +0000)
2007-10-11  Behdad Esfahbod  <behdad@gnome.org>

        * pango/opentype/*: Allocate buffer->positions lazily.

src/harfbuzz-buffer.c
src/harfbuzz-buffer.h
src/harfbuzz-gpos.c
src/harfbuzz-gsub.c

index f597ac9..e39a24b 100644 (file)
@@ -51,10 +51,15 @@ hb_buffer_ensure( HB_Buffer buffer,
       while (size > new_allocated)
        new_allocated += (new_allocated >> 1) + 8;
       
-      if ( REALLOC_ARRAY( buffer->positions, new_allocated, HB_PositionRec ) )
-       return error;
+      if ( buffer->positions )
+        {
+         if ( REALLOC_ARRAY( buffer->positions, new_allocated, HB_PositionRec ) )
+           return error;
+       }
+
       if ( REALLOC_ARRAY( buffer->in_string, new_allocated, HB_GlyphItemRec ) )
        return error;
+
       if ( buffer->inplace )
         {
          buffer->out_string = buffer->in_string;
@@ -121,6 +126,22 @@ hb_buffer_new( HB_Buffer *buffer )
   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
 hb_buffer_clear_output( HB_Buffer buffer )
 {
index 9adfc57..c0b047f 100644 (file)
@@ -79,6 +79,9 @@ void
 hb_buffer_clear_output( HB_Buffer buffer );
 
 HB_Error
+hb_buffer_clear_positions( HB_Buffer buffer );
+
+HB_Error
 hb_buffer_add_glyph( HB_Buffer buffer,
                      FT_UInt    glyph_index,
                      FT_UInt    properties,
index 5c91f6e..52ed120 100644 (file)
@@ -6091,7 +6091,7 @@ HB_Error  HB_GPOS_Apply_String( FT_Face           face,
 {
   HB_Error       error, retError = HB_Err_Not_Covered;
   GPOS_Instance  gpi;
-  FT_UShort      i, j, lookup_count;
+  int            i, j, lookup_count, num_features;
 
   if ( !face || !gpos || !buffer )
     return HB_Err_Invalid_Argument;
@@ -6106,13 +6106,16 @@ HB_Error  HB_GPOS_Apply_String( FT_Face           face,
   gpi.dvi        = dvi;
 
   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];
     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 );
       if ( error )
index 16a5385..3f70e0d 100644 (file)
@@ -4319,7 +4319,7 @@ HB_Error  HB_GSUB_Apply_String( HB_GSUBHeader*   gsub,
                                HB_Buffer        buffer )
 {
   HB_Error          error, retError = HB_Err_Not_Covered;
-  FT_UShort         i, j, lookup_count;
+  int               i, j, lookup_count, num_features;
 
   if ( !gsub ||
        !buffer)
@@ -4329,8 +4329,9 @@ HB_Error  HB_GSUB_Apply_String( HB_GSUBHeader*   gsub,
     return retError;
 
   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];
     HB_Feature feature = gsub->FeatureList.FeatureRecord[feature_index].Feature;