ref: b79b5133803371d7db88135cdafd2af8da2b2d78
parent: ce34d122ba03b4a5b2c55a7ccb376dc1911caa37
author: Werner Lemberg <[email protected]>
date: Tue Dec 20 07:01:58 EST 2005
Formatting, improving comments.
--- a/ChangeLog
+++ b/ChangeLog
@@ -18,33 +18,65 @@
2005-12-13 David Turner <[email protected]>
- * 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 <[email protected]>
--- a/docs/CHANGES
+++ b/docs/CHANGES
@@ -14,8 +14,8 @@
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
--- a/include/freetype/config/ftoption.h
+++ b/include/freetype/config/ftoption.h
@@ -493,10 +493,11 @@
/*************************************************************************/
/* */
- /* 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
+
/*************************************************************************/
/*************************************************************************/
--- 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, */
--- a/include/freetype/internal/tttypes.h
+++ b/include/freetype/internal/tttypes.h
@@ -848,7 +848,7 @@
/*************************************************************************/
/*** ***/
/*** ***/
- /*** EMBEDDED BDF PROPERTIES TABLE SUPPORT ***/
+ /*** EMBEDDED BDF PROPERTIES TABLE SUPPORT ***/
/*** ***/
/*** ***/
/*************************************************************************/
@@ -855,52 +855,56 @@
/*************************************************************************/
/*************************************************************************/
-/* 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 @@
#endif
#ifdef TT_CONFIG_OPTION_BDF
- TT_BDFRec bdf;
+ TT_BDFRec bdf;
#endif /* TT_CONFIG_OPTION_BDF */
/***********************************************************************/
--- 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;
--- 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[] =
{
--- 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 */
--- 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;
+ TT_BDF bdf = &face->bdf;
- if ( bdf->table != NULL )
- FT_FRAME_RELEASE( bdf->table );
- bdf->table_end = NULL;
- bdf->strings = NULL;
- bdf->strings_size = 0;
- }
-}
+ if ( bdf->loaded )
+ {
+ FT_Stream stream = FT_FACE(face)->stream;
-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;
+ if ( bdf->table != NULL )
+ FT_FRAME_RELEASE( bdf->table );
- 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 = NULL;
+ bdf->strings = NULL;
+ bdf->strings_size = 0;
+ }
}
- bdf->table_end = bdf->table + length;
+ static FT_Error
+ tt_face_load_bdf_props( TT_Face face,
+ FT_Stream stream )
{
- 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);
+ TT_BDF bdf = &face->bdf;
+ FT_ULong length;
+ FT_Error error;
- if ( version != 0x0001 ||
- strings < 8 ||
- (strings-8)/4 < num_strikes ||
- strings+1 > length )
+
+ 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;
- /* 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);
+ 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 );
- /* we don't need to check the value sets themselves, since this
- * is done later
- */
- strike += 10*num_items;
- p += 4;
+ 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;
}
- if ( strike > bdf->strings )
- goto BadTable;
- }
+ /* check the strike descriptors */
+ {
+ FT_UInt count = bdf->num_strikes;
+ FT_Byte* p = bdf->table + 8;
+ FT_Byte* strike = p + count * 4;
- bdf->loaded = 1;
-Exit:
- return error;
-}
+ 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;
-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;
+ p += 4;
+ }
- aprop->type = BDF_PROPERTY_TYPE_NONE;
+ if ( strike > bdf->strings )
+ goto BadTable;
+ }
- if ( bdf->loaded == 0 )
- {
- error = tt_face_load_bdf_props( face, FT_FACE(face)->stream );
- if ( error )
- goto Exit;
+ bdf->loaded = 1;
+
+ Exit:
+ return error;
}
- count = bdf->num_strikes;
- p = bdf->table + 8;
- strike = p + 4*count;
- error = FT_Err_Invalid_Argument;
+ 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;
- if ( size == NULL || property_name == NULL )
- goto Exit;
- property_len = ft_strlen( property_name );
- if ( property_len == 0 )
- goto Exit;
+ aprop->type = BDF_PROPERTY_TYPE_NONE;
- for ( ; count > 0; count-- )
- {
- FT_UInt _ppem = FT_NEXT_USHORT(p);
- FT_UInt _count = FT_NEXT_USHORT(p);
-
- if ( _ppem == size->metrics.y_ppem )
+ if ( bdf->loaded == 0 )
{
- count = _count;
- goto FoundStrike;
+ error = tt_face_load_bdf_props( face, FT_FACE( face )->stream );
+ if ( error )
+ goto Exit;
}
- strike += 10*_count;
- }
- goto Exit;
+ count = bdf->num_strikes;
+ p = bdf->table + 8;
+ strike = p + 4 * count;
-FoundStrike:
- p = strike;
- for ( ; count > 0; count-- )
- {
- FT_UInt type = FT_PEEK_USHORT(p+4);
+ error = FT_Err_Invalid_Argument;
- if ( (type & 0x10) != 0 )
+ 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_UInt32 name_offset = FT_PEEK_ULONG(p);
- FT_UInt32 value = FT_PEEK_ULONG(p+6);
+ FT_UInt _ppem = FT_NEXT_USHORT( p );
+ FT_UInt _count = FT_NEXT_USHORT( p );
- /* 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 @@
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 @@
default:
;
+ }
}
}
+ p += 10;
}
- p += 10;
+
+ Exit:
+ return error;
}
-Exit:
- return error;
-}
-
#endif /* TT_CONFIG_OPTION_BDF */
+
+
+/* END */
\ No newline at end of file