diff options
author | Behdad Esfahbod <behdad@gnome.org> | 2009-02-02 00:13:07 +0000 |
---|---|---|
committer | Behdad Esfahbod <behdad@src.gnome.org> | 2009-02-02 00:13:07 +0000 |
commit | ac71657dc57952d37f86a59fd244f72a1bd32b14 (patch) | |
tree | afbaab542e3072cecf7eca7698999d7106942a55 /pango | |
parent | 444a53fb2607c6bd59c644f080843fc0ead5555a (diff) | |
download | pango-ac71657dc57952d37f86a59fd244f72a1bd32b14.tar.gz |
Allocate all array rows in a single ALLOC call. Saves over 100 alloc calls
2009-01-31 Behdad Esfahbod <behdad@gnome.org>
* 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,
svn path=/trunk/; revision=2824
Diffstat (limited to 'pango')
-rw-r--r-- | pango/opentype/harfbuzz-gpos.c | 59 |
1 files changed, 17 insertions, 42 deletions
diff --git a/pango/opentype/harfbuzz-gpos.c b/pango/opentype/harfbuzz-gpos.c index a318ce18..2961940c 100644 --- a/pango/opentype/harfbuzz-gpos.c +++ b/pango/opentype/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; - for ( m = 0; m < count; m++ ) - { - m2r[m].Mark2Anchor = NULL; + m2ans = NULL; - if ( ALLOC_ARRAY( m2r[m].Mark2Anchor, num_classes, HB_Anchor ) ) - goto Fail; + if ( ALLOC_ARRAY( m2ans, count * num_classes, HB_Anchor ) ) + goto Fail; - m2an = m2r[m].Mark2Anchor; + for ( m = 0; m < count; m++ ) + { + 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 ); } } |