#ifndef __FT_OBJECT_H__ #define __FT_OBJECT_H__ #include #include FT_FREETYPE_H FT_BEGIN_HEADER /************************************************************** * * @type: FT_Object * * @description: * handle to a FreeType Object. See @FT_ObjectRec */ typedef struct FT_ObjectRec_* FT_Object; /************************************************************** * * @type: FT_Class * * @description: * handle to a constant class handle to a FreeType Object. * * Note that a class is itself a @FT_Object and are dynamically * allocated on the heap. * * @also: * @FT_ClassRec, @FT_Object, @FT_ObjectRec, @FT_Type, @FT_TypeRec */ typedef const struct FT_ClassRec_* FT_Class; /************************************************************** * * @type: FT_Type * * @description: * handle to a constant structure (of type @FT_TypeRec) used * to describe a given @FT_Class type to the FreeType object * sub-system. */ typedef const struct FT_TypeRec_* FT_Type; /************************************************************** * * @struct: FT_ObjectRec * * @description: * a structure describing the root fields of all @FT_Object * class instances in FreeType * * @fields: * clazz :: handle to the object's class * ref_count :: object's reference count. Starts at 1 */ typedef struct FT_ObjectRec_ { FT_Class clazz; FT_Int ref_count; } FT_ObjectRec; /************************************************************** * * @macro: FT_OBJECT (x) * * @description: * a useful macro to type-cast anything to a @FT_Object * handle. No check performed.. */ #define FT_OBJECT(x) ((FT_Object)(x)) /************************************************************** * * @macro: FT_OBJECT_P (x) * * @description: * a useful macro to type-cast anything to a pointer to * @FT_Object handle. */ #define FT_OBJECT_P(x) ((FT_Object*)(x)) /************************************************************** * * @macro: FT_OBJECT__CLASS (obj) * * @description: * a useful macro to return the class of any object */ #define FT_OBJECT__CLASS(x) FT_OBJECT(x)->clazz /************************************************************** * * @macro: FT_OBJECT__REF_COUNT (obj) * * @description: * a useful macro to return the reference count of any object */ #define FT_OBJECT__REF_COUNT(x) FT_OBJECT(x)->ref_count /************************************************************** * * @macro: FT_OBJECT__MEMORY (obj) * * @description: * a useful macro to return a handle to the memory manager * used to allocate a given object */ #define FT_OBJECT__MEMORY(x) FT_CLASS__MEMORY(FT_OBJECT(x)->clazz) /************************************************************** * * @macro: FT_OBJECT__LIBRARY (obj) * * @description: * a useful macro to return a handle to the library handle * that owns the object */ #define FT_OBJECT__LIBRARY(x) FT_CLASS__LIBRARY(FT_OBJECT(x)->clazz) /************************************************************** * * @functype: FT_Object_InitFunc * * @description: * a function used to initialize a new object * * @input: * object :: target object handle * init_data :: optional pointer to initialization data * * @return: * error code. 0 means success */ typedef FT_Error (*FT_Object_InitFunc)( FT_Object object, FT_Pointer init_data ); /************************************************************** * * @functype: FT_Object_DoneFunc * * @description: * a function used to finalize a given object * * @input: * object :: handle to target object */ typedef void (*FT_Object_DoneFunc)( FT_Object object ); /************************************************************** * * @struct: FT_ClassRec * * @description: * a structure used to describe a given object class within * FreeType * * @fields: * object :: root @FT_ObjectRec fields, since each class is * itself an object. (it's an instance of the * "metaclass", a special object of the FreeType * object sub-system.) * * magic :: a 32-bit magic number used for decoding * super :: pointer to super class * type :: the @FT_Type descriptor of this class * memory :: the current memory manager handle * library :: the current library handle * info :: an opaque pointer to class-specific information * managed by the FreeType object sub-system * * class_done :: the class destructor function * * obj_size :: size of class instances in bytes * obj_init :: class instance constructor * obj_done :: class instance destructor */ typedef struct FT_ClassRec_ { FT_ObjectRec object; FT_UInt32 magic; FT_Class super; FT_Type type; FT_Memory memory; FT_Library library; FT_Pointer info; FT_Object_DoneFunc class_done; FT_UInt obj_size; FT_Object_InitFunc obj_init; FT_Object_DoneFunc obj_done; } FT_ClassRec; /************************************************************** * * @macro: FT_CLASS (x) * * @description: * a useful macro to convert anything to a class handle * without checks */ #define FT_CLASS(x) ((FT_Class)(x)) /************************************************************** * * @macro: FT_CLASS_P (x) * * @description: * a useful macro to convert anything to a pointer to a class * handle without checks */ #define FT_CLASS_P(x) ((FT_Class*)(x)) /************************************************************** * * @macro: FT_CLASS__MEMORY (clazz) * * @description: * a useful macro to return the memory manager handle of a * given class */ #define FT_CLASS__MEMORY(x) FT_CLASS(x)->memory /************************************************************** * * @macro: FT_CLASS__LIBRARY (clazz) * * @description: * a useful macro to return the library handle of a * given class */ #define FT_CLASS__LIBRARY(x) FT_CLASS(x)->library /************************************************************** * * @macro: FT_CLASS__TYPE (clazz) * * @description: * a useful macro to return the type of a given class * given class */ #define FT_CLASS__TYPE(x) FT_CLASS(x)->type /* */ #define FT_CLASS__INFO(x) FT_CLASS(x)->info #define FT_CLASS__MAGIC(x) FT_CLASS(x)->magic /************************************************************** * * @struct: FT_TypeRec * * @description: * a structure used to describe a given class to the FreeType * object sub-system. * * @fields: * name :: class name. only used for debugging * super :: type of super-class. NULL if none * * class_size :: size of class structure in bytes * class_init :: class constructor * class_done :: class finalizer * * obj_size :: instance size in bytes * obj_init :: instance constructor. can be NULL * obj_done :: instance destructor. can be NULL * * @note: * if 'obj_init' is NULL, the class will use it's parent * constructor, if any * * if 'obj_done' is NULL, the class will use it's parent * finalizer, if any * * the object sub-system allocates a new class, copies * the content of its super-class into the new structure, * _then_ calls 'clazz_init'. * * 'class_init' and 'class_done' can be NULL, in which case * the parent's class constructor and destructor wil be used */ typedef struct FT_TypeRec_ { const char* name; FT_Type super; FT_UInt class_size; FT_Object_InitFunc class_init; FT_Object_DoneFunc class_done; FT_UInt obj_size; FT_Object_InitFunc obj_init; FT_Object_DoneFunc obj_done; } FT_TypeRec; /************************************************************** * * @macro: FT_TYPE (x) * * @description: * a useful macro to convert anything to a class type handle * without checks */ #define FT_TYPE(x) ((FT_Type)(x)) /************************************************************** * * @function: ft_object_check * * @description: * checks that a handle points to a valid @FT_Object * * @input: * obj :: handle/pointer * * @return: * 1 iff the handle points to a valid object. 0 otherwise */ FT_BASE( FT_Int ) ft_object_check( FT_Pointer obj ); /************************************************************** * * @function: ft_object_is_a * * @description: * checks that a handle points to a valid @FT_Object that * is an instance of a given class (or of any of its sub-classes) * * @input: * obj :: handle/pointer * clazz :: class handle to check * * @return: * 1 iff the handle points to a valid 'clazz' instance. 0 * otherwise. */ FT_BASE( FT_Int ) ft_object_is_a( FT_Pointer obj, FT_Class clazz ); /************************************************************** * * @function: ft_object_create * * @description: * create a new object (class instance) * * @output: * aobject :: new object handle. NULL in case of error * * @input: * clazz :: object's class pointer * init_data :: optional pointer to initialization data * * @return: * error code. 0 means success */ FT_BASE( FT_Error ) ft_object_create( FT_Object *aobject, FT_Class clazz, FT_Pointer init_data ); /************************************************************** * * @function: ft_object_create_from_type * * @description: * create a new object (class instance) from a @FT_Type * * @output: * aobject :: new object handle. NULL in case of error * * @input: * type :: object's type descriptor * init_data :: optional pointer to initialization data * * @return: * error code. 0 means success * * @note: * this function is slower than @ft_object_create * * this is equivalent to calling @ft_class_from_type followed by * @ft_object_create */ FT_BASE( FT_Error ) ft_object_create_from_type( FT_Object *aobject, FT_Type type, FT_Pointer init_data, FT_Library library ); /************************************************************** * * @macro FT_OBJ_CREATE (object,class,init) * * @description: * a convenient macro used to create new objects. see * @ft_object_create for details */ #define FT_OBJ_CREATE( _obj, _clazz, _init ) \ ft_object_create( FT_OBJECT_P(&(_obj)), _clazz, _init ) /************************************************************** * * @macro FT_CREATE (object,class,init) * * @description: * a convenient macro used to create new objects. It also * sets an _implicit_ local variable named "error" to the error * code returned by the object constructor. */ #define FT_CREATE( _obj, _clazz, _init ) \ FT_SET_ERROR( FT_OBJ_CREATE( _obj, _clazz, _init ) ) /************************************************************** * * @macro FT_OBJ_CREATE_FROM_TYPE (object,type,init) * * @description: * a convenient macro used to create new objects. see * @ft_object_create_from_type for details */ #define FT_OBJ_CREATE_FROM_TYPE( _obj, _type, _init, _lib ) \ ft_object_create_from_type( FT_OBJECT_P(&(_obj)), _type, _init, _lib ) /************************************************************** * * @macro FT_CREATE_FROM_TYPE (object,type,init) * * @description: * a convenient macro used to create new objects. It also * sets an _implicit_ local variable named "error" to the error * code returned by the object constructor. */ #define FT_CREATE_FROM_TYPE( _obj, _type, _init, _lib ) \ FT_SET_ERROR( FT_OBJ_CREATE_FROM_TYPE( _obj, _type, _init, _lib ) ) /* */ /************************************************************** * * @function: ft_class_from_type * * @description: * retrieves the class object corresponding to a given type * descriptor. The class is created when needed * * @output: * aclass :: handle to corresponding class object. NULL in * case of error * * @input: * type :: type descriptor handle * library :: library handle * * @return: * error code. 0 means success */ FT_BASE( FT_Error ) ft_class_from_type( FT_Class *aclass, FT_Type type, FT_Library library ); /* */ #include FT_INTERNAL_HASH_H typedef struct FT_ClassHNodeRec_* FT_ClassHNode; typedef struct FT_ClassHNodeRec_ { FT_HashNodeRec hnode; FT_Type type; FT_Class clazz; } FT_ClassHNodeRec; typedef struct FT_MetaClassRec_ { FT_ClassRec clazz; /* the meta-class is a class itself */ FT_HashRec type_to_class; /* the type => class hash table */ } FT_MetaClassRec, *FT_MetaClass; /* initialize meta class */ FT_BASE( FT_Error ) ft_metaclass_init( FT_MetaClass meta, FT_Library library ); /* finalize meta class - destroy all registered class objects */ FT_BASE( void ) ft_metaclass_done( FT_MetaClass meta ); /* */ FT_END_HEADER #endif /* __FT_OBJECT_H__ */