support for "automatic unpatented hinting" added

we still need to determine the list of "trick" CJK fonts
that are going to toggle the bytecode interpreter instead
of the auto-hinter
This commit is contained in:
David Turner 2006-08-25 22:45:13 +00:00
parent 088e44e877
commit 6aa260ce61
15 changed files with 102 additions and 52 deletions

View File

@ -594,6 +594,16 @@ FT_BEGIN_HEADER
#define FT_CONFIG_OPTION_OLD_INTERNALS
/*
* this variable is defined if either unpatented or native TrueType
* hinting is requested by the definitions above.
*/
#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
# define TT_USE_BYTECODE_INTERPRETER
#elif defined TT_CONFIG_OPTION_UNPATENTED_HINTING
# define TT_USE_BYTECODE_INTERPRETER
#endif
FT_END_HEADER

View File

@ -78,7 +78,7 @@ FT_BEGIN_HEADER
/*************************************************************************/
#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
#ifdef TT_USE_BYTECODE_INTERPRETER
/*************************************************************************/
/* */
@ -108,7 +108,7 @@ FT_BEGIN_HEADER
FT_Long b,
FT_Long c );
#endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */
#endif /* TT_USE_BYTECODE_INTERPRETER */
#define INT_TO_F26DOT6( x ) ( (FT_Long)(x) << 6 )

View File

@ -211,6 +211,27 @@ FT_BEGIN_HEADER
/* this data when first opened. This field exists only if */
/* @FT_CONFIG_OPTION_INCREMENTAL is defined. */
/* */
/* force_autohing ::
/* this boolean flag is used to instruct the glyph loader to */
/* ignore the format-specific hinter, and use the auto-hinter */
/* instead to load all glyphs. */
/* */
/* if the unpatented bytecode interpreter was compiled withing */
/* the library then: */
/* */
/* - if this is one of the tricky Asian fonts, like Gulim, which */
/* absolutely require a bytecode interpreter to load anything */
/* properly, the flag will be set to FALSE */
/* */
/* - for other fonts, the flag will be set to TRUE, and the */
/* auto-hinter will be used to scale the glyphs. */
/* */
/* if the unpatented bytecode interpretr was *not* compiled */
/* within the librayr, the flag will always be FALSE */
/* */
/* the detection of "tricky" fonts is located in the TrueType */
/* face loader. */
/* */
typedef struct FT_Face_InternalRec_
{
#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
@ -227,6 +248,8 @@ FT_BEGIN_HEADER
FT_Incremental_InterfaceRec* incremental_interface;
#endif
FT_Bool force_autohint;
} FT_Face_InternalRec;
@ -621,7 +644,7 @@ FT_BEGIN_HEADER
/* Set this debug hook to a non-null pointer to force unpatented hinting */
/* for all faces when both TT_CONFIG_OPTION_BYTECODE_INTERPRETER and */
/* for all faces when both TT_USE_BYTECODE_INTERPRETER and */
/* TT_CONFIG_OPTION_UNPATENTED_HINTING are defined. this is only used */
/* during debugging. */
#define FT_DEBUG_HOOK_UNPATENTED_HINTING 1

View File

@ -159,7 +159,7 @@
}
#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
#ifdef TT_USE_BYTECODE_INTERPRETER
/* documentation is in ftcalc.h */
@ -183,7 +183,7 @@
return ( s > 0 ) ? d : -d;
}
#endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */
#endif /* TT_USE_BYTECODE_INTERPRETER */
/* documentation is in freetype.h */
@ -353,7 +353,7 @@
}
#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
#ifdef TT_USE_BYTECODE_INTERPRETER
FT_BASE_DEF( FT_Long )
FT_MulDiv_No_Round( FT_Long a,
@ -387,7 +387,7 @@
return ( s < 0 ? -a : a );
}
#endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */
#endif /* TT_USE_BYTECODE_INTERPRETER */
/* documentation is in freetype.h */

View File

