Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 4972 → Rev 4973

/programs/develop/libraries/menuetlibc/include/freetype/ttobjs.h
0,0 → 1,873
/*******************************************************************
*
* ttobjs.h 1.0
*
* Objects definition unit.
*
* Copyright 1996-1999 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used
* modified and distributed under the terms of the FreeType project
* license, LICENSE.TXT. By continuing to use, modify, or distribute
* this file you indicate that you have read the license and
* understand and accept it fully.
*
******************************************************************/
 
#ifndef TTOBJS_H
#define TTOBJS_H
 
#include "ttconfig.h"
#include "ttengine.h"
#include "ttmutex.h"
#include "ttcache.h"
#include "tttables.h"
#include "ttcmap.h"
 
#ifdef __cplusplus
extern "C" {
#endif
 
/* */
/* This file contains the definitions and methods of the four */
/* kinds of objects managed by the FreeType engine. These are: */
/* */
/* */
/* Face objects: */
/* */
/* There is always one face object per opened TrueType font */
/* file, and only one. The face object contains data that is */
/* independent of current transform/scaling/rotation and */
/* pointsize, or glyph index. This data is made of several */
/* critical tables that are loaded on face object creation. */
/* */
/* A face object tracks all active and recycled objects of */
/* the instance and execution context classes. Destroying a face */
/* object will automatically destroy all associated instances. */
/* */
/* */
/* Instance objects: */
/* */
/* An instance object always relates to a given face object, */
/* known as its 'parent' or 'owner', and contains only the */
/* data that is specific to one given pointsize/transform of */
/* the face. You can only create an instance from a face object. */
/* */
/* An instance's current transform/pointsize can be changed */
/* at any time using a single high-level API call, */
/* TT_Reset_Instance(). */
/* */
/* Execution Context objects: */
/* */
/* An execution context (or context in short) relates to a face. */
/* It contains the data and tables that are necessary to load */
/* and hint (i.e. execute the glyph instructions of) one glyph. */
/* A context is a transient object that is queried/created on */
/* the fly: client applications never deal with them directly. */
/* */
/* */
/* Glyph objects: */
/* */
/* A glyph object contains only the minimal glyph information */
/* needed to render one glyph correctly. This means that a glyph */
/* object really contains tables that are sized to hold the */
/* contents of _any_ glyph of a given face. A client application */
/* can usually create one glyph object for a given face, then use */
/* it for all subsequent loads. */
/* */
/* Here is an example of a client application : */
/* (NOTE: No error checking performed here!) */
/* */
/* */
/* TT_Face face; -- face handle */
/* TT_Instance ins1, ins2; -- two instance handles */
/* TT_Glyph glyph; -- glyph handle */
/* */
/* TT_Init_FreeType(); */
/* */
/* -- Initialize the engine. This must be done prior to _any_ */
/* operation. */
/* */
/* TT_Open_Face( "/some/face/name.ttf", &face ); */
/* */
/* -- create the face object. This call opens the font file */
/* */
/* TT_New_Instance( face, &ins1 ); */
/* TT_New_Instance( face, &ins2 ); */
/* */
/* TT_Set_Instance_PointSize( ins1, 8 ); */
/* TT_Set_Instance_PointSize( ins2, 12 ); */
/* */
/* -- create two distinct instances of the same face */
/* -- ins1 is pointsize 8 at resolution 96 dpi */
/* -- ins2 is pointsize 12 at resolution 96 dpi */
/* */
/* TT_New_Glyph( face, &glyph ); */
/* */
/* -- create a new glyph object which will receive the contents */
/* of any glyph of 'face' */
/* */
/* TT_Load_Glyph( ins1, glyph, 64, DEFAULT_GLYPH_LOAD ); */
/* */
/* -- load glyph indexed 64 at pointsize 8 in the 'glyph' object */
/* -- NOTE: This call will fail if the instance and the glyph */
/* do not relate to the same face object. */
/* */
/* TT_Get_Outline( glyph, &outline ); */
/* */
/* -- extract the glyph outline from the object and copies it */
/* to the 'outline' record */
/* */
/* TT_Get_Metrics( glyph, &metrics ); */
/* */
/* -- extract the glyph metrics and put them into the 'metrics' */
/* record */
/* */
/* TT_Load_Glyph( ins2, glyph, 64, DEFAULT_GLYPH_LOAD ); */
/* */
/* -- load the same glyph at pointsize 12 in the 'glyph' object */
/* */
/* */
/* TT_Close_Face( &face ); */
/* */
/* -- destroy the face object. This will destroy 'ins1' and */
/* 'ins2'. However, the glyph object will still be available */
/* */
/* TT_Done_FreeType(); */
/* */
/* -- Finalize the engine. This will also destroy all pending */
/* glyph objects (here 'glyph'). */
 
struct TFace_;
struct TInstance_;
struct TExecution_Context_;
struct TGlyph_;
 
typedef struct TFace_ TFace;
typedef TFace* PFace;
 
typedef struct TInstance_ TInstance;
typedef TInstance* PInstance;
 
typedef struct TExecution_Context_ TExecution_Context;
typedef TExecution_Context* PExecution_Context;
 
typedef struct TGlyph_ TGlyph;
typedef TGlyph* PGlyph;
 
 
/*************************************************************/
/* */
/* ADDITIONAL SUBTABLES */
/* */
/* These tables are not precisely defined by the specs */
/* but their structures is implied by the TrueType font */
/* file layout. */
/* */
/*************************************************************/
 
/* Graphics State */
/* */
/* The Graphics State (GS) is managed by the */
/* instruction field, but does not come from */
/* the font file. Thus, we can use 'int's */
/* where needed. */
 
struct TGraphicsState_
{
UShort rp0;
UShort rp1;
UShort rp2;
 
TT_UnitVector dualVector;
TT_UnitVector projVector;
TT_UnitVector freeVector;
 
Long loop;
TT_F26Dot6 minimum_distance;
Int round_state;
 
Bool auto_flip;
TT_F26Dot6 control_value_cutin;
TT_F26Dot6 single_width_cutin;
TT_F26Dot6 single_width_value;
Short delta_base;
Short delta_shift;
 
Byte instruct_control;
Bool scan_control;
Int scan_type;
 
UShort gep0;
UShort gep1;
UShort gep2;
};
 
typedef struct TGraphicsState_ TGraphicsState;
 
 
LOCAL_DEF
const TGraphicsState Default_GraphicsState;
 
 
/*************************************************************/
/* */
/* EXECUTION SUBTABLES */
/* */
/* These sub-tables relate to instruction execution. */
/* */
/*************************************************************/
 
#define MAX_CODE_RANGES 3
 
/* There can only be 3 active code ranges at once: */
/* - the Font Program */
/* - the CVT Program */
/* - a glyph's instructions set */
 
#define TT_CodeRange_Font 1
#define TT_CodeRange_Cvt 2
#define TT_CodeRange_Glyph 3
 
 
struct TCodeRange_
{
PByte Base;
ULong Size;
};
 
typedef struct TCodeRange_ TCodeRange;
typedef TCodeRange* PCodeRange;
 
 
/* Defintion of a code range */
/* */
/* Code ranges can be resident to a glyph (i.e. the Font Program) */
/* while some others are volatile (Glyph instructions). */
/* Tracking the state and presence of code ranges allows function */
/* and instruction definitions within a code range to be forgotten */
/* when the range is discarded. */
 
typedef TCodeRange TCodeRangeTable[MAX_CODE_RANGES];
 
/* defines a function/instruction definition record */
 
struct TDefRecord_
{
Int Range; /* in which code range is it located ? */
ULong Start; /* where does it start ? */
Int Opc; /* function #, or instruction code */
Bool Active; /* is it active ? */
};
 
typedef struct TDefRecord_ TDefRecord;
typedef TDefRecord* PDefRecord;
typedef TDefRecord* PDefArray;
 
/* defines a call record, used to manage function calls. */
 
struct TCallRecord_
{
Int Caller_Range;
ULong Caller_IP;
Long Cur_Count;
ULong Cur_Restart;
};
 
typedef struct TCallRecord_ TCallRecord;
typedef TCallRecord* PCallRecord;
typedef TCallRecord* PCallStack; /* defines a simple call stack */
 
 
/* This type defining a set of glyph points will be used to represent */
/* each zone (regular and twilight) during instructions decoding. */
struct TGlyph_Zone_
{
UShort n_points; /* number of points in zone */
Short n_contours; /* number of contours */
 
TT_Vector* org; /* original points coordinates */
TT_Vector* cur; /* current points coordinates */
 
Byte* touch; /* current touch flags */
UShort* contours; /* contour end points */
};
 
typedef struct TGlyph_Zone_ TGlyph_Zone;
typedef TGlyph_Zone* PGlyph_Zone;
 
 
 
#ifndef TT_STATIC_INTEPRETER /* indirect implementation */
 
#define EXEC_OPS PExecution_Context exc,
#define EXEC_OP PExecution_Context exc
#define EXEC_ARGS exc,
#define EXEC_ARG exc
 
#else /* static implementation */
 
#define EXEC_OPS /* void */
#define EXEC_OP /* void */
#define EXEC_ARGS /* void */
#define EXEC_ARG /* void */
 
#endif
 
/* Rounding function, as used by the interpreter */
typedef TT_F26Dot6 (*TRound_Function)( EXEC_OPS TT_F26Dot6 distance,
TT_F26Dot6 compensation );
 
/* Point displacement along the freedom vector routine, as */
/* used by the interpreter */
typedef void (*TMove_Function)( EXEC_OPS PGlyph_Zone zone,
UShort point,
TT_F26Dot6 distance );
 
/* Distance projection along one of the proj. vectors, as used */
/* by the interpreter */
typedef TT_F26Dot6 (*TProject_Function)( EXEC_OPS TT_Vector* v1,
TT_Vector* v2 );
 
/* reading a cvt value. Take care of non-square pixels when needed */
typedef TT_F26Dot6 (*TGet_CVT_Function)( EXEC_OPS ULong index );
 
/* setting or moving a cvt value. Take care of non-square pixels */
/* when needed */
typedef void (*TSet_CVT_Function)( EXEC_OPS ULong index,
TT_F26Dot6 value );
 
/* subglyph transformation record */
struct TTransform_
{
TT_Fixed xx, xy; /* transformation */
TT_Fixed yx, yy; /* matrix */
TT_F26Dot6 ox, oy; /* offsets */
};
 
typedef struct TTransform_ TTransform;
typedef TTransform* PTransform;
 
/* subglyph loading record. Used to load composite components */
struct TSubglyph_Record_
{
Long index; /* subglyph index; initialized with -1 */
Bool is_scaled; /* is the subglyph scaled? */
Bool is_hinted; /* should it be hinted? */
Bool preserve_pps; /* preserve phantom points? */
 
Long file_offset;
 
TT_Big_Glyph_Metrics metrics;
 
TGlyph_Zone zone;
 
Long arg1; /* first argument */
Long arg2; /* second argument */
 
UShort element_flag; /* current load element flag */
 
TTransform transform; /* transform */
 
TT_Vector pp1, pp2; /* phantom points */
 
};
 
typedef struct TSubglyph_Record_ TSubglyph_Record;
typedef TSubglyph_Record* PSubglyph_Record;
typedef TSubglyph_Record* PSubglyph_Stack;
 
/* A note regarding non-squared pixels: */
/* */
/* (This text will probably go into some docs at some time, for */
/* now, it is kept there to explain some definitions in the */
/* TIns_Metrics record). */
/* */
/* The CVT is a one-dimensional array containing values that */
/* control certain important characteristics in a font, like */
/* the height of all capitals, all lowercase letter, default */
/* spacing or stem width/height. */
/* */
/* These values are found in FUnits in the font file, and must be */
/* scaled to pixel coordinates before being used by the CVT and */
/* glyph programs. Unfortunately, when using distinct x and y */
/* resolutions (or distinct x and y pointsizes), there are two */
/* possible scalings. */
/* */
/* A first try was to implement a 'lazy' scheme where all values */
/* were scaled when first used. However, while some values are always */
/* used in the same direction, and some other are used in many */
/* different circumstances and orientations. */
/* */
/* I have found a simpler way to do the same, and it even seems to */
/* work in most of the cases: */
/* */
/* - all CVT values are scaled to the maximum ppem size */
/* */
/* - when performing a read or write in the CVT, a ratio factor */
/* is used to perform adequate scaling. Example: */
/* */
/* x_ppem = 14 */
/* y_ppem = 10 */
/* */
/* we choose ppem = x_ppem = 14 as the CVT scaling size. All cvt */
/* entries are scaled to it. */
/* */
/* x_ratio = 1.0 */
/* y_ratio = y_ppem/ppem (< 1.0) */
/* */
/* we compute the current ratio like: */
/* */
/* - if projVector is horizontal, */
/* ratio = x_ratio = 1.0 */
/* - if projVector is vertical, */
/* ratop = y_ratio */
/* - else, */
/* ratio = sqrt((proj.x*x_ratio)^2 + (proj.y*y_ratio)^2) */
/* */
/* reading a cvt value returns ratio * cvt[index] */
/* writing a cvt value in pixels cvt[index] / ratio */
/* */
/* the current ppem is simply ratio * ppem */
/* */
 
/* metrics used by the instance and execution context objects */
struct TIns_Metrics_
{
TT_F26Dot6 pointSize; /* point size. 1 point = 1/72 inch. */
 
UShort x_resolution; /* device horizontal resolution in dpi. */
UShort y_resolution; /* device vertical resolution in dpi. */
 
UShort x_ppem; /* horizontal pixels per EM */
UShort y_ppem; /* vertical pixels per EM */
 
Long x_scale1;
Long x_scale2; /* used to scale FUnits to fractional pixels */
 
Long y_scale1;
Long y_scale2; /* used to scale FUnits to fractional pixels */
 
/* for non-square pixels */
Long x_ratio;
Long y_ratio;
 
UShort ppem; /* maximum ppem size */
Long ratio; /* current ratio */
Long scale1;
Long scale2; /* scale for ppem */
 
TT_F26Dot6 compensations[4]; /* device-specific compensations */
 
Bool rotated; /* `is the glyph rotated?'-flag */
Bool stretched; /* `is the glyph stretched?'-flag */
};
 
typedef struct TIns_Metrics_ TIns_Metrics;
typedef TIns_Metrics* PIns_Metrics;
 
 
 
/***********************************************************************/
/* */
/* FreeType Face Type */
/* */
/***********************************************************************/
 
struct TFace_
{
/* parent engine instance for the face object */
PEngine_Instance engine;
 
/* i/o stream */
TT_Stream stream;
 
/* used only by the threaded builds of the library */
TMutex lock;
 
/* TrueType collection header, if any was found */
TTTCHeader ttcHeader;
 
/* maximum profile table, as found in the TrueType file */
TMaxProfile maxProfile;
 
/* Note: */
/* it seems that some maximum values cannot be */
/* taken directly from this table, but rather by */
/* combining some of its fields; e.g. the max. */
/* number of points seems to be given by */
/* MAX( maxPoints, maxCompositePoints ) */
/* */
/* For this reason, we define later our own */
/* max values that are used to load and allocate */
/* further tables. */
 
TT_Header fontHeader; /* the font header, as */
/* found in the TTF file */
TT_Horizontal_Header horizontalHeader; /* the horizontal header */
 
Bool verticalInfo; /* True when vertical table */
TT_Vertical_Header verticalHeader; /* is present in the font */
 
TT_OS2 os2; /* 'OS/2' table */
 
TT_Postscript postscript; /* 'Post' table */
 
TT_Hdmx hdmx; /* 'Hdmx' table */
 
TName_Table nameTable; /* name table */
 
TGasp gasp; /* the 'gasp' table */
 
/* The directory of TrueType tables for this typeface */
UShort numTables;
PTableDirEntry dirTables;
 
/* The directory of character mappings table for */
/* this typeface */
UShort numCMaps;
PCMapTable cMaps;
 
/* The glyph locations table */
ULong numLocations; /* UShort is not enough */
#ifndef TT_HUGE_PTR
PStorage glyphLocations;
#else
Storage TT_HUGE_PTR * glyphLocations;
#endif
 
/* NOTE : The "hmtx" is now part of the horizontal header */
 
/* the font program, if any */
ULong fontPgmSize;
PByte fontProgram;
 
/* the cvt program, if any */
ULong cvtPgmSize;
PByte cvtProgram;
 
/* the original, unscaled, control value table */
ULong cvtSize;
PShort cvt;
 
/* The following values _must_ be set by the */
/* maximum profile loader */
 
UShort numGlyphs; /* the face's total number of glyphs */
UShort maxPoints; /* max glyph points number, simple and composite */
UShort maxContours; /* max glyph contours numb, simple and composite */
UShort maxComponents; /* max components in a composite glyph */
 
/* the following are object caches to track active */
/* and recycled instances and execution contexts */
/* objects. See 'ttcache.h' */
 
TCache instances; /* current instances for this face */
TCache glyphs; /* current glyph containers for this face */
 
 
/* A typeless pointer to the face object extensions defined */
/* in the 'ttextend.*' files. */
void* extension;
Int n_extensions; /* number of extensions */
 
/* Use extensions to provide additional capabilities to the */
/* engine. Read the developer's guide in the documentation */
/* directory to know how to do that. */
 
/* a generic pointer for client use - see TT_Set/Get_Face_Pointer */
void* generic;
};
 
 
 
/***********************************************************************/
/* */
/* FreeType Instance Type */
/* */
/***********************************************************************/
 
struct TInstance_
{
PFace owner; /* face object */
 
Bool valid;
 
TIns_Metrics metrics;
 
UShort numFDefs; /* number of function definitions */
UShort maxFDefs;
PDefArray FDefs; /* table of FDefs entries */
 
UShort numIDefs; /* number of instruction definitions */
UShort maxIDefs;
PDefArray IDefs; /* table of IDefs entries */
 
Int maxFunc; /* maximum function definition id */
Int maxIns; /* maximum instruction definition id */
 
TCodeRangeTable codeRangeTable;
 
TGraphicsState GS;
TGraphicsState default_GS;
 
ULong cvtSize; /* the scaled control value table */
PLong cvt;
 
ULong storeSize; /* The storage area is now part of the */
PLong storage; /* instance */
 
TGlyph_Zone twilight; /* The instance's twilight zone */
 
/* debugging variables */
 
/* When using the debugger, we must keep the */
/* execution context tied to the instance */
/* object rather than asking it on demand */
 
Bool debug;
PExecution_Context context;
 
/* a generic pointer for client use - see TT_Set/Get_Instance_Pointer */
void* generic;
};
 
 
/***********************************************************************/
/* */
/* FreeType Execution Context Type */
/* */
/***********************************************************************/
 
struct TExecution_Context_
{
PFace face;
PInstance instance;
 
/* instructions state */
 
TT_Error error; /* last execution error */
 
Long top; /* top of exec. stack */
 
ULong stackSize; /* size of exec. stack */
PStorage stack; /* current exec. stack */
 
Long args;
ULong new_top; /* new top after exec. */
 
TGlyph_Zone zp0, /* zone records */
zp1,
zp2,
pts,
twilight;
 
TIns_Metrics metrics; /* instance metrics */
 
TGraphicsState GS; /* current graphics state */
 
Int curRange; /* current code range number */
PByte code; /* current code range */
ULong IP; /* current instruction pointer */
ULong codeSize; /* size of current range */
 
Byte opcode; /* current opcode */
Int length; /* length of current opcode */
 
Bool step_ins; /* true if the interpreter must */
/* increment IP after ins. exec */
ULong cvtSize;
PLong cvt;
 
ULong glyphSize; /* glyph instructions buffer size */
PByte glyphIns; /* glyph instructions buffer */
 
UShort numFDefs; /* number of function defs */
UShort maxFDefs; /* maximum number of function defs */
PDefRecord FDefs; /* table of FDefs entries */
 
UShort numIDefs; /* number of instruction defs */
UShort maxIDefs; /* maximum number of instruction defs */
PDefRecord IDefs; /* table of IDefs entries */
 
Int maxFunc;
Int maxIns;
 
Int callTop, /* top of call stack during execution */
callSize; /* size of call stack */
PCallStack callStack; /* call stack */
 
UShort maxPoints; /* capacity of this context's "pts" */
UShort maxContours; /* record, expressed in points and */
/* contours.. */
 
TCodeRangeTable codeRangeTable; /* table of valid coderanges */
/* useful for the debugger */
 
ULong storeSize; /* size of current storage */
PLong storage; /* storage area */
 
TT_F26Dot6 period; /* values used for the */
TT_F26Dot6 phase; /* 'SuperRounding' */
TT_F26Dot6 threshold;
 
/* this seems to be unused */
#if 0
Int cur_ppem; /* ppem along the current proj vector */
#endif
Long scale1; /* scaling values along the current */
Long scale2; /* projection vector too.. */
Bool cached_metrics; /* the ppem is computed lazily. used */
/* to trigger computation when needed */
 
Bool instruction_trap; /* If True, the interpreter will */
/* exit after each instruction */
 
TGraphicsState default_GS; /* graphics state resulting from */
/* the prep program */
Bool is_composite; /* ture if the glyph is composite */
 
Bool pedantic_hinting; /* if true, read and write array */
/* bounds faults halt the hinting */
 
/* latest interpreter additions */
 
Long F_dot_P; /* dot product of freedom and projection */
/* vectors */
TRound_Function func_round; /* current rounding function */
 
TProject_Function func_project, /* current projection function */
func_dualproj, /* current dual proj. function */
func_freeProj; /* current freedom proj. func */
 
TMove_Function func_move; /* current point move function */
 
TGet_CVT_Function func_read_cvt; /* read a cvt entry */
TSet_CVT_Function func_write_cvt; /* write a cvt entry (in pixels) */
TSet_CVT_Function func_move_cvt; /* incr a cvt entry (in pixels) */
 
ULong loadSize;
PSubglyph_Stack loadStack; /* loading subglyph stack */
 
};
 
 
/***********************************************************************/
/* */
/* FreeType Glyph Object Type */
/* */
/***********************************************************************/
 
struct TGlyph_
{
PFace face;
TT_Big_Glyph_Metrics metrics;
TT_Outline outline;
};
 
 
/* The following type is used to load a font from a collection. */
/* See Face_Create in ttobjs.c */
 
struct TFont_Input_
{
TT_Stream stream; /* input stream */
ULong fontIndex; /* index of font in collection */
PEngine_Instance engine; /* parent engine instance */
 
};
 
typedef struct TFont_Input_ TFont_Input;
 
 
/********************************************************************/
/* */
/* Code Range Functions */
/* */
/********************************************************************/
 
/* Goto a specified coderange */
LOCAL_DEF
TT_Error Goto_CodeRange( PExecution_Context exec,
Int range,
ULong IP );
 
#if 0
/* Return a pointer to a given coderange record. */
/* Used only by the debugger. */
LOCAL_DEF
PCodeRange Get_CodeRange( PExecution_Context exec,
Int range );
#endif
 
/* Set a given code range properties */
LOCAL_DEF
TT_Error Set_CodeRange( PExecution_Context exec,
Int range,
void* base,
ULong length );
 
/* Clear a given coderange */
LOCAL_DEF
TT_Error Clear_CodeRange( PExecution_Context exec, Int range );
 
 
LOCAL_DEF
PExecution_Context New_Context( PFace face );
 
LOCAL_DEF
TT_Error Done_Context( PExecution_Context exec );
 
 
LOCAL_DEF
TT_Error Context_Load( PExecution_Context exec,
PFace face,
PInstance ins );
 
LOCAL_DEF
TT_Error Context_Save( PExecution_Context exec,
PInstance ins );
 
LOCAL_DEF
TT_Error Context_Run( PExecution_Context exec,
Bool debug );
 
LOCAL_DEF
TT_Error Instance_Init( PInstance ins );
 
LOCAL_DEF
TT_Error Instance_Reset( PInstance ins );
 
 
/********************************************************************/
/* */
/* Handy scaling functions */
/* */
/********************************************************************/
 
LOCAL_DEF TT_Pos Scale_X( PIns_Metrics metrics, TT_Pos x );
LOCAL_DEF TT_Pos Scale_Y( PIns_Metrics metrics, TT_Pos y );
 
/********************************************************************/
/* */
/* Component Initializer/Finalizer */
/* */
/* Called from 'freetype.c' */
/* The component must create and register the face, instance and */
/* execution context cache classes before any object can be */
/* managed. */
/* */
/********************************************************************/
 
LOCAL_DEF TT_Error TTObjs_Init( PEngine_Instance engine );
LOCAL_DEF TT_Error TTObjs_Done( PEngine_Instance engine );
 
#ifdef __cplusplus
}
#endif
 
#endif /* TTOBJS_H */
 
 
/* END */