From aca4d11388eedd532a73bd34747abb65c0ea9291 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 2 Feb 2009 00:13:07 +0000 Subject: [PATCH] Allocate all array rows in a single ALLOC call. Saves over 100 alloc calls 2009-01-31 Behdad Esfahbod * pango/opentype/harfbuzz-gpos.c (Load_Mark2Array), (Free_Mark2Array): Allocate all array rows in a single ALLOC call. Saves over 100 alloc calls when loading DejaVu Sans, --- src/harfbuzz-gpos.c | 59 +++++++++++++-------------------------------- 1 file changed, 17 insertions(+), 42 deletions(-) diff --git a/src/harfbuzz-gpos.c b/src/harfbuzz-gpos.c index a318ce18f..2961940c1 100644 --- a/src/harfbuzz-gpos.c +++ b/src/harfbuzz-gpos.c @@ -2735,11 +2735,11 @@ static HB_Error Load_Mark2Array( HB_Mark2Array* m2a, { HB_Error error; - HB_UShort k, m, n, count; + HB_UShort k, m, n, count; HB_UInt cur_offset, new_offset, base_offset; - HB_Mark2Record* m2r; - HB_Anchor* m2an; + HB_Mark2Record *m2r; + HB_Anchor *m2an, *m2ans; base_offset = FILE_Pos(); @@ -2758,19 +2758,19 @@ static HB_Error Load_Mark2Array( HB_Mark2Array* m2a, m2r = m2a->Mark2Record; + m2ans = NULL; + + if ( ALLOC_ARRAY( m2ans, count * num_classes, HB_Anchor ) ) + goto Fail; + for ( m = 0; m < count; m++ ) { - m2r[m].Mark2Anchor = NULL; - - if ( ALLOC_ARRAY( m2r[m].Mark2Anchor, num_classes, HB_Anchor ) ) - goto Fail; - - m2an = m2r[m].Mark2Anchor; + m2an = m2r[m].Mark2Anchor = m2ans + m * num_classes; for ( n = 0; n < num_classes; n++ ) { if ( ACCESS_Frame( 2L ) ) - goto Fail0; + goto Fail; new_offset = GET_UShort() + base_offset; @@ -2786,30 +2786,15 @@ static HB_Error Load_Mark2Array( HB_Mark2Array* m2a, cur_offset = FILE_Pos(); if ( FILE_Seek( new_offset ) || ( error = Load_Anchor( &m2an[n], stream ) ) != HB_Err_Ok ) - goto Fail0; + goto Fail; (void)FILE_Seek( cur_offset ); } - - continue; - Fail0: - for ( k = 0; k < n; k++ ) - Free_Anchor( &m2an[k] ); - goto Fail; } return HB_Err_Ok; Fail: - for ( k = 0; k < m; k++ ) - { - m2an = m2r[k].Mark2Anchor; - - for ( n = 0; n < num_classes; n++ ) - Free_Anchor( &m2an[n] ); - - FREE( m2an ); - } - + FREE( m2ans ); FREE( m2r ); return error; } @@ -2818,27 +2803,17 @@ Fail: static void Free_Mark2Array( HB_Mark2Array* m2a, HB_UShort num_classes ) { - HB_UShort m, n, count; - - HB_Mark2Record* m2r; - HB_Anchor* m2an; + HB_Mark2Record *m2r; + HB_Anchor *m2ans; + HB_UNUSED(num_classes); if ( m2a->Mark2Record ) { - count = m2a->Mark2Count; m2r = m2a->Mark2Record; + m2ans = m2r[0].Mark2Anchor; - for ( m = 0; m < count; m++ ) - { - m2an = m2r[m].Mark2Anchor; - - for ( n = 0; n < num_classes; n++ ) - Free_Anchor( &m2an[n] ); - - FREE( m2an ); - } - + FREE( m2ans ); FREE( m2r ); } }