static void otv_MathConstants_validate( FT_Bytes table, OTV_Validator valid ) { FT_Bytes p = table; FT_UInt i; FT_UInt table_size; OTV_OPTIONAL_TABLE( DeviceTableOffset ); OTV_NAME_ENTER( "MathConstants" ); /* 56 constants, 51 have device tables */ OTV_LIMIT_CHECK( 2 * ( 56 + 51 ) ); table_size = 2 * ( 56 + 51 ); p += 4 * 2; /* First 4 constants have no device tables */ for ( i = 0; i < 51; ++i ) { p += 2; /* skip the value */ OTV_OPTIONAL_OFFSET( DeviceTableOffset ); OTV_SIZE_CHECK( DeviceTableOffset ); if ( DeviceTableOffset ) otv_Device_validate( table + DeviceTableOffset, valid ); } OTV_EXIT; }
static void otv_MathKern_validate( FT_Bytes table, OTV_Validator valid ) { FT_Bytes p = table; FT_UInt i, cnt, table_size; OTV_OPTIONAL_TABLE( DeviceTableOffset ); /* OTV_NAME_ENTER( "MathKern" );*/ OTV_LIMIT_CHECK( 2 ); cnt = FT_NEXT_USHORT( p ); OTV_LIMIT_CHECK( 4 * cnt + 2 ); table_size = 4 + 4 * cnt; /* Heights */ for ( i = 0; i < cnt; ++i ) { p += 2; /* Skip the value */ OTV_OPTIONAL_OFFSET( DeviceTableOffset ); OTV_SIZE_CHECK( DeviceTableOffset ); if ( DeviceTableOffset ) otv_Device_validate( table + DeviceTableOffset, valid ); } /* One more Kerning value */ for ( i = 0; i < cnt + 1; ++i ) { p += 2; /* Skip the value */ OTV_OPTIONAL_OFFSET( DeviceTableOffset ); OTV_SIZE_CHECK( DeviceTableOffset ); if ( DeviceTableOffset ) otv_Device_validate( table + DeviceTableOffset, valid ); } OTV_EXIT; }
static void otv_CaretValue_validate( FT_Bytes table, OTV_Validator valid ) { FT_Bytes p = table; FT_UInt CaretValueFormat; OTV_ENTER; OTV_LIMIT_CHECK( 4 ); CaretValueFormat = FT_NEXT_USHORT( p ); OTV_TRACE(( " (format = %d)\n", CaretValueFormat )); switch ( CaretValueFormat ) { case 1: /* CaretValueFormat1 */ /* skip Coordinate, no test */ break; case 2: /* CaretValueFormat2 */ /* skip CaretValuePoint, no test */ break; case 3: /* CaretValueFormat3 */ p += 2; /* skip Coordinate */ OTV_LIMIT_CHECK( 2 ); /* DeviceTable */ otv_Device_validate( table + FT_NEXT_USHORT( p ), valid ); break; default: FT_INVALID_FORMAT; } OTV_EXIT; }
static void otv_GlyphAssembly_validate( FT_Bytes table, OTV_Validator valid ) { FT_Bytes p = table; FT_UInt pcnt, table_size; FT_UInt i; OTV_OPTIONAL_TABLE( DeviceTableOffset ); /* OTV_NAME_ENTER( "GlyphAssembly" ); */ OTV_LIMIT_CHECK( 6 ); p += 2; /* Skip the Italics Correction value */ OTV_OPTIONAL_OFFSET( DeviceTableOffset ); pcnt = FT_NEXT_USHORT( p ); OTV_LIMIT_CHECK( 8 * pcnt ); table_size = 6 + 8 * pcnt; OTV_SIZE_CHECK( DeviceTableOffset ); if ( DeviceTableOffset ) otv_Device_validate( table + DeviceTableOffset, valid ); for ( i = 0; i < pcnt; ++i ) { FT_UInt gid; gid = FT_NEXT_USHORT( p ); if ( gid >= valid->glyph_count ) FT_INVALID_GLYPH_ID; p += 2*4; /* skip the Start, End, Full, and Flags fields */ } /* OTV_EXIT; */ }
static void otv_MathItalicsCorrectionInfo_validate( FT_Bytes table, OTV_Validator otvalid, FT_Int isItalic ) { FT_Bytes p = table; FT_UInt i, cnt, table_size; OTV_OPTIONAL_TABLE( Coverage ); OTV_OPTIONAL_TABLE( DeviceTableOffset ); FT_UNUSED( isItalic ); /* only used if tracing is active */ OTV_NAME_ENTER( isItalic ? "MathItalicsCorrectionInfo" : "MathTopAccentAttachment" ); OTV_LIMIT_CHECK( 4 ); OTV_OPTIONAL_OFFSET( Coverage ); cnt = FT_NEXT_USHORT( p ); OTV_LIMIT_CHECK( 4 * cnt ); table_size = 4 + 4 * cnt; OTV_SIZE_CHECK( Coverage ); otv_Coverage_validate( table + Coverage, otvalid, (FT_Int)cnt ); for ( i = 0; i < cnt; ++i ) { p += 2; /* Skip the value */ OTV_OPTIONAL_OFFSET( DeviceTableOffset ); OTV_SIZE_CHECK( DeviceTableOffset ); if ( DeviceTableOffset ) otv_Device_validate( table + DeviceTableOffset, otvalid ); } OTV_EXIT; }
static void otv_BaseCoord_validate( FT_Bytes table, OTV_Validator otvalid ) { FT_Bytes p = table; FT_UInt BaseCoordFormat; OTV_NAME_ENTER( "BaseCoord" ); OTV_LIMIT_CHECK( 4 ); BaseCoordFormat = FT_NEXT_USHORT( p ); p += 2; /* skip Coordinate */ OTV_TRACE(( " (format %d)\n", BaseCoordFormat )); switch ( BaseCoordFormat ) { case 1: /* BaseCoordFormat1 */ break; case 2: /* BaseCoordFormat2 */ OTV_LIMIT_CHECK( 4 ); /* ReferenceGlyph, BaseCoordPoint */ break; case 3: /* BaseCoordFormat3 */ OTV_LIMIT_CHECK( 2 ); /* DeviceTable */ otv_Device_validate( table + FT_NEXT_USHORT( p ), otvalid ); break; default: FT_INVALID_FORMAT; } OTV_EXIT; }