| /***************************************************************************/ |
| /* */ |
| /* ftobjs.h */ |
| /* */ |
| /* The FreeType private base classes (specification). */ |
| /* */ |
| /* 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. */ |
| /* */ |
| /***************************************************************************/ |
| |
| |
| /*************************************************************************/ |
| /* */ |
| /* This file contains the definition of all internal FreeType classes. */ |
| /* */ |
| /*************************************************************************/ |
| |
| #ifndef FTOBJS_H |
| #define FTOBJS_H |
| |
| #include <ftconfig.h> |
| #include <ftsystem.h> |
| #include <ftdriver.h> |
| |
| /*************************************************************************/ |
| /* */ |
| /* Some generic definitions. */ |
| /* */ |
| #ifndef TRUE |
| #define TRUE 1 |
| #endif |
| |
| #ifndef FALSE |
| #define FALSE 0 |
| #endif |
| |
| #ifndef NULL |
| #define NULL (void*)0 |
| #endif |
| |
| #ifndef UNUSED |
| #define UNUSED( arg ) ( (void)(arg) ) |
| #endif |
| |
| |
| /*************************************************************************/ |
| /* */ |
| /* The min and max functions missing in C. As usual, be careful not to */ |
| /* write things like MIN( a++, b++ ) to avoid side effects. */ |
| /* */ |
| #ifndef MIN |
| #define MIN( a, b ) ( (a) < (b) ? (a) : (b) ) |
| #endif |
| |
| #ifndef MAX |
| #define MAX( a, b ) ( (a) > (b) ? (a) : (b) ) |
| #endif |
| |
| #ifndef ABS |
| #define ABS( a ) ( (a) < 0 ? -(a) : (a) ) |
| #endif |
| |
| |
| /*************************************************************************/ |
| /* */ |
| /* <Macro> */ |
| /* FT_SET_ERROR */ |
| /* */ |
| /* <Description> */ |
| /* This macro is used to set an implicit `error' variable to a given */ |
| /* expression's value (usually a function call), and convert it to a */ |
| /* boolean which is set whenever the value is != 0. */ |
| /* */ |
| #undef FT_SET_ERROR |
| #define FT_SET_ERROR( expression ) \ |
| ( (error = (expression)) != 0 ) |
| |
| |
| /*************************************************************************/ |
| /*************************************************************************/ |
| /*************************************************************************/ |
| /**** ****/ |
| /**** ****/ |
| /**** M E M O R Y ****/ |
| /**** ****/ |
| /**** ****/ |
| /*************************************************************************/ |
| /*************************************************************************/ |
| /*************************************************************************/ |
| |
| /*************************************************************************/ |
| /* */ |
| /* <Function> */ |
| /* FT_Alloc */ |
| /* */ |
| /* <Description> */ |
| /* Allocates a new block of memory. The returned area is always */ |
| /* zero-filled, this is a strong convention in many FreeType parts. */ |
| /* */ |
| /* <Input> */ |
| /* memory :: A handle to a given `memory object' where allocation */ |
| /* occurs. */ |
| /* */ |
| /* size :: The size in bytes of the block to allocate. */ |
| /* */ |
| /* <Output> */ |
| /* P :: A pointer to the fresh new block. It should be set to */ |
| /* NULL if `size' is 0, or in case of error. */ |
| /* */ |
| /* <Return> */ |
| /* FreeType error code. 0 means success. */ |
| /* */ |
| BASE_DEF |
| FT_Error FT_Alloc( FT_Memory memory, |
| FT_Long size, |
| void** P ); |
| |
| |
| /*************************************************************************/ |
| /* */ |
| /* <Function> */ |
| /* FT_Realloc */ |
| /* */ |
| /* <Description> */ |
| /* Reallocates a block of memory pointed to by `*P' to `Size' bytes */ |
| /* from the heap, possibly changing `*P'. */ |
| /* */ |
| /* <Input> */ |
| /* memory :: A handle to a given `memory object' where allocation */ |
| /* occurs. */ |
| /* */ |
| /* current :: current block size in bytes */ |
| /* size :: the new block size in bytes */ |
| /* */ |
| /* <InOut> */ |
| /* P :: A pointer to the fresh new block. It should be set to */ |
| /* NULL if `size' is 0, or in case of error. */ |
| /* */ |
| /* <Return> */ |
| /* FreeType error code. 0 means success. */ |
| /* */ |
| /* <Note> */ |
| /* All callers of FT_Realloc _must_ provide the current block size */ |
| /* as well as the new one. */ |
| /* */ |
| /* When the memory object's flag FT_memory_FLAG_NO_REALLOC is */ |
| /* set, this function will try to emulate a realloc through uses */ |
| /* of FT_Alloc and FT_Free. Otherwise, it will call the memory- */ |
| /* specific "realloc" implementation. */ |
| /* */ |
| /* (Some embedded memorys do not have a working realloc). */ |
| /* */ |
| BASE_DEF |
| FT_Error FT_Realloc( FT_Memory memory, |
| FT_Long current, |
| FT_Long size, |
| void** P ); |
| |
| |
| /*************************************************************************/ |
| /* */ |
| /* <Function> */ |
| /* FT_Free */ |
| /* */ |
| /* <Description> */ |
| /* Releases a given block of memory allocated through FT_Alloc(). */ |
| /* */ |
| /* <Input> */ |
| /* memory :: A handle to a given `memory object' where allocation */ |
| /* occured. */ |
| /* */ |
| /* P :: This is the _address_ of a _pointer_ which points to the */ |
| /* allocated block. It is always set to NULL on exit. */ |
| /* */ |
| /* <Note> */ |
| /* If P or *P are NULL, this function should return successfully. */ |
| /* This is a strong convention within all of FreeType and its */ |
| /* drivers. */ |
| /* */ |
| BASE_DEF |
| void FT_Free( FT_Memory memory, |
| void** P ); |
| |
| |
| |
| /* This include is needed by the MEM_xxx() macros, it should be */ |
| /* available on every platform we know !! */ |
| #include <string.h> |
| |
| #define MEM_Set( dest, byte, count ) memset( dest, byte, count ) |
| |
| #ifdef HAVE_MEMCPY |
| #define MEM_Copy( dest, source, count ) memcpy( dest, source, count ) |
| #else |
| #define MEM_Copy( dest, source, count ) bcopy( source, dest, count ) |
| #endif |
| |
| #define MEM_Move( dest, source, count ) memmove( dest, source, count ) |
| |
| |
| /*************************************************************************/ |
| /* */ |
| /* We now support closures to produce completely reentrant code. This */ |
| /* means the allocation functions now takes an additional argument */ |
| /* (`memory'). It is a handle to a given memory object, responsible for */ |
| /* all low-level operations, including memory management and */ |
| /* synchronisation. */ |
| /* */ |
| /* In order to keep our code readable and use the same macros in the */ |
| /* font drivers and the rest of the library, MEM_Alloc(), ALLOC(), and */ |
| /* ALLOC_ARRAY() now use an implicit variable, `memory'. It must be */ |
| /* defined at all locations where a memory operation is queried. */ |
| /* */ |
| |
| /* */ |
| /* Note that ALL memory allocation functions need an IMPLICIT argument */ |
| /* called `memory' to point to the current memory object. */ |
| /* */ |
| #define MEM_Alloc( _pointer_, _size_ ) \ |
| FT_Alloc( memory, _size_, (void**)&(_pointer_) ) |
| |
| #define MEM_Realloc( _pointer_, _current_, _size_ ) \ |
| FT_Realloc( memory, _current_, _size_, (void**)&(_pointer_) ) |
| |
| #define ALLOC( _pointer_, _size_ ) \ |
| FT_SET_ERROR( MEM_Alloc( _pointer_, _size_ ) ) |
| |
| #define REALLOC( _pointer_, _current_, _size_ ) \ |
| FT_SET_ERROR( MEM_Realloc( _pointer_, _current_, _size_ ) ) |
| |
| #define ALLOC_ARRAY( _pointer_, _count_, _type_ ) \ |
| FT_SET_ERROR( MEM_Alloc( _pointer_, (_count_)*sizeof (_type_) ) ) |
| |
| #define REALLOC_ARRAY( _pointer_, _current_, _count_, _type_ ) \ |
| FT_SET_ERROR( MEM_Realloc( _pointer_, (_current_)*sizeof(_type_), \ |
| (_count_)*sizeof(_type_) ) ) |
| |
| #define FREE( _pointer_ ) FT_Free( memory, (void**)&(_pointer_) ) |
| |
| |
| |
| /*************************************************************************/ |
| /*************************************************************************/ |
| /*************************************************************************/ |
| /**** ****/ |
| /**** ****/ |
| /**** D R I V E R S ****/ |
| /**** ****/ |
| /**** ****/ |
| /*************************************************************************/ |
| /*************************************************************************/ |
| /*************************************************************************/ |
| |
| /*************************************************************************/ |
| /* */ |
| /* <Struct> */ |
| /* FT_DriverRec */ |
| /* */ |
| /* <Description> */ |
| /* The root font driver class. A font driver is responsible for */ |
| /* managing and loading font files of a given format. */ |
| /* */ |
| /* <Fields> */ |
| /* library :: A handle to the driver's parent library. */ |
| /* */ |
| /* memory :: A handle to the driver's memory object. This is a */ |
| /* duplicate of `library->memory'. */ |
| /* */ |
| /* interface :: A set of driver methods that implement its */ |
| /* behaviour. These methods are called by the */ |
| /* various FreeType functions like FT_New_Face(), */ |
| /* FT_Load_Glyph(), etc. */ |
| /* */ |
| /* format :: A typeless pointer, used to store the address of */ |
| /* the driver's format specific interface. This is a */ |
| /* table of other driver methods that are specific to */ |
| /* its format. Format specific interfaces are */ |
| /* defined in the driver's header files (e.g., */ |
| /* `freetype/drivers/ttlib/ttdriver.h'). */ |
| /* */ |
| /* version :: The driver's version. It can be used for */ |
| /* versioning and dynamic driver update if needed. */ |
| /* */ |
| /* description :: An ASCII string describing the driver's supported */ |
| /* format, like `truetype', `type1', etc. */ |
| /* */ |
| /* faces_list :: The list of faces currently opened by this driver. */ |
| /* */ |
| /* extensions :: a typeless pointer to the driver's extensions */ |
| /* registry, when they are supported through the */ |
| /* config macro FT_CONFIG_OPTION_EXTENSIONS */ |
| /* */ |
| typedef struct FT_DriverRec_ |
| { |
| FT_Library library; |
| FT_Memory memory; |
| |
| FT_Generic generic; |
| |
| FT_DriverInterface interface; |
| FT_FormatInterface format; |
| |
| FT_Int version; /* driver version */ |
| FT_String* description; /* format description */ |
| |
| FT_ListRec faces_list; /* driver's faces list */ |
| |
| void* extensions; |
| |
| } FT_DriverRec; |
| |
| |
| #ifdef FT_CONFIG_OPTION_ALTERNATE_GLYPH_FORMATS |
| |
| /************************************************************************ |
| * |
| * <Struct> |
| * FT_GlyphZone |
| * |
| * <Description> |
| * A glyph zone is used to load, scale and hint glyph outline |
| * coordinates. |
| * |
| * <Fields> |
| * memory :: handle to memory manager |
| * max_points :: max size in points of zone |
| * max_contours :: max size in contours of zone |
| * n_points :: current number of points in zone |
| * n_contours :: current number of contours in zone |
| * org :: original glyph coordinates (font units/scaled) |
| * cur :: current glyph coordinates (scaled/hinted) |
| * tags :: point control tags |
| * contours :: contour end points |
| * |
| ***********************************************************************/ |
| |
| typedef struct FT_GlyphZone_ |
| { |
| FT_Memory memory; |
| FT_UShort max_points; |
| FT_UShort max_contours; |
| FT_UShort n_points; /* number of points in zone */ |
| FT_Short n_contours; /* number of contours */ |
| |
| FT_Vector* org; /* original point coordinates */ |
| FT_Vector* cur; /* current point coordinates */ |
| |
| FT_Byte* tags; /* current touch flags */ |
| FT_UShort* contours; /* contour end points */ |
| |
| } FT_GlyphZone; |
| |
| BASE_DEF |
| FT_Error FT_New_GlyphZone( FT_Memory memory, |
| FT_UShort maxPoints, |
| FT_Short maxContours, |
| FT_GlyphZone* zone ); |
| |
| BASE_DEF |
| void FT_Done_GlyphZone( FT_GlyphZone* zone ); |
| |
| BASE_DEF |
| FT_Error FT_Update_GlyphZone( FT_GlyphZone* zone, |
| FT_UShort num_points, |
| FT_Short num_contours ); |
| |
| |
| /*************************************************************************/ |
| /*************************************************************************/ |
| /*************************************************************************/ |
| /**** ****/ |
| /**** ****/ |
| /**** G L Y P H F O R M A T S ****/ |
| /**** ****/ |
| /**** ****/ |
| /*************************************************************************/ |
| /*************************************************************************/ |
| /*************************************************************************/ |
| |
| /************************************************************************* |
| * |
| * <Struct> |
| * FT_Glyph_Format |
| * |
| * <Description> |
| * A structure used to model various properties of a non-standard |
| * glyph image format. |
| * |
| * <Fields> |
| * format_tag :: the glyph format tag |
| * |
| * raster_interface :: the default rasters interface for this glyph |
| * format. |
| * |
| * raster :: the default raster object for this glyph format |
| * if set to nil, a new object will be allocated |
| * automatically through the raster interface. |
| * |
| * raster_owned :: a boolean used internally by the library. If |
| * set, if indicates that the current raster object |
| * was allocated by the library. |
| * |
| *************************************************************************/ |
| |
| typedef struct FT_Glyph_Format_ |
| { |
| FT_Glyph_Tag format_tag; |
| FT_Raster_Interface* raster_interface; |
| FT_Raster raster; |
| FT_Bool raster_allocated; |
| |
| } FT_Glyph_Format; |
| |
| |
| /************************************************************************* |
| * |
| * <Function> |
| * FT_Add_Glyph_Format |
| * |
| * <Description> |
| * Register a new glyph format into the library |
| * |
| * <Input> |
| * library :: handle to target library object |
| * interface :: pointer to glyph format interface |
| * |
| * <Return> |
| * Error code. 0 means success |
| * |
| * <Note> |
| * This function should normally be called by those font drivers which |
| * need to use their own glyph image format. |
| * |
| *************************************************************************/ |
| |
| EXPORT_DEF |
| FT_Error FT_Add_Glyph_Format( FT_Library library, |
| FT_Glyph_Format* format ); |
| |
| |
| /************************************************************************* |
| * |
| * <Function> |
| * FT_Remove_Glyph_Format |
| * |
| * <Description> |
| * Un-Register a given glyph format from the library |
| * |
| * <Input> |
| * library :: handle to target library object |
| * glyph_format :: glyph format tag |
| * |
| * <Return> |
| * Error code. 0 means success |
| * |
| * <Note> |
| * This function should normally be called by those font drivers which |
| * need to use their own glyph image format. |
| * |
| *************************************************************************/ |
| |
| EXPORT_DEF |
| FT_Error FT_Remove_Glyph_Format( FT_Library library, |
| FT_Glyph_Tag glyph_format ); |
| |
| /************************************************************************* |
| * |
| * <Function> |
| * FT_Get_Glyph_Format |
| * |
| * <Description> |
| * Return a pointer to the glyph format descriptor corresponding to |
| * a given format tag. |
| * |
| * <Input> |
| * library :: handle to source library object |
| * |
| * format_tag :: glyph format tag |
| * |
| * <Return> |
| * a pointer to the corresponding glyph format descriptor, if it was |
| * registered in the library. 0 otherwise. |
| * |
| *************************************************************************/ |
| |
| BASE_DEF |
| FT_Glyph_Format* FT_Get_Glyph_Format( FT_Library library, |
| FT_Glyph_Tag format_tag ); |
| |
| |
| |
| #endif /* FT_CONFIG_OPTION_ALTERNATE_GLYPH_FORMATS */ |
| |
| /*************************************************************************/ |
| /*************************************************************************/ |
| /*************************************************************************/ |
| /**** ****/ |
| /**** ****/ |
| /**** L I B R A R I E S ****/ |
| /**** ****/ |
| /**** ****/ |
| /*************************************************************************/ |
| /*************************************************************************/ |
| /*************************************************************************/ |
| |
| #define FT_DEBUG_HOOK_TRUETYPE 0 |
| #define FT_DEBUG_HOOK_TYPE1 1 |
| |
| /*************************************************************************/ |
| /* */ |
| /* <Struct> */ |
| /* FT_LibraryRec */ |
| /* */ |
| /* <Description> */ |
| /* The FreeType library class. This is the root of all FreeType */ |
| /* data. Use FT_New_Library() to create a library object, and */ |
| /* FT_Done_Library() to discard it and all child objects. */ |
| /* */ |
| /* <Fields> */ |
| /* memory :: The library's memory object. Manages memory */ |
| /* allocation */ |
| /* */ |
| /* generic :: Client data variable. Used to extend the */ |
| /* Library class by higher levels and clients. */ |
| /* */ |
| /* num_drivers :: The number of drivers currently registered */ |
| /* within this library. This is set to 0 for new */ |
| /* libraries. New drivers are added through the */ |
| /* FT_Add_Driver() API function. */ |
| /* */ |
| /* drivers :: A table used to store handles to the currently */ |
| /* registered font drivers. Note that each driver */ |
| /* contains a list of its opened faces. */ |
| /* */ |
| /* glyph_formats :: A table used to store glyph format descriptors */ |
| /* for new image formats that may have been */ |
| /* registered within the library */ |
| /* */ |
| /* raster_pool :: The raster object's render pool. This can */ |
| /* ideally be changed dynamically at run-time. */ |
| /* */ |
| typedef void (*FT_DebugHook_Func)( void* arg ); |
| |
| typedef struct FT_LibraryRec_ |
| { |
| FT_Memory memory; /* library's memory object */ |
| |
| FT_Generic generic; |
| |
| FT_Int num_drivers; |
| FT_Driver drivers[ FT_MAX_DRIVERS ]; /* driver objects */ |
| |
| FT_Glyph_Format glyph_formats[FT_MAX_GLYPH_FORMATS]; |
| |
| void* raster_pool; /* scan-line conversion render pool */ |
| |
| FT_DebugHook_Func debug_hooks[4]; |
| |
| } FT_LibraryRec; |
| |
| |
| /*************************************************************************/ |
| /* */ |
| /* <Function> */ |
| /* FT_New_Library */ |
| /* */ |
| /* <Description> */ |
| /* This function is used to create a new FreeType library instance */ |
| /* from a given memory object. It is thus possible to use libraries */ |
| /* with distinct memory allocators within the same program. */ |
| /* */ |
| /* <Input> */ |
| /* memory :: A handle to the original memory object. */ |
| /* */ |
| /* <Output> */ |
| /* library :: A handle to a new library object. */ |
| /* */ |
| /* <Return> */ |
| /* Error code. 0 means success. */ |
| /* */ |
| /* <Note> */ |
| /* This function is normally not called by client applications, */ |
| /* unless they want to create a specific instance of FreeType which */ |
| /* uses a specific memory allocator. */ |
| /* */ |
| EXPORT_DEF |
| FT_Error FT_New_Library( FT_Memory memory, |
| FT_Library* library ); |
| |
| |
| /*************************************************************************/ |
| /* */ |
| /* <Function> */ |
| /* FT_Done_Library */ |
| /* */ |
| /* <Description> */ |
| /* Discards a given library object. This closes all drivers and */ |
| /* discards all face objects. */ |
| /* */ |
| /* <Input> */ |
| /* library :: A handle to the target library. */ |
| /* */ |
| /* <Return> */ |
| /* Error code. 0 means success. */ |
| /* */ |
| EXPORT_DEF |
| FT_Error FT_Done_Library( FT_Library library ); |
| |
| |
| |
| EXPORT_DEF |
| void FT_Set_Debug_Hook( FT_Library library, |
| FT_UInt hook_index, |
| FT_DebugHook_Func debug_hook ); |
| |
| |
| /*************************************************************************/ |
| /* */ |
| /* <Function> */ |
| /* FT_Add_Driver */ |
| /* */ |
| /* <Description> */ |
| /* Registers a new driver in a given library object. This function */ |
| /* takes only a pointer to a driver interface. It uses it to create */ |
| /* the new driver, then sets up some important fields. */ |
| /* */ |
| /* <Input> */ |
| /* library :: A handle to the target library object. */ |
| /* */ |
| /* driver_interface :: A pointer to a driver interface table. */ |
| /* */ |
| /* <Return> */ |
| /* Error code. 0 means success. */ |
| /* */ |
| /* <Note> */ |
| /* This function doesn't check whether the driver is already */ |
| /* installed! */ |
| /* */ |
| EXPORT_DEF |
| FT_Error FT_Add_Driver( FT_Library library, |
| const FT_DriverInterface* driver_interface ); |
| |
| |
| /*************************************************************************/ |
| /* */ |
| /* <Function> */ |
| /* FT_Remove_Driver */ |
| /* */ |
| /* <Description> */ |
| /* Unregister a given driver. This closes the driver, which in turn */ |
| /* destroys all faces, sizes, slots, etc. associated with it. */ |
| /* */ |
| /* This function also DESTROYS the driver object. */ |
| /* */ |
| /* <Input> */ |
| /* driver :: A handle to target driver object. */ |
| /* */ |
| /* <Return> */ |
| /* Error code. 0 means success. */ |
| /* */ |
| EXPORT_DEF |
| FT_Error FT_Remove_Driver( FT_Driver driver ); |
| |
| |
| /*************************************************************************/ |
| /* */ |
| /* <Function> */ |
| /* FT_Get_Driver */ |
| /* */ |
| /* <Description> */ |
| /* returns the handle of the driver responsible for a given format */ |
| /* (or service) according to its `name'. */ |
| /* */ |
| /* <Input> */ |
| /* library :: handle to library object. */ |
| /* driver_name :: name of driver to look-up. */ |
| /* */ |
| /* <Return> */ |
| /* handle to driver object. 0 otherwise */ |
| /* */ |
| EXPORT_DEF |
| FT_Driver FT_Get_Driver( FT_Library library, |
| char* driver_name ); |
| |
| #ifndef FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM |
| |
| /************************************************************************** |
| * |
| * <Function> |
| * FT_New_Stream |
| * |
| * <Description> |
| * Open a new stream from a given standard ASCII file path name |
| * |
| * <Input> |
| * filepathname :: an ASCII string naming the file to be opened |
| * |
| * <Output> |
| * astream :: the opened stream descriptor to be used by the library |
| * |
| * <Return> |
| * Error code. 0 means success |
| * |
| * <Note> |
| * This function must be implemented by the system-specific part |
| * of the engine, i.e. `ftsystem.c'. |
| * |
| * This function should only fill the stream descriptor. Note that |
| * the stream's `memory' field should be left to the caller. |
| * |
| **************************************************************************/ |
| |
| extern |
| FT_Error FT_New_Stream( const char* filepathname, |
| FT_Stream astream ); |
| |
| |
| /************************************************************************** |
| * |
| * <Function> |
| * FT_New_Memory |
| * |
| * <Description> |
| * Returns a handle to a new memory object |
| * |
| * <Return> |
| * Handle to the memory object. 0 means failure |
| * |
| * <Note> |
| * This function must be implemented by the system-specific part |
| * of the engine, i.e. `ftsystem.c'. |
| * |
| * It is only used by `ftinit' in order to implement the function |
| * FT_Init_FreeType. |
| * |
| **************************************************************************/ |
| |
| extern |
| FT_Memory FT_New_Memory( void ); |
| |
| #endif |
| |
| /* Define default raster's interface. The default raster is located in `src/base/ftraster.c' */ |
| /* */ |
| /* Client applications can register new rasters through the FT_Set_Raster API.. */ |
| /* */ |
| #ifndef FT_NO_DEFAULT_RASTER |
| extern |
| FT_Raster_Interface ft_default_raster; |
| #endif |
| |
| |
| #endif /* FTOBJS_H */ |
| |
| |
| /* END */ |