1 /***************************************************************************/
5 /* ANSI-specific FreeType low-level system interface (body). */
7 /* Copyright 1996-2002, 2006, 2008-2011 by */
8 /* David Turner, Robert Wilhelm, and Werner Lemberg. */
10 /* This file is part of the FreeType project, and may only be used, */
11 /* modified, and distributed under the terms of the FreeType project */
12 /* license, LICENSE.TXT. By continuing to use, modify, or distribute */
13 /* this file you indicate that you have read the license and */
14 /* understand and accept it fully. */
16 /***************************************************************************/
18 /*************************************************************************/
20 /* This file contains the default interface used by FreeType to access */
21 /* low-level, i.e. memory management, i/o access as well as thread */
22 /* synchronisation. It can be replaced by user-specific routines if */
25 /*************************************************************************/
29 #include FT_CONFIG_CONFIG_H
30 #include FT_INTERNAL_DEBUG_H
31 #include FT_INTERNAL_STREAM_H
37 /*************************************************************************/
39 /* MEMORY MANAGEMENT INTERFACE */
41 /*************************************************************************/
43 /*************************************************************************/
45 /* It is not necessary to do any error checking for the */
46 /* allocation-related functions. This will be done by the higher level */
47 /* routines like ft_mem_alloc() or ft_mem_realloc(). */
49 /*************************************************************************/
52 /*************************************************************************/
58 /* The memory allocation function. */
61 /* memory :: A pointer to the memory object. */
63 /* size :: The requested size in bytes. */
66 /* The address of newly allocated block. */
68 FT_CALLBACK_DEF( void* )
69 ft_alloc( FT_Memory memory,
74 return ft_smalloc( size );
78 /*************************************************************************/
84 /* The memory reallocation function. */
87 /* memory :: A pointer to the memory object. */
89 /* cur_size :: The current size of the allocated memory block. */
91 /* new_size :: The newly requested size in bytes. */
93 /* block :: The current address of the block in memory. */
96 /* The address of the reallocated memory block. */
98 FT_CALLBACK_DEF( void* )
99 ft_realloc( FT_Memory memory,
105 FT_UNUSED( cur_size );
107 return ft_srealloc( block, new_size );
111 /*************************************************************************/
117 /* The memory release function. */
120 /* memory :: A pointer to the memory object. */
122 /* block :: The address of block in memory to be freed. */
124 FT_CALLBACK_DEF( void )
125 ft_free( FT_Memory memory,
134 /*************************************************************************/
136 /* RESOURCE MANAGEMENT INTERFACE */
138 /*************************************************************************/
140 #ifndef FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT
142 /*************************************************************************/
144 /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
145 /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
146 /* messages during execution. */
149 #define FT_COMPONENT trace_io
151 /* We use the macro STREAM_FILE for convenience to extract the */
152 /* system-specific stream handle from a given FreeType stream object */
153 #define STREAM_FILE( stream ) ( (FT_FILE*)stream->descriptor.pointer )
156 /*************************************************************************/
159 /* ft_ansi_stream_close */
162 /* The function to close a stream. */
165 /* stream :: A pointer to the stream object. */
167 FT_CALLBACK_DEF( void )
168 ft_ansi_stream_close( FT_Stream stream )
170 ft_fclose( STREAM_FILE( stream ) );
172 stream->descriptor.pointer = NULL;
178 /*************************************************************************/
181 /* ft_ansi_stream_io */
184 /* The function to open a stream. */
187 /* stream :: A pointer to the stream object. */
189 /* offset :: The position in the data stream to start reading. */
191 /* buffer :: The address of buffer to store the read data. */
193 /* count :: The number of bytes to read from the stream. */
196 /* The number of bytes actually read. If `count' is zero (this is, */
197 /* the function is used for seeking), a non-zero return value */
198 /* indicates an error. */
200 FT_CALLBACK_DEF( unsigned long )
201 ft_ansi_stream_io( FT_Stream stream,
202 unsigned long offset,
203 unsigned char* buffer,
204 unsigned long count )
209 if ( !count && offset > stream->size )
212 file = STREAM_FILE( stream );
214 if ( stream->pos != offset )
215 ft_fseek( file, offset, SEEK_SET );
217 return (unsigned long)ft_fread( buffer, 1, count, file );
221 /* documentation is in ftstream.h */
223 FT_BASE_DEF( FT_Error )
224 FT_Stream_Open( FT_Stream stream,
225 const char* filepathname )
231 return FT_Err_Invalid_Stream_Handle;
233 stream->descriptor.pointer = NULL;
234 stream->pathname.pointer = (char*)filepathname;
238 stream->close = NULL;
240 file = ft_fopen( filepathname, "rb" );
243 FT_ERROR(( "FT_Stream_Open:"
244 " could not open `%s'\n", filepathname ));
246 return FT_Err_Cannot_Open_Resource;
249 ft_fseek( file, 0, SEEK_END );
250 stream->size = ft_ftell( file );
253 FT_ERROR(( "FT_Stream_Open:" ));
254 FT_ERROR(( " opened `%s' but zero-sized\n", filepathname ));
256 return FT_Err_Cannot_Open_Stream;
258 ft_fseek( file, 0, SEEK_SET );
260 stream->descriptor.pointer = file;
261 stream->read = ft_ansi_stream_io;
262 stream->close = ft_ansi_stream_close;
264 FT_TRACE1(( "FT_Stream_Open:" ));
265 FT_TRACE1(( " opened `%s' (%d bytes) successfully\n",
266 filepathname, stream->size ));
271 #endif /* !FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT */
273 #ifdef FT_DEBUG_MEMORY
276 ft_mem_debug_init( FT_Memory memory );
279 ft_mem_debug_done( FT_Memory memory );
284 /* documentation is in ftobjs.h */
286 FT_BASE_DEF( FT_Memory )
287 FT_New_Memory( void )
292 memory = (FT_Memory)ft_smalloc( sizeof ( *memory ) );
296 memory->alloc = ft_alloc;
297 memory->realloc = ft_realloc;
298 memory->free = ft_free;
299 #ifdef FT_DEBUG_MEMORY
300 ft_mem_debug_init( memory );
308 /* documentation is in ftobjs.h */
311 FT_Done_Memory( FT_Memory memory )
313 #ifdef FT_DEBUG_MEMORY
314 ft_mem_debug_done( memory );