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