diff --git a/ChangeLog b/ChangeLog index b2f0b2f5f..deceb2fc8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2002-07-11 David Turner + + * include/freetype/t1tables.h, include/freetype/internal/psaux.h, + src/psaux/psobjs.c, src/type1/t1load.c, src/type1/t1tokens.h: + fixing a bug in the Type 1 loader that prevented valid font bounding + boxes to be loaded from multiple master fonts. + 2002-07-10 David Turner * src/cff/cffobjs.c: small fix to select the Unicode charmap by default diff --git a/include/freetype/internal/psaux.h b/include/freetype/internal/psaux.h index 2f1557d6b..fbb743496 100644 --- a/include/freetype/internal/psaux.h +++ b/include/freetype/internal/psaux.h @@ -178,6 +178,7 @@ FT_BEGIN_HEADER T1_FIELD_TYPE_INTEGER, T1_FIELD_TYPE_FIXED, T1_FIELD_TYPE_STRING, + T1_FIELD_TYPE_BBOX, T1_FIELD_TYPE_INTEGER_ARRAY, T1_FIELD_TYPE_FIXED_ARRAY, T1_FIELD_TYPE_CALLBACK, @@ -194,6 +195,7 @@ FT_BEGIN_HEADER T1_FIELD_LOCATION_FONT_DICT, T1_FIELD_LOCATION_FONT_INFO, T1_FIELD_LOCATION_PRIVATE, + T1_FIELD_LOCATION_BBOX, /* do not remove */ T1_FIELD_LOCATION_MAX @@ -271,6 +273,10 @@ FT_BEGIN_HEADER #define T1_FIELD_STRING( _ident, _fname ) \ T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_STRING, _fname ) +#define T1_FIELD_BBOX( _ident, _fname ) \ + T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BBOX, _fname ) + + #define T1_FIELD_NUM_TABLE( _ident, _fname, _fmax ) \ T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \ _fname, _fmax ) diff --git a/include/freetype/t1tables.h b/include/freetype/t1tables.h index 660ea8a44..200ba9be5 100644 --- a/include/freetype/t1tables.h +++ b/include/freetype/t1tables.h @@ -208,7 +208,7 @@ FT_BEGIN_HEADER #define T1_MAX_MM_DESIGNS 16 /* maximum number of Multiple Masters axes, as defined in the spec */ -#define T1_MAX_MM_AXIS 4 +#define T1_MAX_MM_AXIS 4 /* maximum number of elements in a design map */ #define T1_MAX_MM_MAP_POINTS 20 @@ -244,6 +244,8 @@ FT_BEGIN_HEADER FT_ULong blend_bitflags; + FT_BBox* bboxes [T1_MAX_MM_DESIGNS + 1]; + } PS_BlendRec, *PS_Blend; diff --git a/src/psaux/psobjs.c b/src/psaux/psobjs.c index c24a0c724..6bbb1ca5c 100644 --- a/src/psaux/psobjs.c +++ b/src/psaux/psobjs.c @@ -852,8 +852,26 @@ cur = token.start; limit = token.limit; - if ( token.type == T1_TOKEN_TYPE_ARRAY ) + /* we must detect arrays */ + if ( field->type == T1_FIELD_TYPE_BBOX ) { + T1_TokenRec token2; + FT_Byte* old_cur = parser->cursor; + FT_Byte* old_limit = parser->limit; + + parser->cursor = token.start; + parser->limit = token.limit; + + PS_Parser_ToToken( parser, &token2 ); + parser->cursor = old_cur; + parser->limit = old_limit; + + if ( token2.type == T1_TOKEN_TYPE_ARRAY ) + goto FieldArray; + } + else if ( token.type == T1_TOKEN_TYPE_ARRAY ) + { + FieldArray: /* if this is an array, and we have no blend, an error occurs */ if ( max_objects == 0 ) goto Fail; @@ -922,6 +940,23 @@ } break; + case T1_FIELD_TYPE_BBOX: + { + FT_Fixed temp[4]; + FT_BBox* bbox = (FT_BBox*)q; + + /* we need the '[' and ']' delimiters */ + token.start--; + token.limit++; + (void) t1_tofixedarray( &token.start, token.limit, 4, temp, 0 ); + + bbox->xMin = FT_RoundFix( temp[0] ); + bbox->yMin = FT_RoundFix( temp[1] ); + bbox->xMax = FT_RoundFix( temp[2] ); + bbox->yMax = FT_RoundFix( temp[3] ); + } + break; + default: /* an error occured */ goto Fail; diff --git a/src/type1/t1load.c b/src/type1/t1load.c index 4868a984e..00f8d8eb6 100644 --- a/src/type1/t1load.c +++ b/src/type1/t1load.c @@ -123,6 +123,7 @@ /* allocate the blend `private' and `font_info' dictionaries */ if ( FT_NEW_ARRAY( blend->font_infos[1], num_designs ) || FT_NEW_ARRAY( blend->privates[1], num_designs ) || + FT_NEW_ARRAY( blend->bboxes[1], num_designs ) || FT_NEW_ARRAY( blend->weight_vector, num_designs * 2 ) ) goto Exit; @@ -130,11 +131,13 @@ blend->font_infos[0] = &face->type1.font_info; blend->privates [0] = &face->type1.private_dict; + blend->bboxes [0] = &face->type1.font_bbox; for ( nn = 2; nn <= num_designs; nn++ ) { blend->privates[nn] = blend->privates [nn - 1] + 1; blend->font_infos[nn] = blend->font_infos[nn - 1] + 1; + blend->bboxes[nn] = blend->bboxes [nn - 1] + 1; } blend->num_designs = num_designs; @@ -347,11 +350,13 @@ /* release blend `private' and `font info' dictionaries */ FT_FREE( blend->privates[1] ); FT_FREE( blend->font_infos[1] ); + FT_FREE( blend->bboxes[1] ); for ( n = 0; n < num_designs; n++ ) { blend->privates [n] = 0; blend->font_infos[n] = 0; + blend->bboxes [n] = 0; } /* release weight vectors */ @@ -735,6 +740,18 @@ } break; + case T1_FIELD_LOCATION_BBOX: + dummy_object = &face->type1.font_bbox; + objects = &dummy_object; + max_objects = 0; + + if ( blend ) + { + objects = (void**)blend->bboxes; + max_objects = blend->num_designs; + } + break; + default: dummy_object = &face->type1; objects = &dummy_object; @@ -863,6 +880,7 @@ } +#if 0 static void parse_font_bbox( T1_Face face, T1_Loader loader ) @@ -878,6 +896,7 @@ bbox->xMax = FT_RoundFix( temp[2] ); bbox->yMax = FT_RoundFix( temp[3] ); } +#endif static void @@ -1464,7 +1483,9 @@ /* now add the special functions... */ T1_FIELD_CALLBACK( "FontName", parse_font_name ) +#if 0 T1_FIELD_CALLBACK( "FontBBox", parse_font_bbox ) +#endif T1_FIELD_CALLBACK( "FontMatrix", parse_font_matrix ) T1_FIELD_CALLBACK( "Encoding", parse_encoding ) T1_FIELD_CALLBACK( "Subrs", parse_subrs ) diff --git a/src/type1/t1tokens.h b/src/type1/t1tokens.h index 5f5d8ceef..dea50547b 100644 --- a/src/type1/t1tokens.h +++ b/src/type1/t1tokens.h @@ -69,5 +69,12 @@ T1_FIELD_NUM( "FontType", font_type ) T1_FIELD_NUM( "StrokeWidth", stroke_width ) +#undef FT_STRUCTURE +#define FT_STRUCTURE FT_BBox +#undef T1CODE +#define T1CODE T1_FIELD_LOCATION_BBOX + + T1_FIELD_BBOX("FontBBox", xMin ) + /* END */