1 | /**************************************************************************** |
2 | * |
3 | * ftsystem.h |
4 | * |
5 | * FreeType low-level system interface definition (specification). |
6 | * |
7 | * Copyright (C) 1996-2023 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 from the start of the stream to seek to. |
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 | * If count >~0, return the number of bytes effectively read by the |
242 | * stream (after seeking to `offset`). If count ==~0, return the status |
243 | * of the seek operation (non-zero indicates an error). |
244 | * |
245 | */ |
246 | typedef unsigned long |
247 | (*FT_Stream_IoFunc)( FT_Stream stream, |
248 | unsigned long offset, |
249 | unsigned char* buffer, |
250 | unsigned long count ); |
251 | |
252 | |
253 | /************************************************************************** |
254 | * |
255 | * @functype: |
256 | * FT_Stream_CloseFunc |
257 | * |
258 | * @description: |
259 | * A function used to close a given input stream. |
260 | * |
261 | * @input: |
262 | * stream :: |
263 | * A handle to the target stream. |
264 | * |
265 | */ |
266 | typedef void |
267 | (*FT_Stream_CloseFunc)( FT_Stream stream ); |
268 | |
269 | |
270 | /************************************************************************** |
271 | * |
272 | * @struct: |
273 | * FT_StreamRec |
274 | * |
275 | * @description: |
276 | * A structure used to describe an input stream. |
277 | * |
278 | * @input: |
279 | * base :: |
280 | * For memory-based streams, this is the address of the first stream |
281 | * byte in memory. This field should always be set to `NULL` for |
282 | * disk-based streams. |
283 | * |
284 | * size :: |
285 | * The stream size in bytes. |
286 | * |
287 | * In case of compressed streams where the size is unknown before |
288 | * actually doing the decompression, the value is set to 0x7FFFFFFF. |
289 | * (Note that this size value can occur for normal streams also; it is |
290 | * thus just a hint.) |
291 | * |
292 | * pos :: |
293 | * The current position within the stream. |
294 | * |
295 | * descriptor :: |
296 | * This field is a union that can hold an integer or a pointer. It is |
297 | * used by stream implementations to store file descriptors or `FILE*` |
298 | * pointers. |
299 | * |
300 | * pathname :: |
301 | * This field is completely ignored by FreeType. However, it is often |
302 | * useful during debugging to use it to store the stream's filename |
303 | * (where available). |
304 | * |
305 | * read :: |
306 | * The stream's input function. |
307 | * |
308 | * close :: |
309 | * The stream's close function. |
310 | * |
311 | * memory :: |
312 | * The memory manager to use to preload frames. This is set internally |
313 | * by FreeType and shouldn't be touched by stream implementations. |
314 | * |
315 | * cursor :: |
316 | * This field is set and used internally by FreeType when parsing |
317 | * frames. In particular, the `FT_GET_XXX` macros use this instead of |
318 | * the `pos` field. |
319 | * |
320 | * limit :: |
321 | * This field is set and used internally by FreeType when parsing |
322 | * frames. |
323 | * |
324 | */ |
325 | typedef struct FT_StreamRec_ |
326 | { |
327 | unsigned char* base; |
328 | unsigned long size; |
329 | unsigned long pos; |
330 | |
331 | FT_StreamDesc descriptor; |
332 | FT_StreamDesc pathname; |
333 | FT_Stream_IoFunc read; |
334 | FT_Stream_CloseFunc close; |
335 | |
336 | FT_Memory memory; |
337 | unsigned char* cursor; |
338 | unsigned char* limit; |
339 | |
340 | } FT_StreamRec; |
341 | |
342 | /* */ |
343 | |
344 | |
345 | FT_END_HEADER |
346 | |
347 | #endif /* FTSYSTEM_H_ */ |
348 | |
349 | |
350 | /* END */ |
351 | |