diff options
| author | Charles.Forsyth <devnull@localhost> | 2006-12-22 17:07:39 +0000 |
|---|---|---|
| committer | Charles.Forsyth <devnull@localhost> | 2006-12-22 17:07:39 +0000 |
| commit | 37da2899f40661e3e9631e497da8dc59b971cbd0 (patch) | |
| tree | cbc6d4680e347d906f5fa7fca73214418741df72 /libfreetype/ftsysio.c | |
| parent | 54bc8ff236ac10b3eaa928fd6bcfc0cdb2ba46ae (diff) | |
20060303a
Diffstat (limited to 'libfreetype/ftsysio.c')
| -rw-r--r-- | libfreetype/ftsysio.c | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/libfreetype/ftsysio.c b/libfreetype/ftsysio.c new file mode 100644 index 00000000..344ee516 --- /dev/null +++ b/libfreetype/ftsysio.c @@ -0,0 +1,131 @@ +#include <ft2build.h> +#include FT_SYSTEM_STREAM_H + +#include <stdio.h> + + /* the ISO/ANSI standard stream object */ + typedef struct FT_StdStreamRec_ + { + FT_StreamRec stream; + FILE* file; + const char* pathname; + + } FT_StdStreamRec, *FT_StdStream; + + + + /* read bytes from a standard stream */ + static FT_ULong + ft_std_stream_read( FT_StdStream stream, + FT_Byte* buffer, + FT_ULong size ) + { + long read_bytes; + + read_bytes = fread( buffer, 1, size, stream->file ); + if ( read_bytes < 0 ) + read_bytes = 0; + + return (FT_ULong) read_bytes; + } + + + /* seek the standard stream to a new position */ + static FT_Error + ft_std_stream_seek( FT_StdStream stream, + FT_ULong pos ) + { + return ( fseek( stream->file, pos, SEEK_SET ) < 0 ) + ? FT_Err_Stream_Seek + : FT_Err_Ok; + } + + + /* close a standard stream */ + static void + ft_std_stream_done( FT_StdStream stream ) + { + fclose( stream->file ); + stream->file = NULL; + stream->pathname = NULL; + } + + + /* open a standard stream from a given pathname */ + static void + ft_std_stream_init( FT_StdStream stream, + const char* pathname ) + { + FT_ASSERT( pathname != NULL ); + + stream->file = fopen( pathname, "rb" ); + if ( stream->file == NULL ) + { + FT_ERROR(( "iso.stream.init: could not open '%s'\n", pathname )); + FT_XTHROW( FT_Err_Stream_Open ); + } + + /* compute total size in bytes */ + fseek( file, 0, SEEK_END ); + FT_STREAM__SIZE(stream) = ftell( file ); + fseek( file, 0, SEEK_SET ); + + stream->pathname = pathname; + stream->pos = 0; + + FT_TRACE1(( "iso.stream.init: opened '%s' (%ld bytes) succesfully\n", + pathname, FT_STREAM__SIZE(stream) )); + } + + + static void + ft_std_stream_class_init( FT_ClassRec* _clazz ) + { + FT_StreamClassRec* clazz = FT_STREAM_CLASS(_clazz); + + clazz->stream_read = (FT_Stream_ReadFunc) ft_std_stream_read; + clazz->stream_seek = (FT_Stream_SeekFunc) ft_std_stream_seek; + } + + + static const FT_TypeRec ft_std_stream_type; + { + "StreamClass", + NULL, + + sizeof( FT_ClassRec ), + ft_stream_class_init, + NULL, + + sizeof( FT_StdStreamRec ), + ft_std_stream_init, + ft_std_stream_done, + NULL, + }; + + + + FT_EXPORT_DEF( FT_Stream ) + ft_std_stream_new( FT_Memory memory, + const char* pathname ) + { + FT_Class clazz; + + clazz = ft_class_from_type( memory, &ft_std_stream_type ); + + return (FT_Stream) ft_object_new( clazz, pathname ); + } + + + FT_EXPORT_DEF( void ) + ft_std_stream_create( FT_Memory memory, + const char* pathname, + FT_Stream* astream ) + { + FT_Class clazz; + + clazz = ft_class_from_type( memory, &ft_std_stream_type ); + + ft_object_create( clazz, pathname, FT_OBJECT_P(astream) ); + } + |
