/************************************************************************** * * 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, count, 1, 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; }