* freetype2/include/freetype/internal/psaux.h: (enum T1_TokenType_):

add T1_TOKEN_TYPE_KEY. (struct T1_FieldRec_) add `dict'. Add macros
T1_FIELD_DICT_FONTDICT and  T1_FIELD_DICT_PRIVATE. Change T1_NEW_XXX and
T1_FIELD_XXX macros to take the dictionary where the PS keywords is
expected as an additional argument.

* freetype2/src/cid/cidload.c: (T1_FieldRec): Adjust invocations
of T1_FIELD_XXX.

* freetype2/src/cid/cidtoken.h: Adjust invocations of T1_FIELD_XXX.

* freetype2/src/psaux/psobjs.c: Add macro FT_COMPONENT for tracing.
(ps_parser_to_token): Report a PostScript key as T1_TOKEN_TYPE_KEY
instead as T1_TOKEN_TYPE_ANY. (ps_parser_load_field): Make sure a token
that should be a string or name is a string or name indeed. Avoid
memory leak if a keyword has been already encountered and its value
is overwritten.

* freetype2/src/type1/t1load.c: (T1_FieldRec): Adjust invocations of
T1_FIELD_XXX. (parse_dict): Ignore keywords that occur in the wrong
dictionary (e.g., in Private instead of FontDict).

* freetype2/src/type1/t1tokens.h: Adjust invocations of T1_FIELD_XXX.
This commit is contained in:
Jens Claudius 2006-08-13 12:14:36 +00:00
parent 814839a6d8
commit 9950adcc11
8 changed files with 269 additions and 172 deletions

View File

@ -1,3 +1,29 @@
2006-08-13 Jens Claudius <jens.claudius@yahoo.com>
* freetype2/include/freetype/internal/psaux.h: (enum T1_TokenType_):
add T1_TOKEN_TYPE_KEY. (struct T1_FieldRec_) add `dict'. Add macros
T1_FIELD_DICT_FONTDICT and T1_FIELD_DICT_PRIVATE. Change T1_NEW_XXX and
T1_FIELD_XXX macros to take the dictionary where the PS keywords is
expected as an additional argument.
* freetype2/src/cid/cidload.c: (T1_FieldRec): Adjust invocations
of T1_FIELD_XXX.
* freetype2/src/cid/cidtoken.h: Adjust invocations of T1_FIELD_XXX.
* freetype2/src/psaux/psobjs.c: Add macro FT_COMPONENT for tracing.
(ps_parser_to_token): Report a PostScript key as T1_TOKEN_TYPE_KEY
instead as T1_TOKEN_TYPE_ANY. (ps_parser_load_field): Make sure a token
that should be a string or name is a string or name indeed. Avoid
memory leak if a keyword has been already encountered and its value
is overwritten.
* freetype2/src/type1/t1load.c: (T1_FieldRec): Adjust invocations of
T1_FIELD_XXX. (parse_dict): Ignore keywords that occur in the wrong
dictionary (e.g., in Private instead of FontDict).
* freetype2/src/type1/t1tokens.h: Adjust invocations of T1_FIELD_XXX.
2006-07-18 Jens Claudius <jens.claudius@yahoo.com> 2006-07-18 Jens Claudius <jens.claudius@yahoo.com>
Move creation of field `buildchar' of T1_DecoderRec out of Move creation of field `buildchar' of T1_DecoderRec out of

View File

