39#define FT_COMPONENT gxvbsln
50#define GXV_BSLN_VALUE_COUNT 32
51#define GXV_BSLN_VALUE_EMPTY 0xFFFFU
57 FT_UShort defaultBaseline;
59 } GXV_bsln_DataRec, *GXV_bsln_Data;
62#define GXV_BSLN_DATA( field ) GXV_TABLE_DATA( bsln, field )
74 gxv_bsln_LookupValue_validate( FT_UShort glyph,
75 GXV_LookupValueCPtr value_p,
76 GXV_Validator gxvalid )
78 FT_UShort v = value_p->u;
84 GXV_NAME_ENTER(
"lookup value" );
86 if ( v >= GXV_BSLN_VALUE_COUNT )
89 ctlPoints = (FT_UShort*)GXV_BSLN_DATA( ctlPoints_p );
90 if ( ctlPoints && ctlPoints[v] == GXV_BSLN_VALUE_EMPTY )
124 static GXV_LookupValueDesc
125 gxv_bsln_LookupFmt4_transit( FT_UShort relative_gindex,
126 GXV_LookupValueCPtr base_value_p,
127 FT_Bytes lookuptbl_limit,
128 GXV_Validator gxvalid )
133 GXV_LookupValueDesc value;
136 offset = (FT_UShort)( base_value_p->u +
137 ( relative_gindex * sizeof ( FT_UShort ) ) );
139 p = gxvalid->lookuptbl_head + offset;
140 limit = lookuptbl_limit;
141 GXV_LIMIT_CHECK( 2 );
143 value.u = FT_NEXT_USHORT( p );
150 gxv_bsln_parts_fmt0_validate( FT_Bytes tables,
152 GXV_Validator gxvalid )
157 GXV_NAME_ENTER(
"parts format 0" );
160 GXV_LIMIT_CHECK( 2 * GXV_BSLN_VALUE_COUNT );
162 gxvalid->table_data = NULL;
169 gxv_bsln_parts_fmt1_validate( FT_Bytes tables,
171 GXV_Validator gxvalid )
176 GXV_NAME_ENTER(
"parts format 1" );
179 gxv_bsln_parts_fmt0_validate( p, limit, gxvalid );
182 gxvalid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED;
183 gxvalid->lookupval_func = gxv_bsln_LookupValue_validate;
184 gxvalid->lookupfmt4_trans = gxv_bsln_LookupFmt4_transit;
185 gxv_LookupTable_validate( p + 2 * GXV_BSLN_VALUE_COUNT,
194 gxv_bsln_parts_fmt2_validate( FT_Bytes tables,
196 GXV_Validator gxvalid )
204 FT_UShort defaultBaseline = GXV_BSLN_DATA( defaultBaseline );
207 GXV_NAME_ENTER(
"parts format 2" );
209 GXV_LIMIT_CHECK( 2 + ( 2 * GXV_BSLN_VALUE_COUNT ) );
212 stdGlyph = FT_NEXT_USHORT( p );
213 GXV_TRACE((
" (stdGlyph = %u)\n", stdGlyph ));
215 gxv_glyphid_validate( stdGlyph, gxvalid );
218 GXV_BSLN_DATA( ctlPoints_p ) = p;
221 for ( i = 0; i < GXV_BSLN_VALUE_COUNT; i++ )
223 ctlPoint = FT_NEXT_USHORT( p );
224 if ( ctlPoint == GXV_BSLN_VALUE_EMPTY )
226 if ( i == defaultBaseline )
230 gxv_ctlPoint_validate( stdGlyph, ctlPoint, gxvalid );
238 gxv_bsln_parts_fmt3_validate( FT_Bytes tables,
240 GXV_Validator gxvalid)
245 GXV_NAME_ENTER(
"parts format 3" );
248 gxv_bsln_parts_fmt2_validate( p, limit, gxvalid );
251 gxvalid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED;
252 gxvalid->lookupval_func = gxv_bsln_LookupValue_validate;
253 gxvalid->lookupfmt4_trans = gxv_bsln_LookupFmt4_transit;
254 gxv_LookupTable_validate( p + ( 2 + 2 * GXV_BSLN_VALUE_COUNT ),
271 gxv_bsln_validate( FT_Bytes table,
273 FT_Validator ftvalid )
275 GXV_ValidatorRec gxvalidrec;
276 GXV_Validator gxvalid = &gxvalidrec;
278 GXV_bsln_DataRec bslnrec;
279 GXV_bsln_Data bsln = &bslnrec;
286 FT_UShort defaultBaseline;
288 GXV_Validate_Func fmt_funcs_table [] =
290 gxv_bsln_parts_fmt0_validate,
291 gxv_bsln_parts_fmt1_validate,
292 gxv_bsln_parts_fmt2_validate,
293 gxv_bsln_parts_fmt3_validate,
297 gxvalid->root = ftvalid;
298 gxvalid->table_data = bsln;
299 gxvalid->face = face;
301 FT_TRACE3((
"validating `bsln' table\n" ));
305 GXV_LIMIT_CHECK( 4 + 2 + 2 );
306 version = FT_NEXT_ULONG( p );
307 format = FT_NEXT_USHORT( p );
308 defaultBaseline = FT_NEXT_USHORT( p );
311 if ( version != 0x00010000UL )
315 GXV_TRACE((
" (format = %d)\n", format ));
319 if ( defaultBaseline > 31 )
322 bsln->defaultBaseline = defaultBaseline;
324 fmt_funcs_table[format]( p, limit, gxvalid );