@ -567,6 +567,9 @@
if ( FT_LOAD_TARGET_MODE( load_flags ) == FT_RENDER_MODE_LIGHT )
load_flags |= FT_LOAD_FORCE_AUTOHINT;
if ( face->internal->force_autohint )
load_flags |= FT_LOAD_FORCE_AUTOHINT;
/* auto-hinter is preferred and should be used */
if ( ( !FT_DRIVER_HAS_HINTER( driver ) ||
( load_flags & FT_LOAD_FORCE_AUTOHINT ) ) &&

View File

@ -24,7 +24,7 @@
#include "ttgload.c" /* glyph loader */
#include "ttobjs.c" /* object manager */
#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
#ifdef TT_USE_BYTECODE_INTERPRETER
#include "ttinterp.c"
#endif

View File

@ -294,7 +294,7 @@
static const FT_Service_TrueTypeEngineRec tt_service_truetype_engine =
{
#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
#ifdef TT_USE_BYTECODE_INTERPRETER
#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
FT_TRUETYPE_ENGINE_TYPE_UNPATENTED
@ -302,11 +302,11 @@
FT_TRUETYPE_ENGINE_TYPE_PATENTED
#endif
#else /* !TT_CONFIG_OPTION_BYTECODE_INTERPRETER */
#else /* !TT_USE_BYTECODE_INTERPRETER */
FT_TRUETYPE_ENGINE_TYPE_NONE
#endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */
#endif /* TT_USE_BYTECODE_INTERPRETER */
};
static const FT_ServiceDescRec tt_services[] =
@ -354,7 +354,7 @@
{
FT_MODULE_FONT_DRIVER |
FT_MODULE_DRIVER_SCALABLE |
#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
#ifdef TT_USE_BYTECODE_INTERPRETER
FT_MODULE_DRIVER_HAS_HINTER,
#else
0,

View File

@ -310,7 +310,7 @@
goto Fail;
}
#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
#ifdef TT_USE_BYTECODE_INTERPRETER
if ( IS_HINTED( load->load_flags ) )
{
@ -320,7 +320,7 @@
FT_MEM_COPY( load->exec->glyphIns, p, (FT_Long)n_ins );
}
#endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */
#endif /* TT_USE_BYTECODE_INTERPRETER */
p += n_ins;
@ -528,7 +528,7 @@
gloader->current.num_subglyphs = num_subglyphs;
#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
#ifdef TT_USE_BYTECODE_INTERPRETER
{
FT_Stream stream = loader->stream;
@ -599,14 +599,14 @@
TT_GlyphZone zone = &loader->zone;
FT_Pos origin;
#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
#ifdef TT_USE_BYTECODE_INTERPRETER
FT_UInt n_ins;
#else
FT_UNUSED( is_composite );
#endif
#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
#ifdef TT_USE_BYTECODE_INTERPRETER
n_ins = loader->glyph->control_len;
#endif
@ -615,7 +615,7 @@
if ( origin )
translate_array( zone->n_points, zone->cur, origin, 0 );
#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
#ifdef TT_USE_BYTECODE_INTERPRETER
/* save original point positioin in org */
if ( n_ins > 0 )
FT_ARRAY_COPY( zone->org, zone->cur, zone->n_points );
@ -627,7 +627,7 @@
zone->cur[zone->n_points - 1].y =
FT_PIX_ROUND( zone->cur[zone->n_points - 1].y );
#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
#ifdef TT_USE_BYTECODE_INTERPRETER
if ( n_ins > 0 )
{
@ -966,7 +966,7 @@
outline->tags[outline->n_points + 2] = 0;
outline->tags[outline->n_points + 3] = 0;
#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
#ifdef TT_USE_BYTECODE_INTERPRETER
{
FT_Stream stream = loader->stream;
@ -1435,7 +1435,7 @@
loader->ins_pos = ins_pos;
if ( IS_HINTED( loader->load_flags ) &&
#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
#ifdef TT_USE_BYTECODE_INTERPRETER
subglyph->flags & WE_HAVE_INSTR &&
@ -1715,7 +1715,7 @@
FT_MEM_ZERO( loader, sizeof ( TT_LoaderRec ) );
#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
#ifdef TT_USE_BYTECODE_INTERPRETER
/* load execution context */
{
@ -1746,7 +1746,7 @@
loader->instructions = exec->glyphIns;
}
#endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */
#endif /* TT_USE_BYTECODE_INTERPRETER */
/* seek to the beginning of the glyph table. For Type 42 fonts */
/* the table might be accessed from a Postscript stream or something */

View File

@ -23,7 +23,7 @@
#include <ft2build.h>
#include "ttobjs.h"
#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
#ifdef TT_USE_BYTECODE_INTERPRETER
#include "ttinterp.h"
#endif

View File

@ -32,7 +32,7 @@
#include "tterrors.h"
#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
#ifdef TT_USE_BYTECODE_INTERPRETER
#define TT_MULFIX FT_MulFix
@ -7816,7 +7816,7 @@
}
#endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */
#endif /* TT_USE_BYTECODE_INTERPRETER */
/* END */

View File

@ -29,7 +29,7 @@
#include "tterrors.h"
#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
#ifdef TT_USE_BYTECODE_INTERPRETER
#include "ttinterp.h"
#endif
@ -51,7 +51,7 @@
#define FT_COMPONENT trace_ttobjs
#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
#ifdef TT_USE_BYTECODE_INTERPRETER
/*************************************************************************/
/* */
@ -141,7 +141,7 @@
return error;
}
#endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */
#endif /* TT_USE_BYTECODE_INTERPRETER */
/*************************************************************************/
@ -205,7 +205,7 @@
goto Bad_Format;
}
#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
#ifdef TT_USE_BYTECODE_INTERPRETER
face->root.face_flags |= FT_FACE_FLAG_HINTER;
#endif
@ -261,6 +261,17 @@
face->unpatented_hinting = TRUE;
}
/* compare the face with a list of well-known "tricky' fonts !!
* this list shall be expanded as we find them
*/
if ( !face->unpatented_hinting )
{
/* XXX: TODO: */
if ( strcmp( ttface->family_name, "What?" ) == 0 )
face->unpatented_hinting = 1;
}
ttface->internal->force_autohint = !face->unpatented_hinting;
#endif /* TT_CONFIG_OPTION_UNPATENTED_HINTING */
/* initialize standard glyph loading routines */
@ -331,7 +342,7 @@
/* */
/*************************************************************************/
#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
#ifdef TT_USE_BYTECODE_INTERPRETER
/*************************************************************************/
/* */
@ -481,7 +492,7 @@
return error;
}
#endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */
#endif /* TT_USE_BYTECODE_INTERPRETER */
/*************************************************************************/
@ -504,7 +515,7 @@
TT_Size size = (TT_Size)ttsize;
FT_Error error = TT_Err_Ok;
#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
#ifdef TT_USE_BYTECODE_INTERPRETER
TT_Face face = (TT_Face)size->root.face;
FT_Memory memory = face->root.memory;
@ -589,7 +600,7 @@
if ( error )
tt_size_done( ttsize );
#endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */
#endif /* TT_USE_BYTECODE_INTERPRETER */
size->ttmetrics.valid = FALSE;
size->strike_index = 0xFFFFFFFFUL;
@ -614,7 +625,7 @@
{
TT_Size size = (TT_Size)ttsize;
#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
#ifdef TT_USE_BYTECODE_INTERPRETER
FT_Memory memory = size->root.face->memory;
@ -728,7 +739,7 @@
}
#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
#ifdef TT_USE_BYTECODE_INTERPRETER
{
FT_UInt i;
@ -757,7 +768,7 @@
error = tt_size_run_prep( size );
}
#endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */
#endif /* TT_USE_BYTECODE_INTERPRETER */
if ( !error )
size->ttmetrics.valid = TRUE;
@ -784,7 +795,7 @@
tt_driver_init( FT_Module ttdriver ) /* TT_Driver */
{
#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
#ifdef TT_USE_BYTECODE_INTERPRETER
TT_Driver driver = (TT_Driver)ttdriver;
@ -816,7 +827,7 @@
FT_LOCAL_DEF( void )
tt_driver_done( FT_Module ttdriver ) /* TT_Driver */
{
#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
#ifdef TT_USE_BYTECODE_INTERPRETER
TT_Driver driver = (TT_Driver)ttdriver;

View File

@ -109,7 +109,7 @@ FT_BEGIN_HEADER
} TT_GraphicsState;
#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
#ifdef TT_USE_BYTECODE_INTERPRETER
FT_LOCAL( void )
tt_glyphzone_done( TT_GlyphZone zone );
@ -120,7 +120,7 @@ FT_BEGIN_HEADER
FT_Short maxContours,
TT_GlyphZone zone );
#endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */
#endif /* TT_USE_BYTECODE_INTERPRETER */
@ -324,7 +324,7 @@ FT_BEGIN_HEADER
FT_ULong strike_index; /* 0xFFFFFFFF to indicate invalid */
#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
#ifdef TT_USE_BYTECODE_INTERPRETER
FT_UInt num_function_defs; /* number of function definitions */
FT_UInt max_function_defs;
@ -358,7 +358,7 @@ FT_BEGIN_HEADER
FT_Bool debug;
TT_ExecContext context;
#endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */
#endif /* TT_USE_BYTECODE_INTERPRETER */
} TT_SizeRec;
@ -412,7 +412,7 @@ FT_BEGIN_HEADER
FT_LOCAL( void )
tt_size_done( FT_Size ttsize ); /* TT_Size */
#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
#ifdef TT_USE_BYTECODE_INTERPRETER
FT_LOCAL( FT_Error )
tt_size_run_fpgm( TT_Size size );
@ -420,7 +420,7 @@ FT_BEGIN_HEADER
FT_LOCAL( FT_Error )
tt_size_run_prep( TT_Size size );
#endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */
#endif /* TT_USE_BYTECODE_INTERPRETER */
FT_LOCAL( FT_Error )
tt_size_reset( TT_Size size );