@ -154,6 +154,7 @@ FT_BEGIN_HEADER
T1_TOKEN_TYPE_ANY, T1_TOKEN_TYPE_ANY,
T1_TOKEN_TYPE_STRING, T1_TOKEN_TYPE_STRING,
T1_TOKEN_TYPE_ARRAY, T1_TOKEN_TYPE_ARRAY,
T1_TOKEN_TYPE_KEY, /* aka `name' */
/* do not remove */ /* do not remove */
T1_TOKEN_TYPE_MAX T1_TOKEN_TYPE_MAX
@ -227,86 +228,96 @@ FT_BEGIN_HEADER
/* array */ /* array */
FT_UInt count_offset; /* offset of element count for */ FT_UInt count_offset; /* offset of element count for */
/* arrays */ /* arrays */
FT_UInt dict; /* where we expect it */
} T1_FieldRec; } T1_FieldRec;
#define T1_FIELD_DICT_FONTDICT ( 1 << 0 ) /* also FontInfo and FDArray */
#define T1_FIELD_DICT_PRIVATE ( 1 << 1 )
#define T1_NEW_SIMPLE_FIELD( _ident, _type, _fname ) \
{ \
_ident, T1CODE, _type, \ #define T1_NEW_SIMPLE_FIELD( _ident, _type, _fname, _dict ) \
0, \ { \
FT_FIELD_OFFSET( _fname ), \ _ident, T1CODE, _type, \
FT_FIELD_SIZE( _fname ), \ 0, \
0, 0 \ FT_FIELD_OFFSET( _fname ), \
FT_FIELD_SIZE( _fname ), \
0, 0, \
_dict \
}, },
#define T1_NEW_CALLBACK_FIELD( _ident, _reader ) \ #define T1_NEW_CALLBACK_FIELD( _ident, _reader, _dict ) \
{ \ { \
_ident, T1CODE, T1_FIELD_TYPE_CALLBACK, \ _ident, T1CODE, T1_FIELD_TYPE_CALLBACK, \
(T1_Field_ParseFunc)_reader, \ (T1_Field_ParseFunc)_reader, \
0, 0, \ 0, 0, \
0, 0 \ 0, 0, \
_dict \
}, },
#define T1_NEW_TABLE_FIELD( _ident, _type, _fname, _max ) \ #define T1_NEW_TABLE_FIELD( _ident, _type, _fname, _max, _dict ) \
{ \ { \
_ident, T1CODE, _type, \ _ident, T1CODE, _type, \
0, \ 0, \
FT_FIELD_OFFSET( _fname ), \ FT_FIELD_OFFSET( _fname ), \
FT_FIELD_SIZE_DELTA( _fname ), \ FT_FIELD_SIZE_DELTA( _fname ), \
_max, \ _max, \
FT_FIELD_OFFSET( num_ ## _fname ) \ FT_FIELD_OFFSET( num_ ## _fname ), \
_dict \
}, },
#define T1_NEW_TABLE_FIELD2( _ident, _type, _fname, _max ) \ #define T1_NEW_TABLE_FIELD2( _ident, _type, _fname, _max, _dict ) \
{ \ { \
_ident, T1CODE, _type, \ _ident, T1CODE, _type, \
0, \ 0, \
FT_FIELD_OFFSET( _fname ), \ FT_FIELD_OFFSET( _fname ), \
FT_FIELD_SIZE_DELTA( _fname ), \ FT_FIELD_SIZE_DELTA( _fname ), \
_max, 0 \ _max, 0, \
_dict \
}, },
#define T1_FIELD_BOOL( _ident, _fname ) \ #define T1_FIELD_BOOL( _ident, _fname, _dict ) \
T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BOOL, _fname ) T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BOOL, _fname, _dict )
#define T1_FIELD_NUM( _ident, _fname ) \ #define T1_FIELD_NUM( _ident, _fname, _dict ) \
T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER, _fname ) T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER, _fname, _dict )
#define T1_FIELD_FIXED( _ident, _fname ) \ #define T1_FIELD_FIXED( _ident, _fname, _dict ) \
T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED, _fname ) T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED, _fname, _dict )
#define T1_FIELD_FIXED_1000( _ident, _fname ) \ #define T1_FIELD_FIXED_1000( _ident, _fname, _dict ) \
T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_1000, _fname ) T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_1000, _fname, \
_dict )
#define T1_FIELD_STRING( _ident, _fname ) \ #define T1_FIELD_STRING( _ident, _fname, _dict ) \
T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_STRING, _fname ) T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_STRING, _fname, _dict )
#define T1_FIELD_KEY( _ident, _fname ) \ #define T1_FIELD_KEY( _ident, _fname, _dict ) \
T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_KEY, _fname ) T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_KEY, _fname, _dict )
#define T1_FIELD_BBOX( _ident, _fname ) \ #define T1_FIELD_BBOX( _ident, _fname, _dict ) \
T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BBOX, _fname ) T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BBOX, _fname, _dict )
#define T1_FIELD_NUM_TABLE( _ident, _fname, _fmax ) \ #define T1_FIELD_NUM_TABLE( _ident, _fname, _fmax, _dict ) \
T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \ T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \
_fname, _fmax ) _fname, _fmax, _dict )
#define T1_FIELD_FIXED_TABLE( _ident, _fname, _fmax ) \ #define T1_FIELD_FIXED_TABLE( _ident, _fname, _fmax, _dict ) \
T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \ T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \
_fname, _fmax ) _fname, _fmax, _dict )
#define T1_FIELD_NUM_TABLE2( _ident, _fname, _fmax ) \ #define T1_FIELD_NUM_TABLE2( _ident, _fname, _fmax, _dict ) \
T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \ T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \
_fname, _fmax ) _fname, _fmax, _dict )
#define T1_FIELD_FIXED_TABLE2( _ident, _fname, _fmax ) \ #define T1_FIELD_FIXED_TABLE2( _ident, _fname, _fmax, _dict ) \
T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \ T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \
_fname, _fmax ) _fname, _fmax, _dict )
#define T1_FIELD_CALLBACK( _ident, _name ) \ #define T1_FIELD_CALLBACK( _ident, _name, _dict ) \
T1_NEW_CALLBACK_FIELD( _ident, _name ) T1_NEW_CALLBACK_FIELD( _ident, _name, _dict )
/*************************************************************************/ /*************************************************************************/

