summaryrefslogtreecommitdiffstats
path: root/src/3rdparty/freetype/src/gxvalid
diff options
context:
space:
mode:
authorKonstantin Ritt <ritt.ks@gmail.com>2015-03-19 17:34:42 +0400
committerKonstantin Ritt <ritt.ks@gmail.com>2015-03-20 13:42:29 +0000
commit2eaf0cf8fd6e7c290497fedb08134a89e7b49b1d (patch)
tree0a4f7bf528e87d0b0a71ce7fccf702b87f4cdec1 /src/3rdparty/freetype/src/gxvalid
parent77c518a50334d4dcf2476a4f39edc1e3990c7f0b (diff)
Update bundled FreeType to 2.5.5
Removed everything, imported with help of import_from_tarball.sh script, and then added a pre-generated builds/unix/ftconfig.h Task-number: QTBUG-44648 Change-Id: Iea948e41f7761f1580382b3763d04c7a61383382 Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Diffstat (limited to 'src/3rdparty/freetype/src/gxvalid')
-rw-r--r--src/3rdparty/freetype/src/gxvalid/gxvbsln.c56
-rw-r--r--src/3rdparty/freetype/src/gxvalid/gxvcommn.c335
-rw-r--r--src/3rdparty/freetype/src/gxvalid/gxvcommn.h97
-rw-r--r--src/3rdparty/freetype/src/gxvalid/gxverror.h8
-rw-r--r--src/3rdparty/freetype/src/gxvalid/gxvfeat.c67
-rw-r--r--src/3rdparty/freetype/src/gxvalid/gxvjust.c275
-rw-r--r--src/3rdparty/freetype/src/gxvalid/gxvkern.c218
-rw-r--r--src/3rdparty/freetype/src/gxvalid/gxvlcar.c36
-rw-r--r--src/3rdparty/freetype/src/gxvalid/gxvmod.c12
-rw-r--r--src/3rdparty/freetype/src/gxvalid/gxvmod.h2
-rw-r--r--src/3rdparty/freetype/src/gxvalid/gxvmort.c76
-rw-r--r--src/3rdparty/freetype/src/gxvalid/gxvmort.h14
-rw-r--r--src/3rdparty/freetype/src/gxvalid/gxvmort0.c32
-rw-r--r--src/3rdparty/freetype/src/gxvalid/gxvmort1.c69
-rw-r--r--src/3rdparty/freetype/src/gxvalid/gxvmort2.c81
-rw-r--r--src/3rdparty/freetype/src/gxvalid/gxvmort4.c18
-rw-r--r--src/3rdparty/freetype/src/gxvalid/gxvmort5.c39
-rw-r--r--src/3rdparty/freetype/src/gxvalid/gxvmorx.c51
-rw-r--r--src/3rdparty/freetype/src/gxvalid/gxvmorx.h10
-rw-r--r--src/3rdparty/freetype/src/gxvalid/gxvmorx0.c24
-rw-r--r--src/3rdparty/freetype/src/gxvalid/gxvmorx1.c57
-rw-r--r--src/3rdparty/freetype/src/gxvalid/gxvmorx2.c86
-rw-r--r--src/3rdparty/freetype/src/gxvalid/gxvmorx4.c4
-rw-r--r--src/3rdparty/freetype/src/gxvalid/gxvmorx5.c42
-rw-r--r--src/3rdparty/freetype/src/gxvalid/gxvopbd.c32
-rw-r--r--src/3rdparty/freetype/src/gxvalid/gxvprop.c70
-rw-r--r--src/3rdparty/freetype/src/gxvalid/gxvtrak.c65
27 files changed, 1096 insertions, 780 deletions
diff --git a/src/3rdparty/freetype/src/gxvalid/gxvbsln.c b/src/3rdparty/freetype/src/gxvalid/gxvbsln.c
index 3d10031563..d16511876a 100644
--- a/src/3rdparty/freetype/src/gxvalid/gxvbsln.c
+++ b/src/3rdparty/freetype/src/gxvalid/gxvbsln.c
@@ -72,10 +72,10 @@
static void
gxv_bsln_LookupValue_validate( FT_UShort glyph,
GXV_LookupValueCPtr value_p,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
- FT_UShort v = value_p->u;
- FT_UShort* ctlPoints;
+ FT_UShort v = value_p->u;
+ FT_UShort* ctlPoints;
FT_UNUSED( glyph );
@@ -124,7 +124,7 @@
gxv_bsln_LookupFmt4_transit( FT_UShort relative_gindex,
GXV_LookupValueCPtr base_value_p,
FT_Bytes lookuptbl_limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p;
FT_Bytes limit;
@@ -135,7 +135,7 @@
offset = (FT_UShort)( base_value_p->u +
( relative_gindex * sizeof ( FT_UShort ) ) );
- p = valid->lookuptbl_head + offset;
+ p = gxvalid->lookuptbl_head + offset;
limit = lookuptbl_limit;
GXV_LIMIT_CHECK( 2 );
@@ -148,7 +148,7 @@
static void
gxv_bsln_parts_fmt0_validate( FT_Bytes tables,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = tables;
@@ -158,7 +158,7 @@
/* deltas */
GXV_LIMIT_CHECK( 2 * GXV_BSLN_VALUE_COUNT );
- valid->table_data = NULL; /* No ctlPoints here. */
+ gxvalid->table_data = NULL; /* No ctlPoints here. */
GXV_EXIT;
}
@@ -167,7 +167,7 @@
static void
gxv_bsln_parts_fmt1_validate( FT_Bytes tables,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = tables;
@@ -175,15 +175,15 @@
GXV_NAME_ENTER( "parts format 1" );
/* deltas */
- gxv_bsln_parts_fmt0_validate( p, limit, valid );
+ gxv_bsln_parts_fmt0_validate( p, limit, gxvalid );
/* mappingData */
- valid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED;
- valid->lookupval_func = gxv_bsln_LookupValue_validate;
- valid->lookupfmt4_trans = gxv_bsln_LookupFmt4_transit;
+ gxvalid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED;
+ gxvalid->lookupval_func = gxv_bsln_LookupValue_validate;
+ gxvalid->lookupfmt4_trans = gxv_bsln_LookupFmt4_transit;
gxv_LookupTable_validate( p + 2 * GXV_BSLN_VALUE_COUNT,
limit,
- valid );
+ gxvalid );
GXV_EXIT;
}
@@ -192,7 +192,7 @@
static void
gxv_bsln_parts_fmt2_validate( FT_Bytes tables,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = tables;
@@ -211,7 +211,7 @@
stdGlyph = FT_NEXT_USHORT( p );
GXV_TRACE(( " (stdGlyph = %u)\n", stdGlyph ));
- gxv_glyphid_validate( stdGlyph, valid );
+ gxv_glyphid_validate( stdGlyph, gxvalid );
/* Record the position of ctlPoints */
GXV_BSLN_DATA( ctlPoints_p ) = p;
@@ -226,7 +226,7 @@
FT_INVALID_DATA;
}
else
- gxv_ctlPoint_validate( stdGlyph, (FT_Short)ctlPoint, valid );
+ gxv_ctlPoint_validate( stdGlyph, (FT_Short)ctlPoint, gxvalid );
}
GXV_EXIT;
@@ -236,7 +236,7 @@
static void
gxv_bsln_parts_fmt3_validate( FT_Bytes tables,
FT_Bytes limit,
- GXV_Validator valid)
+ GXV_Validator gxvalid)
{
FT_Bytes p = tables;
@@ -244,15 +244,15 @@
GXV_NAME_ENTER( "parts format 3" );
/* stdGlyph + ctlPoints */
- gxv_bsln_parts_fmt2_validate( p, limit, valid );
+ gxv_bsln_parts_fmt2_validate( p, limit, gxvalid );
/* mappingData */
- valid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED;
- valid->lookupval_func = gxv_bsln_LookupValue_validate;
- valid->lookupfmt4_trans = gxv_bsln_LookupFmt4_transit;
+ gxvalid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED;
+ gxvalid->lookupval_func = gxv_bsln_LookupValue_validate;
+ gxvalid->lookupfmt4_trans = gxv_bsln_LookupFmt4_transit;
gxv_LookupTable_validate( p + ( 2 + 2 * GXV_BSLN_VALUE_COUNT ),
limit,
- valid );
+ gxvalid );
GXV_EXIT;
}
@@ -271,8 +271,8 @@
FT_Face face,
FT_Validator ftvalid )
{
- GXV_ValidatorRec validrec;
- GXV_Validator valid = &validrec;
+ GXV_ValidatorRec gxvalidrec;
+ GXV_Validator gxvalid = &gxvalidrec;
GXV_bsln_DataRec bslnrec;
GXV_bsln_Data bsln = &bslnrec;
@@ -293,9 +293,9 @@
};
- valid->root = ftvalid;
- valid->table_data = bsln;
- valid->face = face;
+ gxvalid->root = ftvalid;
+ gxvalid->table_data = bsln;
+ gxvalid->face = face;
FT_TRACE3(( "validating `bsln' table\n" ));
GXV_INIT;
@@ -320,7 +320,7 @@
bsln->defaultBaseline = defaultBaseline;
- fmt_funcs_table[format]( p, limit, valid );
+ fmt_funcs_table[format]( p, limit, gxvalid );
FT_TRACE4(( "\n" ));
}
diff --git a/src/3rdparty/freetype/src/gxvalid/gxvcommn.c b/src/3rdparty/freetype/src/gxvalid/gxvcommn.c
index de7ce6fdef..8e72a72f4e 100644
--- a/src/3rdparty/freetype/src/gxvalid/gxvcommn.c
+++ b/src/3rdparty/freetype/src/gxvalid/gxvcommn.c
@@ -4,7 +4,7 @@
/* */
/* TrueTypeGX/AAT common tables validation (body). */
/* */
-/* Copyright 2004, 2005, 2009 */
+/* Copyright 2004, 2005, 2009, 2010, 2013 */
/* by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */
/* David Turner, Robert Wilhelm, and Werner Lemberg. */
/* */
@@ -65,7 +65,7 @@
FT_UShort* buff,
FT_UInt nmemb,
FT_UShort limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_UInt i;
@@ -130,7 +130,7 @@
FT_ULong* buff,
FT_UInt nmemb,
FT_ULong limit,
- GXV_Validator valid)
+ GXV_Validator gxvalid)
{
FT_UInt i;
@@ -182,7 +182,7 @@
FT_Bytes limit,
FT_Byte* min,
FT_Byte* max,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = table;
@@ -202,7 +202,7 @@
*max = (FT_Byte)FT_MAX( *max, val );
}
- valid->subtable_length = p - table;
+ gxvalid->subtable_length = p - table;
}
@@ -211,7 +211,7 @@
FT_Bytes limit,
FT_UShort* min,
FT_UShort* max,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = table;
@@ -231,7 +231,7 @@
*max = (FT_Byte)FT_MAX( *max, val );
}
- valid->subtable_length = p - table;
+ gxvalid->subtable_length = p - table;
}
@@ -256,7 +256,7 @@
static void
gxv_BinSrchHeader_check_consistency( GXV_BinSrchHeader* binSrchHeader,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_UShort searchRange;
FT_UShort entrySelector;
@@ -304,8 +304,7 @@
binSrchHeader->unitSize, binSrchHeader->nUnits,
searchRange, entrySelector, rangeShift ));
- if ( valid->root->level >= FT_VALIDATE_PARANOID )
- FT_INVALID_DATA;
+ GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );
}
}
@@ -330,7 +329,7 @@
FT_Bytes limit,
FT_UShort* unitSize_p,
FT_UShort* nUnits_p,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = table;
GXV_BinSrchHeader binSrchHeader;
@@ -360,7 +359,7 @@
binSrchHeader.rangeShift = FT_NEXT_USHORT( p );
GXV_TRACE(( "nUnits %d\n", binSrchHeader.nUnits ));
- gxv_BinSrchHeader_check_consistency( &binSrchHeader, valid );
+ gxv_BinSrchHeader_check_consistency( &binSrchHeader, gxvalid );
if ( *unitSize_p == 0 )
*unitSize_p = binSrchHeader.unitSize;
@@ -368,7 +367,7 @@
if ( *nUnits_p == 0 )
*nUnits_p = binSrchHeader.nUnits;
- valid->subtable_length = p - table;
+ gxvalid->subtable_length = p - table;
GXV_EXIT;
}
@@ -423,7 +422,7 @@
static void
gxv_LookupTable_fmt0_validate( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = table;
FT_UShort i;
@@ -433,25 +432,24 @@
GXV_NAME_ENTER( "LookupTable format 0" );
- GXV_LIMIT_CHECK( 2 * valid->face->num_glyphs );
+ GXV_LIMIT_CHECK( 2 * gxvalid->face->num_glyphs );
- for ( i = 0; i < valid->face->num_glyphs; i++ )
+ for ( i = 0; i < gxvalid->face->num_glyphs; i++ )
{
GXV_LIMIT_CHECK( 2 );
if ( p + 2 >= limit ) /* some fonts have too-short fmt0 array */
{
GXV_TRACE(( "too short, glyphs %d - %d are missing\n",
- i, valid->face->num_glyphs ));
- if ( valid->root->level >= FT_VALIDATE_PARANOID )
- FT_INVALID_GLYPH_ID;
+ i, gxvalid->face->num_glyphs ));
+ GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID );
break;
}
- value = GXV_LOOKUP_VALUE_LOAD( p, valid->lookupval_sign );
- valid->lookupval_func( i, &value, valid );
+ value = GXV_LOOKUP_VALUE_LOAD( p, gxvalid->lookupval_sign );
+ gxvalid->lookupval_func( i, &value, gxvalid );
}
- valid->subtable_length = p - table;
+ gxvalid->subtable_length = p - table;
GXV_EXIT;
}
@@ -475,12 +473,12 @@
static void
gxv_LookupTable_fmt2_skip_endmarkers( FT_Bytes table,
FT_UShort unitSize,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = table;
- while ( ( p + 4 ) < valid->root->limit )
+ while ( ( p + 4 ) < gxvalid->root->limit )
{
if ( p[0] != 0xFF || p[1] != 0xFF || /* lastGlyph */
p[2] != 0xFF || p[3] != 0xFF ) /* firstGlyph */
@@ -488,14 +486,14 @@
p += unitSize;
}
- valid->subtable_length = p - table;
+ gxvalid->subtable_length = p - table;
}
static void
gxv_LookupTable_fmt2_validate( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = table;
FT_UShort gid;
@@ -511,8 +509,8 @@
GXV_NAME_ENTER( "LookupTable format 2" );
unitSize = nUnits = 0;
- gxv_BinSrchHeader_validate( p, limit, &unitSize, &nUnits, valid );
- p += valid->subtable_length;
+ gxv_BinSrchHeader_validate( p, limit, &unitSize, &nUnits, gxvalid );
+ p += gxvalid->subtable_length;
GXV_UNITSIZE_VALIDATE( "format2", unitSize, nUnits, 6 );
@@ -521,18 +519,17 @@
GXV_LIMIT_CHECK( 2 + 2 + 2 );
lastGlyph = FT_NEXT_USHORT( p );
firstGlyph = FT_NEXT_USHORT( p );
- value = GXV_LOOKUP_VALUE_LOAD( p, valid->lookupval_sign );
+ value = GXV_LOOKUP_VALUE_LOAD( p, gxvalid->lookupval_sign );
- gxv_glyphid_validate( firstGlyph, valid );
- gxv_glyphid_validate( lastGlyph, valid );
+ gxv_glyphid_validate( firstGlyph, gxvalid );
+ gxv_glyphid_validate( lastGlyph, gxvalid );
if ( lastGlyph < gid )
{
GXV_TRACE(( "reverse ordered segment specification:"
" lastGlyph[%d]=%d < lastGlyph[%d]=%d\n",
unit, lastGlyph, unit - 1 , gid ));
- if ( valid->root->level >= FT_VALIDATE_PARANOID )
- FT_INVALID_GLYPH_ID;
+ GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID );
}
if ( lastGlyph < firstGlyph )
@@ -540,10 +537,9 @@
GXV_TRACE(( "reverse ordered range specification at unit %d:",
" lastGlyph %d < firstGlyph %d ",
unit, lastGlyph, firstGlyph ));
- if ( valid->root->level >= FT_VALIDATE_PARANOID )
- FT_INVALID_GLYPH_ID;
+ GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID );
- if ( valid->root->level == FT_VALIDATE_TIGHT )
+ if ( gxvalid->root->level == FT_VALIDATE_TIGHT )
continue; /* ftxvalidator silently skips such an entry */
FT_TRACE4(( "continuing with exchanged values\n" ));
@@ -553,13 +549,13 @@
}
for ( gid = firstGlyph; gid <= lastGlyph; gid++ )
- valid->lookupval_func( gid, &value, valid );
+ gxvalid->lookupval_func( gid, &value, gxvalid );
}
- gxv_LookupTable_fmt2_skip_endmarkers( p, unitSize, valid );
- p += valid->subtable_length;
+ gxv_LookupTable_fmt2_skip_endmarkers( p, unitSize, gxvalid );
+ p += gxvalid->subtable_length;
- valid->subtable_length = p - table;
+ gxvalid->subtable_length = p - table;
GXV_EXIT;
}
@@ -568,7 +564,7 @@
static void
gxv_LookupTable_fmt4_validate( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = table;
FT_UShort unit;
@@ -585,8 +581,8 @@
GXV_NAME_ENTER( "LookupTable format 4" );
unitSize = nUnits = 0;
- gxv_BinSrchHeader_validate( p, limit, &unitSize, &nUnits, valid );
- p += valid->subtable_length;
+ gxv_BinSrchHeader_validate( p, limit, &unitSize, &nUnits, gxvalid );
+ p += gxvalid->subtable_length;
GXV_UNITSIZE_VALIDATE( "format4", unitSize, nUnits, 6 );
@@ -596,16 +592,15 @@
lastGlyph = FT_NEXT_USHORT( p );
firstGlyph = FT_NEXT_USHORT( p );
- gxv_glyphid_validate( firstGlyph, valid );
- gxv_glyphid_validate( lastGlyph, valid );
+ gxv_glyphid_validate( firstGlyph, gxvalid );
+ gxv_glyphid_validate( lastGlyph, gxvalid );
if ( lastGlyph < gid )
{
GXV_TRACE(( "reverse ordered segment specification:"
" lastGlyph[%d]=%d < lastGlyph[%d]=%d\n",
unit, lastGlyph, unit - 1 , gid ));
- if ( valid->root->level >= FT_VALIDATE_PARANOID )
- FT_INVALID_GLYPH_ID;
+ GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID );
}
if ( lastGlyph < firstGlyph )
@@ -613,10 +608,9 @@
GXV_TRACE(( "reverse ordered range specification at unit %d:",
" lastGlyph %d < firstGlyph %d ",
unit, lastGlyph, firstGlyph ));
- if ( valid->root->level >= FT_VALIDATE_PARANOID )
- FT_INVALID_GLYPH_ID;
+ GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID );
- if ( valid->root->level == FT_VALIDATE_TIGHT )
+ if ( gxvalid->root->level == FT_VALIDATE_TIGHT )
continue; /* ftxvalidator silently skips such an entry */
FT_TRACE4(( "continuing with exchanged values\n" ));
@@ -630,19 +624,19 @@
for ( gid = firstGlyph; gid <= lastGlyph; gid++ )
{
- value = valid->lookupfmt4_trans( (FT_UShort)( gid - firstGlyph ),
+ value = gxvalid->lookupfmt4_trans( (FT_UShort)( gid - firstGlyph ),
&base_value,
limit,
- valid );
+ gxvalid );
- valid->lookupval_func( gid, &value, valid );
+ gxvalid->lookupval_func( gid, &value, gxvalid );
}
}
- gxv_LookupTable_fmt2_skip_endmarkers( p, unitSize, valid );
- p += valid->subtable_length;
+ gxv_LookupTable_fmt2_skip_endmarkers( p, unitSize, gxvalid );
+ p += gxvalid->subtable_length;
- valid->subtable_length = p - table;
+ gxvalid->subtable_length = p - table;
GXV_EXIT;
}
@@ -651,26 +645,26 @@
static void
gxv_LookupTable_fmt6_skip_endmarkers( FT_Bytes table,
FT_UShort unitSize,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = table;
- while ( p < valid->root->limit )
+ while ( p < gxvalid->root->limit )
{
if ( p[0] != 0xFF || p[1] != 0xFF )
break;
p += unitSize;
}
- valid->subtable_length = p - table;
+ gxvalid->subtable_length = p - table;
}
static void
gxv_LookupTable_fmt6_validate( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = table;
FT_UShort unit;
@@ -685,8 +679,8 @@
GXV_NAME_ENTER( "LookupTable format 6" );
unitSize = nUnits = 0;
- gxv_BinSrchHeader_validate( p, limit, &unitSize, &nUnits, valid );
- p += valid->subtable_length;
+ gxv_BinSrchHeader_validate( p, limit, &unitSize, &nUnits, gxvalid );
+ p += gxvalid->subtable_length;
GXV_UNITSIZE_VALIDATE( "format6", unitSize, nUnits, 4 );
@@ -694,9 +688,9 @@
{
GXV_LIMIT_CHECK( 2 + 2 );
glyph = FT_NEXT_USHORT( p );
- value = GXV_LOOKUP_VALUE_LOAD( p, valid->lookupval_sign );
+ value = GXV_LOOKUP_VALUE_LOAD( p, gxvalid->lookupval_sign );
- if ( gxv_glyphid_validate( glyph, valid ) )
+ if ( gxv_glyphid_validate( glyph, gxvalid ) )
GXV_TRACE(( " endmarker found within defined range"
" (entry %d < nUnits=%d)\n",
unit, nUnits ));
@@ -705,18 +699,17 @@
{
GXV_TRACE(( "current gid 0x%04x < previous gid 0x%04x\n",
glyph, prev_glyph ));
- if ( valid->root->level >= FT_VALIDATE_PARANOID )
- FT_INVALID_GLYPH_ID;
+ GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID );
}
prev_glyph = glyph;
- valid->lookupval_func( glyph, &value, valid );
+ gxvalid->lookupval_func( glyph, &value, gxvalid );
}
- gxv_LookupTable_fmt6_skip_endmarkers( p, unitSize, valid );
- p += valid->subtable_length;
+ gxv_LookupTable_fmt6_skip_endmarkers( p, unitSize, gxvalid );
+ p += gxvalid->subtable_length;
- valid->subtable_length = p - table;
+ gxvalid->subtable_length = p - table;
GXV_EXIT;
}
@@ -725,7 +718,7 @@
static void
gxv_LookupTable_fmt8_validate( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = table;
FT_UShort i;
@@ -742,18 +735,18 @@
firstGlyph = FT_NEXT_USHORT( p );
glyphCount = FT_NEXT_USHORT( p );
- gxv_glyphid_validate( firstGlyph, valid );
- gxv_glyphid_validate( (FT_UShort)( firstGlyph + glyphCount ), valid );
+ gxv_glyphid_validate( firstGlyph, gxvalid );
+ gxv_glyphid_validate( (FT_UShort)( firstGlyph + glyphCount ), gxvalid );
/* valueArray */
for ( i = 0; i < glyphCount; i++ )
{
GXV_LIMIT_CHECK( 2 );
- value = GXV_LOOKUP_VALUE_LOAD( p, valid->lookupval_sign );
- valid->lookupval_func( (FT_UShort)( firstGlyph + i ), &value, valid );
+ value = GXV_LOOKUP_VALUE_LOAD( p, gxvalid->lookupval_sign );
+ gxvalid->lookupval_func( (FT_UShort)( firstGlyph + i ), &value, gxvalid );
}
- valid->subtable_length = p - table;
+ gxvalid->subtable_length = p - table;
GXV_EXIT;
}
@@ -761,7 +754,7 @@
FT_LOCAL_DEF( void )
gxv_LookupTable_validate( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = table;
FT_UShort format;
@@ -785,7 +778,7 @@
GXV_NAME_ENTER( "LookupTable" );
/* lookuptbl_head may be used in fmt4 transit function. */
- valid->lookuptbl_head = table;
+ gxvalid->lookuptbl_head = table;
/* format */
GXV_LIMIT_CHECK( 2 );
@@ -799,10 +792,10 @@
if ( func == NULL )
FT_INVALID_FORMAT;
- func( p, limit, valid );
- p += valid->subtable_length;
+ func( p, limit, gxvalid );
+ p += gxvalid->subtable_length;
- valid->subtable_length = p - table;
+ gxvalid->subtable_length = p - table;
GXV_EXIT;
}
@@ -818,7 +811,7 @@
FT_LOCAL_DEF( FT_Int )
gxv_glyphid_validate( FT_UShort gid,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Face face;
@@ -829,13 +822,12 @@
return 1;
}
- face = valid->face;
+ face = gxvalid->face;
if ( face->num_glyphs < gid )
{
GXV_TRACE(( " gxv_glyphid_check() gid overflow: num_glyphs %d < %d\n",
face->num_glyphs, gid ));
- if ( valid->root->level >= FT_VALIDATE_PARANOID )
- FT_INVALID_GLYPH_ID;
+ GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID );
}
return 0;
@@ -853,7 +845,7 @@
FT_LOCAL_DEF( void )
gxv_ctlPoint_validate( FT_UShort gid,
FT_Short ctl_point,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Face face;
FT_Error error;
@@ -863,7 +855,7 @@
short n_points;
- face = valid->face;
+ face = gxvalid->face;
error = FT_Load_Glyph( face,
gid,
@@ -893,7 +885,7 @@
gxv_sfntName_validate( FT_UShort name_index,
FT_UShort min_index,
FT_UShort max_index,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_SfntName name;
FT_UInt i;
@@ -905,10 +897,10 @@
if ( name_index < min_index || max_index < name_index )
FT_INVALID_FORMAT;
- nnames = FT_Get_Sfnt_Name_Count( valid->face );
+ nnames = FT_Get_Sfnt_Name_Count( gxvalid->face );
for ( i = 0; i < nnames; i++ )
{
- if ( FT_Get_Sfnt_Name( valid->face, i, &name ) != FT_Err_Ok )
+ if ( FT_Get_Sfnt_Name( gxvalid->face, i, &name ) != FT_Err_Ok )
continue ;
if ( name.name_id == name_index )
@@ -952,7 +944,7 @@
FT_UShort* length_p,
FT_UShort stateSize,
FT_Byte* maxClassID_p,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = table;
FT_Bytes limit = table + *length_p;
@@ -973,7 +965,7 @@
if ( !nGlyphs )
goto Out;
- gxv_glyphid_validate( (FT_UShort)( firstGlyph + nGlyphs ), valid );
+ gxv_glyphid_validate( (FT_UShort)( firstGlyph + nGlyphs ), gxvalid );
{
FT_Byte nGlyphInClass[256];
@@ -1030,9 +1022,9 @@
FT_UShort stateSize,
FT_Byte* maxState_p,
FT_Byte* maxEntry_p,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
- FT_Bytes p = table;
+ FT_Bytes p = table;
FT_Bytes limit = table + *length_p;
FT_Byte clazz;
FT_Byte entry;
@@ -1084,7 +1076,7 @@
FT_Byte maxClassID,
FT_Bytes statetable_table,
FT_Bytes statetable_limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = table;
FT_Bytes limit = table + *length_p;
@@ -1101,8 +1093,7 @@
if ( ( maxEntry + 1 ) * entrySize > *length_p )
{
- if ( valid->root->level >= FT_VALIDATE_PARANOID )
- FT_INVALID_TOO_SHORT;
+ GXV_SET_ERR_IF_PARANOID( FT_INVALID_TOO_SHORT );
/* ftxvalidator and FontValidator both warn and continue */
maxEntry = (FT_Byte)( *length_p / entrySize - 1 );
@@ -1126,8 +1117,7 @@
{
GXV_TRACE(( " newState offset 0x%04x is out of stateArray\n",
newState ));
- if ( valid->root->level >= FT_VALIDATE_PARANOID )
- FT_INVALID_OFFSET;
+ GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET );
continue;
}
@@ -1135,8 +1125,7 @@
{
GXV_TRACE(( " newState offset 0x%04x is not aligned to %d-classes\n",
newState, 1 + maxClassID ));
- if ( valid->root->level >= FT_VALIDATE_PARANOID )
- FT_INVALID_OFFSET;
+ GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET );
continue;
}
@@ -1173,18 +1162,17 @@
break;
default:
- if ( valid->root->level >= FT_VALIDATE_PARANOID )
- FT_INVALID_FORMAT;
+ GXV_SET_ERR_IF_PARANOID( FT_INVALID_FORMAT );
goto Exit;
}
- if ( NULL != valid->statetable.entry_validate_func )
- valid->statetable.entry_validate_func( state,
- flags,
- &glyphOffset,
- statetable_table,
- statetable_limit,
- valid );
+ if ( NULL != gxvalid->statetable.entry_validate_func )
+ gxvalid->statetable.entry_validate_func( state,
+ flags,
+ &glyphOffset,
+ statetable_table,
+ statetable_limit,
+ gxvalid );
}
Exit:
@@ -1204,7 +1192,7 @@
FT_UShort* classTable_length_p,
FT_UShort* stateArray_length_p,
FT_UShort* entryTable_length_p,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_UShort o[3];
FT_UShort* l[3];
@@ -1218,14 +1206,14 @@
l[1] = stateArray_length_p;
l[2] = entryTable_length_p;
- gxv_set_length_by_ushort_offset( o, l, buff, 3, table_size, valid );
+ gxv_set_length_by_ushort_offset( o, l, buff, 3, table_size, gxvalid );
}
FT_LOCAL_DEF( void )
gxv_StateTable_validate( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_UShort stateSize;
FT_UShort classTable; /* offset to Class(Sub)Table */
@@ -1262,11 +1250,11 @@
if ( stateSize > 0xFF )
FT_INVALID_DATA;
- if ( valid->statetable.optdata_load_func != NULL )
- valid->statetable.optdata_load_func( p, limit, valid );
+ if ( gxvalid->statetable.optdata_load_func != NULL )
+ gxvalid->statetable.optdata_load_func( p, limit, gxvalid );
- if ( valid->statetable.subtable_setup_func != NULL)
- setup_func = valid->statetable.subtable_setup_func;
+ if ( gxvalid->statetable.subtable_setup_func != NULL)
+ setup_func = gxvalid->statetable.subtable_setup_func;
else
setup_func = gxv_StateTable_subtable_setup;
@@ -1277,7 +1265,7 @@
&classTable_length,
&stateArray_length,
&entryTable_length,
- valid );
+ gxvalid );
GXV_TRACE(( "StateTable Subtables\n" ));
@@ -1286,7 +1274,7 @@
&classTable_length,
stateSize,
&maxClassID,
- valid );
+ gxvalid );
else
maxClassID = (FT_Byte)( stateSize - 1 );
@@ -1297,10 +1285,12 @@
stateSize,
&maxState,
&maxEntry,
- valid );
+ gxvalid );
else
{
+#if 0
maxState = 1; /* 0:start of text, 1:start of line are predefined */
+#endif
maxEntry = 0;
}
@@ -1316,7 +1306,7 @@
maxClassID,
table,
limit,
- valid );
+ gxvalid );
GXV_EXIT;
}
@@ -1332,7 +1322,7 @@
FT_ULong* classTable_length_p,
FT_ULong* stateArray_length_p,
FT_ULong* entryTable_length_p,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_ULong o[3];
FT_ULong* l[3];
@@ -1346,21 +1336,21 @@
l[1] = stateArray_length_p;
l[2] = entryTable_length_p;
- gxv_set_length_by_ulong_offset( o, l, buff, 4, table_size, valid );
+ gxv_set_length_by_ulong_offset( o, l, buff, 3, table_size, gxvalid );
}
static void
gxv_XClassTable_lookupval_validate( FT_UShort glyph,
GXV_LookupValueCPtr value_p,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_UNUSED( glyph );
- if ( value_p->u >= valid->xstatetable.nClasses )
+ if ( value_p->u >= gxvalid->xstatetable.nClasses )
FT_INVALID_DATA;
- if ( value_p->u > valid->xstatetable.maxClassID )
- valid->xstatetable.maxClassID = value_p->u;
+ if ( value_p->u > gxvalid->xstatetable.maxClassID )
+ gxvalid->xstatetable.maxClassID = value_p->u;
}
@@ -1394,7 +1384,7 @@
gxv_XClassTable_lookupfmt4_transit( FT_UShort relative_gindex,
GXV_LookupValueCPtr base_value_p,
FT_Bytes lookuptbl_limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p;
FT_Bytes limit;
@@ -1405,7 +1395,7 @@
offset = (FT_UShort)( base_value_p->u +
relative_gindex * sizeof ( FT_UShort ) );
- p = valid->lookuptbl_head + offset;
+ p = gxvalid->lookuptbl_head + offset;
limit = lookuptbl_limit;
GXV_LIMIT_CHECK ( 2 );
@@ -1422,7 +1412,7 @@
FT_ULong stateSize,
FT_UShort* maxState_p,
FT_UShort* maxEntry_p,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = table;
FT_Bytes limit = table + *length_p;
@@ -1473,7 +1463,7 @@
FT_UShort maxClassID,
FT_Bytes xstatetable_table,
FT_Bytes xstatetable_limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = table;
FT_Bytes limit = table + *length_p;
@@ -1503,8 +1493,7 @@
{
GXV_TRACE(( " newState index 0x%04x points out of stateArray\n",
newState_idx ));
- if ( valid->root->level >= FT_VALIDATE_PARANOID )
- FT_INVALID_OFFSET;
+ GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET );
}
state = (FT_UShort)( newState_idx / ( 1 + maxClassID ) );
@@ -1513,8 +1502,7 @@
FT_TRACE4(( "-> new state = %d (supposed)\n"
"but newState index 0x%04x is not aligned to %d-classes\n",
state, newState_idx, 1 + maxClassID ));
- if ( valid->root->level >= FT_VALIDATE_PARANOID )
- FT_INVALID_OFFSET;
+ GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET );
}
switch ( GXV_GLYPHOFFSET_FMT( xstatetable ) )
@@ -1548,18 +1536,17 @@
break;
default:
- if ( valid->root->level >= FT_VALIDATE_PARANOID )
- FT_INVALID_FORMAT;
+ GXV_SET_ERR_IF_PARANOID( FT_INVALID_FORMAT );
goto Exit;
}
- if ( NULL != valid->xstatetable.entry_validate_func )
- valid->xstatetable.entry_validate_func( state,
- flags,
- &glyphOffset,
- xstatetable_table,
- xstatetable_limit,
- valid );
+ if ( NULL != gxvalid->xstatetable.entry_validate_func )
+ gxvalid->xstatetable.entry_validate_func( state,
+ flags,
+ &glyphOffset,
+ xstatetable_table,
+ xstatetable_limit,
+ gxvalid );
}
Exit:
@@ -1572,7 +1559,7 @@
FT_LOCAL_DEF( void )
gxv_XStateTable_validate( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
/* StateHeader members */
FT_ULong classTable; /* offset to Class(Sub)Table */
@@ -1595,26 +1582,26 @@
GXV_TRACE(( "XStateTable header\n" ));
GXV_LIMIT_CHECK( 4 + 4 + 4 + 4 );
- valid->xstatetable.nClasses = FT_NEXT_ULONG( p );
+ gxvalid->xstatetable.nClasses = FT_NEXT_ULONG( p );
classTable = FT_NEXT_ULONG( p );
stateArray = FT_NEXT_ULONG( p );
entryTable = FT_NEXT_ULONG( p );
- GXV_TRACE(( "nClasses =0x%08x\n", valid->xstatetable.nClasses ));
+ GXV_TRACE(( "nClasses =0x%08x\n", gxvalid->xstatetable.nClasses ));
GXV_TRACE(( "offset to classTable=0x%08x\n", classTable ));
GXV_TRACE(( "offset to stateArray=0x%08x\n", stateArray ));
GXV_TRACE(( "offset to entryTable=0x%08x\n", entryTable ));
- if ( valid->xstatetable.nClasses > 0xFFFFU )
+ if ( gxvalid->xstatetable.nClasses > 0xFFFFU )
FT_INVALID_DATA;
GXV_TRACE(( "StateTable Subtables\n" ));
- if ( valid->xstatetable.optdata_load_func != NULL )
- valid->xstatetable.optdata_load_func( p, limit, valid );
+ if ( gxvalid->xstatetable.optdata_load_func != NULL )
+ gxvalid->xstatetable.optdata_load_func( p, limit, gxvalid );
- if ( valid->xstatetable.subtable_setup_func != NULL )
- setup_func = valid->xstatetable.subtable_setup_func;
+ if ( gxvalid->xstatetable.subtable_setup_func != NULL )
+ setup_func = gxvalid->xstatetable.subtable_setup_func;
else
setup_func = gxv_XStateTable_subtable_setup;
@@ -1625,38 +1612,42 @@
&classTable_length,
&stateArray_length,
&entryTable_length,
- valid );
+ gxvalid );
if ( classTable != 0 )
{
- valid->xstatetable.maxClassID = 0;
- valid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED;
- valid->lookupval_func = gxv_XClassTable_lookupval_validate;
- valid->lookupfmt4_trans = gxv_XClassTable_lookupfmt4_transit;
+ gxvalid->xstatetable.maxClassID = 0;
+ gxvalid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED;
+ gxvalid->lookupval_func = gxv_XClassTable_lookupval_validate;
+ gxvalid->lookupfmt4_trans = gxv_XClassTable_lookupfmt4_transit;
gxv_LookupTable_validate( table + classTable,
table + classTable + classTable_length,
- valid );
- if ( valid->subtable_length < classTable_length )
- classTable_length = valid->subtable_length;
+ gxvalid );
+#if 0
+ if ( gxvalid->subtable_length < classTable_length )
+ classTable_length = gxvalid->subtable_length;
+#endif
}
else
{
/* XXX: check range? */
- valid->xstatetable.maxClassID =
- (FT_UShort)( valid->xstatetable.nClasses - 1 );
+ gxvalid->xstatetable.maxClassID =
+ (FT_UShort)( gxvalid->xstatetable.nClasses - 1 );
}
if ( stateArray != 0 )
gxv_XStateArray_validate( table + stateArray,
&stateArray_length,
- valid->xstatetable.maxClassID,
- valid->xstatetable.nClasses,
+ gxvalid->xstatetable.maxClassID,
+ gxvalid->xstatetable.nClasses,
&maxState,
&maxEntry,
- valid );
+ gxvalid );
else
{
+#if 0
maxState = 1; /* 0:start of text, 1:start of line are predefined */
+#endif
maxEntry = 0;
}
@@ -1668,10 +1659,10 @@
&entryTable_length,
maxEntry,
stateArray_length,
- valid->xstatetable.maxClassID,
+ gxvalid->xstatetable.maxClassID,
table,
limit,
- valid );
+ gxvalid );
GXV_EXIT;
}
@@ -1719,16 +1710,16 @@
const FT_String* name,
GXV_odtect_Range odtect )
{
- odtect->range[ odtect->nRanges ].start = start;
- odtect->range[ odtect->nRanges ].length = length;
- odtect->range[ odtect->nRanges ].name = (FT_String*)name;
+ odtect->range[odtect->nRanges].start = start;
+ odtect->range[odtect->nRanges].length = length;
+ odtect->range[odtect->nRanges].name = (FT_String*)name;
odtect->nRanges++;
}
FT_LOCAL_DEF( void )
gxv_odtect_validate( GXV_odtect_Range odtect,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_UInt i, j;
@@ -1742,6 +1733,7 @@
odtect->range[j].start,
odtect->range[j].length ) )
{
+#ifdef FT_DEBUG_LEVEL_TRACE
if ( odtect->range[i].name || odtect->range[j].name )
GXV_TRACE(( "found overlap between range %d and range %d\n",
i, j ));
@@ -1749,6 +1741,7 @@
GXV_TRACE(( "found overlap between `%s' and `%s\'\n",
odtect->range[i].name,
odtect->range[j].name ));
+#endif
FT_INVALID_OFFSET;
}
diff --git a/src/3rdparty/freetype/src/gxvalid/gxvcommn.h b/src/3rdparty/freetype/src/gxvalid/gxvcommn.h
index 404c07ffad..f1143457ff 100644
--- a/src/3rdparty/freetype/src/gxvalid/gxvcommn.h
+++ b/src/3rdparty/freetype/src/gxvalid/gxvcommn.h
@@ -4,7 +4,8 @@
/* */
/* TrueTypeGX/AAT common tables validation (specification). */
/* */
-/* Copyright 2004, 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */
+/* Copyright 2004, 2005, 2012, 2014 */
+/* by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */
/* David Turner, Robert Wilhelm, and Werner Lemberg. */
/* */
/* This file is part of the FreeType project, and may only be used, */
@@ -51,6 +52,19 @@
FT_BEGIN_HEADER
+ /* some variables are not evaluated or only used in trace */
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+#define GXV_LOAD_TRACE_VARS
+#else
+#undef GXV_LOAD_TRACE_VARS
+#endif
+
+#undef GXV_LOAD_UNUSED_VARS /* debug purpose */
+
+#define IS_PARANOID_VALIDATION ( gxvalid->root->level >= FT_VALIDATE_PARANOID )
+#define GXV_SET_ERR_IF_PARANOID( err ) { if ( IS_PARANOID_VALIDATION ) ( err ); }
+
/*************************************************************************/
/*************************************************************************/
/***** *****/
@@ -67,7 +81,7 @@ FT_BEGIN_HEADER
typedef void
(*GXV_Validate_Func)( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid );
+ GXV_Validator gxvalid );
/* ====================== LookupTable Validator ======================== */
@@ -92,13 +106,13 @@ FT_BEGIN_HEADER
typedef void
(*GXV_Lookup_Value_Validate_Func)( FT_UShort glyph,
GXV_LookupValueCPtr value_p,
- GXV_Validator valid );
+ GXV_Validator gxvalid );
typedef GXV_LookupValueDesc
(*GXV_Lookup_Fmt4_Transit_Func)( FT_UShort relative_gindex,
GXV_LookupValueCPtr base_value_p,
FT_Bytes lookuptbl_limit,
- GXV_Validator valid );
+ GXV_Validator gxvalid );
/* ====================== StateTable Validator ========================= */
@@ -117,10 +131,10 @@ FT_BEGIN_HEADER
#define GXV_GLYPHOFFSET_FMT( table ) \
- ( valid->table.entry_glyphoffset_fmt )
+ ( gxvalid->table.entry_glyphoffset_fmt )
#define GXV_GLYPHOFFSET_SIZE( table ) \
- ( valid->table.entry_glyphoffset_fmt / 2 )
+ ( gxvalid->table.entry_glyphoffset_fmt / 2 )
/* ----------------------- 16bit StateTable ---------------------------- */
@@ -146,7 +160,7 @@ FT_BEGIN_HEADER
FT_UShort* classTable_length_p,
FT_UShort* stateArray_length_p,
FT_UShort* entryTable_length_p,
- GXV_Validator valid );
+ GXV_Validator gxvalid );
typedef void
(*GXV_StateTable_Entry_Validate_Func)(
@@ -155,12 +169,12 @@ FT_BEGIN_HEADER
GXV_StateTable_GlyphOffsetCPtr glyphOffset_p,
FT_Bytes statetable_table,
FT_Bytes statetable_limit,
- GXV_Validator valid );
+ GXV_Validator gxvalid );
typedef void
(*GXV_StateTable_OptData_Load_Func)( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid );
+ GXV_Validator gxvalid );
typedef struct GXV_StateTable_ValidatorRec_
{
@@ -188,7 +202,7 @@ FT_BEGIN_HEADER
FT_ULong* classTable_length_p,
FT_ULong* stateArray_length_p,
FT_ULong* entryTable_length_p,
- GXV_Validator valid );
+ GXV_Validator gxvalid );
typedef void
(*GXV_XStateTable_Entry_Validate_Func)(
@@ -197,7 +211,7 @@ FT_BEGIN_HEADER
GXV_StateTable_GlyphOffsetCPtr glyphOffset_p,
FT_Bytes xstatetable_table,
FT_Bytes xstatetable_limit,
- GXV_Validator valid );
+ GXV_Validator gxvalid );
typedef GXV_StateTable_OptData_Load_Func GXV_XStateTable_OptData_Load_Func;
@@ -234,6 +248,9 @@ FT_BEGIN_HEADER
GXV_Lookup_Fmt4_Transit_Func lookupfmt4_trans;
FT_Bytes lookuptbl_head;
+ FT_UShort min_gid;
+ FT_UShort max_gid;
+
GXV_StateTable_ValidatorRec statetable;
GXV_XStateTable_ValidatorRec xstatetable;
@@ -246,35 +263,35 @@ FT_BEGIN_HEADER
#define GXV_TABLE_DATA( tag, field ) \
- ( ( (GXV_ ## tag ## _Data)valid->table_data )->field )
+ ( ( (GXV_ ## tag ## _Data)gxvalid->table_data )->field )
#undef FT_INVALID_
-#define FT_INVALID_( _prefix, _error ) \
- ft_validator_error( valid->root, _prefix ## _error )
+#define FT_INVALID_( _error ) \
+ ft_validator_error( gxvalid->root, FT_THROW( _error ) )
#define GXV_LIMIT_CHECK( _count ) \
FT_BEGIN_STMNT \
- if ( p + _count > ( limit? limit : valid->root->limit ) ) \
+ if ( p + _count > ( limit? limit : gxvalid->root->limit ) ) \
FT_INVALID_TOO_SHORT; \
FT_END_STMNT
#ifdef FT_DEBUG_LEVEL_TRACE
-#define GXV_INIT valid->debug_indent = 0
+#define GXV_INIT gxvalid->debug_indent = 0
#define GXV_NAME_ENTER( name ) \
FT_BEGIN_STMNT \
- valid->debug_indent += 2; \
- FT_TRACE4(( "%*.s", valid->debug_indent, 0 )); \
+ gxvalid->debug_indent += 2; \
+ FT_TRACE4(( "%*.s", gxvalid->debug_indent, 0 )); \
FT_TRACE4(( "%s table\n", name )); \
FT_END_STMNT
-#define GXV_EXIT valid->debug_indent -= 2
+#define GXV_EXIT gxvalid->debug_indent -= 2
#define GXV_TRACE( s ) \
FT_BEGIN_STMNT \
- FT_TRACE4(( "%*.s", valid->debug_indent, 0 )); \
+ FT_TRACE4(( "%*.s", gxvalid->debug_indent, 0 )); \
FT_TRACE4( s ); \
FT_END_STMNT
@@ -300,8 +317,8 @@ FT_BEGIN_HEADER
#define GXV_32BIT_ALIGNMENT_VALIDATE( a ) \
FT_BEGIN_STMNT \
{ \
- if ( 0 != ( (a) % 4 ) ) \
- FT_INVALID_OFFSET ; \
+ if ( (a) & 3 ) \
+ FT_INVALID_OFFSET; \
} \
FT_END_STMNT
@@ -332,7 +349,7 @@ FT_BEGIN_HEADER
\
\
for ( b = p; b < (FT_Bytes)p + len; b++ ) \
- if ( 0x40 < *b && *b < 0x7e ) \
+ if ( 0x40 < *b && *b < 0x7E ) \
FT_TRACE1(("%c", *b)) ; \
else \
FT_TRACE1(("\\x%02x", *b)) ; \
@@ -356,12 +373,12 @@ FT_BEGIN_HEADER
FT_Bytes limit,
FT_UShort* unitSize_p,
FT_UShort* nUnits_p,
- GXV_Validator valid );
+ GXV_Validator gxvalid );
FT_LOCAL( void )
gxv_LookupTable_validate( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid );
+ GXV_Validator gxvalid );
/*************************************************************************/
@@ -374,7 +391,7 @@ FT_BEGIN_HEADER
FT_LOCAL( FT_Int )
gxv_glyphid_validate( FT_UShort gid,
- GXV_Validator valid );
+ GXV_Validator gxvalid );
/*************************************************************************/
@@ -388,7 +405,7 @@ FT_BEGIN_HEADER
FT_LOCAL( void )
gxv_ctlPoint_validate( FT_UShort gid,
FT_Short ctl_point,
- GXV_Validator valid );
+ GXV_Validator gxvalid );
/*************************************************************************/
@@ -403,7 +420,7 @@ FT_BEGIN_HEADER
gxv_sfntName_validate( FT_UShort name_index,
FT_UShort min_index,
FT_UShort max_index,
- GXV_Validator valid );
+ GXV_Validator gxvalid );
/*************************************************************************/
@@ -422,7 +439,7 @@ FT_BEGIN_HEADER
FT_UShort* classTable_length_p,
FT_UShort* stateArray_length_p,
FT_UShort* entryTable_length_p,
- GXV_Validator valid );
+ GXV_Validator gxvalid );
FT_LOCAL( void )
gxv_XStateTable_subtable_setup( FT_ULong table_size,
@@ -432,17 +449,17 @@ FT_BEGIN_HEADER
FT_ULong* classTable_length_p,
FT_ULong* stateArray_length_p,
FT_ULong* entryTable_length_p,
- GXV_Validator valid );
+ GXV_Validator gxvalid );
FT_LOCAL( void )
gxv_StateTable_validate( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid );
+ GXV_Validator gxvalid );
FT_LOCAL( void )
gxv_XStateTable_validate( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid );
+ GXV_Validator gxvalid );
/*************************************************************************/
@@ -458,14 +475,14 @@ FT_BEGIN_HEADER
FT_Bytes limit,
FT_Byte* min,
FT_Byte* max,
- GXV_Validator valid );
+ GXV_Validator gxvalid );
FT_LOCAL( void )
gxv_array_getlimits_ushort( FT_Bytes table,
FT_Bytes limit,
FT_UShort* min,
FT_UShort* max,
- GXV_Validator valid );
+ GXV_Validator gxvalid );
FT_LOCAL( void )
gxv_set_length_by_ushort_offset( FT_UShort* offset,
@@ -473,7 +490,7 @@ FT_BEGIN_HEADER
FT_UShort* buff,
FT_UInt nmemb,
FT_UShort limit,
- GXV_Validator valid );
+ GXV_Validator gxvalid );
FT_LOCAL( void )
gxv_set_length_by_ulong_offset( FT_ULong* offset,
@@ -481,19 +498,19 @@ FT_BEGIN_HEADER
FT_ULong* buff,
FT_UInt nmemb,
FT_ULong limit,
- GXV_Validator valid);
+ GXV_Validator gxvalid);
#define GXV_SUBTABLE_OFFSET_CHECK( _offset ) \
FT_BEGIN_STMNT \
- if ( (_offset) > valid->subtable_length ) \
+ if ( (_offset) > gxvalid->subtable_length ) \
FT_INVALID_OFFSET; \
FT_END_STMNT
#define GXV_SUBTABLE_LIMIT_CHECK( _count ) \
FT_BEGIN_STMNT \
- if ( ( p + (_count) - valid->subtable_start ) > \
- valid->subtable_length ) \
+ if ( ( p + (_count) - gxvalid->subtable_start ) > \
+ gxvalid->subtable_length ) \
FT_INVALID_TOO_SHORT; \
FT_END_STMNT
@@ -539,7 +556,7 @@ FT_BEGIN_HEADER
FT_LOCAL( void )
gxv_odtect_validate( GXV_odtect_Range odtect,
- GXV_Validator valid );
+ GXV_Validator gxvalid );
#define GXV_ODTECT( n, odtect ) \
diff --git a/src/3rdparty/freetype/src/gxvalid/gxverror.h b/src/3rdparty/freetype/src/gxvalid/gxverror.h
index 0196199227..c573b72de7 100644
--- a/src/3rdparty/freetype/src/gxvalid/gxverror.h
+++ b/src/3rdparty/freetype/src/gxvalid/gxverror.h
@@ -4,7 +4,8 @@
/* */
/* TrueTypeGX/AAT validation module error codes (specification only). */
/* */
-/* Copyright 2004, 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */
+/* Copyright 2004, 2005, 2012-2013 */
+/* by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */
/* David Turner, Robert Wilhelm, and Werner Lemberg. */
/* */
/* This file is part of the FreeType project, and may only be used, */
@@ -38,10 +39,9 @@
#undef __FTERRORS_H__
+#undef FT_ERR_PREFIX
#define FT_ERR_PREFIX GXV_Err_
-#define FT_ERR_BASE FT_Mod_Err_GXV
-
-#define FT_KEEP_ERR_PREFIX
+#define FT_ERR_BASE FT_Mod_Err_GXvalid
#include FT_ERRORS_H
diff --git a/src/3rdparty/freetype/src/gxvalid/gxvfeat.c b/src/3rdparty/freetype/src/gxvalid/gxvfeat.c
index 002fec6d6b..69298b2869 100644
--- a/src/3rdparty/freetype/src/gxvalid/gxvfeat.c
+++ b/src/3rdparty/freetype/src/gxvalid/gxvfeat.c
@@ -4,7 +4,7 @@
/* */
/* TrueTypeGX/AAT feat table validation (body). */
/* */
-/* Copyright 2004, 2005, 2008 by */
+/* Copyright 2004, 2005, 2008, 2012 by */
/* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */
/* David Turner, Robert Wilhelm, and Werner Lemberg. */
/* */
@@ -82,7 +82,7 @@
gxv_feat_registry_validate( FT_UShort feature,
FT_UShort nSettings,
FT_Bool exclusive,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
GXV_NAME_ENTER( "feature in registry" );
@@ -92,8 +92,7 @@
{
GXV_TRACE(( "feature number %d is out of range %d\n",
feature, gxv_feat_registry_length ));
- if ( valid->root->level == FT_VALIDATE_PARANOID )
- FT_INVALID_DATA;
+ GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );
goto Exit;
}
@@ -101,8 +100,7 @@
{
GXV_TRACE(( "feature number %d is in defined range but doesn't exist\n",
feature ));
- if ( valid->root->level == FT_VALIDATE_PARANOID )
- FT_INVALID_DATA;
+ GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );
goto Exit;
}
@@ -110,7 +108,7 @@
{
/* Don't use here. Apple is reserved. */
GXV_TRACE(( "feature number %d is reserved by Apple\n", feature ));
- if ( valid->root->level >= FT_VALIDATE_TIGHT )
+ if ( gxvalid->root->level >= FT_VALIDATE_TIGHT )
FT_INVALID_DATA;
}
@@ -119,7 +117,7 @@
GXV_TRACE(( "feature %d: nSettings %d != defined nSettings %d\n",
feature, nSettings,
gxv_feat_registry[feature].nSettings ));
- if ( valid->root->level >= FT_VALIDATE_TIGHT )
+ if ( gxvalid->root->level >= FT_VALIDATE_TIGHT )
FT_INVALID_DATA;
}
@@ -127,7 +125,7 @@
{
GXV_TRACE(( "exclusive flag %d differs from predefined value\n",
exclusive ));
- if ( valid->root->level >= FT_VALIDATE_TIGHT )
+ if ( gxvalid->root->level >= FT_VALIDATE_TIGHT )
FT_INVALID_DATA;
}
@@ -139,7 +137,7 @@
static void
gxv_feat_name_index_validate( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = table;
@@ -155,7 +153,7 @@
gxv_sfntName_validate( (FT_UShort)nameIndex,
255,
32768U,
- valid );
+ gxvalid );
GXV_EXIT;
}
@@ -165,7 +163,7 @@
gxv_feat_setting_validate( FT_Bytes table,
FT_Bytes limit,
FT_Bool exclusive,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = table;
FT_UShort setting;
@@ -178,10 +176,10 @@
setting = FT_NEXT_USHORT( p );
/* If we have exclusive setting, the setting should be odd. */
- if ( exclusive && ( setting % 2 ) == 0 )
+ if ( exclusive && ( setting & 1 ) == 0 )
FT_INVALID_DATA;
- gxv_feat_name_index_validate( p, limit, valid );
+ gxv_feat_name_index_validate( p, limit, gxvalid );
GXV_FEAT_DATA( setting ) = setting;
@@ -192,7 +190,7 @@
static void
gxv_feat_name_validate( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = table;
FT_UInt reserved_size = GXV_FEAT_DATA( reserved_size );
@@ -222,9 +220,8 @@
if ( settingTable < reserved_size )
FT_INVALID_OFFSET;
- if ( valid->root->level == FT_VALIDATE_PARANOID &&
- ( featureFlags & GXV_FEAT_MASK_UNUSED ) == 0 )
- FT_INVALID_DATA;
+ if ( ( featureFlags & GXV_FEAT_MASK_UNUSED ) == 0 )
+ GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );
exclusive = FT_BOOL( featureFlags & GXV_FEAT_MASK_EXCLUSIVE_SETTINGS );
if ( exclusive )
@@ -243,18 +240,17 @@
FT_INVALID_FORMAT;
}
- gxv_feat_registry_validate( feature, nSettings, exclusive, valid );
+ gxv_feat_registry_validate( feature, nSettings, exclusive, gxvalid );
- gxv_feat_name_index_validate( p, limit, valid );
+ gxv_feat_name_index_validate( p, limit, gxvalid );
- p = valid->root->base + settingTable;
+ p = gxvalid->root->base + settingTable;
for ( last_setting = -1, i = 0; i < nSettings; i++ )
{
- gxv_feat_setting_validate( p, limit, exclusive, valid );
+ gxv_feat_setting_validate( p, limit, exclusive, gxvalid );
- if ( valid->root->level == FT_VALIDATE_PARANOID &&
- (FT_Int)GXV_FEAT_DATA( setting ) <= last_setting )
- FT_INVALID_FORMAT;
+ if ( (FT_Int)GXV_FEAT_DATA( setting ) <= last_setting )
+ GXV_SET_ERR_IF_PARANOID( FT_INVALID_FORMAT );
last_setting = (FT_Int)GXV_FEAT_DATA( setting );
/* setting + nameIndex */
@@ -278,8 +274,8 @@
FT_Face face,
FT_Validator ftvalid )
{
- GXV_ValidatorRec validrec;
- GXV_Validator valid = &validrec;
+ GXV_ValidatorRec gxvalidrec;
+ GXV_Validator gxvalid = &gxvalidrec;
GXV_feat_DataRec featrec;
GXV_feat_Data feat = &featrec;
@@ -293,9 +289,9 @@
FT_Int last_feature;
- valid->root = ftvalid;
- valid->table_data = feat;
- valid->face = face;
+ gxvalid->root = ftvalid;
+ gxvalid->table_data = feat;
+ gxvalid->face = face;
FT_TRACE3(( "validating `feat' table\n" ));
GXV_INIT;
@@ -312,8 +308,8 @@
featureNameCount = FT_NEXT_USHORT( p );
GXV_TRACE(( " (featureNameCount = %d)\n", featureNameCount ));
- if ( valid->root->level != FT_VALIDATE_PARANOID )
- p += 6; /* skip (none) and (none) */
+ if ( !( IS_PARANOID_VALIDATION ) )
+ p += 6; /* skip (none) and (none) */
else
{
if ( FT_NEXT_USHORT( p ) != 0 )
@@ -327,11 +323,10 @@
for ( last_feature = -1, i = 0; i < featureNameCount; i++ )
{
- gxv_feat_name_validate( p, limit, valid );
+ gxv_feat_name_validate( p, limit, gxvalid );
- if ( valid->root->level == FT_VALIDATE_PARANOID &&
- (FT_Int)GXV_FEAT_DATA( feature ) <= last_feature )
- FT_INVALID_FORMAT;
+ if ( (FT_Int)GXV_FEAT_DATA( feature ) <= last_feature )
+ GXV_SET_ERR_IF_PARANOID( FT_INVALID_FORMAT );
last_feature = GXV_FEAT_DATA( feature );
p += 2 + 2 + 4 + 2 + 2;
diff --git a/src/3rdparty/freetype/src/gxvalid/gxvjust.c b/src/3rdparty/freetype/src/gxvalid/gxvjust.c
index e14f946f2d..24c26a5655 100644
--- a/src/3rdparty/freetype/src/gxvalid/gxvjust.c
+++ b/src/3rdparty/freetype/src/gxvalid/gxvjust.c
@@ -4,7 +4,7 @@
/* */
/* TrueTypeGX/AAT just table validation (body). */
/* */
-/* Copyright 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */
+/* Copyright 2005, 2014 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */
/* David Turner, Robert Wilhelm, and Werner Lemberg. */
/* */
/* This file is part of the FreeType project, and may only be used, */
@@ -65,40 +65,69 @@
#define GXV_JUST_DATA( a ) GXV_TABLE_DATA( just, a )
+ /* GX just table does not define their subset of GID */
+ static void
+ gxv_just_check_max_gid( FT_UShort gid,
+ const FT_String* msg_tag,
+ GXV_Validator gxvalid )
+ {
+ if ( gid < gxvalid->face->num_glyphs )
+ return;
+
+ GXV_TRACE(( "just table includes too large %s"
+ " GID=%d > %d (in maxp)\n",
+ msg_tag, gid, gxvalid->face->num_glyphs ));
+ GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID );
+ }
+
+
static void
gxv_just_wdp_entry_validate( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = table;
FT_ULong justClass;
+#ifdef GXV_LOAD_UNUSED_VARS
FT_Fixed beforeGrowLimit;
FT_Fixed beforeShrinkGrowLimit;
FT_Fixed afterGrowLimit;
FT_Fixed afterShrinkGrowLimit;
FT_UShort growFlags;
FT_UShort shrinkFlags;
+#endif
GXV_LIMIT_CHECK( 4 + 4 + 4 + 4 + 4 + 2 + 2 );
justClass = FT_NEXT_ULONG( p );
+#ifndef GXV_LOAD_UNUSED_VARS
+ p += 4 + 4 + 4 + 4 + 2 + 2;
+#else
beforeGrowLimit = FT_NEXT_ULONG( p );
beforeShrinkGrowLimit = FT_NEXT_ULONG( p );
afterGrowLimit = FT_NEXT_ULONG( p );
afterShrinkGrowLimit = FT_NEXT_ULONG( p );
growFlags = FT_NEXT_USHORT( p );
shrinkFlags = FT_NEXT_USHORT( p );
+#endif
- /* TODO: decode flags for human readability */
+ /* According to Apple spec, only 7bits in justClass is used */
+ if ( ( justClass & 0xFFFFFF80UL ) != 0 )
+ {
+ GXV_TRACE(( "just table includes non-zero value"
+ " in unused justClass higher bits"
+ " of WidthDeltaPair" ));
+ GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );
+ }
- valid->subtable_length = p - table;
+ gxvalid->subtable_length = p - table;
}
static void
gxv_just_wdc_entry_validate( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = table;
FT_ULong count, i;
@@ -109,18 +138,18 @@
for ( i = 0; i < count; i++ )
{
GXV_TRACE(( "validating wdc pair %d/%d\n", i + 1, count ));
- gxv_just_wdp_entry_validate( p, limit, valid );
- p += valid->subtable_length;
+ gxv_just_wdp_entry_validate( p, limit, gxvalid );
+ p += gxvalid->subtable_length;
}
- valid->subtable_length = p - table;
+ gxvalid->subtable_length = p - table;
}
static void
gxv_just_widthDeltaClusters_validate( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = table ;
FT_Bytes wdc_end = table + GXV_JUST_DATA( wdc_offset_max );
@@ -134,11 +163,11 @@
for ( i = 0; p <= wdc_end; i++ )
{
- gxv_just_wdc_entry_validate( p, limit, valid );
- p += valid->subtable_length;
+ gxv_just_wdc_entry_validate( p, limit, gxvalid );
+ p += gxvalid->subtable_length;
}
- valid->subtable_length = p - table;
+ gxvalid->subtable_length = p - table;
GXV_EXIT;
}
@@ -147,14 +176,15 @@
static void
gxv_just_actSubrecord_type0_validate( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = table;
FT_Fixed lowerLimit;
FT_Fixed upperLimit;
-
+#ifdef GXV_LOAD_UNUSED_VARS
FT_UShort order;
+#endif
FT_UShort decomposedCount;
FT_UInt i;
@@ -163,9 +193,20 @@
GXV_LIMIT_CHECK( 4 + 4 + 2 + 2 );
lowerLimit = FT_NEXT_ULONG( p );
upperLimit = FT_NEXT_ULONG( p );
+#ifdef GXV_LOAD_UNUSED_VARS
order = FT_NEXT_USHORT( p );
+#else
+ p += 2;
+#endif
decomposedCount = FT_NEXT_USHORT( p );
+ if ( lowerLimit >= upperLimit )
+ {
+ GXV_TRACE(( "just table includes invalid range spec:"
+ " lowerLimit(%d) > upperLimit(%d)\n" ));
+ GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );
+ }
+
for ( i = 0; i < decomposedCount; i++ )
{
FT_UShort glyphs;
@@ -173,16 +214,17 @@
GXV_LIMIT_CHECK( 2 );
glyphs = FT_NEXT_USHORT( p );
+ gxv_just_check_max_gid( glyphs, "type0:glyphs", gxvalid );
}
- valid->subtable_length = p - table;
+ gxvalid->subtable_length = p - table;
}
static void
gxv_just_actSubrecord_type1_validate( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = table;
FT_UShort addGlyph;
@@ -191,34 +233,47 @@
GXV_LIMIT_CHECK( 2 );
addGlyph = FT_NEXT_USHORT( p );
- valid->subtable_length = p - table;
+ gxv_just_check_max_gid( addGlyph, "type1:addGlyph", gxvalid );
+
+ gxvalid->subtable_length = p - table;
}
static void
gxv_just_actSubrecord_type2_validate( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = table;
- FT_Fixed substThreshhold; /* Apple misspelled "Threshhold" */
+#ifdef GXV_LOAD_UNUSED_VARS
+ FT_Fixed substThreshhold; /* Apple misspelled "Threshhold" */
+#endif
FT_UShort addGlyph;
FT_UShort substGlyph;
GXV_LIMIT_CHECK( 4 + 2 + 2 );
+#ifdef GXV_LOAD_UNUSED_VARS
substThreshhold = FT_NEXT_ULONG( p );
+#else
+ p += 4;
+#endif
addGlyph = FT_NEXT_USHORT( p );
substGlyph = FT_NEXT_USHORT( p );
- valid->subtable_length = p - table;
+ if ( addGlyph != 0xFFFF )
+ gxv_just_check_max_gid( addGlyph, "type2:addGlyph", gxvalid );
+
+ gxv_just_check_max_gid( substGlyph, "type2:substGlyph", gxvalid );
+
+ gxvalid->subtable_length = p - table;
}
static void
gxv_just_actSubrecord_type4_validate( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = table;
FT_ULong variantsAxis;
@@ -233,14 +288,29 @@
noStretchValue = FT_NEXT_ULONG( p );
maximumLimit = FT_NEXT_ULONG( p );
- valid->subtable_length = p - table;
+ gxvalid->subtable_length = p - table;
+
+ if ( variantsAxis != 0x64756374L ) /* 'duct' */
+ GXV_TRACE(( "variantsAxis 0x%08x is non default value",
+ variantsAxis ));
+
+ if ( minimumLimit > noStretchValue )
+ GXV_TRACE(( "type4:minimumLimit 0x%08x > noStretchValue 0x%08x\n",
+ minimumLimit, noStretchValue ));
+ else if ( noStretchValue > maximumLimit )
+ GXV_TRACE(( "type4:noStretchValue 0x%08x > maximumLimit 0x%08x\n",
+ noStretchValue, maximumLimit ));
+ else if ( !IS_PARANOID_VALIDATION )
+ return;
+
+ FT_INVALID_DATA;
}
static void
gxv_just_actSubrecord_type5_validate( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = table;
FT_UShort flags;
@@ -251,7 +321,12 @@
flags = FT_NEXT_USHORT( p );
glyph = FT_NEXT_USHORT( p );
- valid->subtable_length = p - table;
+ if ( flags )
+ GXV_TRACE(( "type5: nonzero value 0x%04x in unused flags\n",
+ flags ));
+ gxv_just_check_max_gid( glyph, "type5:glyph", gxvalid );
+
+ gxvalid->subtable_length = p - table;
}
@@ -259,7 +334,7 @@
static void
gxv_just_actSubrecord_validate( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = table;
FT_UShort actionClass;
@@ -274,22 +349,26 @@
actionType = FT_NEXT_USHORT( p );
actionLength = FT_NEXT_ULONG( p );
+ /* actionClass is related with justClass using 7bit only */
+ if ( ( actionClass & 0xFF80 ) != 0 )
+ GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );
+
if ( actionType == 0 )
- gxv_just_actSubrecord_type0_validate( p, limit, valid );
+ gxv_just_actSubrecord_type0_validate( p, limit, gxvalid );
else if ( actionType == 1 )
- gxv_just_actSubrecord_type1_validate( p, limit, valid );
+ gxv_just_actSubrecord_type1_validate( p, limit, gxvalid );
else if ( actionType == 2 )
- gxv_just_actSubrecord_type2_validate( p, limit, valid );
+ gxv_just_actSubrecord_type2_validate( p, limit, gxvalid );
else if ( actionType == 3 )
; /* Stretch glyph action: no actionData */
else if ( actionType == 4 )
- gxv_just_actSubrecord_type4_validate( p, limit, valid );
+ gxv_just_actSubrecord_type4_validate( p, limit, gxvalid );
else if ( actionType == 5 )
- gxv_just_actSubrecord_type5_validate( p, limit, valid );
+ gxv_just_actSubrecord_type5_validate( p, limit, gxvalid );
else
FT_INVALID_DATA;
- valid->subtable_length = actionLength;
+ gxvalid->subtable_length = actionLength;
GXV_EXIT;
}
@@ -298,7 +377,7 @@
static void
gxv_just_pcActionRecord_validate( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = table;
FT_ULong actionCount;
@@ -311,11 +390,11 @@
for ( i = 0; i < actionCount; i++ )
{
- gxv_just_actSubrecord_validate( p, limit, valid );
- p += valid->subtable_length;
+ gxv_just_actSubrecord_validate( p, limit, gxvalid );
+ p += gxvalid->subtable_length;
}
- valid->subtable_length = p - table;
+ gxvalid->subtable_length = p - table;
GXV_EXIT;
}
@@ -324,7 +403,7 @@
static void
gxv_just_pcTable_LookupValue_entry_validate( FT_UShort glyph,
GXV_LookupValueCPtr value_p,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_UNUSED( glyph );
@@ -338,19 +417,19 @@
static void
gxv_just_pcLookupTable_validate( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
- FT_Bytes p = table;
+ FT_Bytes p = table;
GXV_NAME_ENTER( "just pcLookupTable" );
GXV_JUST_DATA( pc_offset_max ) = 0x0000;
GXV_JUST_DATA( pc_offset_min ) = 0xFFFFU;
- valid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED;
- valid->lookupval_func = gxv_just_pcTable_LookupValue_entry_validate;
+ gxvalid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED;
+ gxvalid->lookupval_func = gxv_just_pcTable_LookupValue_entry_validate;
- gxv_LookupTable_validate( p, limit, valid );
+ gxv_LookupTable_validate( p, limit, gxvalid );
/* subtable_length is set by gxv_LookupTable_validate() */
@@ -361,20 +440,20 @@
static void
gxv_just_postcompTable_validate( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = table;
GXV_NAME_ENTER( "just postcompTable" );
- gxv_just_pcLookupTable_validate( p, limit, valid );
- p += valid->subtable_length;
+ gxv_just_pcLookupTable_validate( p, limit, gxvalid );
+ p += gxvalid->subtable_length;
- gxv_just_pcActionRecord_validate( p, limit, valid );
- p += valid->subtable_length;
+ gxv_just_pcActionRecord_validate( p, limit, gxvalid );
+ p += gxvalid->subtable_length;
- valid->subtable_length = p - table;
+ gxvalid->subtable_length = p - table;
GXV_EXIT;
}
@@ -387,33 +466,37 @@
GXV_StateTable_GlyphOffsetCPtr glyphOffset_p,
FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
+#ifdef GXV_LOAD_UNUSED_VARS
+ /* TODO: validate markClass & currentClass */
FT_UShort setMark;
FT_UShort dontAdvance;
FT_UShort markClass;
FT_UShort currentClass;
+#endif
FT_UNUSED( state );
FT_UNUSED( glyphOffset_p );
FT_UNUSED( table );
FT_UNUSED( limit );
- FT_UNUSED( valid );
-
+ FT_UNUSED( gxvalid );
+#ifndef GXV_LOAD_UNUSED_VARS
+ FT_UNUSED( flags );
+#else
setMark = (FT_UShort)( ( flags >> 15 ) & 1 );
dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1 );
markClass = (FT_UShort)( ( flags >> 7 ) & 0x7F );
currentClass = (FT_UShort)( flags & 0x7F );
-
- /* TODO: validate markClass & currentClass */
+#endif
}
static void
gxv_just_justClassTable_validate ( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = table;
FT_UShort length;
@@ -428,18 +511,24 @@
coverage = FT_NEXT_USHORT( p );
subFeatureFlags = FT_NEXT_ULONG( p );
- GXV_TRACE(( " justClassTable: coverage = 0x%04x (%s)",
- coverage,
- ( 0x4000 & coverage ) == 0 ? "ascending" : "descending" ));
+ GXV_TRACE(( " justClassTable: coverage = 0x%04x (%s) ", coverage ));
+ if ( ( coverage & 0x4000 ) == 0 )
+ GXV_TRACE(( "ascending\n" ));
+ else
+ GXV_TRACE(( "descending\n" ));
+
+ if ( subFeatureFlags )
+ GXV_TRACE(( " justClassTable: nonzero value (0x%08x)"
+ " in unused subFeatureFlags\n", subFeatureFlags ));
- valid->statetable.optdata = NULL;
- valid->statetable.optdata_load_func = NULL;
- valid->statetable.subtable_setup_func = NULL;
- valid->statetable.entry_glyphoffset_fmt = GXV_GLYPHOFFSET_NONE;
- valid->statetable.entry_validate_func =
+ gxvalid->statetable.optdata = NULL;
+ gxvalid->statetable.optdata_load_func = NULL;
+ gxvalid->statetable.subtable_setup_func = NULL;
+ gxvalid->statetable.entry_glyphoffset_fmt = GXV_GLYPHOFFSET_NONE;
+ gxvalid->statetable.entry_validate_func =
gxv_just_classTable_entry_validate;
- gxv_StateTable_validate( p, table + length, valid );
+ gxv_StateTable_validate( p, table + length, gxvalid );
/* subtable_length is set by gxv_LookupTable_validate() */
@@ -450,7 +539,7 @@
static void
gxv_just_wdcTable_LookupValue_validate( FT_UShort glyph,
GXV_LookupValueCPtr value_p,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_UNUSED( glyph );
@@ -464,7 +553,7 @@
static void
gxv_just_justData_lookuptable_validate( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = table;
@@ -472,10 +561,10 @@
GXV_JUST_DATA( wdc_offset_max ) = 0x0000;
GXV_JUST_DATA( wdc_offset_min ) = 0xFFFFU;
- valid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED;
- valid->lookupval_func = gxv_just_wdcTable_LookupValue_validate;
+ gxvalid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED;
+ gxvalid->lookupval_func = gxv_just_wdcTable_LookupValue_validate;
- gxv_LookupTable_validate( p, limit, valid );
+ gxv_LookupTable_validate( p, limit, gxvalid );
/* subtable_length is set by gxv_LookupTable_validate() */
@@ -489,7 +578,7 @@
static void
gxv_just_justData_validate( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
/*
* following 3 offsets are measured from the start of `just'
@@ -515,36 +604,36 @@
GXV_TRACE(( " (wdcTableOffset = 0x%04x)\n", wdcTableOffset ));
GXV_TRACE(( " (pcTableOffset = 0x%04x)\n", pcTableOffset ));
- gxv_just_justData_lookuptable_validate( p, limit, valid );
- gxv_odtect_add_range( p, valid->subtable_length,
+ gxv_just_justData_lookuptable_validate( p, limit, gxvalid );
+ gxv_odtect_add_range( p, gxvalid->subtable_length,
"just_LookupTable", odtect );
if ( wdcTableOffset )
{
gxv_just_widthDeltaClusters_validate(
- valid->root->base + wdcTableOffset, limit, valid );
- gxv_odtect_add_range( valid->root->base + wdcTableOffset,
- valid->subtable_length, "just_wdcTable", odtect );
+ gxvalid->root->base + wdcTableOffset, limit, gxvalid );
+ gxv_odtect_add_range( gxvalid->root->base + wdcTableOffset,
+ gxvalid->subtable_length, "just_wdcTable", odtect );
}
if ( pcTableOffset )
{
- gxv_just_postcompTable_validate( valid->root->base + pcTableOffset,
- limit, valid );
- gxv_odtect_add_range( valid->root->base + pcTableOffset,
- valid->subtable_length, "just_pcTable", odtect );
+ gxv_just_postcompTable_validate( gxvalid->root->base + pcTableOffset,
+ limit, gxvalid );
+ gxv_odtect_add_range( gxvalid->root->base + pcTableOffset,
+ gxvalid->subtable_length, "just_pcTable", odtect );
}
if ( justClassTableOffset )
{
gxv_just_justClassTable_validate(
- valid->root->base + justClassTableOffset, limit, valid );
- gxv_odtect_add_range( valid->root->base + justClassTableOffset,
- valid->subtable_length, "just_justClassTable",
+ gxvalid->root->base + justClassTableOffset, limit, gxvalid );
+ gxv_odtect_add_range( gxvalid->root->base + justClassTableOffset,
+ gxvalid->subtable_length, "just_justClassTable",
odtect );
}
- gxv_odtect_validate( odtect, valid );
+ gxv_odtect_validate( odtect, gxvalid );
GXV_EXIT;
}
@@ -557,10 +646,9 @@
{
FT_Bytes p = table;
FT_Bytes limit = 0;
- FT_Offset table_size;
- GXV_ValidatorRec validrec;
- GXV_Validator valid = &validrec;
+ GXV_ValidatorRec gxvalidrec;
+ GXV_Validator gxvalid = &gxvalidrec;
GXV_just_DataRec justrec;
GXV_just_Data just = &justrec;
@@ -574,15 +662,14 @@
GXV_ODTECT_INIT( odtect );
- valid->root = ftvalid;
- valid->table_data = just;
- valid->face = face;
+ gxvalid->root = ftvalid;
+ gxvalid->table_data = just;
+ gxvalid->face = face;
FT_TRACE3(( "validating `just' table\n" ));
GXV_INIT;
- limit = valid->root->limit;
- table_size = limit - table;
+ limit = gxvalid->root->limit;
GXV_LIMIT_CHECK( 4 + 2 + 2 + 2 );
version = FT_NEXT_ULONG( p );
@@ -609,19 +696,19 @@
/* validate justData */
if ( 0 < horizOffset )
{
- gxv_just_justData_validate( table + horizOffset, limit, valid );
- gxv_odtect_add_range( table + horizOffset, valid->subtable_length,
+ gxv_just_justData_validate( table + horizOffset, limit, gxvalid );
+ gxv_odtect_add_range( table + horizOffset, gxvalid->subtable_length,
"horizJustData", odtect );
}
if ( 0 < vertOffset )
{
- gxv_just_justData_validate( table + vertOffset, limit, valid );
- gxv_odtect_add_range( table + vertOffset, valid->subtable_length,
+ gxv_just_justData_validate( table + vertOffset, limit, gxvalid );
+ gxv_odtect_add_range( table + vertOffset, gxvalid->subtable_length,
"vertJustData", odtect );
}
- gxv_odtect_validate( odtect, valid );
+ gxv_odtect_validate( odtect, gxvalid );
FT_TRACE4(( "\n" ));
}
diff --git a/src/3rdparty/freetype/src/gxvalid/gxvkern.c b/src/3rdparty/freetype/src/gxvalid/gxvkern.c
index 2137db842a..787e3db830 100644
--- a/src/3rdparty/freetype/src/gxvalid/gxvkern.c
+++ b/src/3rdparty/freetype/src/gxvalid/gxvkern.c
@@ -4,7 +4,7 @@
/* */
/* TrueTypeGX/AAT kern table validation (body). */
/* */
-/* Copyright 2004, 2005, 2006, 2007 */
+/* Copyright 2004-2007, 2013 */
/* by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */
/* David Turner, Robert Wilhelm, and Werner Lemberg. */
/* */
@@ -79,20 +79,20 @@
#define GXV_KERN_DATA( field ) GXV_TABLE_DATA( kern, field )
-#define KERN_IS_CLASSIC( valid ) \
+#define KERN_IS_CLASSIC( gxvalid ) \
( KERN_VERSION_CLASSIC == GXV_KERN_DATA( version ) )
-#define KERN_IS_NEW( valid ) \
+#define KERN_IS_NEW( gxvalid ) \
( KERN_VERSION_NEW == GXV_KERN_DATA( version ) )
-#define KERN_DIALECT( valid ) \
+#define KERN_DIALECT( gxvalid ) \
GXV_KERN_DATA( dialect_request )
-#define KERN_ALLOWS_MS( valid ) \
- ( KERN_DIALECT( valid ) & KERN_DIALECT_MS )
-#define KERN_ALLOWS_APPLE( valid ) \
- ( KERN_DIALECT( valid ) & KERN_DIALECT_APPLE )
+#define KERN_ALLOWS_MS( gxvalid ) \
+ ( KERN_DIALECT( gxvalid ) & KERN_DIALECT_MS )
+#define KERN_ALLOWS_APPLE( gxvalid ) \
+ ( KERN_DIALECT( gxvalid ) & KERN_DIALECT_APPLE )
-#define GXV_KERN_HEADER_SIZE ( KERN_IS_NEW( valid ) ? 8 : 4 )
-#define GXV_KERN_SUBTABLE_HEADER_SIZE ( KERN_IS_NEW( valid ) ? 8 : 6 )
+#define GXV_KERN_HEADER_SIZE ( KERN_IS_NEW( gxvalid ) ? 8 : 4 )
+#define GXV_KERN_SUBTABLE_HEADER_SIZE ( KERN_IS_NEW( gxvalid ) ? 8 : 6 )
/*************************************************************************/
@@ -110,7 +110,7 @@
gxv_kern_subtable_fmt0_pairs_validate( FT_Bytes table,
FT_Bytes limit,
FT_UShort nPairs,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = table;
FT_UShort i;
@@ -127,16 +127,18 @@
{
FT_UShort gid_left;
FT_UShort gid_right;
+#ifdef GXV_LOAD_UNUSED_VARS
FT_Short kernValue;
+#endif
/* left */
gid_left = FT_NEXT_USHORT( p );
- gxv_glyphid_validate( gid_left, valid );
+ gxv_glyphid_validate( gid_left, gxvalid );
/* right */
gid_right = FT_NEXT_USHORT( p );
- gxv_glyphid_validate( gid_right, valid );
+ gxv_glyphid_validate( gid_right, gxvalid );
/* Pairs of left and right GIDs must be unique and sorted. */
GXV_TRACE(( "left gid = %u, right gid = %u\n", gid_left, gid_right ));
@@ -156,7 +158,11 @@
FT_INVALID_DATA;
/* skip the kern value */
+#ifdef GXV_LOAD_UNUSED_VARS
kernValue = FT_NEXT_SHORT( p );
+#else
+ p += 2;
+#endif
}
GXV_EXIT;
@@ -165,7 +171,7 @@
static void
gxv_kern_subtable_fmt0_validate( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = table + GXV_KERN_SUBTABLE_HEADER_SIZE;
@@ -180,10 +186,10 @@
/* nPairs, searchRange, entrySelector, rangeShift */
GXV_LIMIT_CHECK( 2 + 2 + 2 + 2 );
- gxv_BinSrchHeader_validate( p, limit, &unitSize, &nPairs, valid );
+ gxv_BinSrchHeader_validate( p, limit, &unitSize, &nPairs, gxvalid );
p += 2 + 2 + 2 + 2;
- gxv_kern_subtable_fmt0_pairs_validate( p, limit, nPairs, valid );
+ gxv_kern_subtable_fmt0_pairs_validate( p, limit, nPairs, gxvalid );
GXV_EXIT;
}
@@ -203,11 +209,11 @@
static void
gxv_kern_subtable_fmt1_valueTable_load( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = table;
GXV_kern_fmt1_StateOptRecData optdata =
- (GXV_kern_fmt1_StateOptRecData)valid->statetable.optdata;
+ (GXV_kern_fmt1_StateOptRecData)gxvalid->statetable.optdata;
GXV_LIMIT_CHECK( 2 );
@@ -226,14 +232,14 @@
FT_UShort* classTable_length_p,
FT_UShort* stateArray_length_p,
FT_UShort* entryTable_length_p,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_UShort o[4];
FT_UShort *l[4];
FT_UShort buff[5];
GXV_kern_fmt1_StateOptRecData optdata =
- (GXV_kern_fmt1_StateOptRecData)valid->statetable.optdata;
+ (GXV_kern_fmt1_StateOptRecData)gxvalid->statetable.optdata;
o[0] = classTable;
@@ -245,7 +251,7 @@
l[2] = entryTable_length_p;
l[3] = &(optdata->valueTable_length);
- gxv_set_length_by_ushort_offset( o, l, buff, 4, table_size, valid );
+ gxv_set_length_by_ushort_offset( o, l, buff, 4, table_size, gxvalid );
}
@@ -259,25 +265,31 @@
GXV_StateTable_GlyphOffsetCPtr glyphOffset_p,
FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
+#ifdef GXV_LOAD_UNUSED_VARS
FT_UShort push;
FT_UShort dontAdvance;
+#endif
FT_UShort valueOffset;
+#ifdef GXV_LOAD_UNUSED_VARS
FT_UShort kernAction;
FT_UShort kernValue;
+#endif
FT_UNUSED( state );
FT_UNUSED( glyphOffset_p );
+#ifdef GXV_LOAD_UNUSED_VARS
push = (FT_UShort)( ( flags >> 15 ) & 1 );
dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1 );
+#endif
valueOffset = (FT_UShort)( flags & 0x3FFF );
{
GXV_kern_fmt1_StateOptRecData vt_rec =
- (GXV_kern_fmt1_StateOptRecData)valid->statetable.optdata;
+ (GXV_kern_fmt1_StateOptRecData)gxvalid->statetable.optdata;
FT_Bytes p;
@@ -288,8 +300,10 @@
limit = table + vt_rec->valueTable + vt_rec->valueTable_length;
GXV_LIMIT_CHECK( 2 + 2 );
+#ifdef GXV_LOAD_UNUSED_VARS
kernAction = FT_NEXT_USHORT( p );
kernValue = FT_NEXT_USHORT( p );
+#endif
}
}
@@ -297,7 +311,7 @@
static void
gxv_kern_subtable_fmt1_validate( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = table;
GXV_kern_fmt1_StateOptRec vt_rec;
@@ -305,18 +319,18 @@
GXV_NAME_ENTER( "kern subtable format 1" );
- valid->statetable.optdata =
+ gxvalid->statetable.optdata =
&vt_rec;
- valid->statetable.optdata_load_func =
+ gxvalid->statetable.optdata_load_func =
gxv_kern_subtable_fmt1_valueTable_load;
- valid->statetable.subtable_setup_func =
+ gxvalid->statetable.subtable_setup_func =
gxv_kern_subtable_fmt1_subtable_setup;
- valid->statetable.entry_glyphoffset_fmt =
+ gxvalid->statetable.entry_glyphoffset_fmt =
GXV_GLYPHOFFSET_NONE;
- valid->statetable.entry_validate_func =
+ gxvalid->statetable.entry_validate_func =
gxv_kern_subtable_fmt1_entry_validate;
- gxv_StateTable_validate( p, limit, valid );
+ gxv_StateTable_validate( p, limit, gxvalid );
GXV_EXIT;
}
@@ -359,7 +373,7 @@
gxv_kern_subtable_fmt2_clstbl_validate( FT_Bytes table,
FT_Bytes limit,
GXV_kern_ClassSpec spec,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
const FT_String* tag = GXV_KERN_FMT2_DATA( class_tag[spec] );
GXV_odtect_Range odtect = GXV_KERN_FMT2_DATA( odtect );
@@ -377,13 +391,13 @@
GXV_TRACE(( " %s firstGlyph=%d, nGlyphs=%d\n",
tag, firstGlyph, nGlyphs ));
- gxv_glyphid_validate( firstGlyph, valid );
- gxv_glyphid_validate( (FT_UShort)( firstGlyph + nGlyphs - 1 ), valid );
+ gxv_glyphid_validate( firstGlyph, gxvalid );
+ gxv_glyphid_validate( (FT_UShort)( firstGlyph + nGlyphs - 1 ), gxvalid );
gxv_array_getlimits_ushort( p, p + ( 2 * nGlyphs ),
&( GXV_KERN_FMT2_DATA( offset_min[spec] ) ),
&( GXV_KERN_FMT2_DATA( offset_max[spec] ) ),
- valid );
+ gxvalid );
gxv_odtect_add_range( table, 2 * nGlyphs, tag, odtect );
@@ -394,7 +408,7 @@
static void
gxv_kern_subtable_fmt2_validate( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
GXV_ODTECT( 3, odtect );
GXV_kern_subtable_fmt2_DataRec fmt2_rec =
@@ -425,10 +439,10 @@
GXV_LIMIT_CHECK( GXV_KERN_FMT2_DATA( array ) );
gxv_kern_subtable_fmt2_clstbl_validate( table + leftOffsetTable, limit,
- GXV_KERN_CLS_L, valid );
+ GXV_KERN_CLS_L, gxvalid );
gxv_kern_subtable_fmt2_clstbl_validate( table + rightOffsetTable, limit,
- GXV_KERN_CLS_R, valid );
+ GXV_KERN_CLS_R, gxvalid );
if ( GXV_KERN_FMT2_DATA( offset_min[GXV_KERN_CLS_L] ) +
GXV_KERN_FMT2_DATA( offset_min[GXV_KERN_CLS_R] )
@@ -441,7 +455,7 @@
- GXV_KERN_FMT2_DATA( array ),
"array", odtect );
- gxv_odtect_validate( odtect, valid );
+ gxv_odtect_validate( odtect, gxvalid );
GXV_EXIT;
}
@@ -452,7 +466,7 @@
static void
gxv_kern_subtable_fmt3_validate( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = table + GXV_KERN_SUBTABLE_HEADER_SIZE;
FT_UShort glyphCount;
@@ -471,14 +485,16 @@
rightClassCount = FT_NEXT_BYTE( p );
flags = FT_NEXT_BYTE( p );
- if ( valid->face->num_glyphs != glyphCount )
+ if ( gxvalid->face->num_glyphs != glyphCount )
{
GXV_TRACE(( "maxGID=%d, but glyphCount=%d\n",
- valid->face->num_glyphs, glyphCount ));
- if ( valid->root->level >= FT_VALIDATE_PARANOID )
- FT_INVALID_GLYPH_ID;
+ gxvalid->face->num_glyphs, glyphCount ));
+ GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID );
}
+ if ( flags != 0 )
+ GXV_TRACE(( "kern subtable fmt3 has nonzero value"
+ " (%d) in unused flag\n", flags ));
/*
* just skip kernValue[kernValueCount]
*/
@@ -493,8 +509,8 @@
GXV_LIMIT_CHECK( glyphCount );
- gxv_array_getlimits_byte( p, p + glyphCount, &min, &max, valid );
- p += valid->subtable_length;
+ gxv_array_getlimits_byte( p, p + glyphCount, &min, &max, gxvalid );
+ p += gxvalid->subtable_length;
if ( leftClassCount < max )
FT_INVALID_DATA;
@@ -508,8 +524,8 @@
GXV_LIMIT_CHECK( glyphCount );
- gxv_array_getlimits_byte( p, p + glyphCount, &min, &max, valid );
- p += valid->subtable_length;
+ gxv_array_getlimits_byte( p, p + glyphCount, &min, &max, gxvalid );
+ p += gxvalid->subtable_length;
if ( rightClassCount < max )
FT_INVALID_DATA;
@@ -533,7 +549,7 @@
}
}
- valid->subtable_length = p - table;
+ gxvalid->subtable_length = p - table;
GXV_EXIT;
}
@@ -542,23 +558,27 @@
static FT_Bool
gxv_kern_coverage_new_apple_validate( FT_UShort coverage,
FT_UShort* format,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
/* new Apple-dialect */
+#ifdef GXV_LOAD_TRACE_VARS
FT_Bool kernVertical;
FT_Bool kernCrossStream;
FT_Bool kernVariation;
+#endif
- FT_UNUSED( valid );
+ FT_UNUSED( gxvalid );
/* reserved bits = 0 */
if ( coverage & 0x1FFC )
- return 0;
+ return FALSE;
+#ifdef GXV_LOAD_TRACE_VARS
kernVertical = FT_BOOL( ( coverage >> 15 ) & 1 );
kernCrossStream = FT_BOOL( ( coverage >> 14 ) & 1 );
kernVariation = FT_BOOL( ( coverage >> 13 ) & 1 );
+#endif
*format = (FT_UShort)( coverage & 0x0003 );
@@ -568,30 +588,34 @@
GXV_TRACE(( "kerning values in Apple format subtable are ignored\n" ));
- return 1;
+ return TRUE;
}
static FT_Bool
gxv_kern_coverage_classic_apple_validate( FT_UShort coverage,
FT_UShort* format,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
/* classic Apple-dialect */
+#ifdef GXV_LOAD_TRACE_VARS
FT_Bool horizontal;
FT_Bool cross_stream;
+#endif
/* check expected flags, but don't check if MS-dialect is impossible */
- if ( !( coverage & 0xFD00 ) && KERN_ALLOWS_MS( valid ) )
- return 0;
+ if ( !( coverage & 0xFD00 ) && KERN_ALLOWS_MS( gxvalid ) )
+ return FALSE;
/* reserved bits = 0 */
if ( coverage & 0x02FC )
- return 0;
+ return FALSE;
+#ifdef GXV_LOAD_TRACE_VARS
horizontal = FT_BOOL( ( coverage >> 15 ) & 1 );
cross_stream = FT_BOOL( ( coverage >> 13 ) & 1 );
+#endif
*format = (FT_UShort)( coverage & 0x0003 );
@@ -601,36 +625,40 @@
/* format 1 requires GX State Machine, too new for classic */
if ( *format == 1 )
- return 0;
+ return FALSE;
GXV_TRACE(( "kerning values in Apple format subtable are ignored\n" ));
- return 1;
+ return TRUE;
}
static FT_Bool
gxv_kern_coverage_classic_microsoft_validate( FT_UShort coverage,
FT_UShort* format,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
/* classic Microsoft-dialect */
+#ifdef GXV_LOAD_TRACE_VARS
FT_Bool horizontal;
FT_Bool minimum;
FT_Bool cross_stream;
FT_Bool override;
+#endif
- FT_UNUSED( valid );
+ FT_UNUSED( gxvalid );
/* reserved bits = 0 */
if ( coverage & 0xFDF0 )
- return 0;
+ return FALSE;
+#ifdef GXV_LOAD_TRACE_VARS
horizontal = FT_BOOL( coverage & 1 );
minimum = FT_BOOL( ( coverage >> 1 ) & 1 );
cross_stream = FT_BOOL( ( coverage >> 2 ) & 1 );
override = FT_BOOL( ( coverage >> 3 ) & 1 );
+#endif
*format = (FT_UShort)( ( coverage >> 8 ) & 0x0003 );
@@ -643,7 +671,7 @@
GXV_TRACE((
"kerning values in Microsoft format 2 subtable are ignored\n" ));
- return 1;
+ return TRUE;
}
@@ -658,7 +686,7 @@
static GXV_kern_Dialect
gxv_kern_coverage_validate( FT_UShort coverage,
FT_UShort* format,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
GXV_kern_Dialect result = KERN_DIALECT_UNKNOWN;
@@ -667,33 +695,33 @@
GXV_TRACE(( "interprete coverage 0x%04x by Apple style\n", coverage ));
- if ( KERN_IS_NEW( valid ) )
+ if ( KERN_IS_NEW( gxvalid ) )
{
if ( gxv_kern_coverage_new_apple_validate( coverage,
format,
- valid ) )
+ gxvalid ) )
{
result = KERN_DIALECT_APPLE;
goto Exit;
}
}
- if ( KERN_IS_CLASSIC( valid ) && KERN_ALLOWS_APPLE( valid ) )
+ if ( KERN_IS_CLASSIC( gxvalid ) && KERN_ALLOWS_APPLE( gxvalid ) )
{
if ( gxv_kern_coverage_classic_apple_validate( coverage,
format,
- valid ) )
+ gxvalid ) )
{
result = KERN_DIALECT_APPLE;
goto Exit;
}
}
- if ( KERN_IS_CLASSIC( valid ) && KERN_ALLOWS_MS( valid ) )
+ if ( KERN_IS_CLASSIC( gxvalid ) && KERN_ALLOWS_MS( gxvalid ) )
{
if ( gxv_kern_coverage_classic_microsoft_validate( coverage,
format,
- valid ) )
+ gxvalid ) )
{
result = KERN_DIALECT_MS;
goto Exit;
@@ -711,13 +739,17 @@
static void
gxv_kern_subtable_validate( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = table;
+#ifdef GXV_LOAD_TRACE_VARS
FT_UShort version = 0; /* MS only: subtable version, unused */
+#endif
FT_ULong length; /* MS: 16bit, Apple: 32bit*/
FT_UShort coverage;
+#ifdef GXV_LOAD_TRACE_VARS
FT_UShort tupleIndex = 0; /* Apple only */
+#endif
FT_UShort u16[2];
FT_UShort format = 255; /* subtable format */
@@ -729,26 +761,38 @@
u16[1] = FT_NEXT_USHORT( p ); /* Apple: length_lo MS: length */
coverage = FT_NEXT_USHORT( p );
- switch ( gxv_kern_coverage_validate( coverage, &format, valid ) )
+ switch ( gxv_kern_coverage_validate( coverage, &format, gxvalid ) )
{
case KERN_DIALECT_MS:
+#ifdef GXV_LOAD_TRACE_VARS
version = u16[0];
+#endif
length = u16[1];
+#ifdef GXV_LOAD_TRACE_VARS
tupleIndex = 0;
+#endif
GXV_TRACE(( "Subtable version = %d\n", version ));
GXV_TRACE(( "Subtable length = %d\n", length ));
break;
case KERN_DIALECT_APPLE:
+#ifdef GXV_LOAD_TRACE_VARS
version = 0;
+#endif
length = ( u16[0] << 16 ) + u16[1];
+#ifdef GXV_LOAD_TRACE_VARS
tupleIndex = 0;
+#endif
GXV_TRACE(( "Subtable length = %d\n", length ));
- if ( KERN_IS_NEW( valid ) )
+ if ( KERN_IS_NEW( gxvalid ) )
{
GXV_LIMIT_CHECK( 2 );
+#ifdef GXV_LOAD_TRACE_VARS
tupleIndex = FT_NEXT_USHORT( p );
+#else
+ p += 2;
+#endif
GXV_TRACE(( "Subtable tupleIndex = %d\n", tupleIndex ));
}
break;
@@ -762,18 +806,18 @@
/* formats 1, 2, 3 require the position of the start of this subtable */
if ( format == 0 )
- gxv_kern_subtable_fmt0_validate( table, table + length, valid );
+ gxv_kern_subtable_fmt0_validate( table, table + length, gxvalid );
else if ( format == 1 )
- gxv_kern_subtable_fmt1_validate( table, table + length, valid );
+ gxv_kern_subtable_fmt1_validate( table, table + length, gxvalid );
else if ( format == 2 )
- gxv_kern_subtable_fmt2_validate( table, table + length, valid );
+ gxv_kern_subtable_fmt2_validate( table, table + length, gxvalid );
else if ( format == 3 )
- gxv_kern_subtable_fmt3_validate( table, table + length, valid );
+ gxv_kern_subtable_fmt3_validate( table, table + length, gxvalid );
else
FT_INVALID_DATA;
Exit:
- valid->subtable_length = length;
+ gxvalid->subtable_length = length;
GXV_EXIT;
}
@@ -793,8 +837,8 @@
GXV_kern_Dialect dialect_request,
FT_Validator ftvalid )
{
- GXV_ValidatorRec validrec;
- GXV_Validator valid = &validrec;
+ GXV_ValidatorRec gxvalidrec;
+ GXV_Validator gxvalid = &gxvalidrec;
GXV_kern_DataRec kernrec;
GXV_kern_Data kern = &kernrec;
@@ -806,13 +850,13 @@
FT_UInt i;
- valid->root = ftvalid;
- valid->table_data = kern;
- valid->face = face;
+ gxvalid->root = ftvalid;
+ gxvalid->table_data = kern;
+ gxvalid->face = face;
FT_TRACE3(( "validating `kern' table\n" ));
GXV_INIT;
- KERN_DIALECT( valid ) = dialect_request;
+ KERN_DIALECT( gxvalid ) = dialect_request;
GXV_LIMIT_CHECK( 2 );
GXV_KERN_DATA( version ) = (GXV_kern_Version)FT_NEXT_USHORT( p );
@@ -821,12 +865,12 @@
if ( 0x0001 < GXV_KERN_DATA( version ) )
FT_INVALID_FORMAT;
- else if ( KERN_IS_CLASSIC( valid ) )
+ else if ( KERN_IS_CLASSIC( gxvalid ) )
{
GXV_LIMIT_CHECK( 2 );
nTables = FT_NEXT_USHORT( p );
}
- else if ( KERN_IS_NEW( valid ) )
+ else if ( KERN_IS_NEW( gxvalid ) )
{
if ( classic_only )
FT_INVALID_FORMAT;
@@ -842,8 +886,8 @@
{
GXV_TRACE(( "validating subtable %d/%d\n", i, nTables ));
/* p should be 32bit-aligned? */
- gxv_kern_subtable_validate( p, 0, valid );
- p += valid->subtable_length;
+ gxv_kern_subtable_validate( p, 0, gxvalid );
+ p += gxvalid->subtable_length;
}
FT_TRACE4(( "\n" ));
diff --git a/src/3rdparty/freetype/src/gxvalid/gxvlcar.c b/src/3rdparty/freetype/src/gxvalid/gxvlcar.c
index f14fa5b131..48308b0246 100644
--- a/src/3rdparty/freetype/src/gxvalid/gxvlcar.c
+++ b/src/3rdparty/freetype/src/gxvalid/gxvlcar.c
@@ -67,14 +67,14 @@
static void
gxv_lcar_partial_validate( FT_UShort partial,
FT_UShort glyph,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
GXV_NAME_ENTER( "partial" );
if ( GXV_LCAR_DATA( format ) != 1 )
goto Exit;
- gxv_ctlPoint_validate( glyph, partial, valid );
+ gxv_ctlPoint_validate( glyph, partial, gxvalid );
Exit:
GXV_EXIT;
@@ -84,10 +84,10 @@
static void
gxv_lcar_LookupValue_validate( FT_UShort glyph,
GXV_LookupValueCPtr value_p,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
- FT_Bytes p = valid->root->base + value_p->u;
- FT_Bytes limit = valid->root->limit;
+ FT_Bytes p = gxvalid->root->base + value_p->u;
+ FT_Bytes limit = gxvalid->root->limit;
FT_UShort count;
FT_Short partial;
FT_UShort i;
@@ -102,7 +102,7 @@
for ( i = 0; i < count; i++ )
{
partial = FT_NEXT_SHORT( p );
- gxv_lcar_partial_validate( partial, glyph, valid );
+ gxv_lcar_partial_validate( partial, glyph, gxvalid );
}
GXV_EXIT;
@@ -148,7 +148,7 @@
gxv_lcar_LookupFmt4_transit( FT_UShort relative_gindex,
GXV_LookupValueCPtr base_value_p,
FT_Bytes lookuptbl_limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p;
FT_Bytes limit;
@@ -160,8 +160,8 @@
/* XXX: check range? */
offset = (FT_UShort)( base_value_p->u +
relative_gindex * sizeof ( FT_UShort ) );
- p = valid->root->base + offset;
- limit = valid->root->limit;
+ p = gxvalid->root->base + offset;
+ limit = gxvalid->root->limit;
GXV_LIMIT_CHECK ( 2 );
value.u = FT_NEXT_USHORT( p );
@@ -185,8 +185,8 @@
{
FT_Bytes p = table;
FT_Bytes limit = 0;
- GXV_ValidatorRec validrec;
- GXV_Validator valid = &validrec;
+ GXV_ValidatorRec gxvalidrec;
+ GXV_Validator gxvalid = &gxvalidrec;
GXV_lcar_DataRec lcarrec;
GXV_lcar_Data lcar = &lcarrec;
@@ -194,9 +194,9 @@
FT_Fixed version;
- valid->root = ftvalid;
- valid->table_data = lcar;
- valid->face = face;
+ gxvalid->root = ftvalid;
+ gxvalid->table_data = lcar;
+ gxvalid->face = face;
FT_TRACE3(( "validating `lcar' table\n" ));
GXV_INIT;
@@ -211,10 +211,10 @@
if ( GXV_LCAR_DATA( format ) > 1 )
FT_INVALID_FORMAT;
- valid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED;
- valid->lookupval_func = gxv_lcar_LookupValue_validate;
- valid->lookupfmt4_trans = gxv_lcar_LookupFmt4_transit;
- gxv_LookupTable_validate( p, limit, valid );
+ gxvalid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED;
+ gxvalid->lookupval_func = gxv_lcar_LookupValue_validate;
+ gxvalid->lookupfmt4_trans = gxv_lcar_LookupFmt4_transit;
+ gxv_LookupTable_validate( p, limit, gxvalid );
FT_TRACE4(( "\n" ));
}
diff --git a/src/3rdparty/freetype/src/gxvalid/gxvmod.c b/src/3rdparty/freetype/src/gxvalid/gxvmod.c
index b2b16b1ff3..278d47688a 100644
--- a/src/3rdparty/freetype/src/gxvalid/gxvmod.c
+++ b/src/3rdparty/freetype/src/gxvalid/gxvmod.c
@@ -4,7 +4,7 @@
/* */
/* FreeType's TrueTypeGX/AAT validation module implementation (body). */
/* */
-/* Copyright 2004, 2005, 2006 */
+/* Copyright 2004-2006, 2013 */
/* by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */
/* David Turner, Robert Wilhelm, and Werner Lemberg. */
/* */
@@ -58,8 +58,8 @@
error = FT_Load_Sfnt_Table( face, tag, 0, NULL, table_len );
- if ( error == GXV_Err_Table_Missing )
- return GXV_Err_Ok;
+ if ( FT_ERR_EQ( error, Table_Missing ) )
+ return FT_Err_Ok;
if ( error )
goto Exit;
@@ -112,7 +112,7 @@
{
FT_Memory volatile memory = FT_FACE_MEMORY( face );
- FT_Error error = GXV_Err_Ok;
+ FT_Error error = FT_Err_Ok;
FT_ValidatorRec volatile valid;
FT_UInt i;
@@ -200,7 +200,7 @@
/* without volatile on `error' GCC 4.1.1. emits: */
/* warning: variable 'error' might be clobbered by 'longjmp' or 'vfork' */
/* this warning seems spurious but --- */
- FT_Error volatile error = GXV_Err_Ok;
+ FT_Error volatile error;
FT_ValidatorRec volatile valid;
@@ -269,7 +269,7 @@
const FT_Module_Class gxv_module_class =
{
0,
- sizeof( FT_ModuleRec ),
+ sizeof ( FT_ModuleRec ),
"gxvalid",
0x10000L,
0x20000L,
diff --git a/src/3rdparty/freetype/src/gxvalid/gxvmod.h b/src/3rdparty/freetype/src/gxvalid/gxvmod.h
index d912a8f838..22732ba992 100644
--- a/src/3rdparty/freetype/src/gxvalid/gxvmod.h
+++ b/src/3rdparty/freetype/src/gxvalid/gxvmod.h
@@ -36,7 +36,7 @@ FT_BEGIN_HEADER
#ifdef FT_CONFIG_OPTION_PIC
#error "this module does not support PIC yet"
-#endif
+#endif
FT_EXPORT_VAR( const FT_Module_Class ) gxv_module_class;
diff --git a/src/3rdparty/freetype/src/gxvalid/gxvmort.c b/src/3rdparty/freetype/src/gxvalid/gxvmort.c
index 0aa066339d..55ff5a851e 100644
--- a/src/3rdparty/freetype/src/gxvalid/gxvmort.c
+++ b/src/3rdparty/freetype/src/gxvalid/gxvmort.c
@@ -4,7 +4,7 @@
/* */
/* TrueTypeGX/AAT mort table validation (body). */
/* */
-/* Copyright 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */
+/* Copyright 2005, 2013 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */
/* David Turner, Robert Wilhelm, and Werner Lemberg. */
/* */
/* This file is part of the FreeType project, and may only be used, */
@@ -40,23 +40,21 @@
static void
gxv_mort_feature_validate( GXV_mort_feature f,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
if ( f->featureType >= gxv_feat_registry_length )
{
GXV_TRACE(( "featureType %d is out of registered range, "
"setting %d is unchecked\n",
f->featureType, f->featureSetting ));
- if ( valid->root->level >= FT_VALIDATE_PARANOID )
- FT_INVALID_DATA;
+ GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );
}
else if ( !gxv_feat_registry[f->featureType].existence )
{
GXV_TRACE(( "featureType %d is within registered area "
"but undefined, setting %d is unchecked\n",
f->featureType, f->featureSetting ));
- if ( valid->root->level >= FT_VALIDATE_PARANOID )
- FT_INVALID_DATA;
+ GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );
}
else
{
@@ -74,8 +72,7 @@
if ( f->featureSetting > nSettings_max )
{
GXV_TRACE(( "out of defined range %d", nSettings_max ));
- if ( valid->root->level >= FT_VALIDATE_PARANOID )
- FT_INVALID_DATA;
+ GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );
}
GXV_TRACE(( "\n" ));
}
@@ -92,7 +89,7 @@
gxv_mort_featurearray_validate( FT_Bytes table,
FT_Bytes limit,
FT_ULong nFeatureFlags,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = table;
FT_ULong i;
@@ -109,23 +106,24 @@
f.enableFlags = FT_NEXT_ULONG( p );
f.disableFlags = FT_NEXT_ULONG( p );
- gxv_mort_feature_validate( &f, valid );
+ gxv_mort_feature_validate( &f, gxvalid );
}
if ( !IS_GXV_MORT_FEATURE_OFF( f ) )
FT_INVALID_DATA;
- valid->subtable_length = p - table;
+ gxvalid->subtable_length = p - table;
GXV_EXIT;
}
FT_LOCAL_DEF( void )
gxv_mort_coverage_validate( FT_UShort coverage,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
- FT_UNUSED( valid );
+ FT_UNUSED( gxvalid );
+#ifdef FT_DEBUG_LEVEL_TRACE
if ( coverage & 0x8000U )
GXV_TRACE(( " this subtable is for vertical text only\n" ));
else
@@ -144,6 +142,7 @@
if ( coverage & 0x1FF8 )
GXV_TRACE(( " coverage has non-zero bits in reserved area\n" ));
+#endif
}
@@ -151,7 +150,7 @@
gxv_mort_subtables_validate( FT_Bytes table,
FT_Bytes limit,
FT_UShort nSubtables,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = table;
@@ -166,17 +165,20 @@
};
- GXV_Validate_Func func;
- FT_UShort i;
+ FT_UShort i;
GXV_NAME_ENTER( "subtables in a chain" );
for ( i = 0; i < nSubtables; i++ )
{
+ GXV_Validate_Func func;
+
FT_UShort length;
FT_UShort coverage;
+#ifdef GXV_LOAD_UNUSED_VARS
FT_ULong subFeatureFlags;
+#endif
FT_UInt type;
FT_UInt rest;
@@ -184,7 +186,11 @@
GXV_LIMIT_CHECK( 2 + 2 + 4 );
length = FT_NEXT_USHORT( p );
coverage = FT_NEXT_USHORT( p );
+#ifdef GXV_LOAD_UNUSED_VARS
subFeatureFlags = FT_NEXT_ULONG( p );
+#else
+ p += 4;
+#endif
GXV_TRACE(( "validating chain subtable %d/%d (%d bytes)\n",
i + 1, nSubtables, length ));
@@ -192,7 +198,7 @@
rest = length - ( 2 + 2 + 4 );
GXV_LIMIT_CHECK( rest );
- gxv_mort_coverage_validate( coverage, valid );
+ gxv_mort_coverage_validate( coverage, gxvalid );
if ( type > 5 )
FT_INVALID_FORMAT;
@@ -201,12 +207,13 @@
if ( func == NULL )
GXV_TRACE(( "morx type %d is reserved\n", type ));
- func( p, p + rest, valid );
+ func( p, p + rest, gxvalid );
p += rest;
+ /* TODO: validate subFeatureFlags */
}
- valid->subtable_length = p - table;
+ gxvalid->subtable_length = p - table;
GXV_EXIT;
}
@@ -215,10 +222,12 @@
static void
gxv_mort_chain_validate( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = table;
+#ifdef GXV_LOAD_UNUSED_VARS
FT_ULong defaultFlags;
+#endif
FT_ULong chainLength;
FT_UShort nFeatureFlags;
FT_UShort nSubtables;
@@ -227,17 +236,22 @@
GXV_NAME_ENTER( "mort chain header" );
GXV_LIMIT_CHECK( 4 + 4 + 2 + 2 );
+#ifdef GXV_LOAD_UNUSED_VARS
defaultFlags = FT_NEXT_ULONG( p );
+#else
+ p += 4;
+#endif
chainLength = FT_NEXT_ULONG( p );
nFeatureFlags = FT_NEXT_USHORT( p );
nSubtables = FT_NEXT_USHORT( p );
gxv_mort_featurearray_validate( p, table + chainLength,
- nFeatureFlags, valid );
- p += valid->subtable_length;
- gxv_mort_subtables_validate( p, table + chainLength, nSubtables, valid );
- valid->subtable_length = chainLength;
+ nFeatureFlags, gxvalid );
+ p += gxvalid->subtable_length;
+ gxv_mort_subtables_validate( p, table + chainLength, nSubtables, gxvalid );
+ gxvalid->subtable_length = chainLength;
+ /* TODO: validate defaultFlags */
GXV_EXIT;
}
@@ -247,8 +261,8 @@
FT_Face face,
FT_Validator ftvalid )
{
- GXV_ValidatorRec validrec;
- GXV_Validator valid = &validrec;
+ GXV_ValidatorRec gxvalidrec;
+ GXV_Validator gxvalid = &gxvalidrec;
FT_Bytes p = table;
FT_Bytes limit = 0;
FT_ULong version;
@@ -256,9 +270,9 @@
FT_ULong i;
- valid->root = ftvalid;
- valid->face = face;
- limit = valid->root->limit;
+ gxvalid->root = ftvalid;
+ gxvalid->face = face;
+ limit = gxvalid->root->limit;
FT_TRACE3(( "validating `mort' table\n" ));
GXV_INIT;
@@ -274,8 +288,8 @@
{
GXV_TRACE(( "validating chain %d/%d\n", i + 1, nChains ));
GXV_32BIT_ALIGNMENT_VALIDATE( p - table );
- gxv_mort_chain_validate( p, limit, valid );
- p += valid->subtable_length;
+ gxv_mort_chain_validate( p, limit, gxvalid );
+ p += gxvalid->subtable_length;
}
FT_TRACE4(( "\n" ));
diff --git a/src/3rdparty/freetype/src/gxvalid/gxvmort.h b/src/3rdparty/freetype/src/gxvalid/gxvmort.h
index 1e5a1f5ab6..8e62e52dbf 100644
--- a/src/3rdparty/freetype/src/gxvalid/gxvmort.h
+++ b/src/3rdparty/freetype/src/gxvalid/gxvmort.h
@@ -55,36 +55,36 @@
gxv_mort_featurearray_validate( FT_Bytes table,
FT_Bytes limit,
FT_ULong nFeatureFlags,
- GXV_Validator valid );
+ GXV_Validator gxvalid );
FT_LOCAL( void )
gxv_mort_coverage_validate( FT_UShort coverage,
- GXV_Validator valid );
+ GXV_Validator gxvalid );
FT_LOCAL( void )
gxv_mort_subtable_type0_validate( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid );
+ GXV_Validator gxvalid );
FT_LOCAL( void )
gxv_mort_subtable_type1_validate( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid );
+ GXV_Validator gxvalid );
FT_LOCAL( void )
gxv_mort_subtable_type2_validate( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid );
+ GXV_Validator gxvalid );
FT_LOCAL( void )
gxv_mort_subtable_type4_validate( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid );
+ GXV_Validator gxvalid );
FT_LOCAL( void )
gxv_mort_subtable_type5_validate( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid );
+ GXV_Validator gxvalid );
#endif /* __GXVMORT_H__ */
diff --git a/src/3rdparty/freetype/src/gxvalid/gxvmort0.c b/src/3rdparty/freetype/src/gxvalid/gxvmort0.c
index 0453062f63..f19016efdb 100644
--- a/src/3rdparty/freetype/src/gxvalid/gxvmort0.c
+++ b/src/3rdparty/freetype/src/gxvalid/gxvmort0.c
@@ -67,7 +67,7 @@
GXV_StateTable_GlyphOffsetCPtr glyphOffset_p,
FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_UShort markFirst;
FT_UShort dontAdvance;
@@ -98,10 +98,24 @@
GXV_TRACE(( " %02d", verb ));
GXV_TRACE(( " %s\n", GXV_Mort_IndicScript_Msg[verb] ));
+ if ( markFirst > 0 && markLast > 0 )
+ {
+ GXV_TRACE(( " [odd] a glyph is marked as the first and last"
+ " in Indic rearrangement\n" ));
+ GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );
+ }
+
+ if ( markFirst > 0 && dontAdvance > 0 )
+ {
+ GXV_TRACE(( " [odd] the first glyph is marked as dontAdvance"
+ " in Indic rearrangement\n" ));
+ GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );
+ }
+
if ( 0 < reserved )
{
GXV_TRACE(( " non-zero bits found in reserved range\n" ));
- FT_INVALID_DATA;
+ GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );
}
else
GXV_TRACE(( "\n" ));
@@ -111,7 +125,7 @@
FT_LOCAL_DEF( void )
gxv_mort_subtable_type0_validate( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = table;
@@ -121,14 +135,14 @@
GXV_LIMIT_CHECK( GXV_STATETABLE_HEADER_SIZE );
- valid->statetable.optdata = NULL;
- valid->statetable.optdata_load_func = NULL;
- valid->statetable.subtable_setup_func = NULL;
- valid->statetable.entry_glyphoffset_fmt = GXV_GLYPHOFFSET_NONE;
- valid->statetable.entry_validate_func =
+ gxvalid->statetable.optdata = NULL;
+ gxvalid->statetable.optdata_load_func = NULL;
+ gxvalid->statetable.subtable_setup_func = NULL;
+ gxvalid->statetable.entry_glyphoffset_fmt = GXV_GLYPHOFFSET_NONE;
+ gxvalid->statetable.entry_validate_func =
gxv_mort_subtable_type0_entry_validate;
- gxv_StateTable_validate( p, limit, valid );
+ gxv_StateTable_validate( p, limit, gxvalid );
GXV_EXIT;
}
diff --git a/src/3rdparty/freetype/src/gxvalid/gxvmort1.c b/src/3rdparty/freetype/src/gxvalid/gxvmort1.c
index 696d85032d..0189504edf 100644
--- a/src/3rdparty/freetype/src/gxvalid/gxvmort1.c
+++ b/src/3rdparty/freetype/src/gxvalid/gxvmort1.c
@@ -53,12 +53,12 @@
static void
gxv_mort_subtable_type1_substitutionTable_load( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = table;
GXV_mort_subtable_type1_StateOptRecData optdata =
- (GXV_mort_subtable_type1_StateOptRecData)valid->statetable.optdata;
+ (GXV_mort_subtable_type1_StateOptRecData)gxvalid->statetable.optdata;
GXV_LIMIT_CHECK( 2 );
@@ -74,14 +74,14 @@
FT_UShort* classTable_length_p,
FT_UShort* stateArray_length_p,
FT_UShort* entryTable_length_p,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_UShort o[4];
FT_UShort *l[4];
FT_UShort buff[5];
GXV_mort_subtable_type1_StateOptRecData optdata =
- (GXV_mort_subtable_type1_StateOptRecData)valid->statetable.optdata;
+ (GXV_mort_subtable_type1_StateOptRecData)gxvalid->statetable.optdata;
o[0] = classTable;
@@ -93,7 +93,7 @@
l[2] = entryTable_length_p;
l[3] = &( optdata->substitutionTable_length );
- gxv_set_length_by_ushort_offset( o, l, buff, 4, table_size, valid );
+ gxv_set_length_by_ushort_offset( o, l, buff, 4, table_size, gxvalid );
}
@@ -102,12 +102,10 @@
FT_Short wordOffset,
const FT_String* tag,
FT_Byte state,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_UShort substTable;
FT_UShort substTable_limit;
- FT_UShort min_gid;
- FT_UShort max_gid;
FT_UNUSED( tag );
FT_UNUSED( state );
@@ -115,15 +113,16 @@
substTable =
((GXV_mort_subtable_type1_StateOptRec *)
- (valid->statetable.optdata))->substitutionTable;
+ (gxvalid->statetable.optdata))->substitutionTable;
substTable_limit =
(FT_UShort)( substTable +
((GXV_mort_subtable_type1_StateOptRec *)
- (valid->statetable.optdata))->substitutionTable_length );
+ (gxvalid->statetable.optdata))->substitutionTable_length );
- min_gid = (FT_UShort)( ( substTable - wordOffset * 2 ) / 2 );
- max_gid = (FT_UShort)( ( substTable_limit - wordOffset * 2 ) / 2 );
- max_gid = (FT_UShort)( FT_MAX( max_gid, valid->face->num_glyphs ) );
+ gxvalid->min_gid = (FT_UShort)( ( substTable - wordOffset * 2 ) / 2 );
+ gxvalid->max_gid = (FT_UShort)( ( substTable_limit - wordOffset * 2 ) / 2 );
+ gxvalid->max_gid = (FT_UShort)( FT_MAX( gxvalid->max_gid,
+ gxvalid->face->num_glyphs ) );
/* XXX: check range? */
@@ -138,10 +137,12 @@
GXV_StateTable_GlyphOffsetCPtr glyphOffset_p,
FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
+#ifdef GXV_LOAD_UNUSED_VARS
FT_UShort setMark;
FT_UShort dontAdvance;
+#endif
FT_UShort reserved;
FT_Short markOffset;
FT_Short currentOffset;
@@ -150,8 +151,10 @@
FT_UNUSED( limit );
+#ifdef GXV_LOAD_UNUSED_VARS
setMark = (FT_UShort)( flags >> 15 );
dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1 );
+#endif
reserved = (FT_Short)( flags & 0x3FFF );
markOffset = (FT_Short)( glyphOffset_p->ul >> 16 );
@@ -160,31 +163,30 @@
if ( 0 < reserved )
{
GXV_TRACE(( " non-zero bits found in reserved range\n" ));
- if ( valid->root->level >= FT_VALIDATE_PARANOID )
- FT_INVALID_DATA;
+ GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );
}
gxv_mort_subtable_type1_offset_to_subst_validate( markOffset,
"markOffset",
state,
- valid );
+ gxvalid );
gxv_mort_subtable_type1_offset_to_subst_validate( currentOffset,
"currentOffset",
state,
- valid );
+ gxvalid );
}
static void
gxv_mort_subtable_type1_substTable_validate( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = table;
FT_UShort num_gids = (FT_UShort)(
((GXV_mort_subtable_type1_StateOptRec *)
- (valid->statetable.optdata))->substitutionTable_length / 2 );
+ (gxvalid->statetable.optdata))->substitutionTable_length / 2 );
FT_UShort i;
@@ -200,13 +202,12 @@
if ( dst_gid >= 0xFFFFU )
continue;
- if ( dst_gid > valid->face->num_glyphs )
+ if ( dst_gid < gxvalid->min_gid || gxvalid->max_gid < dst_gid )
{
- GXV_TRACE(( "substTable include too large gid[%d]=%d >"
- " max defined gid #%d\n",
- i, dst_gid, valid->face->num_glyphs ));
- if ( valid->root->level >= FT_VALIDATE_PARANOID )
- FT_INVALID_GLYPH_ID;
+ GXV_TRACE(( "substTable include a strange gid[%d]=%d >"
+ " out of define range (%d..%d)\n",
+ i, dst_gid, gxvalid->min_gid, gxvalid->max_gid ));
+ GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID );
}
}
@@ -222,7 +223,7 @@
FT_LOCAL_DEF( void )
gxv_mort_subtable_type1_validate( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = table;
@@ -233,23 +234,23 @@
GXV_LIMIT_CHECK( GXV_MORT_SUBTABLE_TYPE1_HEADER_SIZE );
- valid->statetable.optdata =
+ gxvalid->statetable.optdata =
&st_rec;
- valid->statetable.optdata_load_func =
+ gxvalid->statetable.optdata_load_func =
gxv_mort_subtable_type1_substitutionTable_load;
- valid->statetable.subtable_setup_func =
+ gxvalid->statetable.subtable_setup_func =
gxv_mort_subtable_type1_subtable_setup;
- valid->statetable.entry_glyphoffset_fmt =
+ gxvalid->statetable.entry_glyphoffset_fmt =
GXV_GLYPHOFFSET_ULONG;
- valid->statetable.entry_validate_func =
+ gxvalid->statetable.entry_validate_func =
gxv_mort_subtable_type1_entry_validate;
- gxv_StateTable_validate( p, limit, valid );
+ gxv_StateTable_validate( p, limit, gxvalid );
gxv_mort_subtable_type1_substTable_validate(
table + st_rec.substitutionTable,
table + st_rec.substitutionTable + st_rec.substitutionTable_length,
- valid );
+ gxvalid );
GXV_EXIT;
}
diff --git a/src/3rdparty/freetype/src/gxvalid/gxvmort2.c b/src/3rdparty/freetype/src/gxvalid/gxvmort2.c
index 6f77cf39ce..099ffd48c9 100644
--- a/src/3rdparty/freetype/src/gxvalid/gxvmort2.c
+++ b/src/3rdparty/freetype/src/gxvalid/gxvmort2.c
@@ -57,11 +57,11 @@
static void
gxv_mort_subtable_type2_opttable_load( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
- FT_Bytes p = table;
+ FT_Bytes p = table;
GXV_mort_subtable_type2_StateOptRecData optdata =
- (GXV_mort_subtable_type2_StateOptRecData)valid->statetable.optdata;
+ (GXV_mort_subtable_type2_StateOptRecData)gxvalid->statetable.optdata;
GXV_LIMIT_CHECK( 2 + 2 + 2 );
@@ -86,14 +86,14 @@
FT_UShort *classTable_length_p,
FT_UShort *stateArray_length_p,
FT_UShort *entryTable_length_p,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_UShort o[6];
FT_UShort *l[6];
FT_UShort buff[7];
GXV_mort_subtable_type2_StateOptRecData optdata =
- (GXV_mort_subtable_type2_StateOptRecData)valid->statetable.optdata;
+ (GXV_mort_subtable_type2_StateOptRecData)gxvalid->statetable.optdata;
GXV_NAME_ENTER( "subtable boundaries setup" );
@@ -111,7 +111,7 @@
l[4] = &(optdata->componentTable_length);
l[5] = &(optdata->ligatureTable_length);
- gxv_set_length_by_ushort_offset( o, l, buff, 6, table_size, valid );
+ gxv_set_length_by_ushort_offset( o, l, buff, 6, table_size, gxvalid );
GXV_TRACE(( "classTable: offset=0x%04x length=0x%04x\n",
classTable, *classTable_length_p ));
@@ -137,11 +137,11 @@
gxv_mort_subtable_type2_ligActionOffset_validate(
FT_Bytes table,
FT_UShort ligActionOffset,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
/* access ligActionTable */
GXV_mort_subtable_type2_StateOptRecData optdata =
- (GXV_mort_subtable_type2_StateOptRecData)valid->statetable.optdata;
+ (GXV_mort_subtable_type2_StateOptRecData)gxvalid->statetable.optdata;
FT_Bytes lat_base = table + optdata->ligActionTable;
FT_Bytes p = table + ligActionOffset;
@@ -155,8 +155,7 @@
ligActionOffset, lat_base - p ));
/* FontValidator, ftxvalidator, ftxdumperfuser warn but continue */
- if ( valid->root->level >= FT_VALIDATE_PARANOID )
- FT_INVALID_OFFSET;
+ GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET );
}
else if ( lat_limit < p )
{
@@ -164,23 +163,46 @@
ligActionOffset, p - lat_limit ));
/* FontValidator, ftxvalidator, ftxdumperfuser warn but continue */
- if ( valid->root->level >= FT_VALIDATE_PARANOID )
- FT_INVALID_OFFSET;
+ GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET );
}
else
{
/* validate entry in ligActionTable */
FT_ULong lig_action;
+#ifdef GXV_LOAD_UNUSED_VARS
FT_UShort last;
FT_UShort store;
+#endif
FT_ULong offset;
lig_action = FT_NEXT_ULONG( p );
+#ifdef GXV_LOAD_UNUSED_VARS
last = (FT_UShort)( ( lig_action >> 31 ) & 1 );
store = (FT_UShort)( ( lig_action >> 30 ) & 1 );
+#endif
+ /* Apple spec defines this offset as a word offset */
offset = lig_action & 0x3FFFFFFFUL;
+ if ( offset * 2 < optdata->ligatureTable )
+ {
+ GXV_TRACE(( "too short offset 0x%08x:"
+ " 2 x offset < ligatureTable (%d byte rewind)\n",
+ offset, optdata->ligatureTable - offset * 2 ));
+
+ GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET );
+ } else if ( offset * 2 >
+ optdata->ligatureTable + optdata->ligatureTable_length )
+ {
+ GXV_TRACE(( "too long offset 0x%08x:"
+ " 2 x offset > ligatureTable + ligatureTable_length"
+ " (%d byte overrun)\n",
+ offset,
+ optdata->ligatureTable + optdata->ligatureTable_length
+ - offset * 2 ));
+
+ GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET );
+ }
}
}
@@ -192,10 +214,12 @@
GXV_StateTable_GlyphOffsetCPtr glyphOffset_p,
FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
+#ifdef GXV_LOAD_UNUSED_VARS
FT_UShort setComponent;
FT_UShort dontAdvance;
+#endif
FT_UShort offset;
FT_UNUSED( state );
@@ -203,23 +227,25 @@
FT_UNUSED( limit );
+#ifdef GXV_LOAD_UNUSED_VARS
setComponent = (FT_UShort)( ( flags >> 15 ) & 1 );
dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1 );
+#endif
offset = (FT_UShort)( flags & 0x3FFFU );
if ( 0 < offset )
gxv_mort_subtable_type2_ligActionOffset_validate( table, offset,
- valid );
+ gxvalid );
}
static void
gxv_mort_subtable_type2_ligatureTable_validate( FT_Bytes table,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
GXV_mort_subtable_type2_StateOptRecData optdata =
- (GXV_mort_subtable_type2_StateOptRecData)valid->statetable.optdata;
+ (GXV_mort_subtable_type2_StateOptRecData)gxvalid->statetable.optdata;
FT_Bytes p = table + optdata->ligatureTable;
FT_Bytes limit = table + optdata->ligatureTable
@@ -237,6 +263,9 @@
GXV_LIMIT_CHECK( 2 );
lig_gid = FT_NEXT_USHORT( p );
+
+ if ( gxvalid->face->num_glyphs < lig_gid )
+ GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID );
}
}
GXV_EXIT;
@@ -246,7 +275,7 @@
FT_LOCAL_DEF( void )
gxv_mort_subtable_type2_validate( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = table;
@@ -257,23 +286,23 @@
GXV_LIMIT_CHECK( GXV_MORT_SUBTABLE_TYPE2_HEADER_SIZE );
- valid->statetable.optdata =
+ gxvalid->statetable.optdata =
&lig_rec;
- valid->statetable.optdata_load_func =
+ gxvalid->statetable.optdata_load_func =
gxv_mort_subtable_type2_opttable_load;
- valid->statetable.subtable_setup_func =
+ gxvalid->statetable.subtable_setup_func =
gxv_mort_subtable_type2_subtable_setup;
- valid->statetable.entry_glyphoffset_fmt =
+ gxvalid->statetable.entry_glyphoffset_fmt =
GXV_GLYPHOFFSET_NONE;
- valid->statetable.entry_validate_func =
+ gxvalid->statetable.entry_validate_func =
gxv_mort_subtable_type2_entry_validate;
- gxv_StateTable_validate( p, limit, valid );
+ gxv_StateTable_validate( p, limit, gxvalid );
- p += valid->subtable_length;
- gxv_mort_subtable_type2_ligatureTable_validate( table, valid );
+ p += gxvalid->subtable_length;
+ gxv_mort_subtable_type2_ligatureTable_validate( table, gxvalid );
- valid->subtable_length = p - table;
+ gxvalid->subtable_length = p - table;
GXV_EXIT;
}
diff --git a/src/3rdparty/freetype/src/gxvalid/gxvmort4.c b/src/3rdparty/freetype/src/gxvalid/gxvmort4.c
index 83470988c0..9e86af4dd5 100644
--- a/src/3rdparty/freetype/src/gxvalid/gxvmort4.c
+++ b/src/3rdparty/freetype/src/gxvalid/gxvmort4.c
@@ -41,11 +41,11 @@
static void
gxv_mort_subtable_type4_lookupval_validate( FT_UShort glyph,
GXV_LookupValueCPtr value_p,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_UNUSED( glyph );
- gxv_glyphid_validate( value_p->u, valid );
+ gxv_glyphid_validate( value_p->u, gxvalid );
}
/*
@@ -80,7 +80,7 @@
FT_UShort relative_gindex,
GXV_LookupValueCPtr base_value_p,
FT_Bytes lookuptbl_limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p;
FT_Bytes limit;
@@ -91,7 +91,7 @@
offset = (FT_UShort)( base_value_p->u +
relative_gindex * sizeof ( FT_UShort ) );
- p = valid->lookuptbl_head + offset;
+ p = gxvalid->lookuptbl_head + offset;
limit = lookuptbl_limit;
GXV_LIMIT_CHECK( 2 );
@@ -104,7 +104,7 @@
FT_LOCAL_DEF( void )
gxv_mort_subtable_type4_validate( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = table;
@@ -112,11 +112,11 @@
GXV_NAME_ENTER( "mort chain subtable type4 "
"(Non-Contextual Glyph Substitution)" );
- valid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED;
- valid->lookupval_func = gxv_mort_subtable_type4_lookupval_validate;
- valid->lookupfmt4_trans = gxv_mort_subtable_type4_lookupfmt4_transit;
+ gxvalid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED;
+ gxvalid->lookupval_func = gxv_mort_subtable_type4_lookupval_validate;
+ gxvalid->lookupfmt4_trans = gxv_mort_subtable_type4_lookupfmt4_transit;
- gxv_LookupTable_validate( p, limit, valid );
+ gxv_LookupTable_validate( p, limit, gxvalid );
GXV_EXIT;
}
diff --git a/src/3rdparty/freetype/src/gxvalid/gxvmort5.c b/src/3rdparty/freetype/src/gxvalid/gxvmort5.c
index ec0bcb634d..9498b10855 100644
--- a/src/3rdparty/freetype/src/gxvalid/gxvmort5.c
+++ b/src/3rdparty/freetype/src/gxvalid/gxvmort5.c
@@ -70,10 +70,10 @@
FT_UShort* classTable_length_p,
FT_UShort* stateArray_length_p,
FT_UShort* entryTable_length_p,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
GXV_mort_subtable_type5_StateOptRecData optdata =
- (GXV_mort_subtable_type5_StateOptRecData)valid->statetable.optdata;
+ (GXV_mort_subtable_type5_StateOptRecData)gxvalid->statetable.optdata;
gxv_StateTable_subtable_setup( table_size,
@@ -83,7 +83,7 @@
classTable_length_p,
stateArray_length_p,
entryTable_length_p,
- valid );
+ gxvalid );
optdata->classTable = classTable;
optdata->stateArray = stateArray;
@@ -100,7 +100,7 @@
FT_UShort count,
FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
/*
* We don't know the range of insertion-glyph-list.
@@ -109,7 +109,7 @@
FT_Bytes p = table + offset;
GXV_mort_subtable_type5_StateOptRecData optdata =
- (GXV_mort_subtable_type5_StateOptRecData)valid->statetable.optdata;
+ (GXV_mort_subtable_type5_StateOptRecData)gxvalid->statetable.optdata;
if ( optdata->classTable < offset &&
offset < optdata->classTable + *(optdata->classTable_length_p) )
@@ -121,6 +121,9 @@
offset < optdata->entryTable + *(optdata->entryTable_length_p) )
GXV_TRACE(( " offset runs into EntryTable" ));
+#ifndef GXV_LOAD_TRACE_VARS
+ GXV_LIMIT_CHECK( count * 2 );
+#else
while ( p < table + offset + ( count * 2 ) )
{
FT_UShort insert_glyphID;
@@ -130,8 +133,8 @@
insert_glyphID = FT_NEXT_USHORT( p );
GXV_TRACE(( " 0x%04x", insert_glyphID ));
}
-
GXV_TRACE(( "\n" ));
+#endif
}
@@ -142,14 +145,16 @@
GXV_StateTable_GlyphOffsetCPtr glyphOffset,
FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
+#ifdef GXV_LOAD_UNUSED_VARS
FT_Bool setMark;
FT_Bool dontAdvance;
FT_Bool currentIsKashidaLike;
FT_Bool markedIsKashidaLike;
FT_Bool currentInsertBefore;
FT_Bool markedInsertBefore;
+#endif
FT_Byte currentInsertCount;
FT_Byte markedInsertCount;
FT_UShort currentInsertList;
@@ -158,12 +163,14 @@
FT_UNUSED( state );
+#ifdef GXV_LOAD_UNUSED_VARS
setMark = FT_BOOL( ( flags >> 15 ) & 1 );
dontAdvance = FT_BOOL( ( flags >> 14 ) & 1 );
currentIsKashidaLike = FT_BOOL( ( flags >> 13 ) & 1 );
markedIsKashidaLike = FT_BOOL( ( flags >> 12 ) & 1 );
currentInsertBefore = FT_BOOL( ( flags >> 11 ) & 1 );
markedInsertBefore = FT_BOOL( ( flags >> 10 ) & 1 );
+#endif
currentInsertCount = (FT_Byte)( ( flags >> 5 ) & 0x1F );
markedInsertCount = (FT_Byte)( flags & 0x001F );
@@ -177,7 +184,7 @@
currentInsertCount,
table,
limit,
- valid );
+ gxvalid );
}
if ( 0 != markedInsertList && 0 != markedInsertCount )
@@ -186,7 +193,7 @@
markedInsertCount,
table,
limit,
- valid );
+ gxvalid );
}
}
@@ -194,7 +201,7 @@
FT_LOCAL_DEF( void )
gxv_mort_subtable_type5_validate( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = table;
@@ -206,18 +213,18 @@
GXV_LIMIT_CHECK( GXV_MORT_SUBTABLE_TYPE5_HEADER_SIZE );
- valid->statetable.optdata =
+ gxvalid->statetable.optdata =
et;
- valid->statetable.optdata_load_func =
+ gxvalid->statetable.optdata_load_func =
NULL;
- valid->statetable.subtable_setup_func =
+ gxvalid->statetable.subtable_setup_func =
gxv_mort_subtable_type5_subtable_setup;
- valid->statetable.entry_glyphoffset_fmt =
+ gxvalid->statetable.entry_glyphoffset_fmt =
GXV_GLYPHOFFSET_ULONG;
- valid->statetable.entry_validate_func =
+ gxvalid->statetable.entry_validate_func =
gxv_mort_subtable_type5_entry_validate;
- gxv_StateTable_validate( p, limit, valid );
+ gxv_StateTable_validate( p, limit, gxvalid );
GXV_EXIT;
}
diff --git a/src/3rdparty/freetype/src/gxvalid/gxvmorx.c b/src/3rdparty/freetype/src/gxvalid/gxvmorx.c
index f8ba5b985d..96dba631c4 100644
--- a/src/3rdparty/freetype/src/gxvalid/gxvmorx.c
+++ b/src/3rdparty/freetype/src/gxvalid/gxvmorx.c
@@ -4,7 +4,7 @@
/* */
/* TrueTypeGX/AAT morx table validation (body). */
/* */
-/* Copyright 2005, 2008 by */
+/* Copyright 2005, 2008, 2013 by */
/* suzuki toshiya, Masatake YAMATO, Red Hat K.K., */
/* David Turner, Robert Wilhelm, and Werner Lemberg. */
/* */
@@ -42,7 +42,7 @@
gxv_morx_subtables_validate( FT_Bytes table,
FT_Bytes limit,
FT_UShort nSubtables,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = table;
@@ -57,8 +57,6 @@
};
- GXV_Validate_Func func;
-
FT_UShort i;
@@ -66,9 +64,13 @@
for ( i = 0; i < nSubtables; i++ )
{
+ GXV_Validate_Func func;
+
FT_ULong length;
FT_ULong coverage;
+#ifdef GXV_LOAD_UNUSED_VARS
FT_ULong subFeatureFlags;
+#endif
FT_ULong type;
FT_ULong rest;
@@ -76,7 +78,11 @@
GXV_LIMIT_CHECK( 4 + 4 + 4 );
length = FT_NEXT_ULONG( p );
coverage = FT_NEXT_ULONG( p );
+#ifdef GXV_LOAD_UNUSED_VARS
subFeatureFlags = FT_NEXT_ULONG( p );
+#else
+ p += 4;
+#endif
GXV_TRACE(( "validating chain subtable %d/%d (%d bytes)\n",
i + 1, nSubtables, length ));
@@ -87,7 +93,7 @@
/* morx coverage consists of mort_coverage & 16bit padding */
gxv_mort_coverage_validate( (FT_UShort)( ( coverage >> 16 ) | coverage ),
- valid );
+ gxvalid );
if ( type > 5 )
FT_INVALID_FORMAT;
@@ -95,12 +101,13 @@
if ( func == NULL )
GXV_TRACE(( "morx type %d is reserved\n", type ));
- func( p, p + rest, valid );
+ func( p, p + rest, gxvalid );
+ /* TODO: subFeatureFlags should be unique in a table? */
p += rest;
}
- valid->subtable_length = p - table;
+ gxvalid->subtable_length = p - table;
GXV_EXIT;
}
@@ -109,10 +116,12 @@
static void
gxv_morx_chain_validate( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = table;
+#ifdef GXV_LOAD_UNUSED_VARS
FT_ULong defaultFlags;
+#endif
FT_ULong chainLength;
FT_ULong nFeatureFlags;
FT_ULong nSubtables;
@@ -121,22 +130,28 @@
GXV_NAME_ENTER( "morx chain header" );
GXV_LIMIT_CHECK( 4 + 4 + 4 + 4 );
+#ifdef GXV_LOAD_UNUSED_VARS
defaultFlags = FT_NEXT_ULONG( p );
+#else
+ p += 4;
+#endif
chainLength = FT_NEXT_ULONG( p );
nFeatureFlags = FT_NEXT_ULONG( p );
nSubtables = FT_NEXT_ULONG( p );
/* feature-array of morx is same with that of mort */
- gxv_mort_featurearray_validate( p, limit, nFeatureFlags, valid );
- p += valid->subtable_length;
+ gxv_mort_featurearray_validate( p, limit, nFeatureFlags, gxvalid );
+ p += gxvalid->subtable_length;
if ( nSubtables >= 0x10000L )
FT_INVALID_DATA;
gxv_morx_subtables_validate( p, table + chainLength,
- (FT_UShort)nSubtables, valid );
+ (FT_UShort)nSubtables, gxvalid );
+
+ gxvalid->subtable_length = chainLength;
- valid->subtable_length = chainLength;
+ /* TODO: defaultFlags should be compared with the flags in tables */
GXV_EXIT;
}
@@ -147,8 +162,8 @@
FT_Face face,
FT_Validator ftvalid )
{
- GXV_ValidatorRec validrec;
- GXV_Validator valid = &validrec;
+ GXV_ValidatorRec gxvalidrec;
+ GXV_Validator gxvalid = &gxvalidrec;
FT_Bytes p = table;
FT_Bytes limit = 0;
FT_ULong version;
@@ -156,8 +171,8 @@
FT_ULong i;
- valid->root = ftvalid;
- valid->face = face;
+ gxvalid->root = ftvalid;
+ gxvalid->face = face;
FT_TRACE3(( "validating `morx' table\n" ));
GXV_INIT;
@@ -173,8 +188,8 @@
{
GXV_TRACE(( "validating chain %d/%d\n", i + 1, nChains ));
GXV_32BIT_ALIGNMENT_VALIDATE( p - table );
- gxv_morx_chain_validate( p, limit, valid );
- p += valid->subtable_length;
+ gxv_morx_chain_validate( p, limit, gxvalid );
+ p += gxvalid->subtable_length;
}
FT_TRACE4(( "\n" ));
diff --git a/src/3rdparty/freetype/src/gxvalid/gxvmorx.h b/src/3rdparty/freetype/src/gxvalid/gxvmorx.h
index 28c1a44f6f..9ed907acd7 100644
--- a/src/3rdparty/freetype/src/gxvalid/gxvmorx.h
+++ b/src/3rdparty/freetype/src/gxvalid/gxvmorx.h
@@ -38,27 +38,27 @@
FT_LOCAL( void )
gxv_morx_subtable_type0_validate( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid );
+ GXV_Validator gxvalid );
FT_LOCAL( void )
gxv_morx_subtable_type1_validate( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid );
+ GXV_Validator gxvalid );
FT_LOCAL( void )
gxv_morx_subtable_type2_validate( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid );
+ GXV_Validator gxvalid );
FT_LOCAL( void )
gxv_morx_subtable_type4_validate( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid );
+ GXV_Validator gxvalid );
FT_LOCAL( void )
gxv_morx_subtable_type5_validate( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid );
+ GXV_Validator gxvalid );
#endif /* __GXVMORX_H__ */
diff --git a/src/3rdparty/freetype/src/gxvalid/gxvmorx0.c b/src/3rdparty/freetype/src/gxvalid/gxvmorx0.c
index 0159c5aef7..db165f4e89 100644
--- a/src/3rdparty/freetype/src/gxvalid/gxvmorx0.c
+++ b/src/3rdparty/freetype/src/gxvalid/gxvmorx0.c
@@ -45,13 +45,17 @@
GXV_XStateTable_GlyphOffsetCPtr glyphOffset_p,
FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
+#ifdef GXV_LOAD_UNUSED_VARS
FT_UShort markFirst;
FT_UShort dontAdvance;
FT_UShort markLast;
+#endif
FT_UShort reserved;
+#ifdef GXV_LOAD_UNUSED_VARS
FT_UShort verb;
+#endif
FT_UNUSED( state );
FT_UNUSED( glyphOffset_p );
@@ -59,12 +63,16 @@
FT_UNUSED( limit );
+#ifdef GXV_LOAD_UNUSED_VARS
markFirst = (FT_UShort)( ( flags >> 15 ) & 1 );
dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1 );
markLast = (FT_UShort)( ( flags >> 13 ) & 1 );
+#endif
reserved = (FT_UShort)( flags & 0x1FF0 );
+#ifdef GXV_LOAD_UNUSED_VARS
verb = (FT_UShort)( flags & 0x000F );
+#endif
if ( 0 < reserved )
{
@@ -77,7 +85,7 @@
FT_LOCAL_DEF( void )
gxv_morx_subtable_type0_validate( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = table;
@@ -87,14 +95,14 @@
GXV_LIMIT_CHECK( GXV_STATETABLE_HEADER_SIZE );
- valid->xstatetable.optdata = NULL;
- valid->xstatetable.optdata_load_func = NULL;
- valid->xstatetable.subtable_setup_func = NULL;
- valid->xstatetable.entry_glyphoffset_fmt = GXV_GLYPHOFFSET_NONE;
- valid->xstatetable.entry_validate_func =
+ gxvalid->xstatetable.optdata = NULL;
+ gxvalid->xstatetable.optdata_load_func = NULL;
+ gxvalid->xstatetable.subtable_setup_func = NULL;
+ gxvalid->xstatetable.entry_glyphoffset_fmt = GXV_GLYPHOFFSET_NONE;
+ gxvalid->xstatetable.entry_validate_func =
gxv_morx_subtable_type0_entry_validate;
- gxv_XStateTable_validate( p, limit, valid );
+ gxv_XStateTable_validate( p, limit, gxvalid );
GXV_EXIT;
}
diff --git a/src/3rdparty/freetype/src/gxvalid/gxvmorx1.c b/src/3rdparty/freetype/src/gxvalid/gxvmorx1.c
index e1c162fa0c..49f53d1854 100644
--- a/src/3rdparty/freetype/src/gxvalid/gxvmorx1.c
+++ b/src/3rdparty/freetype/src/gxvalid/gxvmorx1.c
@@ -55,12 +55,12 @@
static void
gxv_morx_subtable_type1_substitutionTable_load( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = table;
GXV_morx_subtable_type1_StateOptRecData optdata =
- (GXV_morx_subtable_type1_StateOptRecData)valid->xstatetable.optdata;
+ (GXV_morx_subtable_type1_StateOptRecData)gxvalid->xstatetable.optdata;
GXV_LIMIT_CHECK( 2 );
@@ -76,14 +76,14 @@
FT_ULong* classTable_length_p,
FT_ULong* stateArray_length_p,
FT_ULong* entryTable_length_p,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_ULong o[4];
FT_ULong *l[4];
FT_ULong buff[5];
GXV_morx_subtable_type1_StateOptRecData optdata =
- (GXV_morx_subtable_type1_StateOptRecData)valid->xstatetable.optdata;
+ (GXV_morx_subtable_type1_StateOptRecData)gxvalid->xstatetable.optdata;
o[0] = classTable;
@@ -95,7 +95,7 @@
l[2] = entryTable_length_p;
l[3] = &(optdata->substitutionTable_length);
- gxv_set_length_by_ulong_offset( o, l, buff, 4, table_size, valid );
+ gxv_set_length_by_ulong_offset( o, l, buff, 4, table_size, gxvalid );
}
@@ -106,24 +106,28 @@
GXV_StateTable_GlyphOffsetCPtr glyphOffset_p,
FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
+#ifdef GXV_LOAD_TRACE_VARS
FT_UShort setMark;
FT_UShort dontAdvance;
+#endif
FT_UShort reserved;
FT_Short markIndex;
FT_Short currentIndex;
GXV_morx_subtable_type1_StateOptRecData optdata =
- (GXV_morx_subtable_type1_StateOptRecData)valid->xstatetable.optdata;
+ (GXV_morx_subtable_type1_StateOptRecData)gxvalid->xstatetable.optdata;
FT_UNUSED( state );
FT_UNUSED( table );
FT_UNUSED( limit );
+#ifdef GXV_LOAD_TRACE_VARS
setMark = (FT_UShort)( ( flags >> 15 ) & 1 );
dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1 );
+#endif
reserved = (FT_UShort)( flags & 0x3FFF );
@@ -136,8 +140,7 @@
if ( 0 < reserved )
{
GXV_TRACE(( " non-zero bits found in reserved range\n" ));
- if ( valid->root->level >= FT_VALIDATE_PARANOID )
- FT_INVALID_DATA;
+ GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );
}
GXV_TRACE(( "markIndex = %d, currentIndex = %d\n",
@@ -156,13 +159,13 @@
static void
gxv_morx_subtable_type1_LookupValue_validate( FT_UShort glyph,
GXV_LookupValueCPtr value_p,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_UNUSED( glyph ); /* for the non-debugging case */
GXV_TRACE(( "morx subtable type1 subst.: %d -> %d\n", glyph, value_p->u ));
- if ( value_p->u > valid->face->num_glyphs )
+ if ( value_p->u > gxvalid->face->num_glyphs )
FT_INVALID_GLYPH_ID;
}
@@ -172,7 +175,7 @@
FT_UShort relative_gindex,
GXV_LookupValueCPtr base_value_p,
FT_Bytes lookuptbl_limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p;
FT_Bytes limit;
@@ -183,7 +186,7 @@
offset = (FT_UShort)( base_value_p->u +
relative_gindex * sizeof ( FT_UShort ) );
- p = valid->lookuptbl_head + offset;
+ p = gxvalid->lookuptbl_head + offset;
limit = lookuptbl_limit;
GXV_LIMIT_CHECK ( 2 );
@@ -199,19 +202,19 @@
static void
gxv_morx_subtable_type1_substitutionTable_validate( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = table;
FT_UShort i;
GXV_morx_subtable_type1_StateOptRecData optdata =
- (GXV_morx_subtable_type1_StateOptRecData)valid->xstatetable.optdata;
+ (GXV_morx_subtable_type1_StateOptRecData)gxvalid->xstatetable.optdata;
/* TODO: calculate offset/length for each lookupTables */
- valid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED;
- valid->lookupval_func = gxv_morx_subtable_type1_LookupValue_validate;
- valid->lookupfmt4_trans = gxv_morx_subtable_type1_LookupFmt4_transit;
+ gxvalid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED;
+ gxvalid->lookupval_func = gxv_morx_subtable_type1_LookupValue_validate;
+ gxvalid->lookupfmt4_trans = gxv_morx_subtable_type1_LookupFmt4_transit;
for ( i = 0; i < optdata->substitutionTable_num_lookupTables; i++ )
{
@@ -221,7 +224,7 @@
GXV_LIMIT_CHECK( 4 );
offset = FT_NEXT_ULONG( p );
- gxv_LookupTable_validate( table + offset, limit, valid );
+ gxv_LookupTable_validate( table + offset, limit, gxvalid );
}
/* TODO: overlapping of lookupTables in substitutionTable */
@@ -236,7 +239,7 @@
FT_LOCAL_DEF( void )
gxv_morx_subtable_type1_validate( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = table;
@@ -249,23 +252,23 @@
st_rec.substitutionTable_num_lookupTables = 0;
- valid->xstatetable.optdata =
+ gxvalid->xstatetable.optdata =
&st_rec;
- valid->xstatetable.optdata_load_func =
+ gxvalid->xstatetable.optdata_load_func =
gxv_morx_subtable_type1_substitutionTable_load;
- valid->xstatetable.subtable_setup_func =
+ gxvalid->xstatetable.subtable_setup_func =
gxv_morx_subtable_type1_subtable_setup;
- valid->xstatetable.entry_glyphoffset_fmt =
+ gxvalid->xstatetable.entry_glyphoffset_fmt =
GXV_GLYPHOFFSET_ULONG;
- valid->xstatetable.entry_validate_func =
+ gxvalid->xstatetable.entry_validate_func =
gxv_morx_subtable_type1_entry_validate;
- gxv_XStateTable_validate( p, limit, valid );
+ gxv_XStateTable_validate( p, limit, gxvalid );
gxv_morx_subtable_type1_substitutionTable_validate(
table + st_rec.substitutionTable,
table + st_rec.substitutionTable + st_rec.substitutionTable_length,
- valid );
+ gxvalid );
GXV_EXIT;
}
diff --git a/src/3rdparty/freetype/src/gxvalid/gxvmorx2.c b/src/3rdparty/freetype/src/gxvalid/gxvmorx2.c
index b4bb3353f6..e44445d141 100644
--- a/src/3rdparty/freetype/src/gxvalid/gxvmorx2.c
+++ b/src/3rdparty/freetype/src/gxvalid/gxvmorx2.c
@@ -5,7 +5,7 @@
/* TrueTypeGX/AAT morx table validation */
/* body for type2 (Ligature Substitution) subtable. */
/* */
-/* Copyright 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */
+/* Copyright 2005, 2013 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */
/* David Turner, Robert Wilhelm, and Werner Lemberg. */
/* */
/* This file is part of the FreeType project, and may only be used, */
@@ -58,12 +58,12 @@
static void
gxv_morx_subtable_type2_opttable_load( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = table;
GXV_morx_subtable_type2_StateOptRecData optdata =
- (GXV_morx_subtable_type2_StateOptRecData)valid->xstatetable.optdata;
+ (GXV_morx_subtable_type2_StateOptRecData)gxvalid->xstatetable.optdata;
GXV_LIMIT_CHECK( 4 + 4 + 4 );
@@ -88,14 +88,14 @@
FT_ULong* classTable_length_p,
FT_ULong* stateArray_length_p,
FT_ULong* entryTable_length_p,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_ULong o[6];
FT_ULong* l[6];
FT_ULong buff[7];
GXV_morx_subtable_type2_StateOptRecData optdata =
- (GXV_morx_subtable_type2_StateOptRecData)valid->xstatetable.optdata;
+ (GXV_morx_subtable_type2_StateOptRecData)gxvalid->xstatetable.optdata;
GXV_NAME_ENTER( "subtable boundaries setup" );
@@ -113,7 +113,7 @@
l[4] = &(optdata->componentTable_length);
l[5] = &(optdata->ligatureTable_length);
- gxv_set_length_by_ulong_offset( o, l, buff, 6, table_size, valid );
+ gxv_set_length_by_ulong_offset( o, l, buff, 6, table_size, gxvalid );
GXV_TRACE(( "classTable: offset=0x%08x length=0x%08x\n",
classTable, *classTable_length_p ));
@@ -142,11 +142,11 @@
gxv_morx_subtable_type2_ligActionIndex_validate(
FT_Bytes table,
FT_UShort ligActionIndex,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
/* access ligActionTable */
GXV_morx_subtable_type2_StateOptRecData optdata =
- (GXV_morx_subtable_type2_StateOptRecData)valid->xstatetable.optdata;
+ (GXV_morx_subtable_type2_StateOptRecData)gxvalid->xstatetable.optdata;
FT_Bytes lat_base = table + optdata->ligActionTable;
FT_Bytes p = lat_base +
@@ -168,16 +168,52 @@
{
/* validate entry in ligActionTable */
FT_ULong lig_action;
+#ifdef GXV_LOAD_UNUSED_VARS
FT_UShort last;
FT_UShort store;
+#endif
FT_ULong offset;
+ FT_Long gid_limit;
lig_action = FT_NEXT_ULONG( p );
+#ifdef GXV_LOAD_UNUSED_VARS
last = (FT_UShort)( ( lig_action >> 31 ) & 1 );
store = (FT_UShort)( ( lig_action >> 30 ) & 1 );
+#endif
offset = lig_action & 0x3FFFFFFFUL;
+
+ /* this offset is 30-bit signed value to add to GID */
+ /* it is different from the location offset in mort */
+ if ( ( offset & 0x3FFF0000UL ) == 0x3FFF0000UL )
+ { /* negative offset */
+ gid_limit = gxvalid->face->num_glyphs - ( offset & 0x0000FFFFUL );
+ if ( gid_limit > 0 )
+ return;
+
+ GXV_TRACE(( "ligature action table includes"
+ " too negative offset moving all GID"
+ " below defined range: 0x%04x\n",
+ offset & 0xFFFFU ));
+ GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET );
+ }
+ else if ( ( offset & 0x3FFF0000UL ) == 0x00000000UL )
+ { /* positive offset */
+ if ( (FT_Long)offset < gxvalid->face->num_glyphs )
+ return;
+
+ GXV_TRACE(( "ligature action table includes"
+ " too large offset moving all GID"
+ " over defined range: 0x%04x\n",
+ offset & 0xFFFFU ));
+ GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET );
+ }
+
+ GXV_TRACE(( "ligature action table includes"
+ " invalid offset to add to 16-bit GID:"
+ " 0x%08x\n", offset ));
+ GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET );
}
}
@@ -189,11 +225,13 @@
GXV_StateTable_GlyphOffsetCPtr glyphOffset_p,
FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
+#ifdef GXV_LOAD_UNUSED_VARS
FT_UShort setComponent;
FT_UShort dontAdvance;
FT_UShort performAction;
+#endif
FT_UShort reserved;
FT_UShort ligActionIndex;
@@ -201,9 +239,11 @@
FT_UNUSED( limit );
+#ifdef GXV_LOAD_UNUSED_VARS
setComponent = (FT_UShort)( ( flags >> 15 ) & 1 );
dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1 );
performAction = (FT_UShort)( ( flags >> 13 ) & 1 );
+#endif
reserved = (FT_UShort)( flags & 0x1FFF );
ligActionIndex = glyphOffset_p->u;
@@ -213,16 +253,16 @@
if ( 0 < ligActionIndex )
gxv_morx_subtable_type2_ligActionIndex_validate(
- table, ligActionIndex, valid );
+ table, ligActionIndex, gxvalid );
}
static void
gxv_morx_subtable_type2_ligatureTable_validate( FT_Bytes table,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
GXV_morx_subtable_type2_StateOptRecData optdata =
- (GXV_morx_subtable_type2_StateOptRecData)valid->xstatetable.optdata;
+ (GXV_morx_subtable_type2_StateOptRecData)gxvalid->xstatetable.optdata;
FT_Bytes p = table + optdata->ligatureTable;
FT_Bytes limit = table + optdata->ligatureTable
@@ -241,6 +281,8 @@
GXV_LIMIT_CHECK( 2 );
lig_gid = FT_NEXT_USHORT( p );
+ if ( lig_gid < gxvalid->face->num_glyphs )
+ GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID );
}
}
@@ -251,7 +293,7 @@
FT_LOCAL_DEF( void )
gxv_morx_subtable_type2_validate( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = table;
@@ -262,21 +304,23 @@
GXV_LIMIT_CHECK( GXV_MORX_SUBTABLE_TYPE2_HEADER_SIZE );
- valid->xstatetable.optdata =
+ gxvalid->xstatetable.optdata =
&lig_rec;
- valid->xstatetable.optdata_load_func =
+ gxvalid->xstatetable.optdata_load_func =
gxv_morx_subtable_type2_opttable_load;
- valid->xstatetable.subtable_setup_func =
+ gxvalid->xstatetable.subtable_setup_func =
gxv_morx_subtable_type2_subtable_setup;
- valid->xstatetable.entry_glyphoffset_fmt =
+ gxvalid->xstatetable.entry_glyphoffset_fmt =
GXV_GLYPHOFFSET_USHORT;
- valid->xstatetable.entry_validate_func =
+ gxvalid->xstatetable.entry_validate_func =
gxv_morx_subtable_type2_entry_validate;
- gxv_XStateTable_validate( p, limit, valid );
+ gxv_XStateTable_validate( p, limit, gxvalid );
- p += valid->subtable_length;
- gxv_morx_subtable_type2_ligatureTable_validate( table, valid );
+#if 0
+ p += gxvalid->subtable_length;
+#endif
+ gxv_morx_subtable_type2_ligatureTable_validate( table, gxvalid );
GXV_EXIT;
}
diff --git a/src/3rdparty/freetype/src/gxvalid/gxvmorx4.c b/src/3rdparty/freetype/src/gxvalid/gxvmorx4.c
index c0d2f78e39..68ab678492 100644
--- a/src/3rdparty/freetype/src/gxvalid/gxvmorx4.c
+++ b/src/3rdparty/freetype/src/gxvalid/gxvmorx4.c
@@ -41,12 +41,12 @@
FT_LOCAL_DEF( void )
gxv_morx_subtable_type4_validate( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
GXV_NAME_ENTER( "morx chain subtable type4 "
"(Non-Contextual Glyph Substitution)" );
- gxv_mort_subtable_type4_validate( table, limit, valid );
+ gxv_mort_subtable_type4_validate( table, limit, gxvalid );
GXV_EXIT;
}
diff --git a/src/3rdparty/freetype/src/gxvalid/gxvmorx5.c b/src/3rdparty/freetype/src/gxvalid/gxvmorx5.c
index 5e3a16437e..5e095dd380 100644
--- a/src/3rdparty/freetype/src/gxvalid/gxvmorx5.c
+++ b/src/3rdparty/freetype/src/gxvalid/gxvmorx5.c
@@ -64,12 +64,12 @@
static void
gxv_morx_subtable_type5_insertionGlyphList_load( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = table;
GXV_morx_subtable_type5_StateOptRecData optdata =
- (GXV_morx_subtable_type5_StateOptRecData)valid->xstatetable.optdata;
+ (GXV_morx_subtable_type5_StateOptRecData)gxvalid->xstatetable.optdata;
GXV_LIMIT_CHECK( 4 );
@@ -85,14 +85,14 @@
FT_ULong* classTable_length_p,
FT_ULong* stateArray_length_p,
FT_ULong* entryTable_length_p,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_ULong o[4];
FT_ULong* l[4];
FT_ULong buff[5];
GXV_morx_subtable_type5_StateOptRecData optdata =
- (GXV_morx_subtable_type5_StateOptRecData)valid->xstatetable.optdata;
+ (GXV_morx_subtable_type5_StateOptRecData)gxvalid->xstatetable.optdata;
o[0] = classTable;
@@ -104,7 +104,7 @@
l[2] = entryTable_length_p;
l[3] = &(optdata->insertionGlyphList_length);
- gxv_set_length_by_ulong_offset( o, l, buff, 4, table_size, valid );
+ gxv_set_length_by_ulong_offset( o, l, buff, 4, table_size, gxvalid );
}
@@ -113,11 +113,14 @@
FT_UShort count,
FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
- FT_Bytes p = table + table_index * 2;
+ FT_Bytes p = table + table_index * 2;
+#ifndef GXV_LOAD_TRACE_VARS
+ GXV_LIMIT_CHECK( count * 2 );
+#else
while ( p < table + count * 2 + table_index * 2 )
{
FT_UShort insert_glyphID;
@@ -129,6 +132,7 @@
}
GXV_TRACE(( "\n" ));
+#endif
}
@@ -139,14 +143,16 @@
GXV_StateTable_GlyphOffsetCPtr glyphOffset_p,
FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
+#ifdef GXV_LOAD_UNUSED_VARS
FT_Bool setMark;
FT_Bool dontAdvance;
FT_Bool currentIsKashidaLike;
FT_Bool markedIsKashidaLike;
FT_Bool currentInsertBefore;
FT_Bool markedInsertBefore;
+#endif
FT_Byte currentInsertCount;
FT_Byte markedInsertCount;
FT_Byte currentInsertList;
@@ -155,12 +161,14 @@
FT_UNUSED( state );
+#ifdef GXV_LOAD_UNUSED_VARS
setMark = FT_BOOL( ( flags >> 15 ) & 1 );
dontAdvance = FT_BOOL( ( flags >> 14 ) & 1 );
currentIsKashidaLike = FT_BOOL( ( flags >> 13 ) & 1 );
markedIsKashidaLike = FT_BOOL( ( flags >> 12 ) & 1 );
currentInsertBefore = FT_BOOL( ( flags >> 11 ) & 1 );
markedInsertBefore = FT_BOOL( ( flags >> 10 ) & 1 );
+#endif
currentInsertCount = (FT_Byte)( ( flags >> 5 ) & 0x1F );
markedInsertCount = (FT_Byte)( flags & 0x001F );
@@ -172,20 +180,20 @@
gxv_morx_subtable_type5_InsertList_validate( currentInsertList,
currentInsertCount,
table, limit,
- valid );
+ gxvalid );
if ( markedInsertList && 0 != markedInsertCount )
gxv_morx_subtable_type5_InsertList_validate( markedInsertList,
markedInsertCount,
table, limit,
- valid );
+ gxvalid );
}
FT_LOCAL_DEF( void )
gxv_morx_subtable_type5_validate( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = table;
@@ -197,18 +205,18 @@
GXV_LIMIT_CHECK( GXV_MORX_SUBTABLE_TYPE5_HEADER_SIZE );
- valid->xstatetable.optdata =
+ gxvalid->xstatetable.optdata =
et;
- valid->xstatetable.optdata_load_func =
+ gxvalid->xstatetable.optdata_load_func =
gxv_morx_subtable_type5_insertionGlyphList_load;
- valid->xstatetable.subtable_setup_func =
+ gxvalid->xstatetable.subtable_setup_func =
gxv_morx_subtable_type5_subtable_setup;
- valid->xstatetable.entry_glyphoffset_fmt =
+ gxvalid->xstatetable.entry_glyphoffset_fmt =
GXV_GLYPHOFFSET_ULONG;
- valid->xstatetable.entry_validate_func =
+ gxvalid->xstatetable.entry_validate_func =
gxv_morx_subtable_type5_entry_validate;
- gxv_XStateTable_validate( p, limit, valid );
+ gxv_XStateTable_validate( p, limit, gxvalid );
GXV_EXIT;
}
diff --git a/src/3rdparty/freetype/src/gxvalid/gxvopbd.c b/src/3rdparty/freetype/src/gxvalid/gxvopbd.c
index e125060946..ab0cd72bf2 100644
--- a/src/3rdparty/freetype/src/gxvalid/gxvopbd.c
+++ b/src/3rdparty/freetype/src/gxvalid/gxvopbd.c
@@ -68,11 +68,11 @@
static void
gxv_opbd_LookupValue_validate( FT_UShort glyph,
GXV_LookupValueCPtr value_p,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
/* offset in LookupTable is measured from the head of opbd table */
- FT_Bytes p = valid->root->base + value_p->u;
- FT_Bytes limit = valid->root->limit;
+ FT_Bytes p = gxvalid->root->base + value_p->u;
+ FT_Bytes limit = gxvalid->root->limit;
FT_Short delta_value;
int i;
@@ -90,7 +90,7 @@
if ( delta_value == -1 )
continue;
- gxv_ctlPoint_validate( glyph, delta_value, valid );
+ gxv_ctlPoint_validate( glyph, delta_value, gxvalid );
}
else /* format 0, value is distance */
continue;
@@ -134,12 +134,12 @@
gxv_opbd_LookupFmt4_transit( FT_UShort relative_gindex,
GXV_LookupValueCPtr base_value_p,
FT_Bytes lookuptbl_limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
GXV_LookupValueDesc value;
FT_UNUSED( lookuptbl_limit );
- FT_UNUSED( valid );
+ FT_UNUSED( gxvalid );
/* XXX: check range? */
value.u = (FT_UShort)( base_value_p->u +
@@ -162,8 +162,8 @@
FT_Face face,
FT_Validator ftvalid )
{
- GXV_ValidatorRec validrec;
- GXV_Validator valid = &validrec;
+ GXV_ValidatorRec gxvalidrec;
+ GXV_Validator gxvalid = &gxvalidrec;
GXV_opbd_DataRec opbdrec;
GXV_opbd_Data opbd = &opbdrec;
FT_Bytes p = table;
@@ -172,9 +172,9 @@
FT_ULong version;
- valid->root = ftvalid;
- valid->table_data = opbd;
- valid->face = face;
+ gxvalid->root = ftvalid;
+ gxvalid->table_data = opbd;
+ gxvalid->face = face;
FT_TRACE3(( "validating `opbd' table\n" ));
GXV_INIT;
@@ -196,12 +196,12 @@
if ( 0x0001 < GXV_OPBD_DATA( format ) )
FT_INVALID_FORMAT;
- valid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED;
- valid->lookupval_func = gxv_opbd_LookupValue_validate;
- valid->lookupfmt4_trans = gxv_opbd_LookupFmt4_transit;
+ gxvalid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED;
+ gxvalid->lookupval_func = gxv_opbd_LookupValue_validate;
+ gxvalid->lookupfmt4_trans = gxv_opbd_LookupFmt4_transit;
- gxv_LookupTable_validate( p, limit, valid );
- p += valid->subtable_length;
+ gxv_LookupTable_validate( p, limit, gxvalid );
+ p += gxvalid->subtable_length;
if ( p > table + GXV_OPBD_DATA( valueOffset_min ) )
{
diff --git a/src/3rdparty/freetype/src/gxvalid/gxvprop.c b/src/3rdparty/freetype/src/gxvalid/gxvprop.c
index 66c3ab7404..aa5c8eed31 100644
--- a/src/3rdparty/freetype/src/gxvalid/gxvprop.c
+++ b/src/3rdparty/freetype/src/gxvalid/gxvprop.c
@@ -75,7 +75,7 @@
static void
gxv_prop_zero_advance_validate( FT_UShort gid,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Face face;
FT_Error error;
@@ -84,7 +84,7 @@
GXV_NAME_ENTER( "zero advance" );
- face = valid->face;
+ face = gxvalid->face;
error = FT_Load_Glyph( face,
gid,
@@ -96,7 +96,10 @@
if ( glyph->advance.x != (FT_Pos)0 ||
glyph->advance.y != (FT_Pos)0 )
+ {
+ GXV_TRACE(( " found non-zero advance in zero-advance glyph\n" ));
FT_INVALID_DATA;
+ }
GXV_EXIT;
}
@@ -106,10 +109,10 @@
static void
gxv_prop_property_validate( FT_UShort property,
FT_UShort glyph,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
if ( glyph != 0 && ( property & GXV_PROP_FLOATER ) )
- gxv_prop_zero_advance_validate( glyph, valid );
+ gxv_prop_zero_advance_validate( glyph, gxvalid );
if ( property & GXV_PROP_USE_COMPLEMENTARY_BRACKET )
{
@@ -119,7 +122,10 @@
offset = (FT_UShort)( property & GXV_PROP_COMPLEMENTARY_BRACKET_OFFSET );
if ( offset == 0 )
- FT_INVALID_DATA;
+ {
+ GXV_TRACE(( " found zero offset to property\n" ));
+ FT_INVALID_OFFSET;
+ }
complement = (char)( offset >> 8 );
if ( complement & 0x08 )
@@ -131,12 +137,15 @@
/* The gid for complement must be greater than 0 */
if ( glyph <= complement )
+ {
+ GXV_TRACE(( " found non-positive glyph complement\n" ));
FT_INVALID_DATA;
+ }
}
else
{
/* The gid for complement must be the face. */
- gxv_glyphid_validate( (FT_UShort)( glyph + complement ), valid );
+ gxv_glyphid_validate( (FT_UShort)( glyph + complement ), gxvalid );
}
}
else
@@ -150,18 +159,27 @@
if ( property & GXV_PROP_ATTACHING_TO_RIGHT )
{
if ( GXV_PROP_DATA( version ) == 0x00010000UL )
+ {
+ GXV_TRACE(( " found older version (1.0) in new version table\n" ));
FT_INVALID_DATA;
+ }
}
if ( property & GXV_PROP_RESERVED )
+ {
+ GXV_TRACE(( " found non-zero bits in reserved bits\n" ));
FT_INVALID_DATA;
+ }
if ( ( property & GXV_PROP_DIRECTIONALITY_CLASS ) > 11 )
{
/* TODO: Too restricted. Use the validation level. */
if ( GXV_PROP_DATA( version ) == 0x00010000UL ||
GXV_PROP_DATA( version ) == 0x00020000UL )
+ {
+ GXV_TRACE(( " found too old version in directionality class\n" ));
FT_INVALID_DATA;
+ }
}
}
@@ -169,9 +187,9 @@
static void
gxv_prop_LookupValue_validate( FT_UShort glyph,
GXV_LookupValueCPtr value_p,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
- gxv_prop_property_validate( value_p->u, glyph, valid );
+ gxv_prop_property_validate( value_p->u, glyph, gxvalid );
}
@@ -206,7 +224,7 @@
gxv_prop_LookupFmt4_transit( FT_UShort relative_gindex,
GXV_LookupValueCPtr base_value_p,
FT_Bytes lookuptbl_limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p;
FT_Bytes limit;
@@ -215,8 +233,8 @@
/* XXX: check range? */
offset = (FT_UShort)( base_value_p->u +
- relative_gindex * sizeof( FT_UShort ) );
- p = valid->lookuptbl_head + offset;
+ relative_gindex * sizeof ( FT_UShort ) );
+ p = gxvalid->lookuptbl_head + offset;
limit = lookuptbl_limit;
GXV_LIMIT_CHECK ( 2 );
@@ -241,8 +259,8 @@
{
FT_Bytes p = table;
FT_Bytes limit = 0;
- GXV_ValidatorRec validrec;
- GXV_Validator valid = &validrec;
+ GXV_ValidatorRec gxvalidrec;
+ GXV_Validator gxvalid = &gxvalidrec;
GXV_prop_DataRec proprec;
GXV_prop_Data prop = &proprec;
@@ -252,9 +270,9 @@
FT_UShort defaultProp;
- valid->root = ftvalid;
- valid->table_data = prop;
- valid->face = face;
+ gxvalid->root = ftvalid;
+ gxvalid->table_data = prop;
+ gxvalid->face = face;
FT_TRACE3(( "validating `prop' table\n" ));
GXV_INIT;
@@ -264,18 +282,28 @@
format = FT_NEXT_USHORT( p );
defaultProp = FT_NEXT_USHORT( p );
+ GXV_TRACE(( " version 0x%08x\n", version ));
+ GXV_TRACE(( " format 0x%04x\n", format ));
+ GXV_TRACE(( " defaultProp 0x%04x\n", defaultProp ));
+
/* only versions 1.0, 2.0, 3.0 are defined (1996) */
if ( version != 0x00010000UL &&
version != 0x00020000UL &&
version != 0x00030000UL )
+ {
+ GXV_TRACE(( " found unknown version\n" ));
FT_INVALID_FORMAT;
+ }
/* only formats 0x0000, 0x0001 are defined (1996) */
if ( format > 1 )
+ {
+ GXV_TRACE(( " found unknown format\n" ));
FT_INVALID_FORMAT;
+ }
- gxv_prop_property_validate( defaultProp, 0, valid );
+ gxv_prop_property_validate( defaultProp, 0, gxvalid );
if ( format == 0 )
{
@@ -287,11 +315,11 @@
/* format == 1 */
GXV_PROP_DATA( version ) = version;
- valid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED;
- valid->lookupval_func = gxv_prop_LookupValue_validate;
- valid->lookupfmt4_trans = gxv_prop_LookupFmt4_transit;
+ gxvalid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED;
+ gxvalid->lookupval_func = gxv_prop_LookupValue_validate;
+ gxvalid->lookupfmt4_trans = gxv_prop_LookupFmt4_transit;
- gxv_LookupTable_validate( p, limit, valid );
+ gxv_LookupTable_validate( p, limit, gxvalid );
Exit:
FT_TRACE4(( "\n" ));
diff --git a/src/3rdparty/freetype/src/gxvalid/gxvtrak.c b/src/3rdparty/freetype/src/gxvalid/gxvtrak.c
index df3fd15c0b..3ec1a56739 100644
--- a/src/3rdparty/freetype/src/gxvalid/gxvtrak.c
+++ b/src/3rdparty/freetype/src/gxvalid/gxvtrak.c
@@ -93,14 +93,14 @@
gxv_trak_trackTable_validate( FT_Bytes table,
FT_Bytes limit,
FT_UShort nTracks,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
- FT_Bytes p = table;
+ FT_Bytes p = table;
- FT_Fixed track;
+ FT_Fixed track, t;
FT_UShort nameIndex;
FT_UShort offset;
- FT_UShort i;
+ FT_UShort i, j;
GXV_NAME_ENTER( "trackTable" );
@@ -108,9 +108,11 @@
GXV_TRAK_DATA( trackValueOffset_min ) = 0xFFFFU;
GXV_TRAK_DATA( trackValueOffset_max ) = 0x0000;
+ GXV_LIMIT_CHECK( nTracks * ( 4 + 2 + 2 ) );
+
for ( i = 0; i < nTracks; i ++ )
{
- GXV_LIMIT_CHECK( 4 + 2 + 2 );
+ p = table + i * ( 4 + 2 + 2 );
track = FT_NEXT_LONG( p );
nameIndex = FT_NEXT_USHORT( p );
offset = FT_NEXT_USHORT( p );
@@ -120,10 +122,19 @@
if ( offset > GXV_TRAK_DATA( trackValueOffset_max ) )
GXV_TRAK_DATA( trackValueOffset_max ) = offset;
- gxv_sfntName_validate( nameIndex, 256, 32767, valid );
+ gxv_sfntName_validate( nameIndex, 256, 32767, gxvalid );
+
+ for ( j = i; j < nTracks; j ++ )
+ {
+ p = table + j * ( 4 + 2 + 2 );
+ t = FT_NEXT_LONG( p );
+ if ( t == track )
+ GXV_TRACE(( "duplicated entries found for track value 0x%x\n",
+ track ));
+ }
}
- valid->subtable_length = p - table;
+ gxvalid->subtable_length = p - table;
GXV_EXIT;
}
@@ -131,7 +142,7 @@
static void
gxv_trak_trackData_validate( FT_Bytes table,
FT_Bytes limit,
- GXV_Validator valid )
+ GXV_Validator gxvalid )
{
FT_Bytes p = table;
FT_UShort nTracks;
@@ -153,31 +164,31 @@
gxv_odtect_add_range( table, p - table, "trackData header", odtect );
/* validate trackTable */
- gxv_trak_trackTable_validate( p, limit, nTracks, valid );
- gxv_odtect_add_range( p, valid->subtable_length,
+ gxv_trak_trackTable_validate( p, limit, nTracks, gxvalid );
+ gxv_odtect_add_range( p, gxvalid->subtable_length,
"trackTable", odtect );
/* sizeTable is array of FT_Fixed, don't check contents */
- p = valid->root->base + sizeTableOffset;
+ p = gxvalid->root->base + sizeTableOffset;
GXV_LIMIT_CHECK( nSizes * 4 );
gxv_odtect_add_range( p, nSizes * 4, "sizeTable", odtect );
/* validate trackValueOffet */
- p = valid->root->base + GXV_TRAK_DATA( trackValueOffset_min );
+ p = gxvalid->root->base + GXV_TRAK_DATA( trackValueOffset_min );
if ( limit - p < nTracks * nSizes * 2 )
GXV_TRACE(( "too short trackValue array\n" ));
- p = valid->root->base + GXV_TRAK_DATA( trackValueOffset_max );
+ p = gxvalid->root->base + GXV_TRAK_DATA( trackValueOffset_max );
GXV_LIMIT_CHECK( nSizes * 2 );
- gxv_odtect_add_range( valid->root->base
+ gxv_odtect_add_range( gxvalid->root->base
+ GXV_TRAK_DATA( trackValueOffset_min ),
GXV_TRAK_DATA( trackValueOffset_max )
- GXV_TRAK_DATA( trackValueOffset_min )
+ nSizes * 2,
"trackValue array", odtect );
- gxv_odtect_validate( odtect, valid );
+ gxv_odtect_validate( odtect, gxvalid );
GXV_EXIT;
}
@@ -198,10 +209,9 @@
{
FT_Bytes p = table;
FT_Bytes limit = 0;
- FT_Offset table_size;
- GXV_ValidatorRec validrec;
- GXV_Validator valid = &validrec;
+ GXV_ValidatorRec gxvalidrec;
+ GXV_Validator gxvalid = &gxvalidrec;
GXV_trak_DataRec trakrec;
GXV_trak_Data trak = &trakrec;
@@ -215,12 +225,11 @@
GXV_ODTECT( 3, odtect );
GXV_ODTECT_INIT( odtect );
- valid->root = ftvalid;
- valid->table_data = trak;
- valid->face = face;
+ gxvalid->root = ftvalid;
+ gxvalid->table_data = trak;
+ gxvalid->face = face;
- limit = valid->root->limit;
- table_size = limit - table;
+ limit = gxvalid->root->limit;
FT_TRACE3(( "validating `trak' table\n" ));
GXV_INIT;
@@ -256,19 +265,19 @@
/* validate trackData */
if ( 0 < horizOffset )
{
- gxv_trak_trackData_validate( table + horizOffset, limit, valid );
- gxv_odtect_add_range( table + horizOffset, valid->subtable_length,
+ gxv_trak_trackData_validate( table + horizOffset, limit, gxvalid );
+ gxv_odtect_add_range( table + horizOffset, gxvalid->subtable_length,
"horizJustData", odtect );
}
if ( 0 < vertOffset )
{
- gxv_trak_trackData_validate( table + vertOffset, limit, valid );
- gxv_odtect_add_range( table + vertOffset, valid->subtable_length,
+ gxv_trak_trackData_validate( table + vertOffset, limit, gxvalid );
+ gxv_odtect_add_range( table + vertOffset, gxvalid->subtable_length,
"vertJustData", odtect );
}
- gxv_odtect_validate( odtect, valid );
+ gxv_odtect_validate( odtect, gxvalid );
FT_TRACE4(( "\n" ));
}