diff options
Diffstat (limited to 'pango/opentype/harfbuzz-open.c')
-rw-r--r-- | pango/opentype/harfbuzz-open.c | 238 |
1 files changed, 111 insertions, 127 deletions
diff --git a/pango/opentype/harfbuzz-open.c b/pango/opentype/harfbuzz-open.c index fa540401..2aebb5ac 100644 --- a/pango/opentype/harfbuzz-open.c +++ b/pango/opentype/harfbuzz-open.c @@ -21,10 +21,10 @@ /* LangSys */ -static FT_Error Load_LangSys( HB_LangSys* ls, +static HB_Error Load_LangSys( HB_LangSys* ls, FT_Stream stream ) { - FT_Error error; + HB_Error error; FT_Memory memory = stream->memory; FT_UShort n, count; FT_UShort* fi; @@ -57,7 +57,7 @@ static FT_Error Load_LangSys( HB_LangSys* ls, FORGET_Frame(); - return FT_Err_Ok; + return HB_Err_Ok; } @@ -70,10 +70,10 @@ static void Free_LangSys( HB_LangSys* ls, /* Script */ -static FT_Error Load_Script( HB_Script* s, +static HB_Error Load_Script( HB_Script* s, FT_Stream stream ) { - FT_Error error; + HB_Error error; FT_Memory memory = stream->memory; FT_UShort n, m, count; FT_ULong cur_offset, new_offset, base_offset; @@ -95,7 +95,7 @@ static FT_Error Load_Script( HB_Script* s, cur_offset = FILE_Pos(); if ( FILE_Seek( new_offset ) || ( error = Load_LangSys( &s->DefaultLangSys, - stream ) ) != FT_Err_Ok ) + stream ) ) != HB_Err_Ok ) return error; (void)FILE_Seek( cur_offset ); } @@ -144,12 +144,12 @@ static FT_Error Load_Script( HB_Script* s, cur_offset = FILE_Pos(); if ( FILE_Seek( new_offset ) || - ( error = Load_LangSys( &lsr[n].LangSys, stream ) ) != FT_Err_Ok ) + ( error = Load_LangSys( &lsr[n].LangSys, stream ) ) != HB_Err_Ok ) goto Fail1; (void)FILE_Seek( cur_offset ); } - return FT_Err_Ok; + return HB_Err_Ok; Fail1: for ( m = 0; m < n; m++ ) @@ -188,10 +188,10 @@ static void Free_Script( HB_Script* s, /* ScriptList */ -FT_Error _HB_OPEN_Load_ScriptList( HB_ScriptList* sl, +HB_Error _HB_OPEN_Load_ScriptList( HB_ScriptList* sl, FT_Stream stream ) { - FT_Error error; + HB_Error error; FT_Memory memory = stream->memory; FT_UShort n, script_count; @@ -233,7 +233,7 @@ FT_Error _HB_OPEN_Load_ScriptList( HB_ScriptList* sl, goto Fail; error = Load_Script( &sr[sl->ScriptCount].Script, stream ); - if ( error == FT_Err_Ok ) + if ( error == HB_Err_Ok ) sl->ScriptCount += 1; else if ( error != HB_Err_Empty_Script ) goto Fail; @@ -247,12 +247,12 @@ FT_Error _HB_OPEN_Load_ScriptList( HB_ScriptList* sl, #if 0 if ( sl->ScriptCount == 0 ) { - error = HB_Err_Invalid_SubTable; + error = _hb_err(HB_Err_Invalid_SubTable); goto Fail; } #endif - return FT_Err_Ok; + return HB_Err_Ok; Fail: for ( n = 0; n < sl->ScriptCount; n++ ) @@ -292,10 +292,10 @@ void _HB_OPEN_Free_ScriptList( HB_ScriptList* sl, /* Feature */ -static FT_Error Load_Feature( HB_Feature* f, +static HB_Error Load_Feature( HB_Feature* f, FT_Stream stream ) { - FT_Error error; + HB_Error error; FT_Memory memory = stream->memory; FT_UShort n, count; @@ -329,7 +329,7 @@ static FT_Error Load_Feature( HB_Feature* f, FORGET_Frame(); - return FT_Err_Ok; + return HB_Err_Ok; } @@ -342,10 +342,10 @@ static void Free_Feature( HB_Feature* f, /* FeatureList */ -FT_Error _HB_OPEN_Load_FeatureList( HB_FeatureList* fl, +HB_Error _HB_OPEN_Load_FeatureList( HB_FeatureList* fl, FT_Stream stream ) { - FT_Error error; + HB_Error error; FT_Memory memory = stream->memory; FT_UShort n, m, count; @@ -386,12 +386,12 @@ FT_Error _HB_OPEN_Load_FeatureList( HB_FeatureList* fl, cur_offset = FILE_Pos(); if ( FILE_Seek( new_offset ) || - ( error = Load_Feature( &fr[n].Feature, stream ) ) != FT_Err_Ok ) + ( error = Load_Feature( &fr[n].Feature, stream ) ) != HB_Err_Ok ) goto Fail1; (void)FILE_Seek( cur_offset ); } - return FT_Err_Ok; + return HB_Err_Ok; Fail1: for ( m = 0; m < n; m++ ) @@ -440,7 +440,7 @@ void _HB_OPEN_Free_FeatureList( HB_FeatureList* fl, /* SubTable */ -static FT_Error Load_SubTable( HB_SubTable* st, +static HB_Error Load_SubTable( HB_SubTable* st, FT_Stream stream, HB_Type table_type, FT_UShort lookup_type ) @@ -466,11 +466,11 @@ static void Free_SubTable( HB_SubTable* st, /* Lookup */ -static FT_Error Load_Lookup( HB_Lookup* l, +static HB_Error Load_Lookup( HB_Lookup* l, FT_Stream stream, HB_Type type ) { - FT_Error error; + HB_Error error; FT_Memory memory = stream->memory; FT_UShort n, m, count; @@ -530,12 +530,12 @@ static FT_Error Load_Lookup( HB_Lookup* l, if ( FILE_Seek( new_offset ) || ( error = Load_SubTable( &st[n], stream, - type, l->LookupType ) ) != FT_Err_Ok ) + type, l->LookupType ) ) != HB_Err_Ok ) goto Fail; (void)FILE_Seek( cur_offset ); } - return FT_Err_Ok; + return HB_Err_Ok; Fail: for ( m = 0; m < n; m++ ) @@ -570,11 +570,11 @@ static void Free_Lookup( HB_Lookup* l, /* LookupList */ -FT_Error _HB_OPEN_Load_LookupList( HB_LookupList* ll, +HB_Error _HB_OPEN_Load_LookupList( HB_LookupList* ll, FT_Stream stream, HB_Type type ) { - FT_Error error; + HB_Error error; FT_Memory memory = stream->memory; FT_UShort n, m, count; @@ -612,12 +612,12 @@ FT_Error _HB_OPEN_Load_LookupList( HB_LookupList* ll, cur_offset = FILE_Pos(); if ( FILE_Seek( new_offset ) || - ( error = Load_Lookup( &l[n], stream, type ) ) != FT_Err_Ok ) + ( error = Load_Lookup( &l[n], stream, type ) ) != HB_Err_Ok ) goto Fail1; (void)FILE_Seek( cur_offset ); } - return FT_Err_Ok; + return HB_Err_Ok; Fail1: FREE( ll->Properties ); @@ -663,10 +663,10 @@ void _HB_OPEN_Free_LookupList( HB_LookupList* ll, /* CoverageFormat1 */ -static FT_Error Load_Coverage1( HB_CoverageFormat1* cf1, +static HB_Error Load_Coverage1( HB_CoverageFormat1* cf1, FT_Stream stream ) { - FT_Error error; + HB_Error error; FT_Memory memory = stream->memory; FT_UShort n, count; @@ -699,7 +699,7 @@ static FT_Error Load_Coverage1( HB_CoverageFormat1* cf1, FORGET_Frame(); - return FT_Err_Ok; + return HB_Err_Ok; } @@ -712,10 +712,10 @@ static void Free_Coverage1( HB_CoverageFormat1* cf1, /* CoverageFormat2 */ -static FT_Error Load_Coverage2( HB_CoverageFormat2* cf2, +static HB_Error Load_Coverage2( HB_CoverageFormat2* cf2, FT_Stream stream ) { - FT_Error error; + HB_Error error; FT_Memory memory = stream->memory; FT_UShort n, count; @@ -751,14 +751,14 @@ static FT_Error Load_Coverage2( HB_CoverageFormat2* cf2, ( rr[n].End - rr[n].Start + (long)rr[n].StartCoverageIndex ) >= 0x10000L ) { - error = HB_Err_Invalid_SubTable; + error = _hb_err(HB_Err_Invalid_SubTable); goto Fail; } } FORGET_Frame(); - return FT_Err_Ok; + return HB_Err_Ok; Fail: FREE( cf2->RangeRecord ); @@ -773,10 +773,10 @@ static void Free_Coverage2( HB_CoverageFormat2* cf2, } -FT_Error _HB_OPEN_Load_Coverage( HB_Coverage* c, +HB_Error _HB_OPEN_Load_Coverage( HB_Coverage* c, FT_Stream stream ) { - FT_Error error; + HB_Error error; if ( ACCESS_Frame( 2L ) ) return error; @@ -787,17 +787,12 @@ FT_Error _HB_OPEN_Load_Coverage( HB_Coverage* c, switch ( c->CoverageFormat ) { - case 1: - return Load_Coverage1( &c->cf.cf1, stream ); - - case 2: - return Load_Coverage2( &c->cf.cf2, stream ); - - default: - return HB_Err_Invalid_SubTable_Format; + case 1: return Load_Coverage1( &c->cf.cf1, stream ); + case 2: return Load_Coverage2( &c->cf.cf2, stream ); + default: return _hb_err(HB_Err_Invalid_SubTable_Format); } - return FT_Err_Ok; /* never reached */ + return HB_Err_Ok; /* never reached */ } @@ -806,18 +801,14 @@ void _HB_OPEN_Free_Coverage( HB_Coverage* c, { switch ( c->CoverageFormat ) { - case 1: - Free_Coverage1( &c->cf.cf1, memory ); - break; - - case 2: - Free_Coverage2( &c->cf.cf2, memory ); - break; + case 1: Free_Coverage1( &c->cf.cf1, memory ); break; + case 2: Free_Coverage2( &c->cf.cf2, memory ); break; + default: break; } } -static FT_Error Coverage_Index1( HB_CoverageFormat1* cf1, +static HB_Error Coverage_Index1( HB_CoverageFormat1* cf1, FT_UShort glyphID, FT_UShort* index ) { @@ -847,7 +838,7 @@ static FT_Error Coverage_Index1( HB_CoverageFormat1* cf1, if ( glyphID == array[middle] ) { *index = middle; - return FT_Err_Ok; + return HB_Err_Ok; } else if ( glyphID < array[middle] ) { @@ -867,7 +858,7 @@ static FT_Error Coverage_Index1( HB_CoverageFormat1* cf1, } -static FT_Error Coverage_Index2( HB_CoverageFormat2* cf2, +static HB_Error Coverage_Index2( HB_CoverageFormat2* cf2, FT_UShort glyphID, FT_UShort* index ) { @@ -897,7 +888,7 @@ static FT_Error Coverage_Index2( HB_CoverageFormat2* cf2, if ( glyphID >= rr[middle].Start && glyphID <= rr[middle].End ) { *index = rr[middle].StartCoverageIndex + glyphID - rr[middle].Start; - return FT_Err_Ok; + return HB_Err_Ok; } else if ( glyphID < rr[middle].Start ) { @@ -917,23 +908,18 @@ static FT_Error Coverage_Index2( HB_CoverageFormat2* cf2, } -FT_Error _HB_OPEN_Coverage_Index( HB_Coverage* c, +HB_Error _HB_OPEN_Coverage_Index( HB_Coverage* c, FT_UShort glyphID, FT_UShort* index ) { switch ( c->CoverageFormat ) { - case 1: - return Coverage_Index1( &c->cf.cf1, glyphID, index ); - - case 2: - return Coverage_Index2( &c->cf.cf2, glyphID, index ); - - default: - return HB_Err_Invalid_SubTable_Format; + case 1: return Coverage_Index1( &c->cf.cf1, glyphID, index ); + case 2: return Coverage_Index2( &c->cf.cf2, glyphID, index ); + default: return _hb_err(HB_Err_Invalid_SubTable_Format); } - return FT_Err_Ok; /* never reached */ + return HB_Err_Ok; /* never reached */ } @@ -945,11 +931,11 @@ FT_Error _HB_OPEN_Coverage_Index( HB_Coverage* c, /* ClassDefFormat1 */ -static FT_Error Load_ClassDef1( HB_ClassDefinition* cd, +static HB_Error Load_ClassDef1( HB_ClassDefinition* cd, FT_UShort limit, FT_Stream stream ) { - FT_Error error; + HB_Error error; FT_Memory memory = stream->memory; FT_UShort n, count; @@ -973,7 +959,7 @@ static FT_Error Load_ClassDef1( HB_ClassDefinition* cd, /* sanity check; we are limited to 16bit integers */ if ( cdf1->StartGlyph + (long)count >= 0x10000L ) - return HB_Err_Invalid_SubTable; + return _hb_err(HB_Err_Invalid_SubTable); cdf1->ClassValueArray = NULL; @@ -991,7 +977,7 @@ static FT_Error Load_ClassDef1( HB_ClassDefinition* cd, cva[n] = GET_UShort(); if ( cva[n] >= limit ) { - error = HB_Err_Invalid_SubTable; + error = _hb_err(HB_Err_Invalid_SubTable); goto Fail; } d[cva[n]] = TRUE; @@ -999,7 +985,7 @@ static FT_Error Load_ClassDef1( HB_ClassDefinition* cd, FORGET_Frame(); - return FT_Err_Ok; + return HB_Err_Ok; Fail: FREE( cva ); @@ -1017,11 +1003,11 @@ static void Free_ClassDef1( HB_ClassDefFormat1* cdf1, /* ClassDefFormat2 */ -static FT_Error Load_ClassDef2( HB_ClassDefinition* cd, +static HB_Error Load_ClassDef2( HB_ClassDefinition* cd, FT_UShort limit, FT_Stream stream ) { - FT_Error error; + HB_Error error; FT_Memory memory = stream->memory; FT_UShort n, count; @@ -1037,7 +1023,8 @@ static FT_Error Load_ClassDef2( HB_ClassDefinition* cd, if ( ACCESS_Frame( 2L ) ) return error; - count = cdf2->ClassRangeCount = GET_UShort(); + count = GET_UShort(); + cdf2->ClassRangeCount = 0; /* zero for now. we fill with the number of good entries later */ FORGET_Frame(); @@ -1063,15 +1050,22 @@ static FT_Error Load_ClassDef2( HB_ClassDefinition* cd, if ( crr[n].Start > crr[n].End || crr[n].Class >= limit ) { - error = HB_Err_Invalid_SubTable; - goto Fail; + /* XXX + * Corrupt entry. Skip it. + * This is hit by Nafees Nastaliq font for example + */ + n--; + count--; } - d[crr[n].Class] = TRUE; + else + d[crr[n].Class] = TRUE; } FORGET_Frame(); - return FT_Err_Ok; + cdf2->ClassRangeCount = count; + + return HB_Err_Ok; Fail: FREE( crr ); @@ -1089,11 +1083,11 @@ static void Free_ClassDef2( HB_ClassDefFormat2* cdf2, /* ClassDefinition */ -FT_Error _HB_OPEN_Load_ClassDefinition( HB_ClassDefinition* cd, +HB_Error _HB_OPEN_Load_ClassDefinition( HB_ClassDefinition* cd, FT_UShort limit, FT_Stream stream ) { - FT_Error error; + HB_Error error; FT_Memory memory = stream->memory; @@ -1109,17 +1103,9 @@ FT_Error _HB_OPEN_Load_ClassDefinition( HB_ClassDefinition* cd, switch ( cd->ClassFormat ) { - case 1: - error = Load_ClassDef1( cd, limit, stream ); - break; - - case 2: - error = Load_ClassDef2( cd, limit, stream ); - break; - - default: - error = HB_Err_Invalid_SubTable_Format; - break; + case 1: error = Load_ClassDef1( cd, limit, stream ); break; + case 2: error = Load_ClassDef2( cd, limit, stream ); break; + default: error = _hb_err(HB_Err_Invalid_SubTable_Format); break; } if ( error ) @@ -1127,7 +1113,7 @@ FT_Error _HB_OPEN_Load_ClassDefinition( HB_ClassDefinition* cd, cd->loaded = TRUE; - return FT_Err_Ok; + return HB_Err_Ok; Fail: FREE( cd->Defined ); @@ -1135,10 +1121,10 @@ Fail: } -FT_Error _HB_OPEN_Load_EmptyClassDefinition( HB_ClassDefinition* cd, +HB_Error _HB_OPEN_Load_EmptyClassDefinition( HB_ClassDefinition* cd, FT_Stream stream ) { - FT_Error error; + HB_Error error; FT_Memory memory = stream->memory; @@ -1151,7 +1137,7 @@ FT_Error _HB_OPEN_Load_EmptyClassDefinition( HB_ClassDefinition* cd, if ( ALLOC_ARRAY( cd->cd.cd1.ClassValueArray, 1, FT_UShort ) ) goto Fail; - return FT_Err_Ok; + return HB_Err_Ok; Fail: FREE( cd->Defined ); @@ -1168,18 +1154,14 @@ void _HB_OPEN_Free_ClassDefinition( HB_ClassDefinition* cd, switch ( cd->ClassFormat ) { - case 1: - Free_ClassDef1( &cd->cd.cd1, memory ); - break; - - case 2: - Free_ClassDef2( &cd->cd.cd2, memory ); - break; + case 1: Free_ClassDef1( &cd->cd.cd1, memory ); break; + case 2: Free_ClassDef2( &cd->cd.cd2, memory ); break; + default: break; } } -static FT_Error Get_Class1( HB_ClassDefFormat1* cdf1, +static HB_Error Get_Class1( HB_ClassDefFormat1* cdf1, FT_UShort glyphID, FT_UShort* class, FT_UShort* index ) @@ -1194,7 +1176,7 @@ static FT_Error Get_Class1( HB_ClassDefFormat1* cdf1, glyphID < cdf1->StartGlyph + cdf1->GlyphCount ) { *class = cva[glyphID - cdf1->StartGlyph]; - return FT_Err_Ok; + return HB_Err_Ok; } else { @@ -1207,12 +1189,12 @@ static FT_Error Get_Class1( HB_ClassDefFormat1* cdf1, /* we need the index value of the last searched class range record in case of failure for constructed GDEF tables */ -static FT_Error Get_Class2( HB_ClassDefFormat2* cdf2, +static HB_Error Get_Class2( HB_ClassDefFormat2* cdf2, FT_UShort glyphID, FT_UShort* class, FT_UShort* index ) { - FT_Error error = FT_Err_Ok; + HB_Error error = HB_Err_Ok; FT_UShort min, max, new_min, new_max, middle; HB_ClassRangeRecord* crr = cdf2->ClassRangeRecord; @@ -1245,7 +1227,7 @@ static FT_Error Get_Class2( HB_ClassDefFormat2* cdf2, if ( glyphID >= crr[middle].Start && glyphID <= crr[middle].End ) { *class = crr[middle].Class; - error = FT_Err_Ok; + error = HB_Err_Ok; break; } else if ( glyphID < crr[middle].Start ) @@ -1277,24 +1259,19 @@ static FT_Error Get_Class2( HB_ClassDefFormat2* cdf2, } -FT_Error _HB_OPEN_Get_Class( HB_ClassDefinition* cd, +HB_Error _HB_OPEN_Get_Class( HB_ClassDefinition* cd, FT_UShort glyphID, FT_UShort* class, FT_UShort* index ) { switch ( cd->ClassFormat ) { - case 1: - return Get_Class1( &cd->cd.cd1, glyphID, class, index ); - - case 2: - return Get_Class2( &cd->cd.cd2, glyphID, class, index ); - - default: - return HB_Err_Invalid_SubTable_Format; + case 1: return Get_Class1( &cd->cd.cd1, glyphID, class, index ); + case 2: return Get_Class2( &cd->cd.cd2, glyphID, class, index ); + default: return _hb_err(HB_Err_Invalid_SubTable_Format); } - return FT_Err_Ok; /* never reached */ + return HB_Err_Ok; /* never reached */ } @@ -1304,10 +1281,10 @@ FT_Error _HB_OPEN_Get_Class( HB_ClassDefinition* cd, ***************************/ -FT_Error _HB_OPEN_Load_Device( HB_Device* d, +HB_Error _HB_OPEN_Load_Device( HB_Device* d, FT_Stream stream ) { - FT_Error error; + HB_Error error; FT_Memory memory = stream->memory; FT_UShort n, count; @@ -1324,11 +1301,18 @@ FT_Error _HB_OPEN_Load_Device( HB_Device* d, FORGET_Frame(); + d->DeltaValue = NULL; + if ( d->StartSize > d->EndSize || d->DeltaFormat == 0 || d->DeltaFormat > 3 ) - return HB_Err_Invalid_SubTable; - - d->DeltaValue = NULL; + { + /* XXX + * I've seen fontforge generate DeltaFormat == 0. + * Just return Ok and let the NULL DeltaValue disable + * this table. + */ + return HB_Err_Ok; + } count = ( ( d->EndSize - d->StartSize + 1 ) >> ( 4 - d->DeltaFormat ) ) + 1; @@ -1349,7 +1333,7 @@ FT_Error _HB_OPEN_Load_Device( HB_Device* d, FORGET_Frame(); - return FT_Err_Ok; + return HB_Err_Ok; } @@ -1395,7 +1379,7 @@ void _HB_OPEN_Free_Device( HB_Device* d, mask = 0x00FF */ -FT_Error _HB_OPEN_Get_Device( HB_Device* d, +HB_Error _HB_OPEN_Get_Device( HB_Device* d, FT_UShort size, FT_Short* value ) { @@ -1418,7 +1402,7 @@ FT_Error _HB_OPEN_Get_Device( HB_Device* d, if ( *value >= ( ( mask + 1 ) >> 1 ) ) *value -= mask + 1; - return FT_Err_Ok; + return HB_Err_Ok; } else { |