View File

@ -240,10 +240,10 @@
#include "cidtoken.h" #include "cidtoken.h"
T1_FIELD_CALLBACK( "FDArray", parse_fd_array ) T1_FIELD_CALLBACK( "FDArray", parse_fd_array, 0 )
T1_FIELD_CALLBACK( "FontMatrix", parse_font_matrix ) T1_FIELD_CALLBACK( "FontMatrix", parse_font_matrix, 0 )
{ 0, T1_FIELD_LOCATION_CID_INFO, T1_FIELD_TYPE_NONE, 0, 0, 0, 0, 0 } { 0, T1_FIELD_LOCATION_CID_INFO, T1_FIELD_TYPE_NONE, 0, 0, 0, 0, 0, 0 }
}; };

View File

@ -21,17 +21,17 @@
#undef T1CODE #undef T1CODE
#define T1CODE T1_FIELD_LOCATION_CID_INFO #define T1CODE T1_FIELD_LOCATION_CID_INFO
T1_FIELD_KEY ( "CIDFontName", cid_font_name ) T1_FIELD_KEY ( "CIDFontName", cid_font_name, 0 )
T1_FIELD_NUM ( "CIDFontVersion", cid_version ) T1_FIELD_NUM ( "CIDFontVersion", cid_version, 0 )
T1_FIELD_NUM ( "CIDFontType", cid_font_type ) T1_FIELD_NUM ( "CIDFontType", cid_font_type, 0 )
T1_FIELD_STRING( "Registry", registry ) T1_FIELD_STRING( "Registry", registry, 0 )
T1_FIELD_STRING( "Ordering", ordering ) T1_FIELD_STRING( "Ordering", ordering, 0 )
T1_FIELD_NUM ( "Supplement", supplement ) T1_FIELD_NUM ( "Supplement", supplement, 0 )
T1_FIELD_NUM ( "UIDBase", uid_base ) T1_FIELD_NUM ( "UIDBase", uid_base, 0 )
T1_FIELD_NUM ( "CIDMapOffset", cidmap_offset ) T1_FIELD_NUM ( "CIDMapOffset", cidmap_offset, 0 )
T1_FIELD_NUM ( "FDBytes", fd_bytes ) T1_FIELD_NUM ( "FDBytes", fd_bytes, 0 )
T1_FIELD_NUM ( "GDBytes", gd_bytes ) T1_FIELD_NUM ( "GDBytes", gd_bytes, 0 )
T1_FIELD_NUM ( "CIDCount", cid_count ) T1_FIELD_NUM ( "CIDCount", cid_count, 0 )
#undef FT_STRUCTURE #undef FT_STRUCTURE
@ -39,15 +39,15 @@
#undef T1CODE #undef T1CODE
#define T1CODE T1_FIELD_LOCATION_FONT_INFO #define T1CODE T1_FIELD_LOCATION_FONT_INFO
T1_FIELD_STRING( "version", version ) T1_FIELD_STRING( "version", version, 0 )
T1_FIELD_STRING( "Notice", notice ) T1_FIELD_STRING( "Notice", notice, 0 )
T1_FIELD_STRING( "FullName", full_name ) T1_FIELD_STRING( "FullName", full_name, 0 )
T1_FIELD_STRING( "FamilyName", family_name ) T1_FIELD_STRING( "FamilyName", family_name, 0 )
T1_FIELD_STRING( "Weight", weight ) T1_FIELD_STRING( "Weight", weight, 0 )
T1_FIELD_NUM ( "ItalicAngle", italic_angle ) T1_FIELD_NUM ( "ItalicAngle", italic_angle, 0 )
T1_FIELD_BOOL ( "isFixedPitch", is_fixed_pitch ) T1_FIELD_BOOL ( "isFixedPitch", is_fixed_pitch, 0 )
T1_FIELD_NUM ( "UnderlinePosition", underline_position ) T1_FIELD_NUM ( "UnderlinePosition", underline_position, 0 )
T1_FIELD_NUM ( "UnderlineThickness", underline_thickness ) T1_FIELD_NUM ( "UnderlineThickness", underline_thickness, 0 )
#undef FT_STRUCTURE #undef FT_STRUCTURE
@ -55,15 +55,15 @@
#undef T1CODE #undef T1CODE
#define T1CODE T1_FIELD_LOCATION_FONT_DICT #define T1CODE T1_FIELD_LOCATION_FONT_DICT
T1_FIELD_NUM ( "PaintType", paint_type ) T1_FIELD_NUM ( "PaintType", paint_type, 0 )
T1_FIELD_NUM ( "FontType", font_type ) T1_FIELD_NUM ( "FontType", font_type, 0 )
T1_FIELD_NUM ( "SubrMapOffset", subrmap_offset ) T1_FIELD_NUM ( "SubrMapOffset", subrmap_offset, 0 )
T1_FIELD_NUM ( "SDBytes", sd_bytes ) T1_FIELD_NUM ( "SDBytes", sd_bytes, 0 )
T1_FIELD_NUM ( "SubrCount", num_subrs ) T1_FIELD_NUM ( "SubrCount", num_subrs, 0 )
T1_FIELD_NUM ( "lenBuildCharArray", len_buildchar ) T1_FIELD_NUM ( "lenBuildCharArray", len_buildchar, 0 )
T1_FIELD_FIXED( "ForceBoldThreshold", forcebold_threshold ) T1_FIELD_FIXED( "ForceBoldThreshold", forcebold_threshold, 0 )
T1_FIELD_FIXED( "ExpansionFactor", expansion_factor ) T1_FIELD_FIXED( "ExpansionFactor", expansion_factor, 0 )
T1_FIELD_FIXED( "StrokeWidth", stroke_width ) T1_FIELD_FIXED( "StrokeWidth", stroke_width, 0 )
#undef FT_STRUCTURE #undef FT_STRUCTURE
@ -71,33 +71,33 @@
#undef T1CODE #undef T1CODE
#define T1CODE T1_FIELD_LOCATION_PRIVATE #define T1CODE T1_FIELD_LOCATION_PRIVATE
T1_FIELD_NUM ( "UniqueID", unique_id ) T1_FIELD_NUM ( "UniqueID", unique_id, 0 )
T1_FIELD_NUM ( "lenIV", lenIV ) T1_FIELD_NUM ( "lenIV", lenIV, 0 )
T1_FIELD_NUM ( "LanguageGroup", language_group ) T1_FIELD_NUM ( "LanguageGroup", language_group, 0 )
T1_FIELD_NUM ( "password", password ) T1_FIELD_NUM ( "password", password, 0 )
T1_FIELD_FIXED_1000( "BlueScale", blue_scale ) T1_FIELD_FIXED_1000( "BlueScale", blue_scale, 0 )
T1_FIELD_NUM ( "BlueShift", blue_shift ) T1_FIELD_NUM ( "BlueShift", blue_shift, 0 )
T1_FIELD_NUM ( "BlueFuzz", blue_fuzz ) T1_FIELD_NUM ( "BlueFuzz", blue_fuzz, 0 )
T1_FIELD_NUM_TABLE ( "BlueValues", blue_values, 14 ) T1_FIELD_NUM_TABLE ( "BlueValues", blue_values, 14, 0 )
T1_FIELD_NUM_TABLE ( "OtherBlues", other_blues, 10 ) T1_FIELD_NUM_TABLE ( "OtherBlues", other_blues, 10, 0 )
T1_FIELD_NUM_TABLE ( "FamilyBlues", family_blues, 14 ) T1_FIELD_NUM_TABLE ( "FamilyBlues", family_blues, 14, 0 )
T1_FIELD_NUM_TABLE ( "FamilyOtherBlues", family_other_blues, 10 ) T1_FIELD_NUM_TABLE ( "FamilyOtherBlues", family_other_blues, 10, 0 )
T1_FIELD_NUM_TABLE2( "StdHW", standard_width, 1 ) T1_FIELD_NUM_TABLE2( "StdHW", standard_width, 1, 0 )
T1_FIELD_NUM_TABLE2( "StdVW", standard_height, 1 ) T1_FIELD_NUM_TABLE2( "StdVW", standard_height, 1, 0 )
T1_FIELD_NUM_TABLE2( "MinFeature", min_feature, 2 ) T1_FIELD_NUM_TABLE2( "MinFeature", min_feature, 2, 0 )
T1_FIELD_NUM_TABLE ( "StemSnapH", snap_widths, 12 ) T1_FIELD_NUM_TABLE ( "StemSnapH", snap_widths, 12, 0 )
T1_FIELD_NUM_TABLE ( "StemSnapV", snap_heights, 12 ) T1_FIELD_NUM_TABLE ( "StemSnapV", snap_heights, 12, 0 )
#undef FT_STRUCTURE #undef FT_STRUCTURE
#define FT_STRUCTURE FT_BBox #define FT_STRUCTURE FT_BBox
#undef T1CODE #undef T1CODE
#define T1CODE T1_FIELD_LOCATION_BBOX #define T1CODE T1_FIELD_LOCATION_BBOX
T1_FIELD_BBOX( "FontBBox", xMin ) T1_FIELD_BBOX( "FontBBox", xMin, 0 )
/* END */ /* END */

