1 /***************************************************************************/ 2 /* */ 3 /* ftsystem.h */ 4 /* */ 5 /* FreeType low-level system interface definition (specification). */ 6 /* */ 7 /* Copyright 1996-2015 by */ 8 /* David Turner, Robert Wilhelm, and Werner Lemberg. */ 9 /* */ 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. */ 15 /* */ 16 /***************************************************************************/ 17 18 19 #ifndef __FTSYSTEM_H__ 20 #define __FTSYSTEM_H__ 21 22 23 #include <ft2build.h> 24 25 26 FT_BEGIN_HEADER 27 28 29 /*************************************************************************/ 30 /* */ 31 /* <Section> */ 32 /* system_interface */ 33 /* */ 34 /* <Title> */ 35 /* System Interface */ 36 /* */ 37 /* <Abstract> */ 38 /* How FreeType manages memory and i/o. */ 39 /* */ 40 /* <Description> */ 41 /* This section contains various definitions related to memory */ 42 /* management and i/o access. You need to understand this */ 43 /* information if you want to use a custom memory manager or you own */ 44 /* i/o streams. */ 45 /* */ 46 /*************************************************************************/ 47 48 49 /*************************************************************************/ 50 /* */ 51 /* M E M O R Y M A N A G E M E N T */ 52 /* */ 53 /*************************************************************************/ 54 55 56 /************************************************************************* 57 * 58 * @type: 59 * FT_Memory 60 * 61 * @description: 62 * A handle to a given memory manager object, defined with an 63 * @FT_MemoryRec structure. 64 * 65 */ 66 typedef struct FT_MemoryRec_* FT_Memory; 67 68 69 /************************************************************************* 70 * 71 * @functype: 72 * FT_Alloc_Func 73 * 74 * @description: 75 * A function used to allocate `size' bytes from `memory'. 76 * 77 * @input: 78 * memory :: 79 * A handle to the source memory manager. 80 * 81 * size :: 82 * The size in bytes to allocate. 83 * 84 * @return: 85 * Address of new memory block. 0~in case of failure. 86 * 87 */ 88 typedef void* 89 (*FT_Alloc_Func)( FT_Memory memory, 90 long size ); 91 92 93 /************************************************************************* 94 * 95 * @functype: 96 * FT_Free_Func 97 * 98 * @description: 99 * A function used to release a given block of memory. 100 * 101 * @input: 102 * memory :: 103 * A handle to the source memory manager. 104 * 105 * block :: 106 * The address of the target memory block. 107 * 108 */ 109 typedef void 110 (*FT_Free_Func)( FT_Memory memory, 111 void* block ); 112 113 114 /************************************************************************* 115 * 116 * @functype: 117 * FT_Realloc_Func 118 * 119 * @description: 120 * A function used to re-allocate a given block of memory. 121 * 122 * @input: 123 * memory :: 124 * A handle to the source memory manager. 125 * 126 * cur_size :: 127 * The block's current size in bytes. 128 * 129 * new_size :: 130 * The block's requested new size. 131 * 132 * block :: 133 * The block's current address. 134 * 135 * @return: 136 * New block address. 0~in case of memory shortage. 137 * 138 * @note: 139 * In case of error, the old block must still be available. 140 * 141 */ 142 typedef void* 143 (*FT_Realloc_Func)( FT_Memory memory, 144 long cur_size, 145 long new_size, 146 void* block ); 147 148 149 /************************************************************************* 150 * 151 * @struct: 152 * FT_MemoryRec 153 * 154 * @description: 155 * A structure used to describe a given memory manager to FreeType~2. 156 * 157 * @fields: 158 * user :: 159 * A generic typeless pointer for user data. 160 * 161 * alloc :: 162 * A pointer type to an allocation function. 163 * 164 * free :: 165 * A pointer type to an memory freeing function. 166 * 167 * realloc :: 168 * A pointer type to a reallocation function. 169 * 170 */ 171 struct FT_MemoryRec_ 172 { 173 void* user; 174 FT_Alloc_Func alloc; 175 FT_Free_Func free; 176 FT_Realloc_Func realloc; 177 }; 178 179 180 /*************************************************************************/ 181 /* */ 182 /* I / O M A N A G E M E N T */ 183 /* */ 184 /*************************************************************************/ 185 186 187 /************************************************************************* 188 * 189 * @type: 190 * FT_Stream 191 * 192 * @description: 193 * A handle to an input stream. 194 * 195 * @also: 196 * See @FT_StreamRec for the publicly accessible fields of a given 197 * stream object. 198 * 199 */ 200 typedef struct FT_StreamRec_* FT_Stream; 201 202 203 /************************************************************************* 204 * 205 * @struct: 206 * FT_StreamDesc 207 * 208 * @description: 209 * A union type used to store either a long or a pointer. This is used 210 * to store a file descriptor or a `FILE*' in an input stream. 211 * 212 */ 213 typedef union FT_StreamDesc_ 214 { 215 long value; 216 void* pointer; 217 218 } FT_StreamDesc; 219 220 221 /************************************************************************* 222 * 223 * @functype: 224 * FT_Stream_IoFunc 225 * 226 * @description: 227 * A function used to seek and read data from a given input stream. 228 * 229 * @input: 230 * stream :: 231 * A handle to the source stream. 232 * 233 * offset :: 234 * The offset of read in stream (always from start). 235 * 236 * buffer :: 237 * The address of the read buffer. 238 * 239 * count :: 240 * The number of bytes to read from the stream. 241 * 242 * @return: 243 * The number of bytes effectively read by the stream. 244 * 245 * @note: 246 * This function might be called to perform a seek or skip operation 247 * with a `count' of~0. A non-zero return value then indicates an 248 * error. 249 * 250 */ 251 typedef unsigned long 252 (*FT_Stream_IoFunc)( FT_Stream stream, 253 unsigned long offset, 254 unsigned char* buffer, 255 unsigned long count ); 256 257 258 /************************************************************************* 259 * 260 * @functype: 261 * FT_Stream_CloseFunc 262 * 263 * @description: 264 * A function used to close a given input stream. 265 * 266 * @input: 267 * stream :: 268 * A handle to the target stream. 269 * 270 */ 271 typedef void 272 (*FT_Stream_CloseFunc)( FT_Stream stream ); 273 274 275 /************************************************************************* 276 * 277 * @struct: 278 * FT_StreamRec 279 * 280 * @description: 281 * A structure used to describe an input stream. 282 * 283 * @input: 284 * base :: 285 * For memory-based streams, this is the address of the first stream 286 * byte in memory. This field should always be set to NULL for 287 * disk-based streams. 288 * 289 * size :: 290 * The stream size in bytes. 291 * 292 * In case of compressed streams where the size is unknown before 293 * actually doing the decompression, the value is set to 0x7FFFFFFF. 294 * (Note that this size value can occur for normal streams also; it is 295 * thus just a hint.) 296 * 297 * pos :: 298 * The current position within the stream. 299 * 300 * descriptor :: 301 * This field is a union that can hold an integer or a pointer. It is 302 * used by stream implementations to store file descriptors or `FILE*' 303 * pointers. 304 * 305 * pathname :: 306 * This field is completely ignored by FreeType. However, it is often 307 * useful during debugging to use it to store the stream's filename 308 * (where available). 309 * 310 * read :: 311 * The stream's input function. 312 * 313 * close :: 314 * The stream's close function. 315 * 316 * memory :: 317 * The memory manager to use to preload frames. This is set 318 * internally by FreeType and shouldn't be touched by stream 319 * implementations. 320 * 321 * cursor :: 322 * This field is set and used internally by FreeType when parsing 323 * frames. 324 * 325 * limit :: 326 * This field is set and used internally by FreeType when parsing 327 * frames. 328 * 329 */ 330 typedef struct FT_StreamRec_ 331 { 332 unsigned char* base; 333 unsigned long size; 334 unsigned long pos; 335 336 FT_StreamDesc descriptor; 337 FT_StreamDesc pathname; 338 FT_Stream_IoFunc read; 339 FT_Stream_CloseFunc close; 340 341 FT_Memory memory; 342 unsigned char* cursor; 343 unsigned char* limit; 344 345 } FT_StreamRec; 346 347 /* */ 348 349 350 FT_END_HEADER 351 352 #endif /* __FTSYSTEM_H__ */ 353 354 355 /* END */ 356