00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "otvalid.h"
00020 #include "otvcommn.h"
00021
00022
00023
00024
00025
00026
00027
00028
00029 #undef FT_COMPONENT
00030 #define FT_COMPONENT trace_otvgdef
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 #define AttachListFunc otv_O_x_Ox
00042 #define LigCaretListFunc otv_O_x_Ox
00043
00044
00045
00046 static void
00047 otv_O_x_Ox( FT_Bytes table,
00048 OTV_Validator valid )
00049 {
00050 FT_Bytes p = table;
00051 FT_Bytes Coverage;
00052 FT_UInt GlyphCount;
00053 OTV_Validate_Func func;
00054
00055
00056 OTV_ENTER;
00057
00058 OTV_LIMIT_CHECK( 4 );
00059 Coverage = table + FT_NEXT_USHORT( p );
00060 GlyphCount = FT_NEXT_USHORT( p );
00061
00062 OTV_TRACE(( " (GlyphCount = %d)\n", GlyphCount ));
00063
00064 otv_Coverage_validate( Coverage, valid, GlyphCount );
00065 if ( GlyphCount != otv_Coverage_get_count( Coverage ) )
00066 FT_INVALID_DATA;
00067
00068 OTV_LIMIT_CHECK( GlyphCount * 2 );
00069
00070 valid->nesting_level++;
00071 func = valid->func[valid->nesting_level];
00072 valid->extra1 = 0;
00073
00074 for ( ; GlyphCount > 0; GlyphCount-- )
00075 func( table + FT_NEXT_USHORT( p ), valid );
00076
00077 valid->nesting_level--;
00078
00079 OTV_EXIT;
00080 }
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091 #define CaretValueFunc otv_CaretValue_validate
00092
00093 static void
00094 otv_CaretValue_validate( FT_Bytes table,
00095 OTV_Validator valid )
00096 {
00097 FT_Bytes p = table;
00098 FT_UInt CaretValueFormat;
00099
00100
00101 OTV_ENTER;
00102
00103 OTV_LIMIT_CHECK( 4 );
00104
00105 CaretValueFormat = FT_NEXT_USHORT( p );
00106
00107 OTV_TRACE(( " (format = %d)\n", CaretValueFormat ));
00108
00109 switch ( CaretValueFormat )
00110 {
00111 case 1:
00112
00113 break;
00114
00115 case 2:
00116
00117 break;
00118
00119 case 3:
00120 p += 2;
00121
00122 OTV_LIMIT_CHECK( 2 );
00123
00124
00125 otv_Device_validate( table + FT_NEXT_USHORT( p ), valid );
00126 break;
00127
00128 default:
00129 FT_INVALID_FORMAT;
00130 }
00131
00132 OTV_EXIT;
00133 }
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146 FT_LOCAL_DEF( void )
00147 otv_GDEF_validate( FT_Bytes table,
00148 FT_Bytes gsub,
00149 FT_Bytes gpos,
00150 FT_UInt glyph_count,
00151 FT_Validator ftvalid )
00152 {
00153 OTV_ValidatorRec validrec;
00154 OTV_Validator valid = &validrec;
00155 FT_Bytes p = table;
00156 FT_UInt table_size;
00157 FT_Bool need_MarkAttachClassDef;
00158
00159 OTV_OPTIONAL_TABLE( GlyphClassDef );
00160 OTV_OPTIONAL_TABLE( AttachListOffset );
00161 OTV_OPTIONAL_TABLE( LigCaretListOffset );
00162 OTV_OPTIONAL_TABLE( MarkAttachClassDef );
00163
00164
00165 valid->root = ftvalid;
00166
00167 FT_TRACE3(( "validating GDEF table\n" ));
00168 OTV_INIT;
00169
00170 OTV_LIMIT_CHECK( 12 );
00171
00172 if ( FT_NEXT_ULONG( p ) != 0x10000UL )
00173 FT_INVALID_FORMAT;
00174
00175
00176
00177
00178
00179
00180 need_MarkAttachClassDef = FT_BOOL(
00181 otv_GSUBGPOS_have_MarkAttachmentType_flag( gsub ) ||
00182 otv_GSUBGPOS_have_MarkAttachmentType_flag( gpos ) );
00183
00184 if ( need_MarkAttachClassDef )
00185 table_size = 12;
00186 else
00187 table_size = 10;
00188
00189 valid->glyph_count = glyph_count;
00190
00191 OTV_OPTIONAL_OFFSET( GlyphClassDef );
00192 OTV_SIZE_CHECK( GlyphClassDef );
00193 if ( GlyphClassDef )
00194 otv_ClassDef_validate( table + GlyphClassDef, valid );
00195
00196 OTV_OPTIONAL_OFFSET( AttachListOffset );
00197 OTV_SIZE_CHECK( AttachListOffset );
00198 if ( AttachListOffset )
00199 {
00200 OTV_NEST2( AttachList, AttachPoint );
00201 OTV_RUN( table + AttachListOffset, valid );
00202 }
00203
00204 OTV_OPTIONAL_OFFSET( LigCaretListOffset );
00205 OTV_SIZE_CHECK( LigCaretListOffset );
00206 if ( LigCaretListOffset )
00207 {
00208 OTV_NEST3( LigCaretList, LigGlyph, CaretValue );
00209 OTV_RUN( table + LigCaretListOffset, valid );
00210 }
00211
00212 if ( need_MarkAttachClassDef )
00213 {
00214 OTV_OPTIONAL_OFFSET( MarkAttachClassDef );
00215 OTV_SIZE_CHECK( MarkAttachClassDef );
00216 if ( MarkAttachClassDef )
00217 otv_ClassDef_validate( table + MarkAttachClassDef, valid );
00218 }
00219
00220 FT_TRACE4(( "\n" ));
00221 }
00222
00223
00224