1 /***************************************************************************/
5 /* ANSI-specific FreeType low-level system interface (body). */
7 /* Copyright 1996-2016 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_t)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
, (size_t)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
, (long)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_THROW( 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_THROW( Cannot_Open_Resource
);
249 ft_fseek( file
, 0, SEEK_END
);
250 stream
->size
= (unsigned long)ft_ftell( file
);
253 FT_ERROR(( "FT_Stream_Open:" ));
254 FT_ERROR(( " opened `%s' but zero-sized\n", filepathname
));
256 return FT_THROW( 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
);