Add CFF_CONFIG_OPTION_OLD_ENGINE configuration option.

This controls whether the old FreeType CFF engine gets compiled into
FreeType.  It is now disabled by default.

* devel/ftoption.h, include/freetype/config/ftoption.h
(CFF_CONFIG_OPTION_OLD_ENGINE): New macro.

* src/cff/cffdrivr.c (cff_property_set), src/cff/cffgload.c
(CFF_Operator, cff_argument_counts, cff_builder_add_point,
cff_operator_seac, cff_decoder_parse_charstrings, cff_slot_load),
src/cff/cffgload.h, src/cff/cffobjs.c (cff_driver_init): Use
CFF_CONFIG_OPTION_OLD_ENGINE to guard the affected code.

* docs/CHANGES: Updated.
This commit is contained in:
Werner Lemberg 2013-06-03 12:41:58 +02:00
parent f9cceeb4e3
commit 2429dc3d7c
9 changed files with 141 additions and 21 deletions

View File

@ -1,3 +1,21 @@
2013-06-03 Werner Lemberg <wl@gnu.org>
Add CFF_CONFIG_OPTION_OLD_ENGINE configuration option.
This controls whether the old FreeType CFF engine gets compiled into
FreeType. It is now disabled by default.
* devel/ftoption.h, include/freetype/config/ftoption.h
(CFF_CONFIG_OPTION_OLD_ENGINE): New macro.
* src/cff/cffdrivr.c (cff_property_set), src/cff/cffgload.c
(CFF_Operator, cff_argument_counts, cff_builder_add_point,
cff_operator_seac, cff_decoder_parse_charstrings, cff_slot_load),
src/cff/cffgload.h, src/cff/cffobjs.c (cff_driver_init): Use
CFF_CONFIG_OPTION_OLD_ENGINE to guard the affected code.
* docs/CHANGES: Updated.
2013-06-02 Werner Lemberg <wl@gnu.org> 2013-06-02 Werner Lemberg <wl@gnu.org>
Fix PNG library handling. Fix PNG library handling.

View File

@ -749,6 +749,25 @@ FT_BEGIN_HEADER
#undef T1_CONFIG_OPTION_NO_MM_SUPPORT #undef T1_CONFIG_OPTION_NO_MM_SUPPORT
/*************************************************************************/
/*************************************************************************/
/**** ****/
/**** C F F D R I V E R C O N F I G U R A T I O N ****/
/**** ****/
/*************************************************************************/
/*************************************************************************/
/*************************************************************************/
/* */
/* CFF_CONFIG_OPTION_OLD_ENGINE controls whether the pre-Adobe CFF */
/* engine gets compiled into FreeType. If defined, it is possible to */
/* switch between the two engines using the `hinting-engine' property of */
/* the cff driver module. */
/* */
/* #define CFF_CONFIG_OPTION_OLD_ENGINE */
/*************************************************************************/ /*************************************************************************/
/*************************************************************************/ /*************************************************************************/
/**** ****/ /**** ****/

View File

