ref: b8004d2e884fe0315a0bf072964356a126a5a016
parent: e6b6f3733ebf4b7f95eb56180f79dbacd21c8d50
author: Werner Lemberg <[email protected]>
date: Sun Jan 7 04:13:38 EST 2007
* src/cid/cidparse.c (cid_parser_new): Improve error message for Type 11 fonts. Scan for `/sfnts' token.
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,7 +1,12 @@
2007-01-07 Werner Lemberg <[email protected]>
- * src/cid/cidparse.c (cid_parser_new): Reject Type 42 CID-keyed
- fonts.
+ * src/cid/cidparse.c (cid_parser_new): Improve error message for
+ Type 11 fonts.
+ Scan for `/sfnts' token.
+
+2007-01-07 Werner Lemberg <[email protected]>
+
+ * src/cid/cidparse.c (cid_parser_new): Reject Type 11 fonts.
2007-01-06 Werner Lemberg <[email protected]>
--- a/src/cid/cidparse.c
+++ b/src/cid/cidparse.c
@@ -83,7 +83,8 @@
goto Exit;
Again:
- /* now, read the rest of the file until we find a `StartData' */
+ /* now, read the rest of the file until we find */
+ /* `StartData' or `/sfnts' */
{
FT_Byte buffer[256 + 10];
FT_Int read_len = 256 + 10;
@@ -92,7 +93,7 @@
for ( offset = (FT_ULong)FT_STREAM_POS(); ; offset += 256 )
{
- FT_Int stream_len;
+ FT_Int stream_len;
stream_len = stream->size - FT_STREAM_POS();
@@ -116,6 +117,11 @@
offset += p - buffer + 10;
goto Found;
}
+ else if ( p[1] == 's' && ft_strncmp( (char*)p, "/sfnts", 6 ) == 0 )
+ {
+ offset += p - buffer + 7;
+ goto Found;
+ }
}
FT_MEM_MOVE( buffer, p, 10 );
@@ -125,8 +131,9 @@
}
Found:
- /* We have found the start of the binary data. Now rewind and */
- /* extract the frame corresponding to the PostScript section. */
+ /* We have found the start of the binary data or the `/sfnts' token. */
+ /* Now rewind and extract the frame corresponding to this PostScript */
+ /* section. */
ps_len = offset - base_offset;
if ( FT_STREAM_SEEK( base_offset ) ||
@@ -140,9 +147,10 @@
parser->root.limit = parser->root.cursor + ps_len;
parser->num_dict = -1;
- /* Finally, we check whether `StartData' was real -- it could be */
- /* in a comment or string. We also get its arguments to find out */
- /* whether the data is represented in binary or hex format. */
+ /* Finally, we check whether `StartData' or `/sfnts' was real -- */
+ /* it could be in a comment or string. We also get the arguments */
+ /* of `StartData' to find out whether the data is represented in */
+ /* binary or hex format. */
arg1 = parser->root.cursor;
cid_parser_skip_PS_token( parser );
@@ -159,7 +167,7 @@
if ( parser->root.error )
break;
- if ( *cur == 'S' && ft_strncmp( (char*)cur, "StartData", 9 ) == 0 )
+ if ( cur[0] == 'S' && ft_strncmp( (char*)cur, "StartData", 9 ) == 0 )
{
if ( ft_strncmp( (char*)arg1, "(Hex)", 5 ) == 0 )
parser->binary_length = ft_atol( (const char *)arg2 );
@@ -168,6 +176,12 @@
cur = parser->root.cursor;
goto Exit;
}
+ else if ( cur[1] == 's' && ft_strncmp( (char*)cur, "/sfnts", 6 ) == 0 )
+ {
+ FT_TRACE2(( "cid_parser_new: cannot handle Type 11 fonts\n" ));
+ error = CID_Err_Unknown_File_Format;
+ goto Exit;
+ }
cid_parser_skip_PS_token( parser );
cid_parser_skip_spaces ( parser );
@@ -183,11 +197,6 @@
goto Again;
Exit:
- if ( !parser->postscript )
- {
- FT_TRACE2(( "[not a valid CID-keyed font]\n" ));
- error = CID_Err_Unknown_File_Format;
- }
return error;
}