diff --git a/src/base/ftsystem.c b/src/base/ftsystem.c new file mode 100644 index 000000000..0da26b84a --- /dev/null +++ b/src/base/ftsystem.c @@ -0,0 +1,214 @@ +/************************************************************************** + * + * ftsystem.h 1.0 + * + * ANSI-specific FreeType low-level system interface + * + * This file contains the definition of interface used by FreeType + * to access low-level, i.e. memory management, i/o access as well + * as thread synchronisation. + * + * + * 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. + * + **************************************************************************/ + +#include +#include + +#include +#include +#include + + /*********************************************************************/ + /* */ + /* MEMORY MANAGEMENT INTERFACE */ + /* */ + +/************************************************************************ + * + * + * FT_Alloc_Func + * + * + * The memory allocator function type + * + * + * system :: pointer to the system object + * size :: requested size in bytes + * + * + * block :: address of newly allocated block + * + * + * Error code. 0 means success. + * + * + * If your allocation routine ALWAYS zeroes the new block, you + * should set the flag FT_SYSTEM_FLAG_ALLOC_ZEROES in your system + * object 'flags' field. + * + * If you have set the flag FT_SYSTEM_FLAG_REPORT_CURRENT_ALLOC in + * your system's "system_flags" field, this function should update + * the "current_alloc" field of the system object. + * + ************************************************************************/ + + static + void* ft_alloc( FT_Memory memory, + long size ) + { + (void)memory; + return malloc(size); + } + + +/************************************************************************ + * + * + * FT_Realloc_Func + * + * + * The memory reallocator function type + * + * + * system :: pointer to the system object + * new_size :: new requested size in bytes + * + * + * block :: address of block in memory + * + * + * Error code. 0 means success. + * + * + * This function is _never_ called when the system flag + * FT_SYSTEM_FLAG_NO_REALLOC is set. Instead, the engine will emulate + * realloc through "alloc" and "free". + * + * Note that this is possible due to the fact that FreeType's + * "FT_Realloc" always requests the _current_ size of the reallocated + * block as a parameter, thus avoiding memory leaks. + * + * If you have set the flag FT_SYSTEM_FLAG_REPORT_CURRENT_ALLOC in + * your system's "system_flags" field, this function should update + * the "current_alloc" field of the system object. + * + ************************************************************************/ + + static + void* ft_realloc( FT_Memory memory, + long cur_size, + long new_size, + void* block ) + { + (void)memory; + (void)cur_size; + + return realloc( block, new_size ); + } + + +/************************************************************************ + * + * + * FT_Free_Func + * + * + * The memory release function type + * + * + * system :: pointer to the system object + * block :: address of block in memory + * + * + * If you have set the flag FT_SYSTEM_FLAG_REPORT_CURRENT_ALLOC in + * your system's "system_flags" field, this function should update + * the "current_alloc" field of the system object. + * + ************************************************************************/ + + static + void ft_free( FT_Memory memory, + void* block ) + { + (void)memory; + free( block ); + } + + /*********************************************************************/ + /* */ + /* RESOURCE MANAGEMENT INTERFACE */ + /* */ + + +#define STREAM_FILE(stream) ((FILE*)stream->descriptor.pointer) + + static + void ft_close_stream( FT_Stream stream ) + { + fclose( STREAM_FILE(stream) ); + } + + static + unsigned long ft_io_stream( FT_Stream stream, + unsigned long offset, + char* buffer, + unsigned long count ) + { + FILE* file; + + file = STREAM_FILE(stream); + + fseek( file, offset, SEEK_SET ); + return (unsigned long)fread( buffer, 1, count, file ); + } + + + extern + int FT_New_Stream( const char* filepathname, + FT_Stream stream ) + { + FILE* file; + + file = fopen( filepathname, "rb" ); + if (!file) + return FT_Err_Cannot_Open_Resource; + + fseek( file, 0, SEEK_END ); + stream->size = ftell(file); + fseek( file, 0, SEEK_SET ); + + stream->descriptor.pointer = file; + stream->pos = 0; + + stream->read = ft_io_stream; + stream->close = ft_close_stream; + + return 0; + } + + + extern + FT_Memory FT_New_Memory( void ) + { + FT_Memory memory; + + memory = (FT_Memory)malloc( sizeof(*memory) ); + if (memory) + { + memory->user = 0; + memory->alloc = ft_alloc; + memory->realloc = ft_realloc; + memory->free = ft_free; + } + return memory; + } +