Remove ClassDef->Defined field. This is the comment accompanying it:

2009-01-29  Behdad Esfahbod  <behdad@gnome.org>

        * pango/opentype/harfbuzz-open.h:
        * pango/opentype/harfbuzz-gdef.c (Make_ClassRange),
        (HB_GDEF_Build_ClassDefinition):
        * pango/opentype/harfbuzz-gpos.c (Load_PosClassRule),
        (Load_ChainPosClassRule):
        * pango/opentype/harfbuzz-gsub.c (Load_SubClassRule),
        (Load_ChainSubClassRule):
        * pango/opentype/harfbuzz-open.c (Load_ClassDef1),
        (Load_ClassDef2), (_HB_OPEN_Load_ClassDefinition),
        (_HB_OPEN_Load_EmptyClassDefinition),
        (_HB_OPEN_Free_ClassDefinition):
        Remove ClassDef->Defined field.  This is the comment accompanying it:

          The `Defined' field is not defined in the OpenType specification
          but apparently needed for processing fonts like trado.ttf: This
          font refers to a class which contains not a single element.  We
          map such classes to class 0.

        The comment is correct that trado.ttf (MS Traditional Arabic) uses
        such classes.  However, in my testing I couldn't identify any
        problems with the font if the special handling is removed.  I also
        processed as many fonts as I could get my hand on and trado.ttf was
        the only not-totally-broken font hitting the special-case code.
        DejaVu fonts hit it too, but I'm sure they do not require the
        special-handling code.  Most probably, that code introduces bugs
        in them.

        The special-casing was consuming lots of memory.  EIGHT MEGABYTES
        for loading DejaVu Sans!  While this could be complete fixed, I
        decided to remove the special-handling code altogether.  I don't
        think it will make any real difference, and if it does, we'll fix
        fonts.  Such hacks will not be in harfbuzz-ng anyway.

        Bug originally reported by nsf.
This commit is contained in:
Behdad Esfahbod 2009-01-29 09:20:08 +00:00 committed by Behdad Esfahbod
parent 9372edd6f0
commit c561d69c72
5 changed files with 3 additions and 106 deletions

View File

@ -776,8 +776,6 @@ static HB_Error Make_ClassRange( HB_ClassDefinition* cd,
crr[index].End = end;
crr[index].Class = class;
cd->Defined[class] = TRUE;
return HB_Err_Ok;
}
@ -807,11 +805,6 @@ HB_Error HB_GDEF_Build_ClassDefinition( HB_GDEFHeader* gdef,
gcd->ClassFormat = 2;
/* A GlyphClassDef table contains at most 5 different class values */
if ( ALLOC_ARRAY( gcd->Defined, 5, HB_Bool ) )
return error;
gcd->cd.cd2.ClassRangeCount = 0;
gcd->cd.cd2.ClassRangeRecord = NULL;
@ -959,7 +952,6 @@ Fail3:
FREE( gcd->cd.cd2.ClassRangeRecord );
Fail4:
FREE( gcd->Defined );
return error;
}

View File

@ -3362,7 +3362,6 @@ static HB_Error Load_PosClassRule( HB_ContextPosFormat2* cpf2,
HB_UShort* c;
HB_PosLookupRecord* plr;
HB_Bool* d;
if ( ACCESS_Frame( 4L ) )
@ -3384,22 +3383,13 @@ static HB_Error Load_PosClassRule( HB_ContextPosFormat2* cpf2,
return error;
c = pcr->Class;
d = cpf2->ClassDef.Defined;
if ( ACCESS_Frame( count * 2L ) )
goto Fail2;
for ( n = 0; n < count; n++ )
{
c[n] = GET_UShort();
/* We check whether the specific class is used at all. If not,
class 0 is used instead. */
if ( !d[c[n]] )
c[n] = 0;
}
FORGET_Frame();
pcr->PosLookupRecord = NULL;
@ -4376,7 +4366,6 @@ static HB_Error Load_ChainPosClassRule(
HB_UShort* i;
HB_UShort* l;
HB_PosLookupRecord* plr;
HB_Bool* d;
if ( ACCESS_Frame( 2L ) )
@ -4397,22 +4386,13 @@ static HB_Error Load_ChainPosClassRule(
return error;
b = cpcr->Backtrack;
d = ccpf2->BacktrackClassDef.Defined;
if ( ACCESS_Frame( count * 2L ) )
goto Fail4;
for ( n = 0; n < count; n++ )
{
b[n] = GET_UShort();
/* We check whether the specific class is used at all. If not,
class 0 is used instead. */
if ( !d[b[n]] )
b[n] = 0;
}
FORGET_Frame();
if ( ACCESS_Frame( 2L ) )
@ -4433,19 +4413,13 @@ static HB_Error Load_ChainPosClassRule(
goto Fail4;
i = cpcr->Input;
d = ccpf2->InputClassDef.Defined;
if ( ACCESS_Frame( count * 2L ) )
goto Fail3;
for ( n = 0; n < count; n++ )
{
i[n] = GET_UShort();
if ( !d[i[n]] )
i[n] = 0;
}
FORGET_Frame();
if ( ACCESS_Frame( 2L ) )
@ -4466,19 +4440,13 @@ static HB_Error Load_ChainPosClassRule(
goto Fail3;
l = cpcr->Lookahead;
d = ccpf2->LookaheadClassDef.Defined;
if ( ACCESS_Frame( count * 2L ) )
goto Fail2;
for ( n = 0; n < count; n++ )
{
l[n] = GET_UShort();
if ( !d[l[n]] )
l[n] = 0;
}
FORGET_Frame();
if ( ACCESS_Frame( 2L ) )

View File

@ -1385,7 +1385,6 @@ static HB_Error Load_SubClassRule( HB_ContextSubstFormat2* csf2,
HB_UShort* c;
HB_SubstLookupRecord* slr;
HB_Bool* d;
if ( ACCESS_Frame( 4L ) )
@ -1407,21 +1406,13 @@ static HB_Error Load_SubClassRule( HB_ContextSubstFormat2* csf2,
return error;
c = scr->Class;
d = csf2->ClassDef.Defined;
if ( ACCESS_Frame( count * 2L ) )
goto Fail2;
for ( n = 0; n < count; n++ )
{
c[n] = GET_UShort();
/* We check whether the specific class is used at all. If not,
class 0 is used instead. */
if ( !d[c[n]] )
c[n] = 0;
}
FORGET_Frame();
scr->SubstLookupRecord = NULL;
@ -2379,7 +2370,6 @@ static HB_Error Load_ChainSubClassRule(
HB_UShort* i;
HB_UShort* l;
HB_SubstLookupRecord* slr;
HB_Bool* d;
if ( ACCESS_Frame( 2L ) )
@ -2400,22 +2390,13 @@ static HB_Error Load_ChainSubClassRule(
return error;
b = cscr->Backtrack;
d = ccsf2->BacktrackClassDef.Defined;
if ( ACCESS_Frame( count * 2L ) )
goto Fail4;
for ( n = 0; n < count; n++ )
{
b[n] = GET_UShort();
/* We check whether the specific class is used at all. If not,
class 0 is used instead. */
if ( !d[b[n]] )
b[n] = 0;
}
FORGET_Frame();
if ( ACCESS_Frame( 2L ) )
@ -2436,19 +2417,13 @@ static HB_Error Load_ChainSubClassRule(
goto Fail4;
i = cscr->Input;
d = ccsf2->InputClassDef.Defined;
if ( ACCESS_Frame( count * 2L ) )
goto Fail3;
for ( n = 0; n < count; n++ )
{
i[n] = GET_UShort();
if ( !d[i[n]] )
i[n] = 0;
}
FORGET_Frame();
if ( ACCESS_Frame( 2L ) )
@ -2469,19 +2444,13 @@ static HB_Error Load_ChainSubClassRule(
goto Fail3;
l = cscr->Lookahead;
d = ccsf2->LookaheadClassDef.Defined;
if ( ACCESS_Frame( count * 2L ) )
goto Fail2;
for ( n = 0; n < count; n++ )
{
l[n] = GET_UShort();
if ( !d[l[n]] )
l[n] = 0;
}
FORGET_Frame();
if ( ACCESS_Frame( 2L ) )

View File

@ -942,7 +942,6 @@ static HB_Error Load_ClassDef1( HB_ClassDefinition* cd,
HB_UShort n, count;
HB_UShort* cva;
HB_Bool* d;
HB_ClassDefFormat1* cdf1;
@ -967,7 +966,6 @@ static HB_Error Load_ClassDef1( HB_ClassDefinition* cd,
if ( ALLOC_ARRAY( cdf1->ClassValueArray, count, HB_UShort ) )
return error;
d = cd->Defined;
cva = cdf1->ClassValueArray;
if ( ACCESS_Frame( count * 2L ) )
@ -981,7 +979,6 @@ static HB_Error Load_ClassDef1( HB_ClassDefinition* cd,
error = ERR(HB_Err_Invalid_SubTable);
goto Fail;
}
d[cva[n]] = TRUE;
}
FORGET_Frame();
@ -1012,7 +1009,6 @@ static HB_Error Load_ClassDef2( HB_ClassDefinition* cd,
HB_UShort n, count;
HB_ClassRangeRecord* crr;
HB_Bool* d;
HB_ClassDefFormat2* cdf2;
@ -1032,7 +1028,6 @@ static HB_Error Load_ClassDef2( HB_ClassDefinition* cd,
if ( ALLOC_ARRAY( cdf2->ClassRangeRecord, count, HB_ClassRangeRecord ) )
return error;
d = cd->Defined;
crr = cdf2->ClassRangeRecord;
if ( ACCESS_Frame( count * 6L ) )
@ -1056,8 +1051,6 @@ static HB_Error Load_ClassDef2( HB_ClassDefinition* cd,
n--;
count--;
}
else
d[crr[n].Class] = TRUE;
}
FORGET_Frame();
@ -1088,11 +1081,8 @@ _HB_OPEN_Load_ClassDefinition( HB_ClassDefinition* cd,
{
HB_Error error;
if ( ALLOC_ARRAY( cd->Defined, limit, HB_Bool ) )
return error;
if ( ACCESS_Frame( 2L ) )
goto Fail;
return error;
cd->ClassFormat = GET_UShort();
@ -1106,15 +1096,11 @@ _HB_OPEN_Load_ClassDefinition( HB_ClassDefinition* cd,
}
if ( error )
goto Fail;
return error;
cd->loaded = TRUE;
return HB_Err_Ok;
Fail:
FREE( cd->Defined );
return error;
}
@ -1123,20 +1109,12 @@ _HB_OPEN_Load_EmptyClassDefinition( HB_ClassDefinition* cd )
{
HB_Error error;
if ( ALLOC_ARRAY( cd->Defined, 1, HB_Bool ) )
return error;
cd->ClassFormat = 1; /* Meaningless */
cd->Defined[0] = FALSE;
if ( ALLOC_ARRAY( cd->cd.cd1.ClassValueArray, 1, HB_UShort ) )
goto Fail;
return error;
return HB_Err_Ok;
Fail:
FREE( cd->Defined );
return error;
}
HB_INTERNAL HB_Error
@ -1171,8 +1149,6 @@ _HB_OPEN_Free_ClassDefinition( HB_ClassDefinition* cd )
if ( !cd->loaded )
return;
FREE( cd->Defined );
switch ( cd->ClassFormat )
{
case 1: Free_ClassDef1( &cd->cd.cd1 ); break;

View File

@ -240,18 +240,10 @@ struct HB_ClassDefFormat2_
typedef struct HB_ClassDefFormat2_ HB_ClassDefFormat2;
/* The `Defined' field is not defined in the OpenType specification but
apparently needed for processing fonts like trado.ttf: This font
refers to a class which contains not a single element. We map such
classes to class 0. */
struct HB_ClassDefinition_
{
HB_Bool loaded;
HB_Bool* Defined; /* array of Booleans.
If Defined[n] is FALSE,
class n contains no glyphs. */
HB_UShort ClassFormat; /* 1 or 2 */
union