ref: 64f1ba90642db6578abe8a6dd338b176533224f6
parent: f9d864a916becf67e6ae0e3f0888fda3a89d419e
author: Werner Lemberg <[email protected]>
date: Fri Jul 25 18:09:53 EDT 2003
Make reference valid HTML 4.01 transitional. * src/tools/docmaker/tohtml.py (html_header_1): Add doctype and charset. (html_header_2): Fix style elements and add some more. Fix syntax. (block_header, block_footer, description_header, description_footer, marker_header, marker_footer, source_header, source_footer, chapter_header, chapter_footer): Don't use <center>...</center> but `align=center' table attribute. Use double quotes around table widths given in percent. (keyword_prefix, keyword_suffix): Don't change font colour directly but use a new <span> class. (section_synopsis_header, section_synopsis_footer): Don't change colour. (print_html_field): <tr> gets the `valign' attribute, not <table>. (print_html_field_list): Ditto. (index_exit): Don't use <center>...</center> but `align=center' table attribute. (toc_exit, section_enter): Ditto. (block_enter): Use <h4><a>, not <a><h4>. This change reimplements fix from 2003-05-30 without breaking binary compatibility. * include/freetype/t1tables.h (PS_FontInfoRec): `italic_angle', `is_fixed_pitch', `underline_position', `underline_thickness' are reverted to be normal values. * include/freetype/internal/psaux.h (T1_FieldType): Remove `T1_FIELD_TYPE_BOOL_P', `T1_FIELD_TYPE_INTEGER_P', `T1_FIELD_TYPE_FIXED_P', `T1_FIELD_TYPE_FIXED_1000_P'. (T1_FIELD_TYPE_BOOL_P, T1_FIELD_NUM_P, T1_FIELD_FIXED_P, T1_FIELD_FIXED_1000_P): Removed. (T1_FIELD_TYPE_BOOL): Renamed to... (T1_FIELD_BOOL): New macro. Updated all callers. * src/type42/t42parse.c: `italic_angle', `is_fixed_pitch', `underline_position', `underline_thickness', `paint_type', `stroke_width' are reverted to be normal values. (T42_KEYWORD_COUNT): New macro. (t42_parse_dict): New array `keyword_flags' to mark that a value has already been assigned to a dictionary entry. * src/type42/t42objs.c (T42_Face_Init, T42_Face_Done): Updated. * src/cid/cidtoken.h: `italic_angle', `is_fixed_pitch', `underline_position', `underline_thickness' are reverted to be normal values. * src/cid/cidobjs.c (cid_face_done, cid_face_init): Updated. * src/psaux/psobjs.c (ps_parser_load_field): Updated. * src/type1/t1tokens.h: `italic_angle', `is_fixed_pitch', `underline_position', `underline_thickness', `paint_type', `stroke_width' are reverted to be normal values. * src/type1/t1objs.c (T1_Face_Done, T1_Face_Init): Updated. * src/type1/t1load.c (T1_FIELD_COUNT): New macro. (parse_dict): Add parameter for keyword flags. Record only first instance of a field. (T1_Open_Face): New array `keyword_flags'.
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,68 @@
+2003-07-25 Werner Lemberg <[email protected]>
+
+ Make reference valid HTML 4.01 transitional.
+
+ * src/tools/docmaker/tohtml.py (html_header_1): Add doctype
+ and charset.
+ (html_header_2): Fix style elements and add some more.
+ Fix syntax.
+ (block_header, block_footer, description_header, description_footer,
+ marker_header, marker_footer, source_header, source_footer,
+ chapter_header, chapter_footer): Don't use <center>...</center> but
+ `align=center' table attribute.
+ Use double quotes around table widths given in percent.
+ (keyword_prefix, keyword_suffix): Don't change font colour directly
+ but use a new <span> class.
+ (section_synopsis_header, section_synopsis_footer): Don't change
+ colour.
+ (print_html_field): <tr> gets the `valign' attribute, not <table>.
+ (print_html_field_list): Ditto.
+ (index_exit): Don't use <center>...</center> but `align=center'
+ table attribute.
+ (toc_exit, section_enter): Ditto.
+ (block_enter): Use <h4><a>, not <a><h4>.
+
+2003-07-25 David Turner <[email protected]>
+
+ This change reimplements fix from 2003-05-30 without breaking
+ binary compatibility.
+
+ * include/freetype/t1tables.h (PS_FontInfoRec): `italic_angle',
+ `is_fixed_pitch', `underline_position', `underline_thickness' are
+ reverted to be normal values.
+
+ * include/freetype/internal/psaux.h (T1_FieldType): Remove
+ `T1_FIELD_TYPE_BOOL_P', `T1_FIELD_TYPE_INTEGER_P',
+ `T1_FIELD_TYPE_FIXED_P', `T1_FIELD_TYPE_FIXED_1000_P'.
+ (T1_FIELD_TYPE_BOOL_P, T1_FIELD_NUM_P, T1_FIELD_FIXED_P,
+ T1_FIELD_FIXED_1000_P): Removed.
+ (T1_FIELD_TYPE_BOOL): Renamed to...
+ (T1_FIELD_BOOL): New macro. Updated all callers.
+
+ * src/type42/t42parse.c: `italic_angle', `is_fixed_pitch',
+ `underline_position', `underline_thickness', `paint_type',
+ `stroke_width' are reverted to be normal values.
+ (T42_KEYWORD_COUNT): New macro.
+ (t42_parse_dict): New array `keyword_flags' to mark that a value has
+ already been assigned to a dictionary entry.
+ * src/type42/t42objs.c (T42_Face_Init, T42_Face_Done): Updated.
+
+ * src/cid/cidtoken.h: `italic_angle', `is_fixed_pitch',
+ `underline_position', `underline_thickness' are reverted to be
+ normal values.
+ * src/cid/cidobjs.c (cid_face_done, cid_face_init): Updated.
+
+ * src/psaux/psobjs.c (ps_parser_load_field): Updated.
+
+ * src/type1/t1tokens.h: `italic_angle', `is_fixed_pitch',
+ `underline_position', `underline_thickness', `paint_type',
+ `stroke_width' are reverted to be normal values.
+ * src/type1/t1objs.c (T1_Face_Done, T1_Face_Init): Updated.
+ * src/type1/t1load.c (T1_FIELD_COUNT): New macro.
+ (parse_dict): Add parameter for keyword flags.
+ Record only first instance of a field.
+ (T1_Open_Face): New array `keyword_flags'.
+
2003-07-24 Werner Lemberg <[email protected]>
* include/freetype/freetype.h (FREETYPE_PATCH): Set to 5.
--- a/include/freetype/freetype.h
+++ b/include/freetype/freetype.h
@@ -920,7 +920,7 @@
/* FT_FACE_FLAG_SCALABLE :: */
/* Indicates that the face provides vectorial outlines. This */
/* doesn't prevent embedded bitmaps, i.e., a face can have both */
- /* this bit and @FT_FACE_FLAG_FIXED_SIZES set */
+ /* this bit and @FT_FACE_FLAG_FIXED_SIZES set. */
/* */
/* FT_FACE_FLAG_FIXED_SIZES :: */
/* Indicates that the face contains `fixed sizes', i.e., bitmap */
--- a/include/freetype/ftbdf.h
+++ b/include/freetype/ftbdf.h
@@ -95,12 +95,17 @@
* This structure models a given BDF/PCF property.
*
* @fields:
- * type :: The property type.
+ * type ::
+ * The property type.
*
- * u.atom :: The atom string, if type is @BDF_PROPERTY_TYPE_ATOM.
- * u.integer :: A signed integer, if type is @BDF_PROPERTY_TYPE_INTEGER.
- * u.cardinal :: An unsigned integer, if type is
- * @BDF_PROPERTY_TYPE_CARDINAL.
+ * u.atom ::
+ * The atom string, if type is @BDF_PROPERTY_TYPE_ATOM.
+ *
+ * u.integer ::
+ * A signed integer, if type is @BDF_PROPERTY_TYPE_INTEGER.
+ *
+ * u.cardinal ::
+ * An unsigned integer, if type is @BDF_PROPERTY_TYPE_CARDINAL.
*/
typedef struct BDF_PropertyRec_
{
--- a/include/freetype/internal/psaux.h
+++ b/include/freetype/internal/psaux.h
@@ -175,13 +175,9 @@
{
T1_FIELD_TYPE_NONE = 0,
T1_FIELD_TYPE_BOOL,
- T1_FIELD_TYPE_BOOL_P,
T1_FIELD_TYPE_INTEGER,
- T1_FIELD_TYPE_INTEGER_P,
T1_FIELD_TYPE_FIXED,
- T1_FIELD_TYPE_FIXED_P,
T1_FIELD_TYPE_FIXED_1000,
- T1_FIELD_TYPE_FIXED_1000_P,
T1_FIELD_TYPE_STRING,
T1_FIELD_TYPE_KEY,
T1_FIELD_TYPE_BBOX,
@@ -267,29 +263,17 @@
},
-#define T1_FIELD_TYPE_BOOL( _ident, _fname ) \
+#define T1_FIELD_BOOL( _ident, _fname ) \
T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BOOL, _fname )
-#define T1_FIELD_TYPE_BOOL_P( _ident, _fname ) \
- T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BOOL_P, _fname )
-
#define T1_FIELD_NUM( _ident, _fname ) \
T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER, _fname )
-#define T1_FIELD_NUM_P( _ident, _fname ) \
- T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER_P, _fname )
-
#define T1_FIELD_FIXED( _ident, _fname ) \
T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED, _fname )
-#define T1_FIELD_FIXED_P( _ident, _fname ) \
- T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_P, _fname )
-
#define T1_FIELD_FIXED_1000( _ident, _fname ) \
T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_1000, _fname )
-
-#define T1_FIELD_FIXED_1000_P( _ident, _fname ) \
- T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_1000_P, _fname )
#define T1_FIELD_STRING( _ident, _fname ) \
T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_STRING, _fname )
--- a/include/freetype/t1tables.h
+++ b/include/freetype/t1tables.h
@@ -67,10 +67,10 @@
FT_String* full_name;
FT_String* family_name;
FT_String* weight;
- FT_Fixed* italic_angle;
- FT_Bool* is_fixed_pitch;
- FT_Fixed* underline_position;
- FT_Fixed* underline_thickness;
+ FT_Fixed italic_angle;
+ FT_Bool is_fixed_pitch;
+ FT_Fixed underline_position;
+ FT_Fixed underline_thickness;
} PS_FontInfoRec, *PS_FontInfo;
--- a/src/cid/cidobjs.c
+++ b/src/cid/cidobjs.c
@@ -223,11 +223,6 @@
FT_FREE( info->family_name );
FT_FREE( info->weight );
- FT_FREE( info->italic_angle );
- FT_FREE( info->underline_position );
- FT_FREE( info->underline_thickness );
- FT_FREE( info->is_fixed_pitch );
-
/* release font dictionaries */
FT_FREE( cid->font_dicts );
cid->num_dicts = 0;
@@ -352,7 +347,7 @@
root->face_flags |= FT_FACE_FLAG_HORIZONTAL;
- if ( info->is_fixed_pitch && *info->is_fixed_pitch )
+ if ( info->is_fixed_pitch )
root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;
/* XXX: TODO: add kerning with .afm support */
@@ -402,7 +397,7 @@
/* compute style flags */
root->style_flags = 0;
- if ( info->italic_angle && *info->italic_angle )
+ if ( info->italic_angle )
root->style_flags |= FT_STYLE_FLAG_ITALIC;
if ( info->weight )
{
@@ -428,10 +423,8 @@
root->height = (FT_Short)(
( ( root->ascender - root->descender ) * 12 ) / 10 );
- if ( info->underline_position )
- root->underline_position = *info->underline_position >> 16;
- if ( info->underline_thickness )
- root->underline_thickness = *info->underline_thickness >> 16;
+ root->underline_position = info->underline_position >> 16;
+ root->underline_thickness = info->underline_thickness >> 16;
root->internal->max_points = 0;
root->internal->max_contours = 0;
--- a/src/cid/cidtoken.h
+++ b/src/cid/cidtoken.h
@@ -39,15 +39,15 @@
#undef T1CODE
#define T1CODE T1_FIELD_LOCATION_FONT_INFO
- T1_FIELD_STRING ( "version", version )
- T1_FIELD_STRING ( "Notice", notice )
- T1_FIELD_STRING ( "FullName", full_name )
- T1_FIELD_STRING ( "FamilyName", family_name )
- T1_FIELD_STRING ( "Weight", weight )
- T1_FIELD_FIXED_P ( "ItalicAngle", italic_angle )
- T1_FIELD_TYPE_BOOL_P( "isFixedPitch", is_fixed_pitch )
- T1_FIELD_FIXED_P ( "UnderlinePosition", underline_position )
- T1_FIELD_FIXED_P ( "UnderlineThickness", underline_thickness )
+ T1_FIELD_STRING( "version", version )
+ T1_FIELD_STRING( "Notice", notice )
+ T1_FIELD_STRING( "FullName", full_name )
+ T1_FIELD_STRING( "FamilyName", family_name )
+ T1_FIELD_STRING( "Weight", weight )
+ T1_FIELD_FIXED ( "ItalicAngle", italic_angle )
+ T1_FIELD_BOOL ( "isFixedPitch", is_fixed_pitch )
+ T1_FIELD_FIXED ( "UnderlinePosition", underline_position )
+ T1_FIELD_FIXED ( "UnderlineThickness", underline_thickness )
#undef FT_STRUCTURE
--- a/src/psaux/psobjs.c
+++ b/src/psaux/psobjs.c
@@ -987,34 +987,18 @@
val = t1_tobool( &cur, limit );
goto Store_Integer;
- case T1_FIELD_TYPE_BOOL_P:
- val = t1_tobool( &cur, limit );
- goto Store_Integer_P;
-
case T1_FIELD_TYPE_FIXED:
val = t1_tofixed( &cur, limit, 0 );
goto Store_Integer;
- case T1_FIELD_TYPE_FIXED_P:
- val = t1_tofixed( &cur, limit, 0 );
- goto Store_Integer_P;
-
case T1_FIELD_TYPE_FIXED_1000:
val = t1_tofixed( &cur, limit, 3 );
goto Store_Integer;
- case T1_FIELD_TYPE_FIXED_1000_P:
- val = t1_tofixed( &cur, limit, 3 );
- goto Store_Integer_P;
-
case T1_FIELD_TYPE_INTEGER:
val = t1_toint( &cur, limit );
goto Store_Integer;
- case T1_FIELD_TYPE_INTEGER_P:
- val = t1_toint( &cur, limit );
- goto Store_Integer_P;
-
Store_Integer:
switch ( field->size )
{
@@ -1032,83 +1016,6 @@
default: /* for 64-bit systems */
*(FT_Long*)q = val;
- }
- break;
-
- Store_Integer_P:
- switch ( field->size )
- {
- case 1:
- {
- FT_Memory memory = parser->memory;
- FT_Byte* p;
-
-
- /* with synthetic fonts, it's possible to find a field twice */
- if ( *(FT_Byte**)q )
- break;
-
- if ( FT_ALLOC( p, 1 ) )
- goto Exit;
-
- *p = val;
- *(FT_Byte**)q = p;
- break;
- }
-
- case 2:
- {
- FT_Memory memory = parser->memory;
- FT_UShort* p;
-
-
- /* with synthetic fonts, it's possible to find a field twice */
- if ( *(FT_UShort**)q )
- break;
-
- if ( FT_ALLOC( p, 2 ) )
- goto Exit;
-
- *p = val;
- *(FT_UShort**)q = p;
- break;
- }
-
- case 4:
- {
- FT_Memory memory = parser->memory;
- FT_UInt32* p;
-
-
- /* with synthetic fonts, it's possible to find a field twice */
- if ( *(FT_UInt32**)q )
- break;
-
- if ( FT_ALLOC( p, 4 ) )
- goto Exit;
-
- *p = val;
- *(FT_UInt32**)q = p;
- break;
- }
-
- default:
- {
- FT_Memory memory = parser->memory;
- FT_Long* p;
-
-
- /* with synthetic fonts, it's possible to find a field twice */
- if ( *(FT_Long**)q )
- break;
-
- if ( FT_ALLOC( p, 8 ) )
- goto Exit;
-
- *p = val;
- *(FT_Long**)q = p;
- break;
- }
}
break;
--- a/src/tools/docmaker/tohtml.py
+++ b/src/tools/docmaker/tohtml.py
@@ -7,23 +7,34 @@
# The following defines the HTML header used by all generated pages.
#
html_header_1 = """\
+<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN"
+"http://www.w3.org/TR/html4/loose.dtd">
<html>
-<header>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>"""
html_header_2= """ API Reference</title>
-<basefont face="Verdana,Geneva,Arial,Helvetica">
-<style content="text/css">
- P { text-align=justify }
- H1 { text-align=center }
- LI { text-align=justify }
+<style type="text/css">
+ body { font-family: Verdana, Geneva, Arial, Helvetica, serif;
+ color: #000000;
+ background: #FFFFFF; }
+
+ p { text-align: justify; }
+ h1 { text-align: center; }
+ li { text-align: justify; }
+
+ a:link { color: #0000EF; }
+ a:visited { color: #51188E; }
+ a:hover { color: #FF0000; }
+
+ span.keyword { font-family: monospace;
+ text-align: left;
+ white-space: pre;
+ color: darkblue; }
</style>
-</header>
-<body text=#000000
- bgcolor=#FFFFFF
- link=#0000EF
- vlink=#51188E
- alink=#FF0000>
+</head>
+<body>
<center><h1>"""
html_header_3=""" API Reference</h1></center>
@@ -54,39 +65,39 @@
# Block header and footer.
#
-block_header = "<center><table width=75%><tr><td>"
-block_footer = "</td></tr></table><hr width=75%></center>"
+block_header = '<table align=center width="75%"><tr><td>'
+block_footer = '</td></tr></table><hr width="75%">'
# Description header/footer.
#
-description_header = "<center><table width=87%><tr><td>"
-description_footer = "</td></tr></table></center><br>"
+description_header = '<table align=center width="87%"><tr><td>'
+description_footer = "</td></tr></table><br>"
# Marker header/inter/footer combination.
#
-marker_header = "<center><table width=87% cellpadding=5><tr bgcolor=#EEEEFF><td><em><b>"
+marker_header = '<table align=center width="87%" cellpadding=5><tr bgcolor="#EEEEFF"><td><em><b>'
marker_inter = "</b></em></td></tr><tr><td>"
-marker_footer = "</td></tr></table></center>"
+marker_footer = "</td></tr></table>"
# Source code extracts header/footer.
#
-source_header = "<center><table width=87%><tr bgcolor=#D6E8FF width=100%><td><pre>\n"
-source_footer = "\n</pre></table></center><br>"
+source_header = '<table align=center width="87%"><tr bgcolor="#D6E8FF"><td><pre>\n'
+source_footer = "\n</pre></table><br>"
# Chapter header/inter/footer.
#
-chapter_header = "<br><center><table width=75%><tr><td><h2>"
+chapter_header = '<br><table align=center width="75%"><tr><td><h2>'
chapter_inter = "</h2><ul>"
-chapter_footer = "</ul></td></tr></table></center>"
+chapter_footer = "</ul></td></tr></table>"
# source language keyword coloration/styling
#
-keyword_prefix = '<font color="darkblue">'
-keyword_suffix = '</font>'
+keyword_prefix = '<span class="keyword">'
+keyword_suffix = '</span>'
-section_synopsis_header = '<h2>Synopsis</h2><font color="cyan">'
-section_synopsis_footer = '</font>'
+section_synopsis_header = '<h2>Synopsis</h2>'
+section_synopsis_footer = ''
# Translate a single line of source to HTML. This will convert
# a "<" into "<.", ">" into ">.", etc.
@@ -231,7 +242,7 @@
def print_html_field( self, field ):
if field.name:
- print "<table valign=top><tr><td><b>"+field.name+"</b></td><td>"
+ print "<table><tr valign=top><td><b>"+field.name+"</b></td><td>"
print self.make_html_items( field.items )
@@ -273,7 +284,7 @@
def print_html_field_list( self, fields ):
- print "<table valign=top cellpadding=3>"
+ print "<table cellpadding=3>"
for field in fields:
print "<tr valign=top><td><b>" + field.name + "</b></td><td>"
self.print_html_items( field.items )
@@ -320,7 +331,7 @@
count = len( self.block_index )
rows = (count + self.columns - 1)/self.columns
- print "<center><table border=0 cellpadding=0 cellspacing=0>"
+ print "<table align=center border=0 cellpadding=0 cellspacing=0>"
for r in range(rows):
line = "<tr>"
for c in range(self.columns):
@@ -334,7 +345,7 @@
line = line + "</tr>"
print line
- print "</table></center>"
+ print "</table>"
print self.html_footer
self.index_items = {}
@@ -374,7 +385,7 @@
print chapter_header + '<a href="' + index_filename + '">Global Index</a>' + chapter_inter + chapter_footer
def toc_exit( self ):
- print "</table></center>"
+ print "</table>"
print self.html_footer
def toc_dump( self, toc_filename = None, index_filename = None ):
@@ -398,7 +409,7 @@
# print section synopsys
print section_synopsis_header
- print "<center><table cellspacing=5 cellpadding=0 border=0>"
+ print "<table align=center cellspacing=5 cellpadding=0 border=0>"
maxwidth = 0
for b in section.blocks.values():
@@ -425,7 +436,7 @@
line = line + "</tr>"
print line
- print "</table></center><br><br>"
+ print "</table><br><br>"
print section_synopsis_footer
print description_header
@@ -437,9 +448,7 @@
# place html anchor if needed
if block.name:
- print '<a name="' + block.name + '">'
- print "<h4>" + block.name + "</h4>"
- print "</a>"
+ print '<h4><a name="' + block.name + '">' + block.name + '</a></h4>'
# dump the block C source lines now
if block.code:
--- a/src/type1/t1load.c
+++ b/src/type1/t1load.c
@@ -1450,11 +1450,16 @@
};
+#define T1_FIELD_COUNT \
+ ( sizeof ( t1_keywords ) / sizeof ( t1_keywords[0] ) )
+
+
static FT_Error
parse_dict( T1_Face face,
T1_Loader loader,
FT_Byte* base,
- FT_Long size )
+ FT_Long size,
+ FT_Byte* keyword_flags )
{
T1_Parser parser = &loader->parser;
@@ -1519,7 +1524,8 @@
{
{
/* now, compare the immediate name to the keyword table */
- T1_Field keyword = (T1_Field)t1_keywords;
+ T1_Field keyword = (T1_Field)t1_keywords;
+ FT_Byte* keyword_flag = keyword_flags;
for (;;)
@@ -1546,11 +1552,18 @@
/* we found it -- run the parsing callback! */
parser->root.cursor = cur2;
T1_Skip_Spaces( parser );
- parser->root.error = t1_load_keyword( face,
- loader,
- keyword );
- if ( parser->root.error )
- return parser->root.error;
+
+ /* we only record the first instance of any */
+ /* field to deal adequately with synthetic fonts */
+ if ( keyword_flag[0] == 0 )
+ {
+ parser->root.error = t1_load_keyword( face,
+ loader,
+ keyword );
+ if ( parser->root.error )
+ return parser->root.error;
+ }
+ keyword_flag[0] = 1;
cur = parser->root.cursor;
break;
@@ -1557,6 +1570,7 @@
}
}
keyword++;
+ keyword_flag++;
}
}
}
@@ -1612,6 +1626,7 @@
T1_Parser parser;
T1_Font type1 = &face->type1;
FT_Error error;
+ FT_Byte keyword_flags[T1_FIELD_COUNT];
PSAux_Service psaux = (PSAux_Service)face->psaux;
@@ -1632,7 +1647,16 @@
if ( error )
goto Exit;
- error = parse_dict( face, &loader, parser->base_dict, parser->base_len );
+ {
+ FT_UInt n;
+
+
+ for ( n = 0; n < T1_FIELD_COUNT; n++ )
+ keyword_flags[n] = 0;
+ }
+
+ error = parse_dict( face, &loader, parser->base_dict, parser->base_len,
+ keyword_flags );
if ( error )
goto Exit;
@@ -1641,7 +1665,8 @@
goto Exit;
error = parse_dict( face, &loader, parser->private_dict,
- parser->private_len );
+ parser->private_len,
+ keyword_flags );
if ( error )
goto Exit;
--- a/src/type1/t1objs.c
+++ b/src/type1/t1objs.c
@@ -211,11 +211,6 @@
FT_FREE( info->full_name );
FT_FREE( info->family_name );
FT_FREE( info->weight );
-
- FT_FREE( info->italic_angle );
- FT_FREE( info->underline_position );
- FT_FREE( info->underline_thickness );
- FT_FREE( info->is_fixed_pitch );
}
/* release top dictionary */
@@ -341,7 +336,7 @@
root->face_flags |= FT_FACE_FLAG_HORIZONTAL;
root->face_flags |= FT_FACE_FLAG_GLYPH_NAMES;
- if ( info->is_fixed_pitch && *info->is_fixed_pitch )
+ if ( info->is_fixed_pitch )
root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;
if ( face->blend )
@@ -394,7 +389,7 @@
/* compute style flags */
root->style_flags = 0;
- if ( info->italic_angle && *info->italic_angle )
+ if ( info->italic_angle )
root->style_flags |= FT_STYLE_FLAG_ITALIC;
if ( info->weight )
{
@@ -439,10 +434,8 @@
root->max_advance_height = root->height;
- if ( info->underline_position )
- root->underline_position = *info->underline_position >> 16;
- if ( info->underline_thickness )
- root->underline_thickness = *info->underline_thickness >> 16;
+ root->underline_position = info->underline_position >> 16;
+ root->underline_thickness = info->underline_thickness >> 16;
root->internal->max_points = 0;
root->internal->max_contours = 0;
--- a/src/type1/t1tokens.h
+++ b/src/type1/t1tokens.h
@@ -21,17 +21,17 @@
#undef T1CODE
#define T1CODE T1_FIELD_LOCATION_FONT_INFO
- T1_FIELD_STRING ( "version", version )
- T1_FIELD_STRING ( "Notice", notice )
- T1_FIELD_STRING ( "FullName", full_name )
- T1_FIELD_STRING ( "FamilyName", family_name )
- T1_FIELD_STRING ( "Weight", weight )
+ T1_FIELD_STRING( "version", version )
+ T1_FIELD_STRING( "Notice", notice )
+ T1_FIELD_STRING( "FullName", full_name )
+ T1_FIELD_STRING( "FamilyName", family_name )
+ T1_FIELD_STRING( "Weight", weight )
/* we use pointers to detect modifications made by synthetic fonts */
- T1_FIELD_FIXED_P ( "ItalicAngle", italic_angle )
- T1_FIELD_TYPE_BOOL_P( "isFixedPitch", is_fixed_pitch )
- T1_FIELD_FIXED_P ( "UnderlinePosition", underline_position )
- T1_FIELD_FIXED_P ( "UnderlineThickness", underline_thickness )
+ T1_FIELD_FIXED ( "ItalicAngle", italic_angle )
+ T1_FIELD_BOOL ( "isFixedPitch", is_fixed_pitch )
+ T1_FIELD_FIXED ( "UnderlinePosition", underline_position )
+ T1_FIELD_FIXED ( "UnderlineThickness", underline_thickness )
#undef FT_STRUCTURE
@@ -66,10 +66,10 @@
#undef T1CODE
#define T1CODE T1_FIELD_LOCATION_FONT_DICT
- T1_FIELD_KEY ( "FontName", font_name )
- T1_FIELD_NUM_P ( "PaintType", paint_type )
- T1_FIELD_NUM ( "FontType", font_type )
- T1_FIELD_FIXED_P( "StrokeWidth", stroke_width )
+ T1_FIELD_KEY ( "FontName", font_name )
+ T1_FIELD_NUM ( "PaintType", paint_type )
+ T1_FIELD_NUM ( "FontType", font_type )
+ T1_FIELD_FIXED( "StrokeWidth", stroke_width )
#undef FT_STRUCTURE
#define FT_STRUCTURE FT_BBox
--- a/src/type42/t42objs.c
+++ b/src/type42/t42objs.c
@@ -203,7 +203,7 @@
root->face_flags |= FT_FACE_FLAG_HORIZONTAL;
root->face_flags |= FT_FACE_FLAG_GLYPH_NAMES;
- if ( info->is_fixed_pitch && *info->is_fixed_pitch )
+ if ( info->is_fixed_pitch )
root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;
/* XXX: TODO -- add kerning with .afm support */
@@ -278,10 +278,8 @@
root->max_advance_width = face->ttf_face->max_advance_width;
root->max_advance_height = face->ttf_face->max_advance_height;
- if ( info->underline_position )
- root->underline_position = *info->underline_position >> 16;
- if ( info->underline_thickness )
- root->underline_thickness = *info->underline_thickness >> 16;
+ root->underline_position = info->underline_position >> 16;
+ root->underline_thickness = info->underline_thickness >> 16;
root->internal->max_points = 0;
root->internal->max_contours = 0;
@@ -288,7 +286,7 @@
/* compute style flags */
root->style_flags = 0;
- if ( info->italic_angle && *info->italic_angle )
+ if ( info->italic_angle )
root->style_flags |= FT_STYLE_FLAG_ITALIC;
if ( face->ttf_face->style_flags & FT_STYLE_FLAG_BOLD )
@@ -387,11 +385,6 @@
FT_FREE( info->full_name );
FT_FREE( info->family_name );
FT_FREE( info->weight );
-
- FT_FREE( info->italic_angle );
- FT_FREE( info->underline_position );
- FT_FREE( info->underline_thickness );
- FT_FREE( info->is_fixed_pitch );
/* release top dictionary */
FT_FREE( type1->charstrings_len );
--- a/src/type42/t42parse.c
+++ b/src/type42/t42parse.c
@@ -57,15 +57,15 @@
#undef T1CODE
#define T1CODE T1_FIELD_LOCATION_FONT_INFO
- T1_FIELD_STRING ( "version", version )
- T1_FIELD_STRING ( "Notice", notice )
- T1_FIELD_STRING ( "FullName", full_name )
- T1_FIELD_STRING ( "FamilyName", family_name )
- T1_FIELD_STRING ( "Weight", weight )
- T1_FIELD_FIXED_P ( "ItalicAngle", italic_angle )
- T1_FIELD_TYPE_BOOL_P( "isFixedPitch", is_fixed_pitch )
- T1_FIELD_FIXED_P ( "UnderlinePosition", underline_position )
- T1_FIELD_FIXED_P ( "UnderlineThickness", underline_thickness )
+ T1_FIELD_STRING( "version", version )
+ T1_FIELD_STRING( "Notice", notice )
+ T1_FIELD_STRING( "FullName", full_name )
+ T1_FIELD_STRING( "FamilyName", family_name )
+ T1_FIELD_STRING( "Weight", weight )
+ T1_FIELD_FIXED ( "ItalicAngle", italic_angle )
+ T1_FIELD_BOOL ( "isFixedPitch", is_fixed_pitch )
+ T1_FIELD_FIXED ( "UnderlinePosition", underline_position )
+ T1_FIELD_FIXED ( "UnderlineThickness", underline_thickness )
#undef FT_STRUCTURE
#define FT_STRUCTURE T1_FontRec
@@ -72,10 +72,10 @@
#undef T1CODE
#define T1CODE T1_FIELD_LOCATION_FONT_DICT
- T1_FIELD_KEY ( "FontName", font_name )
- T1_FIELD_NUM_P ( "PaintType", paint_type )
- T1_FIELD_NUM ( "FontType", font_type )
- T1_FIELD_FIXED_P( "StrokeWidth", stroke_width )
+ T1_FIELD_KEY ( "FontName", font_name )
+ T1_FIELD_NUM ( "PaintType", paint_type )
+ T1_FIELD_NUM ( "FontType", font_type )
+ T1_FIELD_FIXED( "StrokeWidth", stroke_width )
#undef FT_STRUCTURE
#define FT_STRUCTURE FT_BBox
@@ -93,6 +93,10 @@
};
+#define T42_KEYWORD_COUNT \
+ ( sizeof ( t42_keywords ) / sizeof ( t42_keywords[0] ) )
+
+
#define T1_Add_Table( p, i, o, l ) (p)->funcs.add( (p), i, o, l )
#define T1_Done_Table( p ) \
do \
@@ -814,8 +818,17 @@
FT_Byte* limit = cur + size;
FT_UInt n_keywords = (FT_UInt)( sizeof ( t42_keywords ) /
sizeof ( t42_keywords[0] ) );
+
+ FT_Byte keyword_flags[T42_KEYWORD_COUNT];
+ {
+ FT_UInt n;
+
+ for ( n = 0; n < T42_KEYWORD_COUNT; n++ )
+ keyword_flags[n] = 0;
+ }
+
parser->root.cursor = base;
parser->root.limit = base + size;
parser->root.error = 0;
@@ -887,11 +900,19 @@
/* we found it -- run the parsing callback! */
parser->root.cursor = cur2;
T1_Skip_Spaces( parser );
- parser->root.error = t42_load_keyword(face,
- loader,
- keyword );
- if ( parser->root.error )
- return parser->root.error;
+
+ /* only record the first instance of each field/keyword */
+ /* to deal with synthetic fonts correctly */
+ if ( keyword_flags[i] == 0 )
+ {
+ parser->root.error = t42_load_keyword(face,
+ loader,
+ keyword );
+ if ( parser->root.error )
+ return parser->root.error;
+ }
+ keyword_flags[i] = 1;
+
cur = parser->root.cursor;
break;
}