diff --git a/ChangeLog b/ChangeLog index 7547942b3..6bdc065d8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -18,33 +18,65 @@ 2005-12-13 David Turner - * src/autofit/aflatin.c, src/autofit/afhints.c: changed the - implementation of the LIGHT hinting mode to completely disable - horizontal hinting. This is an experimental effort to integrate - David Chester's latest patch without fucking the other hinting - modes as well. + Change the implementation of the LIGHT hinting mode to completely + disable horizontal hinting. This is an experimental effort to + integrate David Chester's latest patch without affecting the other + hinting modes as well. - Note that this doesn't force auto-hinting for all fonts however. + Note that this doesn't force auto-hinting for all fonts, however. - * Jamfile: small fix to ensure that ftexport.sym is placed in the - same location than other generated objects (i.e. within the 'objs' - directory of the current dir) + * src/autofit/afhints.c (af_glyph_hints_reload): Don't set + scaler_fiags here but... + (af_glyph_hints_rescale): Here. - * include/freetype/config/ftoption.h, - include/freetype/config/ftstdlib.h, - include/freetype/internal/tttypes.h, - src/sfnt/Jamfile, src/sfnt/rules.mk, src/sfnt/sfdriver.c, - src/sfnt/ttbdf.h, src/sfnt/ttbdf.c, src/sfnt/sfobjs.c: + * src/autofit/aflatin.c (af_latin_hints_init): Disable horizontal + hinting for `light' hinting mode. - Added support for an embedded 'BDF ' table within SFNT-based - bitmap font files. This is used to store atoms & properties from - the original BDF fonts that were used to generate the font file. - the feature is controled by TT_CONFIG_OPTION_BDF within 'ftoption.h' - and is used to implement FT_Get_BDF_Property for these font files. + * Jamfile: Small fix to ensure that ftexport.sym is placed into the + same location as other generated objects (i.e., within the `objs' + directory of the current directory). - At the moment, this is still experimental, the BDF table format isn't - cast into stone yet. + + Add support for an embedded `BDF ' table within SFNT-based bitmap + font files. This is used to store atoms & properties from the + original BDF fonts that were used to generate the font file. + + The feature is controlled by TT_CONFIG_OPTION_BDF within + `ftoption.h' and is used to implement FT_Get_BDF_Property for these + font files. + + At the moment, this is still experimental, the BDF table format + isn't cast into stone yet. + + * include/freetype/config/ftoption.h (TT_CONFIG_OPTION_BDF): New + macro. + + * include/freetype/config/ftstdlib.h (ft_memchr): New macro. + + * include/freetype/internal/tttypes.h (TT_BDFRec, TT_BDF) + [TT_CONFIG_OPTION_BDF]: New structure. + (TT_FaceRec) [TT_CONFIG_OPTION_BDF]: New member `bdf'. + + * include/freetype/ttags.h (TTAG_BDF): New macro. + + * src/sfnt/Jamfile (_sources): Add ttbdf. + + * src/sfnt/rules.mk (SFNT_DRV_SRC): Add ttbdf.c. + + * src/sfnt/sfdriver.c [TT_CONFIG_OPTION_BDF]: Include ttbdf.h and + FT_SERVICE_BDF_H. + (sfnt_get_charset_it) [TT_CONFIG_OPTION_BDF]: New function. + (sfnt_service_bdf) [TT_CONFIG_OPTION_BDF]: New service. + (sfnt_servives) [TT_CONFIG_OPTION_BDF]: Add sfnt_service_bdf. + + * src/sfnt/sfnt.c [TT_CONFIG_OPTION_BDF]: Include ttbdf.c. + + * src/sfnt/sfobjs.c [TT_CONFIG_OPTION_BDF]: Include ttbdf.h. + (sfnt_done_face) [TT_CONFIG_OPTION_BDF]: Call + tt_face_free_bdf_props. + + * src/sfnt/ttbdf.h, src/sfnt/ttbdf.c: New files. 2005-12-07 Werner Lemberg diff --git a/docs/CHANGES b/docs/CHANGES index 37ed7ebad..092387f89 100644 --- a/docs/CHANGES +++ b/docs/CHANGES @@ -14,8 +14,8 @@ LATEST CHANGES BETWEEN 2.2.0 and 2.1.10 II. IMPORTANT CHANGES - - Face metrics (face->size->metrics) and glyph metrics are no - longer rounded. If you do not round in your applications too, + - Face metrics (face->size->metrics) and glyph metrics are no + longer rounded. If you do not round in your applications too, you may find glyphs become blurry. - A new API `FT_TrueTypeGX_Validate' (in FT_GX_VALIDATE_H) has diff --git a/include/freetype/config/ftoption.h b/include/freetype/config/ftoption.h index fcd142eb0..74b6b6648 100644 --- a/include/freetype/config/ftoption.h +++ b/include/freetype/config/ftoption.h @@ -493,11 +493,12 @@ FT_BEGIN_HEADER /*************************************************************************/ /* */ - /* Define TT_CONFIG_OPTION_BDF if upi want to include support for */ - /* an embedded 'BDF' table within SFNT-based bitmap formats. */ + /* Define TT_CONFIG_OPTION_BDF if you want to include support for */ + /* an embedded `BDF ' table within SFNT-based bitmap formats. */ /* */ #define TT_CONFIG_OPTION_BDF + /*************************************************************************/ /*************************************************************************/ /**** ****/ diff --git a/include/freetype/config/ftstdlib.h b/include/freetype/config/ftstdlib.h index 2839e15b4..1e9eaf8ff 100644 --- a/include/freetype/config/ftstdlib.h +++ b/include/freetype/config/ftstdlib.h @@ -5,7 +5,7 @@ /* ANSI-specific library and header configuration file (specification */ /* only). */ /* */ -/* Copyright 2002, 2003, 2004 by */ +/* Copyright 2002, 2003, 2004, 2005 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ diff --git a/include/freetype/internal/tttypes.h b/include/freetype/internal/tttypes.h index 368ab68f4..3d951c799 100644 --- a/include/freetype/internal/tttypes.h +++ b/include/freetype/internal/tttypes.h @@ -848,59 +848,63 @@ FT_BEGIN_HEADER /*************************************************************************/ /*** ***/ /*** ***/ - /*** EMBEDDED BDF PROPERTIES TABLE SUPPORT ***/ + /*** EMBEDDED BDF PROPERTIES TABLE SUPPORT ***/ /*** ***/ /*** ***/ /*************************************************************************/ /*************************************************************************/ /*************************************************************************/ -/* these types are used to support a 'BDF' table that isn't part of the - * official TrueType specification. It is mainly used in SFNT-based bitmap - * fonts that were generated from a set of BDF fonts - * - * the format of the table is the following: - * - * USHORT version 'BDF' table version number, should be 0x0001 - * USHORT strikeCount number of strikes (bitmap sizes) in this table - * ULONG stringTable offset (froms start of BDF table) to string table - * - * followed by an array of 'strikeCount' descriptors that look like: - * - * USHORT ppem vertical pixels per EM for this strike - * USHORT numItems number of items for this strike (properties and - * atoms), max is 255 - * - * this array is followed by 'strikeCount' value sets. Each "value set" - * is an array of 'numItems' items that look like the following: - * - * ULONG item_name offset in string table to item name - * USHORT item_type 0 => string (e.g. COMMENT) - * 1 => atom (e.g. FONT or even SIZE) - * 2 => int32 - * 3 => uint32 - * 0x10 => flag for properties, ored with above values - * - * ULONG item_value for strings => offset in string table without - * the corresponding double quotes - * - * atoms => offset in string table - * - * integers => direct value - * - * all strings in the string table are 8-bit, zero-terminated - */ + /* + * These types are used to support a `BDF ' table that isn't part of the + * official TrueType specification. It is mainly used in SFNT-based + * bitmap fonts that were generated from a set of BDF fonts. + * + * The format of the table is as follows. + * + * USHORT version `BDF ' table version number, should be 0x0001. + * USHORT strikeCount Number of strikes (bitmap sizes) in this table. + * ULONG stringTable Offset (froms start of BDF table) to string + * table. + * + * This is followed by an array of `strikeCount' descriptors, having the + * following format. + * + * USHORT ppem Vertical pixels per EM for this strike. + * USHORT numItems Number of items for this strike (properties and + * atoms). Maximum is 255. + * + * This array in turn is followed by `strikeCount' value sets. Each + * `value set' is an array of `numItems' items with the following format. + * + * ULONG item_name Offset in string table to item name. + * USHORT item_type The item type. Possible values are + * 0 => string (e.g., COMMENT) + * 1 => atom (e.g., FONT or even SIZE) + * 2 => int32 + * 3 => uint32 + * 0x10 => A flag to indicate a properties. This + * is ORed with the above values. + * ULONG item_value For strings => Offset into string table without + * the corresponding double quotes. + * For atoms => Offset into string table. + * For integers => Direct value. + * + * All strings in the string table consist of bytes and are + * zero-terminated. + * + */ #ifdef TT_CONFIG_OPTION_BDF - typedef struct TT_BDFRec_ + typedef struct TT_BDFRec_ { - FT_Byte* table; - FT_Byte* table_end; - FT_Byte* strings; - FT_UInt32 strings_size; - FT_UInt num_strikes; - FT_Bool loaded; + FT_Byte* table; + FT_Byte* table_end; + FT_Byte* strings; + FT_UInt32 strings_size; + FT_UInt num_strikes; + FT_Bool loaded; } TT_BDFRec, *TT_BDF; @@ -1405,7 +1409,7 @@ FT_BEGIN_HEADER #endif #ifdef TT_CONFIG_OPTION_BDF - TT_BDFRec bdf; + TT_BDFRec bdf; #endif /* TT_CONFIG_OPTION_BDF */ /***********************************************************************/ diff --git a/src/autofit/aflatin.c b/src/autofit/aflatin.c index 8b6255763..0f17cc220 100644 --- a/src/autofit/aflatin.c +++ b/src/autofit/aflatin.c @@ -1308,7 +1308,7 @@ hints->y_scale = metrics->axis[AF_DIMENSION_VERT].scale; hints->y_delta = metrics->axis[AF_DIMENSION_VERT].delta; - /* compute flags depending on render mode, etc... */ + /* compute flags depending on render mode, etc. */ mode = metrics->root.scaler.render_mode; scaler_flags = hints->scaler_flags; @@ -1337,7 +1337,8 @@ if ( mode == FT_RENDER_MODE_MONO ) other_flags |= AF_LATIN_HINTS_MONO; - /* in 'light' hinting mode, we disable horizontal hinting completely + /* + * In `light' hinting mode we disable horizontal hinting completely. */ if ( mode == FT_RENDER_MODE_LIGHT ) scaler_flags |= AF_SCALER_FLAG_NO_HORIZONTAL; diff --git a/src/sfnt/sfdriver.c b/src/sfnt/sfdriver.c index c7fc71302..feb767e00 100644 --- a/src/sfnt/sfdriver.c +++ b/src/sfnt/sfdriver.c @@ -289,15 +289,15 @@ }; - /* - * TT CMAP INFO - * - */ + /* + * TT CMAP INFO + */ static const FT_Service_TTCMapsRec tt_service_get_cmap_info = { (TT_CMap_Info_GetFunc)tt_get_cmap_info }; + #ifdef TT_CONFIG_OPTION_BDF static FT_Error @@ -305,15 +305,16 @@ const char* *acharset_encoding, const char* *acharset_registry ) { - BDF_PropertyRec encoding, registry; - FT_Error error; + BDF_PropertyRec encoding, registry; + FT_Error error; - /* XXX: I don't know if this is correct, since tt_face_find_bdf_prop - * will only return something correct if we have previously - * selected a size that is listed in the BDF table. - * should we change the BDF table format to include single - * offsets for "CHARSET_REGISTRY" and "CHARSET_ENCODING" ? - */ + + /* XXX: I don't know whether this is correct, since + * tt_face_find_bdf_prop only returns something correct if we have + * previously selected a size that is listed in the BDF table. + * Should we change the BDF table format to include single offsets + * for `CHARSET_REGISTRY' and `CHARSET_ENCODING'? + */ error = tt_face_find_bdf_prop( face, "CHARSET_REGISTRY", ®istry ); if ( !error ) { @@ -344,10 +345,9 @@ #endif /* TT_CONFIG_OPTION_BDF */ - /* - * SERVICE LIST - * - */ + /* + * SERVICE LIST + */ static const FT_ServiceDescRec sfnt_services[] = { diff --git a/src/sfnt/sfobjs.c b/src/sfnt/sfobjs.c index ba3194a48..6ffc5a2f1 100644 --- a/src/sfnt/sfobjs.c +++ b/src/sfnt/sfobjs.c @@ -31,6 +31,7 @@ #include "ttbdf.h" #endif + /*************************************************************************/ /* */ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ diff --git a/src/sfnt/ttbdf.c b/src/sfnt/ttbdf.c index 0e679c672..aa08b9062 100644 --- a/src/sfnt/ttbdf.c +++ b/src/sfnt/ttbdf.c @@ -24,6 +24,7 @@ #include "sferrors.h" + #ifdef TT_CONFIG_OPTION_BDF /*************************************************************************/ @@ -35,168 +36,176 @@ #undef FT_COMPONENT #define FT_COMPONENT trace_ttbdf -FT_LOCAL_DEF( void ) -tt_face_free_bdf_props( TT_Face face ) -{ - TT_BDF bdf = &face->bdf; - if ( bdf->loaded ) + FT_LOCAL_DEF( void ) + tt_face_free_bdf_props( TT_Face face ) { - FT_Stream stream = FT_FACE(face)->stream; - - if ( bdf->table != NULL ) - FT_FRAME_RELEASE( bdf->table ); - - bdf->table_end = NULL; - bdf->strings = NULL; - bdf->strings_size = 0; - } -} + TT_BDF bdf = &face->bdf; -static FT_Error -tt_face_load_bdf_props( TT_Face face, - FT_Stream stream ) -{ - TT_BDF bdf = &face->bdf; - FT_ULong length; - FT_Error error; - - FT_ZERO( bdf ); - - error = tt_face_goto_table( face, TTAG_BDF, stream, &length ); - if ( error || - length < 8 || - FT_FRAME_EXTRACT( length, bdf->table ) ) - { - error = FT_Err_Invalid_Table; - goto Exit; - } - - bdf->table_end = bdf->table + length; - - { - FT_Byte* p = bdf->table; - FT_UInt version = FT_NEXT_USHORT(p); - FT_UInt num_strikes = FT_NEXT_USHORT(p); - FT_UInt32 strings = FT_NEXT_ULONG(p); - - if ( version != 0x0001 || - strings < 8 || - (strings-8)/4 < num_strikes || - strings+1 > length ) + if ( bdf->loaded ) + { + FT_Stream stream = FT_FACE(face)->stream; + + + if ( bdf->table != NULL ) + FT_FRAME_RELEASE( bdf->table ); + + bdf->table_end = NULL; + bdf->strings = NULL; + bdf->strings_size = 0; + } + } + + + static FT_Error + tt_face_load_bdf_props( TT_Face face, + FT_Stream stream ) + { + TT_BDF bdf = &face->bdf; + FT_ULong length; + FT_Error error; + + + FT_ZERO( bdf ); + + error = tt_face_goto_table( face, TTAG_BDF, stream, &length ); + if ( error || + length < 8 || + FT_FRAME_EXTRACT( length, bdf->table ) ) { - BadTable: - FT_FRAME_RELEASE( bdf->table ); - FT_ZERO( bdf ); error = FT_Err_Invalid_Table; goto Exit; } - bdf->num_strikes = num_strikes; - bdf->strings = bdf->table + strings; - bdf->strings_size = length - strings; + bdf->table_end = bdf->table + length; + + { + FT_Byte* p = bdf->table; + FT_UInt version = FT_NEXT_USHORT( p ); + FT_UInt num_strikes = FT_NEXT_USHORT( p ); + FT_UInt32 strings = FT_NEXT_ULONG ( p ); + + + if ( version != 0x0001 || + strings < 8 || + ( strings - 8 ) / 4 < num_strikes || + strings + 1 > length ) + { + BadTable: + FT_FRAME_RELEASE( bdf->table ); + FT_ZERO( bdf ); + error = FT_Err_Invalid_Table; + goto Exit; + } + + bdf->num_strikes = num_strikes; + bdf->strings = bdf->table + strings; + bdf->strings_size = length - strings; + } + + /* check the strike descriptors */ + { + FT_UInt count = bdf->num_strikes; + FT_Byte* p = bdf->table + 8; + FT_Byte* strike = p + count * 4; + + + for ( ; count > 0; count-- ) + { + FT_UInt num_items = FT_PEEK_USHORT( p + 2 ); + + /* + * We don't need to check the value sets themselves, since this + * is done later. + */ + strike += 10 * num_items; + + p += 4; + } + + if ( strike > bdf->strings ) + goto BadTable; + } + + bdf->loaded = 1; + + Exit: + return error; } - /* check the strike descriptors - */ + + FT_LOCAL_DEF( FT_Error ) + tt_face_find_bdf_prop( TT_Face face, + const char* property_name, + BDF_PropertyRec *aprop ) { - FT_UInt count = bdf->num_strikes; - FT_Byte* p = bdf->table + 8; - FT_Byte* strike = p + count*4; + TT_BDF bdf = &face->bdf; + FT_Size size = FT_FACE(face)->size; + FT_Error error = 0; + FT_Byte* p; + FT_UInt count; + FT_Byte* strike; + FT_UInt property_len; + + + aprop->type = BDF_PROPERTY_TYPE_NONE; + + if ( bdf->loaded == 0 ) + { + error = tt_face_load_bdf_props( face, FT_FACE( face )->stream ); + if ( error ) + goto Exit; + } + + count = bdf->num_strikes; + p = bdf->table + 8; + strike = p + 4 * count; + + error = FT_Err_Invalid_Argument; + + if ( size == NULL || property_name == NULL ) + goto Exit; + + property_len = ft_strlen( property_name ); + if ( property_len == 0 ) + goto Exit; for ( ; count > 0; count-- ) { - FT_UInt num_items = FT_PEEK_USHORT(p+2); + FT_UInt _ppem = FT_NEXT_USHORT( p ); + FT_UInt _count = FT_NEXT_USHORT( p ); - /* we don't need to check the value sets themselves, since this - * is done later - */ - strike += 10*num_items; - - p += 4; - } - - if ( strike > bdf->strings ) - goto BadTable; - } - - bdf->loaded = 1; - -Exit: - return error; -} - - -FT_LOCAL_DEF( FT_Error ) -tt_face_find_bdf_prop( TT_Face face, - const char* property_name, - BDF_PropertyRec *aprop ) -{ - TT_BDF bdf = &face->bdf; - FT_Size size = FT_FACE(face)->size; - FT_Error error = 0; - FT_Byte* p; - FT_UInt count; - FT_Byte* strike; - FT_UInt property_len; - - aprop->type = BDF_PROPERTY_TYPE_NONE; - - if ( bdf->loaded == 0 ) - { - error = tt_face_load_bdf_props( face, FT_FACE(face)->stream ); - if ( error ) - goto Exit; - } - - count = bdf->num_strikes; - p = bdf->table + 8; - strike = p + 4*count; - - error = FT_Err_Invalid_Argument; - - if ( size == NULL || property_name == NULL ) - goto Exit; - - property_len = ft_strlen( property_name ); - if ( property_len == 0 ) - goto Exit; - - for ( ; count > 0; count-- ) - { - FT_UInt _ppem = FT_NEXT_USHORT(p); - FT_UInt _count = FT_NEXT_USHORT(p); - - if ( _ppem == size->metrics.y_ppem ) - { - count = _count; - goto FoundStrike; - } - - strike += 10*_count; - } - goto Exit; - -FoundStrike: - p = strike; - for ( ; count > 0; count-- ) - { - FT_UInt type = FT_PEEK_USHORT(p+4); - - if ( (type & 0x10) != 0 ) - { - FT_UInt32 name_offset = FT_PEEK_ULONG(p); - FT_UInt32 value = FT_PEEK_ULONG(p+6); - - /* be a bit paranoid for invalid entries here */ - if ( name_offset < bdf->strings_size && - property_len < bdf->strings_size - name_offset && - ft_strncmp( property_name, (const char*)bdf->strings + name_offset, - bdf->strings_size - name_offset ) == 0 ) + if ( _ppem == size->metrics.y_ppem ) { - switch ( type & 0x0F ) + count = _count; + goto FoundStrike; + } + + strike += 10 * _count; + } + goto Exit; + + FoundStrike: + p = strike; + for ( ; count > 0; count-- ) + { + FT_UInt type = FT_PEEK_USHORT( p + 4 ); + + if ( ( type & 0x10 ) != 0 ) + { + FT_UInt32 name_offset = FT_PEEK_ULONG( p ); + FT_UInt32 value = FT_PEEK_ULONG( p + 6 ); + + /* be a bit paranoid for invalid entries here */ + if ( name_offset < bdf->strings_size && + property_len < bdf->strings_size - name_offset && + ft_strncmp( property_name, + (const char*)bdf->strings + name_offset, + bdf->strings_size - name_offset ) == 0 ) { + switch ( type & 0x0F ) + { case 0x00: /* string */ case 0x01: /* atoms */ /* check that the content is really 0-terminated */ @@ -204,7 +213,7 @@ FoundStrike: ft_memchr( bdf->strings + value, 0, bdf->strings_size ) ) { aprop->type = BDF_PROPERTY_TYPE_ATOM; - aprop->u.atom = (const char*) bdf->strings + value; + aprop->u.atom = (const char*)bdf->strings + value; error = 0; goto Exit; } @@ -224,14 +233,17 @@ FoundStrike: default: ; + } } } + p += 10; } - p += 10; + + Exit: + return error; } -Exit: - return error; -} - #endif /* TT_CONFIG_OPTION_BDF */ + + +/* END */ \ No newline at end of file