39#define FT_COMPONENT gxvmort
42 static const char* GXV_Mort_IndicScript_Msg[] =
65 gxv_mort_subtable_type0_entry_validate(
68 GXV_StateTable_GlyphOffsetCPtr glyphOffset_p,
71 GXV_Validator gxvalid )
74 FT_UShort dontAdvance;
83 FT_UNUSED( GXV_Mort_IndicScript_Msg[verb] );
84 FT_UNUSED( glyphOffset_p );
87 markFirst = (FT_UShort)( ( flags >> 15 ) & 1 );
88 dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1 );
89 markLast = (FT_UShort)( ( flags >> 13 ) & 1 );
91 reserved = (FT_UShort)( flags & 0x1FF0 );
92 verb = (FT_UShort)( flags & 0x000F );
94 GXV_TRACE((
" IndicScript MorphRule for glyphOffset 0x%04x",
96 GXV_TRACE((
" markFirst=%01d", markFirst ));
97 GXV_TRACE((
" dontAdvance=%01d", dontAdvance ));
98 GXV_TRACE((
" markLast=%01d", markLast ));
99 GXV_TRACE((
" %02d", verb ));
100 GXV_TRACE((
" %s\n", GXV_Mort_IndicScript_Msg[verb] ));
102 if ( markFirst > 0 && markLast > 0 )
104 GXV_TRACE((
" [odd] a glyph is marked as the first and last"
105 " in Indic rearrangement\n" ));
106 GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );
109 if ( markFirst > 0 && dontAdvance > 0 )
111 GXV_TRACE((
" [odd] the first glyph is marked as dontAdvance"
112 " in Indic rearrangement\n" ));
113 GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );
118 GXV_TRACE((
" non-zero bits found in reserved range\n" ));
119 GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );
127 gxv_mort_subtable_type0_validate( FT_Bytes table,
129 GXV_Validator gxvalid )
135 "mort chain subtable type0 (Indic-Script Rearrangement)" );
137 GXV_LIMIT_CHECK( GXV_STATETABLE_HEADER_SIZE );
139 gxvalid->statetable.optdata = NULL;
140 gxvalid->statetable.optdata_load_func = NULL;
141 gxvalid->statetable.subtable_setup_func = NULL;
142 gxvalid->statetable.entry_glyphoffset_fmt = GXV_GLYPHOFFSET_NONE;
143 gxvalid->statetable.entry_validate_func =
144 gxv_mort_subtable_type0_entry_validate;
146 gxv_StateTable_validate( p, limit, gxvalid );