View File

@ -26,6 +26,16 @@
#include "psauxerr.h" #include "psauxerr.h"
/*************************************************************************/
/* */
/* The macro FT_COMPONENT is used in trace mode. It is an implicit */
/* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
/* messages during execution. */
/* */
#undef FT_COMPONENT
#define FT_COMPONENT trace_psobjs
/*************************************************************************/ /*************************************************************************/
/*************************************************************************/ /*************************************************************************/
/***** *****/ /***** *****/
@ -118,7 +128,7 @@
} }
/* copy elements and shift offsets */ /* copy elements and shift offsets */
if (old_base ) if ( old_base )
{ {
FT_MEM_COPY( table->block, old_base, table->capacity ); FT_MEM_COPY( table->block, old_base, table->capacity );
shift_elements( table, old_base ); shift_elements( table, old_base );
@ -681,7 +691,7 @@
/* ************ otherwise, it is any token **************/ /* ************ otherwise, it is any token **************/
default: default:
token->start = cur; token->start = cur;
token->type = T1_TOKEN_TYPE_ANY; token->type = ( *cur == '/' ? T1_TOKEN_TYPE_KEY : T1_TOKEN_TYPE_ANY );
ps_parser_skip_PS_token( parser ); ps_parser_skip_PS_token( parser );
cur = parser->cursor; cur = parser->cursor;
if ( !parser->error ) if ( !parser->error )
@ -1101,18 +1111,41 @@
if ( cur >= limit ) if ( cur >= limit )
break; break;
if ( field->type == T1_FIELD_TYPE_KEY ) /* we allow both a string or a name */
/* for cases like /FontName (foo) def */
if ( token.type == T1_TOKEN_TYPE_KEY )
{ {
/* don't include leading `/' */ /* don't include leading `/' */
len--; len--;
cur++; cur++;
} }
else else if ( token.type == T1_TOKEN_TYPE_STRING )
{ {
/* don't include delimiting parentheses */ /* don't include delimiting parentheses */
/* XXX we don't handle <<...>> here */
/* XXX should we convert octal escapes? */
/* if so, what encoding should we use? */
cur++; cur++;
len -= 2; len -= 2;
} }
else
{
FT_ERROR(( "ps_parser_load_field: expected a name or string "
"but found token of type %d instead\n",
token.type ));
error = PSaux_Err_Invalid_File_Format;
goto Exit;
}
/* for this to work (FT_String**)q must have been */
/* initialized to NULL */
if ( *(FT_String**)q != NULL )
{
FT_TRACE0(( "ps_parser_load_field: overwriting field %s\n",
field->ident ));
FT_FREE( *(FT_String**)q );
*(FT_String**)q = NULL;
}
if ( FT_ALLOC( string, len + 1 ) ) if ( FT_ALLOC( string, len + 1 ) )
goto Exit; goto Exit;

View File

@ -1721,21 +1721,21 @@
#include "t1tokens.h" #include "t1tokens.h"
/* now add the special functions... */ /* now add the special functions... */
T1_FIELD_CALLBACK( "FontMatrix", parse_font_matrix ) T1_FIELD_CALLBACK( "FontMatrix", parse_font_matrix, T1_FIELD_DICT_FONTDICT )
T1_FIELD_CALLBACK( "Encoding", parse_encoding ) T1_FIELD_CALLBACK( "Encoding", parse_encoding, T1_FIELD_DICT_FONTDICT )
T1_FIELD_CALLBACK( "Subrs", parse_subrs ) T1_FIELD_CALLBACK( "Subrs", parse_subrs, T1_FIELD_DICT_PRIVATE )
T1_FIELD_CALLBACK( "CharStrings", parse_charstrings ) T1_FIELD_CALLBACK( "CharStrings", parse_charstrings, T1_FIELD_DICT_PRIVATE )
T1_FIELD_CALLBACK( "Private", parse_private ) T1_FIELD_CALLBACK( "Private", parse_private, T1_FIELD_DICT_FONTDICT )
#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT #ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
T1_FIELD_CALLBACK( "BlendDesignPositions", parse_blend_design_positions ) T1_FIELD_CALLBACK( "BlendDesignPositions", parse_blend_design_positions, T1_FIELD_DICT_FONTDICT )
T1_FIELD_CALLBACK( "BlendDesignMap", parse_blend_design_map ) T1_FIELD_CALLBACK( "BlendDesignMap", parse_blend_design_map, T1_FIELD_DICT_FONTDICT )
T1_FIELD_CALLBACK( "BlendAxisTypes", parse_blend_axis_types ) T1_FIELD_CALLBACK( "BlendAxisTypes", parse_blend_axis_types, T1_FIELD_DICT_FONTDICT )
T1_FIELD_CALLBACK( "WeightVector", parse_weight_vector ) T1_FIELD_CALLBACK( "WeightVector", parse_weight_vector, T1_FIELD_DICT_FONTDICT )
T1_FIELD_CALLBACK( "BuildCharArray", parse_buildchar ) T1_FIELD_CALLBACK( "BuildCharArray", parse_buildchar, T1_FIELD_DICT_PRIVATE )
#endif #endif
{ 0, T1_FIELD_LOCATION_CID_INFO, T1_FIELD_TYPE_NONE, 0, 0, 0, 0, 0 } { 0, T1_FIELD_LOCATION_CID_INFO, T1_FIELD_TYPE_NONE, 0, 0, 0, 0, 0, 0 }
}; };
@ -1874,9 +1874,34 @@
/* interested in anything that follows this */ /* interested in anything that follows this */
/* `FontDirectory' */ /* `FontDirectory' */
if ( !( loader->keywords_encountered & /* MM fonts have more than one /Private token at */
/* the top level; let's hope that all the junk */
/* that follows the first /Private token is not */
/* interesting to us */
/* According to Adobe Tech Note #5175 (CID-Keyed */
/* Font Installation for ATM Software) a `begin' */
/* must be followed by exactly one `end' and */
/* `begin' -- `end' pairs must be accurately */
/* paired. We could use this to dinstinguish */
/* between the global Private and the Private */
/* that is a member of the Blend dict. */
const FT_UInt dict
= ( ( loader->keywords_encountered & T1_PRIVATE ) ?
T1_FIELD_DICT_PRIVATE : T1_FIELD_DICT_FONTDICT );
if ( ! ( dict & keyword->dict ) )
{
FT_TRACE1(( "parse_dict: found %s but ignore it "
"since it is in the wrong dictionary\n",
keyword->ident ));
break;
}
if ( !( loader->keywords_encountered &
T1_FONTDIR_AFTER_PRIVATE ) || T1_FONTDIR_AFTER_PRIVATE ) ||
ft_strcmp((const char*)name, "CharStrings") == 0 ) ft_strcmp( (const char*)name, "CharStrings" ) == 0 )
{ {
parser->root.error = t1_load_keyword( face, parser->root.error = t1_load_keyword( face,
loader, loader,

View File

@ -21,17 +21,17 @@
#undef T1CODE #undef T1CODE
#define T1CODE T1_FIELD_LOCATION_FONT_INFO #define T1CODE T1_FIELD_LOCATION_FONT_INFO
T1_FIELD_STRING( "version", version ) T1_FIELD_STRING( "version", version, T1_FIELD_DICT_FONTDICT )
T1_FIELD_STRING( "Notice", notice ) T1_FIELD_STRING( "Notice", notice, T1_FIELD_DICT_FONTDICT )
T1_FIELD_STRING( "FullName", full_name ) T1_FIELD_STRING( "FullName", full_name, T1_FIELD_DICT_FONTDICT )
T1_FIELD_STRING( "FamilyName", family_name ) T1_FIELD_STRING( "FamilyName", family_name, T1_FIELD_DICT_FONTDICT )
T1_FIELD_STRING( "Weight", weight ) T1_FIELD_STRING( "Weight", weight, T1_FIELD_DICT_FONTDICT )
/* we use pointers to detect modifications made by synthetic fonts */ /* we use pointers to detect modifications made by synthetic fonts */
T1_FIELD_NUM ( "ItalicAngle", italic_angle ) T1_FIELD_NUM ( "ItalicAngle", italic_angle, T1_FIELD_DICT_FONTDICT )
T1_FIELD_BOOL ( "isFixedPitch", is_fixed_pitch ) T1_FIELD_BOOL ( "isFixedPitch", is_fixed_pitch, T1_FIELD_DICT_FONTDICT )
T1_FIELD_NUM ( "UnderlinePosition", underline_position ) T1_FIELD_NUM ( "UnderlinePosition", underline_position, T1_FIELD_DICT_FONTDICT )
T1_FIELD_NUM ( "UnderlineThickness", underline_thickness ) T1_FIELD_NUM ( "UnderlineThickness", underline_thickness, T1_FIELD_DICT_FONTDICT )
#undef FT_STRUCTURE #undef FT_STRUCTURE
@ -39,28 +39,28 @@
#undef T1CODE #undef T1CODE
#define T1CODE T1_FIELD_LOCATION_PRIVATE #define T1CODE T1_FIELD_LOCATION_PRIVATE
T1_FIELD_NUM ( "UniqueID", unique_id ) T1_FIELD_NUM ( "UniqueID", unique_id, T1_FIELD_DICT_FONTDICT | T1_FIELD_DICT_PRIVATE )
T1_FIELD_NUM ( "lenIV", lenIV ) T1_FIELD_NUM ( "lenIV", lenIV, T1_FIELD_DICT_PRIVATE )
T1_FIELD_NUM ( "LanguageGroup", language_group ) T1_FIELD_NUM ( "LanguageGroup", language_group, T1_FIELD_DICT_PRIVATE )
T1_FIELD_NUM ( "password", password ) T1_FIELD_NUM ( "password", password, T1_FIELD_DICT_PRIVATE )
T1_FIELD_FIXED_1000( "BlueScale", blue_scale ) T1_FIELD_FIXED_1000( "BlueScale", blue_scale, T1_FIELD_DICT_PRIVATE )
T1_FIELD_NUM ( "BlueShift", blue_shift ) T1_FIELD_NUM ( "BlueShift", blue_shift, T1_FIELD_DICT_PRIVATE )
T1_FIELD_NUM ( "BlueFuzz", blue_fuzz ) T1_FIELD_NUM ( "BlueFuzz", blue_fuzz, T1_FIELD_DICT_PRIVATE )
T1_FIELD_NUM_TABLE ( "BlueValues", blue_values, 14 ) T1_FIELD_NUM_TABLE ( "BlueValues", blue_values, 14, T1_FIELD_DICT_PRIVATE )
T1_FIELD_NUM_TABLE ( "OtherBlues", other_blues, 10 ) T1_FIELD_NUM_TABLE ( "OtherBlues", other_blues, 10, T1_FIELD_DICT_PRIVATE )
T1_FIELD_NUM_TABLE ( "FamilyBlues", family_blues, 14 ) T1_FIELD_NUM_TABLE ( "FamilyBlues", family_blues, 14, T1_FIELD_DICT_PRIVATE )
T1_FIELD_NUM_TABLE ( "FamilyOtherBlues", family_other_blues, 10 ) T1_FIELD_NUM_TABLE ( "FamilyOtherBlues", family_other_blues, 10, T1_FIELD_DICT_PRIVATE )
T1_FIELD_NUM_TABLE2( "StdHW", standard_width, 1 ) T1_FIELD_NUM_TABLE2( "StdHW", standard_width, 1, T1_FIELD_DICT_PRIVATE )
T1_FIELD_NUM_TABLE2( "StdVW", standard_height, 1 ) T1_FIELD_NUM_TABLE2( "StdVW", standard_height, 1, T1_FIELD_DICT_PRIVATE )
T1_FIELD_NUM_TABLE2( "MinFeature", min_feature, 2 ) T1_FIELD_NUM_TABLE2( "MinFeature", min_feature, 2, T1_FIELD_DICT_PRIVATE )
T1_FIELD_NUM_TABLE ( "StemSnapH", snap_widths, 12 ) T1_FIELD_NUM_TABLE ( "StemSnapH", snap_widths, 12, T1_FIELD_DICT_PRIVATE )
T1_FIELD_NUM_TABLE ( "StemSnapV", snap_heights, 12 ) T1_FIELD_NUM_TABLE ( "StemSnapV", snap_heights, 12, T1_FIELD_DICT_PRIVATE )
T1_FIELD_FIXED ( "ExpansionFactor", expansion_factor ) T1_FIELD_FIXED ( "ExpansionFactor", expansion_factor, T1_FIELD_DICT_PRIVATE )
#undef FT_STRUCTURE #undef FT_STRUCTURE
@ -68,10 +68,10 @@
#undef T1CODE #undef T1CODE
#define T1CODE T1_FIELD_LOCATION_FONT_DICT #define T1CODE T1_FIELD_LOCATION_FONT_DICT
T1_FIELD_KEY ( "FontName", font_name ) T1_FIELD_KEY ( "FontName", font_name, T1_FIELD_DICT_FONTDICT )
T1_FIELD_NUM ( "PaintType", paint_type ) T1_FIELD_NUM ( "PaintType", paint_type, T1_FIELD_DICT_FONTDICT )
T1_FIELD_NUM ( "FontType", font_type ) T1_FIELD_NUM ( "FontType", font_type, T1_FIELD_DICT_FONTDICT )
T1_FIELD_FIXED( "StrokeWidth", stroke_width ) T1_FIELD_FIXED( "StrokeWidth", stroke_width, T1_FIELD_DICT_FONTDICT )
#undef FT_STRUCTURE #undef FT_STRUCTURE
@ -79,7 +79,7 @@
#undef T1CODE #undef T1CODE
#define T1CODE T1_FIELD_LOCATION_BBOX #define T1CODE T1_FIELD_LOCATION_BBOX
T1_FIELD_BBOX("FontBBox", xMin ) T1_FIELD_BBOX( "FontBBox", xMin, T1_FIELD_DICT_FONTDICT )
#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT #ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
@ -89,8 +89,8 @@
#undef T1CODE #undef T1CODE
#define T1CODE T1_FIELD_LOCATION_FACE #define T1CODE T1_FIELD_LOCATION_FACE
T1_FIELD_NUM ( "NDV", ndv_idx ) T1_FIELD_NUM ( "NDV", ndv_idx, T1_FIELD_DICT_PRIVATE )
T1_FIELD_NUM ( "CDV", cdv_idx ) T1_FIELD_NUM ( "CDV", cdv_idx, T1_FIELD_DICT_PRIVATE )
#undef FT_STRUCTURE #undef FT_STRUCTURE
@ -98,7 +98,7 @@
#undef T1CODE #undef T1CODE
#define T1CODE T1_FIELD_LOCATION_BLEND #define T1CODE T1_FIELD_LOCATION_BLEND
T1_FIELD_NUM_TABLE( "DesignVector", default_design_vector, T1_MAX_MM_DESIGNS ) T1_FIELD_NUM_TABLE( "DesignVector", default_design_vector, T1_MAX_MM_DESIGNS, T1_FIELD_DICT_FONTDICT )
#endif /* T1_CONFIG_OPTION_NO_MM_SUPPORT */ #endif /* T1_CONFIG_OPTION_NO_MM_SUPPORT */

View File

@ -49,6 +49,8 @@
T42_Loader loader ); T42_Loader loader );
/* as Type42 fonts have no Private dict, */
/* we set the last argument of T1_FIELD_XXX to 0 */
static const static const
T1_FieldRec t42_keywords[] = { T1_FieldRec t42_keywords[] = {
@ -57,39 +59,39 @@
#undef T1CODE #undef T1CODE
#define T1CODE T1_FIELD_LOCATION_FONT_INFO #define T1CODE T1_FIELD_LOCATION_FONT_INFO
T1_FIELD_STRING( "version", version ) T1_FIELD_STRING( "version", version, 0 )
T1_FIELD_STRING( "Notice", notice ) T1_FIELD_STRING( "Notice", notice, 0 )
T1_FIELD_STRING( "FullName", full_name ) T1_FIELD_STRING( "FullName", full_name, 0 )
T1_FIELD_STRING( "FamilyName", family_name ) T1_FIELD_STRING( "FamilyName", family_name, 0 )
T1_FIELD_STRING( "Weight", weight ) T1_FIELD_STRING( "Weight", weight, 0 )
T1_FIELD_NUM ( "ItalicAngle", italic_angle ) T1_FIELD_NUM ( "ItalicAngle", italic_angle, 0 )
T1_FIELD_BOOL ( "isFixedPitch", is_fixed_pitch ) T1_FIELD_BOOL ( "isFixedPitch", is_fixed_pitch, 0 )
T1_FIELD_NUM ( "UnderlinePosition", underline_position ) T1_FIELD_NUM ( "UnderlinePosition", underline_position, 0 )
T1_FIELD_NUM ( "UnderlineThickness", underline_thickness ) T1_FIELD_NUM ( "UnderlineThickness", underline_thickness, 0 )
#undef FT_STRUCTURE #undef FT_STRUCTURE
#define FT_STRUCTURE T1_FontRec #define FT_STRUCTURE T1_FontRec
#undef T1CODE #undef T1CODE
#define T1CODE T1_FIELD_LOCATION_FONT_DICT #define T1CODE T1_FIELD_LOCATION_FONT_DICT
T1_FIELD_KEY ( "FontName", font_name ) T1_FIELD_KEY ( "FontName", font_name, 0 )
T1_FIELD_NUM ( "PaintType", paint_type ) T1_FIELD_NUM ( "PaintType", paint_type, 0 )
T1_FIELD_NUM ( "FontType", font_type ) T1_FIELD_NUM ( "FontType", font_type, 0 )
T1_FIELD_FIXED( "StrokeWidth", stroke_width ) T1_FIELD_FIXED( "StrokeWidth", stroke_width, 0 )
#undef FT_STRUCTURE #undef FT_STRUCTURE
#define FT_STRUCTURE FT_BBox #define FT_STRUCTURE FT_BBox
#undef T1CODE #undef T1CODE
#define T1CODE T1_FIELD_LOCATION_BBOX #define T1CODE T1_FIELD_LOCATION_BBOX
T1_FIELD_BBOX("FontBBox", xMin ) T1_FIELD_BBOX("FontBBox", xMin, 0 )
T1_FIELD_CALLBACK( "FontMatrix", t42_parse_font_matrix ) T1_FIELD_CALLBACK( "FontMatrix", t42_parse_font_matrix, 0 )
T1_FIELD_CALLBACK( "Encoding", t42_parse_encoding ) T1_FIELD_CALLBACK( "Encoding", t42_parse_encoding, 0 )
T1_FIELD_CALLBACK( "CharStrings", t42_parse_charstrings ) T1_FIELD_CALLBACK( "CharStrings", t42_parse_charstrings, 0 )
T1_FIELD_CALLBACK( "sfnts", t42_parse_sfnts ) T1_FIELD_CALLBACK( "sfnts", t42_parse_sfnts, 0 )
{ 0, T1_FIELD_LOCATION_CID_INFO, T1_FIELD_TYPE_NONE, 0, 0, 0, 0, 0 } { 0, T1_FIELD_LOCATION_CID_INFO, T1_FIELD_TYPE_NONE, 0, 0, 0, 0, 0, 0 }
}; };