[otvalid] Handle `GSUB' and `GPOS' v1.1 tables.

* src/otvalid/otvgsub.c (otv_GSUB_validate), src/otvalid/otvgpos.c
(otv_GPOS_validate): Implement it.
This commit is contained in:
Werner Lemberg 2017-09-24 09:13:41 +02:00
parent 2b79d25f22
commit 0da0faf0fb
3 changed files with 75 additions and 8 deletions

View File

@ -5,6 +5,13 @@
* build/windows/ftver.rc: New VERSIONINFO resource.
* build/windows/vc2010/freetype.vcxproj: Further improvements.
2017-09-23 Werner Lemberg <wl@gnu.org>
[otvalid] Handle `GSUB' and `GPOS' v1.1 tables.
* src/otvalid/otvgsub.c (otv_GSUB_validate), src/otvalid/otvgpos.c
(otv_GPOS_validate): Implement it.
2017-09-23 Werner Lemberg <wl@gnu.org>
[otvalid] Update common table handling to OpenType 1.8.2.

View File

@ -130,7 +130,7 @@
otv_MarkArray_validate( table + Array1, otvalid );
otvalid->nesting_level++;
func = otvalid->func[otvalid->nesting_level];
func = otvalid->func[otvalid->nesting_level];
otvalid->extra1 = ClassCount;
func( table + Array2, otvalid );
@ -271,7 +271,7 @@
case 3:
{
FT_UInt table_size;
FT_UInt table_size;
OTV_OPTIONAL_TABLE( XDeviceTable );
OTV_OPTIONAL_TABLE( YDeviceTable );
@ -537,7 +537,7 @@
otv_ClassDef_validate( table + ClassDef2, otvalid );
OTV_LIMIT_CHECK( ClassCount1 * ClassCount2 *
( len_value1 + len_value2 ) );
( len_value1 + len_value2 ) );
/* Class1Record */
for ( ; ClassCount1 > 0; ClassCount1-- )
@ -985,20 +985,42 @@
{
OTV_ValidatorRec validrec;
OTV_Validator otvalid = &validrec;
FT_Bytes p = table;
FT_Bytes p = table;
FT_UInt table_size;
FT_UShort version;
FT_UInt ScriptList, FeatureList, LookupList;
OTV_OPTIONAL_TABLE32( featureVariations );
otvalid->root = ftvalid;
FT_TRACE3(( "validating GPOS table\n" ));
OTV_INIT;
OTV_LIMIT_CHECK( 10 );
OTV_LIMIT_CHECK( 4 );
if ( FT_NEXT_ULONG( p ) != 0x10000UL ) /* Version */
if ( FT_NEXT_USHORT( p ) != 1 ) /* majorVersion */
FT_INVALID_FORMAT;
version = FT_NEXT_USHORT( p ); /* minorVersion */
table_size = 10;
switch ( version )
{
case 0:
OTV_LIMIT_CHECK( 6 );
break;
case 1:
OTV_LIMIT_CHECK( 10 );
table_size += 4;
break;
default:
FT_INVALID_FORMAT;
}
ScriptList = FT_NEXT_USHORT( p );
FeatureList = FT_NEXT_USHORT( p );
LookupList = FT_NEXT_USHORT( p );
@ -1014,6 +1036,14 @@
otv_ScriptList_validate( table + ScriptList, table + FeatureList,
otvalid );
if ( version > 0 )
{
OTV_OPTIONAL_OFFSET32( featureVariations );
OTV_SIZE_CHECK32( featureVariations );
if ( featureVariations )
OTV_TRACE(( " [omitting featureVariations validation]\n" )); /* XXX */
}
FT_TRACE4(( "\n" ));
}

View File

@ -552,19 +552,41 @@
OTV_ValidatorRec otvalidrec;
OTV_Validator otvalid = &otvalidrec;
FT_Bytes p = table;
FT_UInt table_size;
FT_UShort version;
FT_UInt ScriptList, FeatureList, LookupList;
OTV_OPTIONAL_TABLE32( featureVariations );
otvalid->root = ftvalid;
FT_TRACE3(( "validating GSUB table\n" ));
OTV_INIT;
OTV_LIMIT_CHECK( 10 );
OTV_LIMIT_CHECK( 4 );
if ( FT_NEXT_ULONG( p ) != 0x10000UL ) /* Version */
if ( FT_NEXT_USHORT( p ) != 1 ) /* majorVersion */
FT_INVALID_FORMAT;
version = FT_NEXT_USHORT( p ); /* minorVersion */
table_size = 10;
switch ( version )
{
case 0:
OTV_LIMIT_CHECK( 6 );
break;
case 1:
OTV_LIMIT_CHECK( 10 );
table_size += 4;
break;
default:
FT_INVALID_FORMAT;
}
ScriptList = FT_NEXT_USHORT( p );
FeatureList = FT_NEXT_USHORT( p );
LookupList = FT_NEXT_USHORT( p );
@ -580,6 +602,14 @@
otv_ScriptList_validate( table + ScriptList, table + FeatureList,
otvalid );
if ( version > 0 )
{
OTV_OPTIONAL_OFFSET32( featureVariations );
OTV_SIZE_CHECK32( featureVariations );
if ( featureVariations )
OTV_TRACE(( " [omitting featureVariations validation]\n" )); /* XXX */
}
FT_TRACE4(( "\n" ));
}