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 #include "gxvalid.h"
00028 #include "gxvcommn.h"
00029
00030
00031
00032
00033
00034
00035
00036
00037 #undef FT_COMPONENT
00038 #define FT_COMPONENT trace_gxvbsln
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049 #define GXV_BSLN_VALUE_COUNT 32
00050 #define GXV_BSLN_VALUE_EMPTY 0xFFFFU
00051
00052
00053 typedef struct GXV_bsln_DataRec_
00054 {
00055 FT_Bytes ctlPoints_p;
00056 FT_UShort defaultBaseline;
00057
00058 } GXV_bsln_DataRec, *GXV_bsln_Data;
00059
00060
00061 #define GXV_BSLN_DATA( field ) GXV_TABLE_DATA( bsln, field )
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072 static void
00073 gxv_bsln_LookupValue_validate( FT_UShort glyph,
00074 GXV_LookupValueCPtr value_p,
00075 GXV_Validator valid )
00076 {
00077 FT_UShort v = value_p->u;
00078 FT_UShort* ctlPoints;
00079
00080 FT_UNUSED( glyph );
00081
00082
00083 GXV_NAME_ENTER( "lookup value" );
00084
00085 if ( v >= GXV_BSLN_VALUE_COUNT )
00086 FT_INVALID_DATA;
00087
00088 ctlPoints = (FT_UShort*)GXV_BSLN_DATA( ctlPoints_p );
00089 if ( ctlPoints && ctlPoints[v] == GXV_BSLN_VALUE_EMPTY )
00090 FT_INVALID_DATA;
00091
00092 GXV_EXIT;
00093 }
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123 static GXV_LookupValueDesc
00124 gxv_bsln_LookupFmt4_transit( FT_UShort relative_gindex,
00125 GXV_LookupValueCPtr base_value_p,
00126 FT_Bytes lookuptbl_limit,
00127 GXV_Validator valid )
00128 {
00129 FT_Bytes p;
00130 FT_Bytes limit;
00131 FT_UShort offset;
00132 GXV_LookupValueDesc value;
00133
00134
00135 offset = (FT_UShort)( base_value_p->u +
00136 ( relative_gindex * sizeof ( FT_UShort ) ) );
00137
00138 p = valid->lookuptbl_head + offset;
00139 limit = lookuptbl_limit;
00140 GXV_LIMIT_CHECK( 2 );
00141
00142 value.u = FT_NEXT_USHORT( p );
00143
00144 return value;
00145 }
00146
00147
00148 static void
00149 gxv_bsln_parts_fmt0_validate( FT_Bytes tables,
00150 FT_Bytes limit,
00151 GXV_Validator valid )
00152 {
00153 FT_Bytes p = tables;
00154
00155
00156 GXV_NAME_ENTER( "parts format 0" );
00157
00158
00159 GXV_LIMIT_CHECK( 2 * GXV_BSLN_VALUE_COUNT );
00160
00161 valid->table_data = NULL;
00162
00163 GXV_EXIT;
00164 }
00165
00166
00167 static void
00168 gxv_bsln_parts_fmt1_validate( FT_Bytes tables,
00169 FT_Bytes limit,
00170 GXV_Validator valid )
00171 {
00172 FT_Bytes p = tables;
00173
00174
00175 GXV_NAME_ENTER( "parts format 1" );
00176
00177
00178 gxv_bsln_parts_fmt0_validate( p, limit, valid );
00179
00180
00181 valid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED;
00182 valid->lookupval_func = gxv_bsln_LookupValue_validate;
00183 valid->lookupfmt4_trans = gxv_bsln_LookupFmt4_transit;
00184 gxv_LookupTable_validate( p + 2 * GXV_BSLN_VALUE_COUNT,
00185 limit,
00186 valid );
00187
00188 GXV_EXIT;
00189 }
00190
00191
00192 static void
00193 gxv_bsln_parts_fmt2_validate( FT_Bytes tables,
00194 FT_Bytes limit,
00195 GXV_Validator valid )
00196 {
00197 FT_Bytes p = tables;
00198
00199 FT_UShort stdGlyph;
00200 FT_UShort ctlPoint;
00201 FT_Int i;
00202
00203 FT_UShort defaultBaseline = GXV_BSLN_DATA( defaultBaseline );
00204
00205
00206 GXV_NAME_ENTER( "parts format 2" );
00207
00208 GXV_LIMIT_CHECK( 2 + ( 2 * GXV_BSLN_VALUE_COUNT ) );
00209
00210
00211 stdGlyph = FT_NEXT_USHORT( p );
00212 GXV_TRACE(( " (stdGlyph = %u)\n", stdGlyph ));
00213
00214 gxv_glyphid_validate( stdGlyph, valid );
00215
00216
00217 GXV_BSLN_DATA( ctlPoints_p ) = p;
00218
00219
00220 for ( i = 0; i < GXV_BSLN_VALUE_COUNT; i++ )
00221 {
00222 ctlPoint = FT_NEXT_USHORT( p );
00223 if ( ctlPoint == GXV_BSLN_VALUE_EMPTY )
00224 {
00225 if ( i == defaultBaseline )
00226 FT_INVALID_DATA;
00227 }
00228 else
00229 gxv_ctlPoint_validate( stdGlyph, (FT_Short)ctlPoint, valid );
00230 }
00231
00232 GXV_EXIT;
00233 }
00234
00235
00236 static void
00237 gxv_bsln_parts_fmt3_validate( FT_Bytes tables,
00238 FT_Bytes limit,
00239 GXV_Validator valid)
00240 {
00241 FT_Bytes p = tables;
00242
00243
00244 GXV_NAME_ENTER( "parts format 3" );
00245
00246
00247 gxv_bsln_parts_fmt2_validate( p, limit, valid );
00248
00249
00250 valid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED;
00251 valid->lookupval_func = gxv_bsln_LookupValue_validate;
00252 valid->lookupfmt4_trans = gxv_bsln_LookupFmt4_transit;
00253 gxv_LookupTable_validate( p + ( 2 + 2 * GXV_BSLN_VALUE_COUNT ),
00254 limit,
00255 valid );
00256
00257 GXV_EXIT;
00258 }
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269 FT_LOCAL_DEF( void )
00270 gxv_bsln_validate( FT_Bytes table,
00271 FT_Face face,
00272 FT_Validator ftvalid )
00273 {
00274 GXV_ValidatorRec validrec;
00275 GXV_Validator valid = &validrec;
00276
00277 GXV_bsln_DataRec bslnrec;
00278 GXV_bsln_Data bsln = &bslnrec;
00279
00280 FT_Bytes p = table;
00281 FT_Bytes limit = 0;
00282
00283 FT_ULong version;
00284 FT_UShort format;
00285 FT_UShort defaultBaseline;
00286
00287 GXV_Validate_Func fmt_funcs_table [] =
00288 {
00289 gxv_bsln_parts_fmt0_validate,
00290 gxv_bsln_parts_fmt1_validate,
00291 gxv_bsln_parts_fmt2_validate,
00292 gxv_bsln_parts_fmt3_validate,
00293 };
00294
00295
00296 valid->root = ftvalid;
00297 valid->table_data = bsln;
00298 valid->face = face;
00299
00300 FT_TRACE3(( "validating `bsln' table\n" ));
00301 GXV_INIT;
00302
00303
00304 GXV_LIMIT_CHECK( 4 + 2 + 2 );
00305 version = FT_NEXT_ULONG( p );
00306 format = FT_NEXT_USHORT( p );
00307 defaultBaseline = FT_NEXT_USHORT( p );
00308
00309
00310 if ( version != 0x00010000UL )
00311 FT_INVALID_FORMAT;
00312
00313
00314 GXV_TRACE(( " (format = %d)\n", format ));
00315 if ( format > 3 )
00316 FT_INVALID_FORMAT;
00317
00318 if ( defaultBaseline > 31 )
00319 FT_INVALID_FORMAT;
00320
00321 bsln->defaultBaseline = defaultBaseline;
00322
00323 fmt_funcs_table[format]( p, limit, valid );
00324
00325 FT_TRACE4(( "\n" ));
00326 }
00327
00328
00329
00330
00331
00332
00333