View File

@ -334,7 +334,7 @@
tt_face_load_cvt( TT_Face face,
FT_Stream stream )
{
#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
#ifdef TT_USE_BYTECODE_INTERPRETER
FT_Error error;
FT_Memory memory = stream->memory;
@ -383,7 +383,7 @@
Exit:
return error;
#else /* !TT_CONFIG_OPTION_BYTECODE_INTERPRETER */
#else /* !TT_USE_BYTECODE_INTERPRETER */
FT_UNUSED( face );
FT_UNUSED( stream );
@ -415,7 +415,7 @@
tt_face_load_fpgm( TT_Face face,
FT_Stream stream )
{
#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
#ifdef TT_USE_BYTECODE_INTERPRETER
FT_Error error;
FT_ULong table_len;
@ -445,7 +445,7 @@
Exit:
return error;
#else /* !TT_CONFIG_OPTION_BYTECODE_INTERPRETER */
#else /* !TT_USE_BYTECODE_INTERPRETER */
FT_UNUSED( face );
FT_UNUSED( stream );
@ -477,7 +477,7 @@
tt_face_load_prep( TT_Face face,
FT_Stream stream )
{
#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
#ifdef TT_USE_BYTECODE_INTERPRETER
FT_Error error;
FT_ULong table_len;
@ -506,7 +506,7 @@
Exit:
return error;
#else /* !TT_CONFIG_OPTION_BYTECODE_INTERPRETER */
#else /* !TT_USE_BYTECODE_INTERPRETER */
FT_UNUSED( face );
FT_UNUSED( stream );

View File

@ -199,7 +199,7 @@
{
FT_MODULE_FONT_DRIVER |
FT_MODULE_DRIVER_SCALABLE |
#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
#ifdef TT_USE_BYTECODE_INTERPRETER
FT_MODULE_DRIVER_HAS_HINTER,
#else
0,

View File

@ -209,6 +209,9 @@
if ( info->is_fixed_pitch )
root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;
/* note, only define if we have the patented bytecode interpreter,
* there are no known "tricky" Type42 fonts that could be loaded
* with the unpatented interpreter */
#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
root->face_flags |= FT_FACE_FLAG_HINTER;
#endif