Commit 8f43c714 authored by David Turner's avatar David Turner
Browse files

A major refresh of the TrueType driver :

- some #ifdefs were included in order to _not_
  compile support for the bytecode interpreter
  when FT_CONFIG_OPTION_BYTECODE_INTERPRETER
  is not defined in "ttconfig.h"

- the glyph loader has been seriously re-designed. It is now
  smaller, simpler and should load composites a bit faster

- works with the TrueType debugger
parent 0360168a
......@@ -44,7 +44,9 @@
#include <ttdriver.c> /* driver interface */
#include <ttpload.c> /* tables loader */
#include <ttgload.c> /* glyph loader */
#include <ttinterp.c> /* bytecode interpreter */
#include <ttobjs.c> /* object manager */
#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
#include <ttinterp.c> /* bytecode interpreter */
#endif
/* END */
......@@ -28,6 +28,17 @@
#define TTCONFIG_H
/*************************************************************************/
/* */
/* Define TT_CONFIG_OPTION_BYTECODE_INTERPRETER if you want to compile */
/* a bytecode interpreter in the TrueType driver. Note that there are */
/* important patent issues related to the use of the interpreter. */
/* */
/* By undefining this, you'll only compile the code necessary to load */
/* TrueType glyphs without hinting.. */
/* */
#undef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
/*************************************************************************/
/* */
/* Define TT_CONFIG_OPTION_INTERPRETER_SWITCH to compile the TrueType */
......@@ -46,7 +57,7 @@
/* Define TT_CONFIG_OPTION_EMBEDDED_BITMAPS if you want to support */
/* embedded bitmaps in the TrueType/OpenType driver. */
/* */
#define TT_CONFIG_OPTION_EMBEDDED_BITMAPS
#undef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
/*************************************************************************/
......@@ -55,8 +66,10 @@
/* load and enumerate the glyph Postscript names in a TrueType or */
/* OpenType file. */
/* */
#define TT_CONFIG_OPTION_POSTSCRIPT_NAMES
#undef TT_CONFIG_OPTION_POSTSCRIPT_NAMES
/* The maximum number of sub-glyphs in a TrueType composite glyph */
#define TT_MAX_SUBGLYPHS 32
#define TT_USE_FIXED
......
......@@ -683,7 +683,7 @@
EXPORT_FUNC
FT_DriverInterface* getDriverInterface( void )
{
return &truetype_driver_interface;
return &tt_driver_interface;
}
#endif /* CONFIG_OPTION_DYNAMIC_DRIVERS */
......
......@@ -26,115 +26,10 @@
#include <ttnameid.h>
/*************************************************************************/
/* */
/* <FuncType> */
/* TTDriver_getFontData */
/* */
/* <Description> */
/* Returns either a single font table or the whole font file into */
/* caller's memory. This function mimics the GetFontData() API */
/* function found in Windows. */
/* */
/* <Input> */
/* face :: A handle to the source TrueType face object. */
/* */
/* tag :: A 32-bit integer used to name the table you want to */
/* read. Use the macro MAKE_TT_TAG (defined in freetype.h) */
/* to create one. Use the value 0 if you want to access */
/* the whole file instead. */
/* */
/* offset :: The offset from the start of the table or file from */
/* which you want to read bytes. */
/* */
/* buffer :: The address of the target/read buffer where data will be */
/* copied. */
/* */
/* <InOut> */
/* length :: The length in bytes of the data to read. If it is set */
/* to 0 when this function is called, it will return */
/* immediately, setting the value of `length' to the */
/* requested table's size (or the whole font file if the */
/* tag is 0). It is thus possible to allocate and read an */
/* arbitrary table in two successive calls. */
/* <Return> */
/* TrueType error code. 0 means success. */
/* */
typedef TT_Error (*TTDriver_getFontData)( TT_Face face,
TT_ULong tag,
TT_ULong offset,
void* buffer,
TT_Long* length );
/*************************************************************************/
/* */
/* <FuncType> */
/* TTDriver_getFaceWidths */
/* */
/* <Description> */
/* Returns the widths and/or heights of a given range of glyph from */
/* a face. */
/* */
/* <Input> */
/* face :: A handle to the source FreeType face object. */
/* */
/* first_glyph :: The first glyph in the range. */
/* */
/* last_glyph :: The last glyph in the range. */
/* */
/* <Output> */
/* widths :: The address of the table receiving the widths */
/* expressed in font units (UShorts). Set this */
/* parameter to NULL if you're not interested in these */
/* values. */
/* */
/* heights :: The address of the table receiving the heights */
/* expressed in font units (UShorts). Set this */
/* parameter to NULL if you're not interested in these */
/* values. */
/* */
/* <Return> */
/* Error code. 0 means success. */
/* */
typedef TT_Error (*TTDriver_getFaceWidths)( TT_Face face,
TT_UShort first_glyph,
TT_UShort last_glyph,
TT_UShort* widths,
TT_UShort* heights );
/*************************************************************************/
/* */
/* <Struct> */
/* TT_DriverInterface */
/* */
/* <Description> */
/* The TrueType-specific interface of this driver. Note that some of */
/* the methods defined here are optional, as they're only used for */
/* for specific tasks of the driver. */
/* */
/* <Fields> */
/* get_font_data :: See the declaration of TTDriver_getFontData(). */
/* get_face_widths :: See the declaration of */
/* TTDriver_getFaceWidths(). */
/* */
typedef struct TT_DriverInterface_
{
TTDriver_getFontData get_font_data;
TTDriver_getFaceWidths get_face_widths;
} TT_DriverInterface;
EXPORT_DEF
const FT_DriverInterface tt_driver_interface;
const FT_DriverInterface ttz_driver_interface;
EXPORT_DEF
const TT_DriverInterface tt_format_interface;
#endif /* TTDRIVER_H */
......
This diff is collapsed.
......@@ -21,10 +21,47 @@
#include <ttobjs.h>
#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
#include <ttinterp.h>
#endif
#ifdef __cplusplus
extern "C" {
#endif
typedef struct TT_Loader_
{
TT_Face face;
TT_Size size;
TT_GlyphSlot glyph;
TT_ULong load_flags;
FT_Stream stream;
TT_Int byte_len;
TT_Int left_points;
TT_Int left_contours;
TT_BBox bbox;
TT_Int left_bearing;
TT_Int advance;
TT_Bool preserve_pps;
TT_Vector pp1;
TT_Vector pp2;
TT_ULong glyf_offset;
/* the zone where we load our glyphs */
TT_GlyphZone base;
TT_GlyphZone zone;
#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
TT_ExecContext exec;
TT_Byte* instructions;
#endif
} TT_Loader;
/*************************************************************************/
/* */
......@@ -53,7 +90,7 @@
/* */
LOCAL_DEF
void TT_Get_Metrics( TT_HoriHeader* header,
TT_UShort index,
TT_UInt index,
TT_Short* bearing,
TT_UShort* advance );
......
......@@ -21,13 +21,18 @@
#include <ftcalc.h>
#include <ftstream.h>
#include <ttnameid.h>
#include <tttags.h>
#include <sfnt.h>
#include <ttobjs.h>
#include <ttpload.h>
#include <ttinterp.h>
#include <tterrors.h>
#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
#include <ttinterp.h>
#endif
/* required by tracing mode */
#undef FT_COMPONENT
#define FT_COMPONENT trace_ttobjs
......@@ -442,14 +447,16 @@
LOCAL_DEF
TT_Error TT_Init_Size( TT_Size size )
{
TT_Error error = 0;
#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
TT_Face face = (TT_Face)size->root.face;
FT_Memory memory = face->root.memory;
TT_Error error;
TT_Int i;
TT_UShort n_twilight;
TT_MaxProfile* maxp = &face->max_profile;
TT_ExecContext exec;
TT_UShort n_twilight;
TT_MaxProfile* maxp = &face->max_profile;
size->ttmetrics.valid = FALSE;
......@@ -587,14 +594,19 @@
if ( !size->debug )
TT_Done_Context( exec );
#endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */
size->ttmetrics.valid = FALSE;
return error;
#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
Fail_Exec:
if ( !size->debug )
TT_Done_Context( exec );
Fail_Memory:
#endif
TT_Done_Size( size );
return error;
}
......@@ -614,9 +626,9 @@
LOCAL_FUNC
void TT_Done_Size( TT_Size size )
{
#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
FT_Memory memory = size->root.face->memory;
if ( size->debug )
{
/* the debug context must be deleted by the debugger itself */
......@@ -643,6 +655,7 @@
size->max_func = 0;
size->max_ins = 0;
#endif
size->ttmetrics.valid = FALSE;
}
......@@ -663,10 +676,8 @@
LOCAL_DEF
TT_Error TT_Reset_Size( TT_Size size )
{
TT_ExecContext exec;
TT_Error error;
TT_UShort i, j;
TT_Face face;
TT_Face face;
TT_Error error = TT_Err_Ok;
FT_Size_Metrics* metrics;
......@@ -713,72 +724,79 @@
metrics->max_advance = ( FT_MulFix( face->root.max_advance_width,
metrics->x_scale ) + 32 ) & -64;
/* Scale the cvt values to the new ppem. */
/* We use by default the y ppem to scale the CVT. */
for ( i = 0; i < size->cvt_size; i++ )
size->cvt[i] = FT_MulFix( face->cvt[i], size->ttmetrics.scale );
/* All twilight points are originally zero */
for ( j = 0; j < size->twilight.n_points; j++ )
{
size->twilight.org[j].x = 0;
size->twilight.org[j].y = 0;
size->twilight.cur[j].x = 0;
size->twilight.cur[j].y = 0;
}
/* clear storage area */
for ( i = 0; i < size->storage_size; i++ )
size->storage[i] = 0;
size->GS = tt_default_graphics_state;
/* get execution context and run prep program */
if ( size->debug )
exec = size->context;
else
exec = TT_New_Context( face );
/* debugging instances have their own context */
if ( !exec )
return TT_Err_Could_Not_Find_Context;
TT_Load_Context( exec, face, size );
TT_Set_CodeRange( exec,
tt_coderange_cvt,
face->cvt_program,
face->cvt_program_size );
TT_Clear_CodeRange( exec, tt_coderange_glyph );
exec->instruction_trap = FALSE;
exec->top = 0;
exec->callTop = 0;
if ( face->cvt_program_size > 0 )
#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
{
error = TT_Goto_CodeRange( exec, tt_coderange_cvt, 0 );
if ( error )
goto Fin;
TT_ExecContext exec;
TT_UInt i, j;
/* Scale the cvt values to the new ppem. */
/* We use by default the y ppem to scale the CVT. */
for ( i = 0; i < size->cvt_size; i++ )
size->cvt[i] = FT_MulFix( face->cvt[i], size->ttmetrics.scale );
/* All twilight points are originally zero */
for ( j = 0; j < size->twilight.n_points; j++ )
{
size->twilight.org[j].x = 0;
size->twilight.org[j].y = 0;
size->twilight.cur[j].x = 0;
size->twilight.cur[j].y = 0;
}
/* clear storage area */
for ( i = 0; i < size->storage_size; i++ )
size->storage[i] = 0;
size->GS = tt_default_graphics_state;
/* get execution context and run prep program */
if ( size->debug )
exec = size->context;
else
exec = TT_New_Context( face );
/* debugging instances have their own context */
if ( !exec )
return TT_Err_Could_Not_Find_Context;
TT_Load_Context( exec, face, size );
TT_Set_CodeRange( exec,
tt_coderange_cvt,
face->cvt_program,
face->cvt_program_size );
TT_Clear_CodeRange( exec, tt_coderange_glyph );
exec->instruction_trap = FALSE;
exec->top = 0;
exec->callTop = 0;
if ( face->cvt_program_size > 0 )
{
error = TT_Goto_CodeRange( exec, tt_coderange_cvt, 0 );
if ( error )
goto Fin;
if ( !size->debug )
error = face->interpreter( exec );
}
else
error = TT_Err_Ok;
size->GS = exec->GS;
/* save default graphics state */
Fin:
TT_Save_Context( exec, size );
if ( !size->debug )
error = face->interpreter( exec );
TT_Done_Context( exec );
/* debugging instances keep their context */
}
else
error = TT_Err_Ok;
size->GS = exec->GS;
/* save default graphics state */
Fin:
TT_Save_Context( exec, size );
if ( !size->debug )
TT_Done_Context( exec );
/* debugging instances keep their context */
#endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */
if ( !error )
size->ttmetrics.valid = TRUE;
......@@ -888,12 +906,14 @@
TT_Done_Extensions( driver );
#endif
#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
/* destroy the execution context */
if ( driver->context )
{
TT_Destroy_Context( driver->context, driver->root.memory );
driver->context = NULL;
}
#endif
}
......
......@@ -330,6 +330,7 @@
TT_Size_Metrics ttmetrics;
#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
TT_UInt num_function_defs; /* number of function definitions */
TT_UInt max_function_defs;
TT_DefArray function_defs; /* table of function definitions */
......@@ -362,6 +363,8 @@
TT_Bool debug;
TT_ExecContext context;
#endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */
} TT_SizeRec;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment