* src/sfnt/sfobjs.c (sfnt_init_face): Check that format_tag is known
before loading the table directory. * src/sfnt/ttload.c (tt_face_load_sfnt_header, tt_face_load_directory): Delay sfnt_dir_check from tt_face_load_sfnt_header to tt_face_load_directory.
This commit is contained in:
parent
6f1eca0460
commit
d81947e429
|
@ -1,3 +1,12 @@
|
||||||
|
2005-11-21 Chia-I Wu <b90201047@ntu.edu.tw>
|
||||||
|
|
||||||
|
* src/sfnt/sfobjs.c (sfnt_init_face): Check that format_tag is known
|
||||||
|
before loading the table directory.
|
||||||
|
|
||||||
|
* src/sfnt/ttload.c (tt_face_load_sfnt_header,
|
||||||
|
tt_face_load_directory): Delay sfnt_dir_check from
|
||||||
|
tt_face_load_sfnt_header to tt_face_load_directory.
|
||||||
|
|
||||||
2005-11-20 Chia-I Wu <b90201047@ntu.edu.tw>
|
2005-11-20 Chia-I Wu <b90201047@ntu.edu.tw>
|
||||||
|
|
||||||
* src/sfnt/ttload.c (sfnt_dir_check): Clean up and return correct
|
* src/sfnt/ttload.c (sfnt_dir_check): Clean up and return correct
|
||||||
|
|
|
@ -376,6 +376,13 @@
|
||||||
if ( error )
|
if ( error )
|
||||||
goto Exit;
|
goto Exit;
|
||||||
|
|
||||||
|
if ( sfnt_header.format_tag != 0x00010000UL &&
|
||||||
|
sfnt_header.format_tag != TTAG_ttcf &&
|
||||||
|
sfnt_header.format_tag != FT_MAKE_TAG( 'O', 'T', 'T', 'O' ) &&
|
||||||
|
sfnt_header.format_tag != TTAG_true &&
|
||||||
|
sfnt_header.format_tag != 0x00020000UL )
|
||||||
|
return SFNT_Err_Unknown_File_Format;
|
||||||
|
|
||||||
face->format_tag = sfnt_header.format_tag;
|
face->format_tag = sfnt_header.format_tag;
|
||||||
face->num_tables = sfnt_header.num_tables;
|
face->num_tables = sfnt_header.num_tables;
|
||||||
|
|
||||||
|
|
|
@ -134,13 +134,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* In theory, we should check the values of `search_range', */
|
/* Here, we: */
|
||||||
/* `entry_selector', and `range_shift' to detect non-SFNT based files */
|
|
||||||
/* whose header might also start with 0x100000L (yes, these exist). */
|
|
||||||
/* */
|
|
||||||
/* Very unfortunately, many TrueType fonts don't have these fields */
|
|
||||||
/* set correctly and we must ignore them to support them. An */
|
|
||||||
/* alternative way to check the font file is thus to: */
|
|
||||||
/* */
|
/* */
|
||||||
/* - check that `num_tables' is valid */
|
/* - check that `num_tables' is valid */
|
||||||
/* - look for a "head" table, check its size, and parse it to */
|
/* - look for a "head" table, check its size, and parse it to */
|
||||||
|
@ -381,10 +375,12 @@
|
||||||
FT_STREAM_READ_FIELDS( sfnt_header_fields, sfnt ) )
|
FT_STREAM_READ_FIELDS( sfnt_header_fields, sfnt ) )
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
/* now check the sfnt directory */
|
/* many fonts don't have these fields set correctly */
|
||||||
error = sfnt_dir_check( sfnt, stream );
|
#if 0
|
||||||
if ( error )
|
if ( sfnt->search_range != 1 << ( sfnt->entry_selector + 4 ) ||
|
||||||
FT_TRACE2(( "tt_face_load_sfnt_header: invalid SFNT!\n" ));
|
sfnt->search_range + sfnt->range_shift != sfnt->num_tables << 4 )
|
||||||
|
return SFNT_Err_Unknown_File_Format;
|
||||||
|
#endif
|
||||||
|
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
@ -428,6 +424,14 @@
|
||||||
FT_TRACE2(( "-- Tables count: %12u\n", sfnt->num_tables ));
|
FT_TRACE2(( "-- Tables count: %12u\n", sfnt->num_tables ));
|
||||||
FT_TRACE2(( "-- Format version: %08lx\n", sfnt->format_tag ));
|
FT_TRACE2(( "-- Format version: %08lx\n", sfnt->format_tag ));
|
||||||
|
|
||||||
|
/* check first */
|
||||||
|
error = sfnt_dir_check( sfnt, stream );
|
||||||
|
if ( error ) {
|
||||||
|
FT_TRACE2(( "tt_face_load_directory: directory checking failed!\n" ));
|
||||||
|
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
face->num_tables = sfnt->num_tables;
|
face->num_tables = sfnt->num_tables;
|
||||||
|
|
||||||
if ( FT_QNEW_ARRAY( face->dir_tables, face->num_tables ) )
|
if ( FT_QNEW_ARRAY( face->dir_tables, face->num_tables ) )
|
||||||
|
|
Loading…
Reference in New Issue