00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include "gxvmort.h"
00029
00030
00031
00032
00033
00034
00035
00036
00037 #undef FT_COMPONENT
00038 #define FT_COMPONENT trace_gxvmort
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049 typedef struct GXV_mort_subtable_type5_StateOptRec_
00050 {
00051 FT_UShort classTable;
00052 FT_UShort stateArray;
00053 FT_UShort entryTable;
00054
00055 #define GXV_MORT_SUBTABLE_TYPE5_HEADER_SIZE GXV_STATETABLE_HEADER_SIZE
00056
00057 FT_UShort* classTable_length_p;
00058 FT_UShort* stateArray_length_p;
00059 FT_UShort* entryTable_length_p;
00060
00061 } GXV_mort_subtable_type5_StateOptRec,
00062 *GXV_mort_subtable_type5_StateOptRecData;
00063
00064
00065 FT_LOCAL_DEF( void )
00066 gxv_mort_subtable_type5_subtable_setup( FT_UShort table_size,
00067 FT_UShort classTable,
00068 FT_UShort stateArray,
00069 FT_UShort entryTable,
00070 FT_UShort* classTable_length_p,
00071 FT_UShort* stateArray_length_p,
00072 FT_UShort* entryTable_length_p,
00073 GXV_Validator valid )
00074 {
00075 GXV_mort_subtable_type5_StateOptRecData optdata =
00076 (GXV_mort_subtable_type5_StateOptRecData)valid->statetable.optdata;
00077
00078
00079 gxv_StateTable_subtable_setup( table_size,
00080 classTable,
00081 stateArray,
00082 entryTable,
00083 classTable_length_p,
00084 stateArray_length_p,
00085 entryTable_length_p,
00086 valid );
00087
00088 optdata->classTable = classTable;
00089 optdata->stateArray = stateArray;
00090 optdata->entryTable = entryTable;
00091
00092 optdata->classTable_length_p = classTable_length_p;
00093 optdata->stateArray_length_p = stateArray_length_p;
00094 optdata->entryTable_length_p = entryTable_length_p;
00095 }
00096
00097
00098 static void
00099 gxv_mort_subtable_type5_InsertList_validate( FT_UShort offset,
00100 FT_UShort count,
00101 FT_Bytes table,
00102 FT_Bytes limit,
00103 GXV_Validator valid )
00104 {
00105
00106
00107
00108
00109 FT_Bytes p = table + offset;
00110
00111 GXV_mort_subtable_type5_StateOptRecData optdata =
00112 (GXV_mort_subtable_type5_StateOptRecData)valid->statetable.optdata;
00113
00114 if ( optdata->classTable < offset &&
00115 offset < optdata->classTable + *(optdata->classTable_length_p) )
00116 GXV_TRACE(( " offset runs into ClassTable" ));
00117 if ( optdata->stateArray < offset &&
00118 offset < optdata->stateArray + *(optdata->stateArray_length_p) )
00119 GXV_TRACE(( " offset runs into StateArray" ));
00120 if ( optdata->entryTable < offset &&
00121 offset < optdata->entryTable + *(optdata->entryTable_length_p) )
00122 GXV_TRACE(( " offset runs into EntryTable" ));
00123
00124 while ( p < table + offset + ( count * 2 ) )
00125 {
00126 FT_UShort insert_glyphID;
00127
00128
00129 GXV_LIMIT_CHECK( 2 );
00130 insert_glyphID = FT_NEXT_USHORT( p );
00131 GXV_TRACE(( " 0x%04x", insert_glyphID ));
00132 }
00133
00134 GXV_TRACE(( "\n" ));
00135 }
00136
00137
00138 static void
00139 gxv_mort_subtable_type5_entry_validate(
00140 FT_Byte state,
00141 FT_UShort flags,
00142 GXV_StateTable_GlyphOffsetCPtr glyphOffset,
00143 FT_Bytes table,
00144 FT_Bytes limit,
00145 GXV_Validator valid )
00146 {
00147 FT_Bool setMark;
00148 FT_Bool dontAdvance;
00149 FT_Bool currentIsKashidaLike;
00150 FT_Bool markedIsKashidaLike;
00151 FT_Bool currentInsertBefore;
00152 FT_Bool markedInsertBefore;
00153 FT_Byte currentInsertCount;
00154 FT_Byte markedInsertCount;
00155 FT_UShort currentInsertList;
00156 FT_UShort markedInsertList;
00157
00158 FT_UNUSED( state );
00159
00160
00161 setMark = FT_BOOL( ( flags >> 15 ) & 1 );
00162 dontAdvance = FT_BOOL( ( flags >> 14 ) & 1 );
00163 currentIsKashidaLike = FT_BOOL( ( flags >> 13 ) & 1 );
00164 markedIsKashidaLike = FT_BOOL( ( flags >> 12 ) & 1 );
00165 currentInsertBefore = FT_BOOL( ( flags >> 11 ) & 1 );
00166 markedInsertBefore = FT_BOOL( ( flags >> 10 ) & 1 );
00167
00168 currentInsertCount = (FT_Byte)( ( flags >> 5 ) & 0x1F );
00169 markedInsertCount = (FT_Byte)( flags & 0x001F );
00170
00171 currentInsertList = (FT_UShort)( glyphOffset->ul >> 16 );
00172 markedInsertList = (FT_UShort)( glyphOffset->ul );
00173
00174 if ( 0 != currentInsertList && 0 != currentInsertCount )
00175 {
00176 gxv_mort_subtable_type5_InsertList_validate( currentInsertList,
00177 currentInsertCount,
00178 table,
00179 limit,
00180 valid );
00181 }
00182
00183 if ( 0 != markedInsertList && 0 != markedInsertCount )
00184 {
00185 gxv_mort_subtable_type5_InsertList_validate( markedInsertList,
00186 markedInsertCount,
00187 table,
00188 limit,
00189 valid );
00190 }
00191 }
00192
00193
00194 FT_LOCAL_DEF( void )
00195 gxv_mort_subtable_type5_validate( FT_Bytes table,
00196 FT_Bytes limit,
00197 GXV_Validator valid )
00198 {
00199 FT_Bytes p = table;
00200
00201 GXV_mort_subtable_type5_StateOptRec et_rec;
00202 GXV_mort_subtable_type5_StateOptRecData et = &et_rec;
00203
00204
00205 GXV_NAME_ENTER( "mort chain subtable type5 (Glyph Insertion)" );
00206
00207 GXV_LIMIT_CHECK( GXV_MORT_SUBTABLE_TYPE5_HEADER_SIZE );
00208
00209 valid->statetable.optdata =
00210 et;
00211 valid->statetable.optdata_load_func =
00212 NULL;
00213 valid->statetable.subtable_setup_func =
00214 gxv_mort_subtable_type5_subtable_setup;
00215 valid->statetable.entry_glyphoffset_fmt =
00216 GXV_GLYPHOFFSET_ULONG;
00217 valid->statetable.entry_validate_func =
00218 gxv_mort_subtable_type5_entry_validate;
00219
00220 gxv_StateTable_validate( p, limit, valid );
00221
00222 GXV_EXIT;
00223 }
00224
00225
00226