@ -21,11 +21,42 @@ CHANGES BETWEEN 2.4.12 and 2.5
Note that color bitmaps are converted to grayscale if client Note that color bitmaps are converted to grayscale if client
didn't ask for color. didn't ask for color.
- As announced in the previous release, the old FreeType CFF
engine is now disabled by default. It can be conditionally
compiled by defining the configuration macro
CFF_CONFIG_OPTION_OLD_ENGINE.
- As announced in the previous release, all code related to macro - As announced in the previous release, all code related to macro
FT_CONFIG_OPTION_OLD_INTERNALS has been removed, thus becoming FT_CONFIG_OPTION_OLD_INTERNALS has been removed, thus becoming
obsolete. obsolete.
II. MISCELLANEOUS
- The property API (`FT_Property_Get' and `FT_Property_Set') is
now declared as stable.
- `ftview' has been updated to support color embedded bitmaps; it
can be toggled on and off with key `c'.
- It is now possible to control the version of the TrueType
hinting engine using the new `interpreter-version' property of
the `truetype' module: Versions 35 and 38 (the default) are
supported, which roughly corresponds to disable and enable
subpixel hinting support, respectively.
In both `ftview' and `ftdiff', switching between the two
versions can be done with key `H'. In the `ftbench' demo
program, command line option `-H' has been extended to activate
the non-default interpreter version.
- Another round of TrueType subpixel hinting fixes.
- The `apinames' tool can now create an import file for NetWare.
- 64bit compilation of the new CFF engine was buggy.
====================================================================== ======================================================================
CHANGES BETWEEN 2.4.11 and 2.4.12 CHANGES BETWEEN 2.4.11 and 2.4.12

View File

@ -749,6 +749,25 @@ FT_BEGIN_HEADER
#undef T1_CONFIG_OPTION_NO_MM_SUPPORT #undef T1_CONFIG_OPTION_NO_MM_SUPPORT
/*************************************************************************/
/*************************************************************************/
/**** ****/
/**** C F F D R I V E R C O N F I G U R A T I O N ****/
/**** ****/
/*************************************************************************/
/*************************************************************************/
/*************************************************************************/
/* */
/* CFF_CONFIG_OPTION_OLD_ENGINE controls whether the pre-Adobe CFF */
/* engine gets compiled into FreeType. If defined, it is possible to */
/* switch between the two engines using the `hinting-engine' property of */
/* the cff driver module. */
/* */
#define CFF_CONFIG_OPTION_OLD_ENGINE
/*************************************************************************/ /*************************************************************************/
/*************************************************************************/ /*************************************************************************/
/**** ****/ /**** ****/

View File

@ -61,11 +61,12 @@ FT_BEGIN_HEADER
* *
* @description: * @description:
* Thanks to Adobe, which contributed a new hinting (and parsing) * Thanks to Adobe, which contributed a new hinting (and parsing)
* engine, an application can select between `freetype' and `adobe'. * engine, an application can select between `freetype' and `adobe' if
* compiled with CFF_CONFIG_OPTION_OLD_ENGINE. If this configuration
* macro isn't defined, `hinting-engine' does nothing.
* *
* Right now, the default engine is `freetype'. However, this will * The default engine is `freetype' if CFF_CONFIG_OPTION_OLD_ENGINE is
* change: After a certain time of intensive testing it is planned to * defined, and `adobe' otherwise.
* make `adobe' the default due to its superior rendering results.
* *
* The following example code demonstrates how to select Adobe's hinting * The following example code demonstrates how to select Adobe's hinting
* engine (omitting the error handling). * engine (omitting the error handling).

View File

@ -38,6 +38,7 @@
#include FT_SERVICE_XFREE86_NAME_H #include FT_SERVICE_XFREE86_NAME_H
#include FT_SERVICE_GLYPH_DICT_H #include FT_SERVICE_GLYPH_DICT_H
#include FT_SERVICE_PROPERTIES_H #include FT_SERVICE_PROPERTIES_H
#include FT_CFF_DRIVER_H
/*************************************************************************/ /*************************************************************************/
@ -590,7 +591,12 @@
FT_UInt* hinting_engine = (FT_UInt*)value; FT_UInt* hinting_engine = (FT_UInt*)value;
driver->hinting_engine = *hinting_engine; #ifndef CFF_CONFIG_OPTION_OLD_ENGINE
if ( *hinting_engine != FT_CFF_HINTING_ADOBE )
error = FT_ERR( Unimplemented_Feature );
else
#endif
driver->hinting_engine = *hinting_engine;
return error; return error;
} }

View File

