ref: 38c4647427dd0fef1c78bbdba6608f7bb1fa271a
parent: ed3a7d7b0f77030530dbbaecf7b786853a693774
author: Werner Lemberg <[email protected]>
date: Mon Oct 13 01:58:54 EDT 2003
* src/type1/t1load.c (parse_font_matrix, parse_charstrings): Remove code specially for synthetic fonts; this is handled elsewhere. (parse_encoding): Remove code specially for synthetic fonts; this is handled elsewhere. Improve boundary checking while parsing. (parse_dict): Improve boundary checking while parsing. Use ft_memcmp to simplify code.
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2003-10-08 Werner Lemberg <[email protected]>
+
+ * src/type1/t1load.c (parse_font_matrix, parse_charstrings): Remove
+ code specially for synthetic fonts; this is handled elsewhere.
+ (parse_encoding): Remove code specially for synthetic fonts; this is
+ handled elsewhere.
+ Improve boundary checking while parsing.
+ (parse_dict): Improve boundary checking while parsing.
+ Use ft_memcmp to simplify code.
+
2003-10-07 Werner Lemberg <[email protected]>
* src/type1/t1load.c (parse_subrs, parse_dict): Handle synthetic
--- a/src/type1/t1load.c
+++ b/src/type1/t1load.c
@@ -772,9 +772,9 @@
static int
is_space( FT_Byte c )
{
- return ( c == ' ' || c == '\t' ||
+ return ( c == ' ' || c == '\t' ||
c == '\r' || c == '\n' || c == '\f' ||
- c == '\0' );
+ c == '\0' );
}
@@ -831,10 +831,6 @@
FT_Fixed temp_scale;
- if ( matrix->xx || matrix->yx )
- /* with synthetic fonts it is possible we get here twice */
- return;
-
(void)T1_ToFixedArray( parser, 6, temp, 3 );
temp_scale = ABS( temp[3] );
@@ -863,8 +859,8 @@
matrix->yy = temp[3];
/* note that the offsets must be expressed in integer font units */
- offset->x = temp[4] >> 16;
- offset->y = temp[5] >> 16;
+ offset->x = temp[4] >> 16;
+ offset->y = temp[5] >> 16;
}
@@ -899,10 +895,6 @@
FT_Error error;
- if ( encode->char_index )
- /* with synthetic fonts it is possible we get here twice */
- return;
-
/* read the number of entries in the encoding; should be 256 */
count = (FT_Int)T1_ToInt( parser );
T1_Skip_Spaces( parser );
@@ -941,10 +933,10 @@
/* used to clean the encoding array before anything else. */
n = 0;
+ T1_Skip_Spaces( parser );
while ( parser->root.cursor < limit )
{
- T1_Skip_Spaces( parser );
cur = parser->root.cursor;
/* we stop when we encounter a `def' */
@@ -991,6 +983,8 @@
}
else
T1_Skip_PS_Token( parser );
+
+ T1_Skip_Spaces( parser );
}
face->type1.encoding_type = T1_ENCODING_TYPE_ARRAY;
@@ -1044,7 +1038,7 @@
T1_Skip_PS_Token( parser );
T1_Skip_Spaces ( parser );
if ( parser->root.cursor >= parser->root.limit ||
- *parser->root.cursor != ']' )
+ *parser->root.cursor != ']' )
parser->root.error = T1_Err_Invalid_File_Format;
return;
}
@@ -1161,10 +1155,6 @@
FT_Byte notdef_found = 0;
- if ( loader->num_glyphs )
- /* with synthetic fonts it is possible we get here twice */
- return;
-
loader->num_glyphs = (FT_Int)T1_ToInt( parser );
if ( parser->root.error )
return;
@@ -1187,7 +1177,6 @@
/* index 0 names and codes (if necessary). */
error = psaux->ps_table_funcs->init( swap_table, 4, memory );
-
if ( error )
goto Fail;
@@ -1458,15 +1447,16 @@
limit = parser->root.limit;
+ T1_Skip_Spaces( parser );
+
while ( parser->root.cursor < limit )
{
FT_Byte* cur;
- T1_Skip_Spaces( parser );
cur = parser->root.cursor;
- /* look for `FontDirectory', which causes problems for some fonts */
+ /* look for `FontDirectory' which causes problems for some fonts */
if ( *cur == 'F' && cur + 25 < limit &&
ft_strncmp( (char*)cur, "FontDirectory", 13 ) == 0 )
{
@@ -1524,7 +1514,7 @@
len = parser->root.cursor - cur;
- if ( len > 0 && len < 22 )
+ if ( len > 0 && len < 22 && parser->root.cursor < limit )
{
/* now compare the immediate name to the keyword table */
T1_Field keyword = (T1_Field)t1_keywords;
@@ -1543,35 +1533,27 @@
break;
}
- if ( cur[0] == name[0] &&
- len == ft_strlen( (const char*)name ) )
+ if ( cur[0] == name[0] &&
+ len == ft_strlen( (const char *)name ) &&
+ ft_memcmp( cur, name, len ) == 0 )
{
- FT_PtrDist n;
-
-
- for ( n = 1; n < len; n++ )
- if ( cur[n] != name[n] )
- break;
-
- if ( n >= len )
+ /* We found it -- run the parsing callback! */
+ /* We only record the first instance of any */
+ /* field to deal adequately with synthetic */
+ /* fonts; /Subrs is handled specially. */
+ if ( keyword_flag[0] == 0 ||
+ ft_strcmp( (const char*)name, "Subrs" ) == 0 )
{
- /* We found it -- run the parsing callback! */
- /* We only record the first instance of any */
- /* field to deal adequately with synthetic */
- /* fonts; /Subrs is handled specially. */
- if ( keyword_flag[0] == 0 ||
- ft_strcmp( (const char*)name, "Subrs" ) == 0 )
- {
- parser->root.error = t1_load_keyword( face,
- loader,
- keyword );
- if ( parser->root.error )
- return parser->root.error;
- }
- keyword_flag[0] = 1;
- break;
+ parser->root.error = t1_load_keyword( face,
+ loader,
+ keyword );
+ if ( parser->root.error )
+ return parser->root.error;
}
+ keyword_flag[0] = 1;
+ break;
}
+
keyword++;
keyword_flag++;
}
@@ -1579,7 +1561,10 @@
}
else
T1_Skip_PS_Token( parser );
+
+ T1_Skip_Spaces( parser );
}
+
return parser->root.error;
}