ref: e755002ddc30fb50ed2033e9ca631d83088180e3
parent: 7bda46d094bbefede2926ea8601256fecaf3c36a
author: David Turner <[email protected]>
date: Tue Feb 29 12:11:53 EST 2000
moved the ANSI "ftsystem.c" to src/base
--- /dev/null
+++ b/src/base/ftsystem.c
@@ -1,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 <ftsystem.h>
+#include <fterrors.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+ /*********************************************************************/
+ /* */
+ /* MEMORY MANAGEMENT INTERFACE */
+ /* */
+
+/************************************************************************
+ *
+ * <FuncType>
+ * FT_Alloc_Func
+ *
+ * <Description>
+ * The memory allocator function type
+ *
+ * <Input>
+ * system :: pointer to the system object
+ * size :: requested size in bytes
+ *
+ * <Output>
+ * block :: address of newly allocated block
+ *
+ * <Return>
+ * Error code. 0 means success.
+ *
+ * <Note>
+ * 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);
+ }
+
+
+/************************************************************************
+ *
+ * <FuncType>
+ * FT_Realloc_Func
+ *
+ * <Description>
+ * The memory reallocator function type
+ *
+ * <Input>
+ * system :: pointer to the system object
+ * new_size :: new requested size in bytes
+ *
+ * <InOut>
+ * block :: address of block in memory
+ *
+ * <Return>
+ * Error code. 0 means success.
+ *
+ * <Note>
+ * 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 );
+ }
+
+
+/************************************************************************
+ *
+ * <FuncType>
+ * FT_Free_Func
+ *
+ * <Description>
+ * The memory release function type
+ *
+ * <Input>
+ * system :: pointer to the system object
+ * block :: address of block in memory
+ *
+ * <Note>
+ * 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;
+ }
+