@ -41,6 +41,8 @@
#define FT_COMPONENT trace_cffgload #define FT_COMPONENT trace_cffgload
#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
typedef enum CFF_Operator_ typedef enum CFF_Operator_
{ {
cff_op_unknown = 0, cff_op_unknown = 0,
@ -211,6 +213,8 @@
2 /* setcurrentpoint */ 2 /* setcurrentpoint */
}; };
#endif /* CFF_CONFIG_OPTION_OLD_ENGINE */
/*************************************************************************/ /*************************************************************************/
/*************************************************************************/ /*************************************************************************/
@ -485,23 +489,25 @@
if ( builder->load_points ) if ( builder->load_points )
{ {
CFF_Driver driver = (CFF_Driver)FT_FACE_DRIVER( builder->face );
FT_Vector* point = outline->points + outline->n_points; FT_Vector* point = outline->points + outline->n_points;
FT_Byte* control = (FT_Byte*)outline->tags + outline->n_points; FT_Byte* control = (FT_Byte*)outline->tags + outline->n_points;
#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
CFF_Driver driver = (CFF_Driver)FT_FACE_DRIVER( builder->face );
if ( driver->hinting_engine == FT_CFF_HINTING_ADOBE )
if ( driver->hinting_engine == FT_CFF_HINTING_FREETYPE )
{
point->x = x >> 16;
point->y = y >> 16;
}
else
#endif
{ {
/* cf2_decoder_parse_charstrings uses 16.16 coordinates */ /* cf2_decoder_parse_charstrings uses 16.16 coordinates */
point->x = x >> 10; point->x = x >> 10;
point->y = y >> 10; point->y = y >> 10;
} }
else
{
point->x = x >> 16;
point->y = y >> 16;
}
*control = (FT_Byte)( flag ? FT_CURVE_TAG_ON : FT_CURVE_TAG_CUBIC ); *control = (FT_Byte)( flag ? FT_CURVE_TAG_ON : FT_CURVE_TAG_CUBIC );
} }
@ -722,6 +728,8 @@
} }
#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
static FT_Error static FT_Error
cff_operator_seac( CFF_Decoder* decoder, cff_operator_seac( CFF_Decoder* decoder,
FT_Pos asb, FT_Pos asb,
@ -2518,6 +2526,8 @@
return FT_THROW( Stack_Overflow ); return FT_THROW( Stack_Overflow );
} }
#endif /* CFF_CONFIG_OPTION_OLD_ENGINE */
/*************************************************************************/ /*************************************************************************/
/*************************************************************************/ /*************************************************************************/
@ -2794,7 +2804,10 @@
glyph->root.format = FT_GLYPH_FORMAT_OUTLINE; /* by default */ glyph->root.format = FT_GLYPH_FORMAT_OUTLINE; /* by default */
{ {
#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
CFF_Driver driver = (CFF_Driver)FT_FACE_DRIVER( face ); CFF_Driver driver = (CFF_Driver)FT_FACE_DRIVER( face );
#endif
FT_Byte* charstring; FT_Byte* charstring;
FT_ULong charstring_len; FT_ULong charstring_len;
@ -2819,19 +2832,26 @@
if ( error ) if ( error )
goto Glyph_Build_Finished; goto Glyph_Build_Finished;
#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
/* choose which CFF renderer to use */ /* choose which CFF renderer to use */
if ( driver->hinting_engine == FT_CFF_HINTING_ADOBE ) if ( driver->hinting_engine == FT_CFF_HINTING_FREETYPE )
error = cff_decoder_parse_charstrings( &decoder,
charstring,
charstring_len );
else
#endif
{
error = cf2_decoder_parse_charstrings( &decoder, error = cf2_decoder_parse_charstrings( &decoder,
charstring, charstring,
charstring_len ); charstring_len );
/* Adobe's engine uses 16.16 numbers everywhere; */ /* Adobe's engine uses 16.16 numbers everywhere; */
/* as a consequence, glyphs larger than 2000ppem get rejected */ /* as a consequence, glyphs larger than 2000ppem get rejected */
if ( FT_ERR_EQ( error, Glyph_Too_Big ) || if ( FT_ERR_EQ( error, Glyph_Too_Big ) )
driver->hinting_engine == FT_CFF_HINTING_FREETYPE ) {
error = cff_decoder_parse_charstrings( &decoder, /* XXX to be implemented */
charstring, }
charstring_len ); }
cff_free_glyph_data( face, &charstring, charstring_len ); cff_free_glyph_data( face, &charstring, charstring_len );

View File

@ -218,10 +218,12 @@ FT_BEGIN_HEADER
#endif /* 0 */ #endif /* 0 */
#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
FT_LOCAL( FT_Error ) FT_LOCAL( FT_Error )
cff_decoder_parse_charstrings( CFF_Decoder* decoder, cff_decoder_parse_charstrings( CFF_Decoder* decoder,
FT_Byte* charstring_base, FT_Byte* charstring_base,
FT_ULong charstring_len ); FT_ULong charstring_len );
#endif
FT_LOCAL( FT_Error ) FT_LOCAL( FT_Error )
cff_slot_load( CFF_GlyphSlot glyph, cff_slot_load( CFF_GlyphSlot glyph,

View File

@ -1056,7 +1056,11 @@
/* set default property values */ /* set default property values */
#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
driver->hinting_engine = FT_CFF_HINTING_FREETYPE; driver->hinting_engine = FT_CFF_HINTING_FREETYPE;
#else
driver->hinting_engine = FT_CFF_HINTING_ADOBE;
#endif
driver->no_stem_darkening = FALSE; driver->no_stem_darkening = FALSE;
return FT_Err_Ok; return FT_Err_Ok;