| #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 <ft2build.h> |
| #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__ */ |