#ifndef __FT_SYSTEM_IO_H__ #define __FT_SYSTEM_IO_H__ /************************************************************************/ /************************************************************************/ /***** *****/ /***** NOTE: THE CONTENT OF THIS FILE IS NOT CURRENTLY USED *****/ /***** IN NORMAL BUILDS. CONSIDER IT EXPERIMENTAL. *****/ /***** *****/ /************************************************************************/ /************************************************************************/ /******************************************************************** * * designing custom streams is a bit different now * * * * * * * * * * * * * * * * * * * * * * * * */ #include #include FT_INTERNAL_OBJECT_H FT_BEGIN_HEADER /*@******************************************************************* * * @type: FT_Stream * * @description: * handle to an input stream object. These are also @FT_Object handles */ typedef struct FT_StreamRec_* FT_Stream; /*@******************************************************************* * * @type: FT_Stream_Class * * @description: * opaque handle to a @FT_Stream_ClassRec class structure describing * the methods of input streams */ typedef const struct FT_Stream_ClassRec_* FT_Stream_Class; /*@******************************************************************* * * @functype: FT_Stream_ReadFunc * * @description: * a method used to read bytes from an input stream into memory * * @input: * stream :: target stream handle * buffer :: target buffer address * size :: number of bytes to read * * @return: * number of bytes effectively read. Must be <= 'size'. */ typedef FT_ULong (*FT_Stream_ReadFunc)( FT_Stream stream, FT_Byte* buffer, FT_ULong size ); /*@******************************************************************* * * @functype: FT_Stream_SeekFunc * * @description: * a method used to seek to a new position within a stream * * @input: * stream :: target stream handle * pos :: new read position, from start of stream * * @return: * error code. 0 means success */ typedef FT_Error (*FT_Stream_SeekFunc)( FT_Stream stream, FT_ULong pos ); /*@******************************************************************* * * @struct: FT_Stream_ClassRec * * @description: * a structure used to describe an input stream class * * @input: * clazz :: root @FT_ClassRec fields * stream_read :: stream byte read method * stream_seek :: stream seek method */ typedef struct FT_Stream_ClassRec_ { FT_ClassRec clazz; FT_Stream_ReadFunc stream_read; FT_Stream_SeekFunc stream_seek; } FT_Stream_ClassRec; /* */ #define FT_STREAM_CLASS(x) ((FT_Stream_Class)(x)) #define FT_STREAM_CLASS__READ(x) FT_STREAM_CLASS(x)->stream_read #define FT_STREAM_CLASS__SEEK(x) FT_STREAM_CLASS(x)->stream_seek; /*@******************************************************************* * * @struct: FT_StreamRec * * @description: * the input stream object structure. See @FT_Stream_ClassRec for * its class descriptor * * @fields: * object :: root @FT_ObjectRec fields * size :: size of stream in bytes (0 if unknown) * pos :: current position within stream * base :: for memory-based streams, the address of the stream's * first data byte in memory. NULL otherwise * * cursor :: the current cursor position within an input stream * frame. Only valid within a FT_FRAME_ENTER .. FT_FRAME_EXIT * block; NULL otherwise * * limit :: the current frame limit within a FT_FRAME_ENTER .. * FT_FRAME_EXIT block. NULL otherwise */ typedef struct FT_StreamRec_ { FT_ObjectRec object; FT_ULong size; FT_ULong pos; const FT_Byte* base; const FT_Byte* cursor; const FT_Byte* limit; } FT_StreamRec; /* some useful macros */ #define FT_STREAM(x) ((FT_Stream)(x)) #define FT_STREAM_P(x) ((FT_Stream*)(x)) #define FT_STREAM__READ(x) FT_STREAM_CLASS__READ(FT_OBJECT__CLASS(x)) #define FT_STREAM__SEEK(x) FT_STREAM_CLASS__SEEK(FT_OBJECT__CLASS(x)) #define FT_STREAM_IS_BASED(x) ( FT_STREAM(x)->base != NULL ) /* */ /* create new memory-based stream */ FT_BASE( FT_Error ) ft_stream_new_memory( const FT_Byte* stream_base, FT_ULong stream_size, FT_Memory memory, FT_Stream *astream ); FT_BASE( FT_Error ) ft_stream_new_iso( const char* pathanme, FT_Memory memory, FT_Stream *astream ); /* handle to default stream class implementation for a given build */ /* this is used by "FT_New_Face" */ /* */ FT_APIVAR( FT_Type ) ft_stream_default_type; FT_END_HEADER #endif /* __FT_SYSTEM_STREAM_H__ */