1/****************************************************************************
2 *
3 * fttypes.h
4 *
5 * FreeType simple types definitions (specification only).
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 FTTYPES_H_
20#define FTTYPES_H_
21
22
23#include <ft2build.h>
24#include FT_CONFIG_CONFIG_H
25#include <freetype/ftsystem.h>
26#include <freetype/ftimage.h>
27
28#include <stddef.h>
29
30
31FT_BEGIN_HEADER
32
33
34 /**************************************************************************
35 *
36 * @section:
37 * basic_types
38 *
39 * @title:
40 * Basic Data Types
41 *
42 * @abstract:
43 * The basic data types defined by the library.
44 *
45 * @description:
46 * This section contains the basic data types defined by FreeType~2,
47 * ranging from simple scalar types to bitmap descriptors. More
48 * font-specific structures are defined in a different section. Note
49 * that FreeType does not use floating-point data types. Fractional
50 * values are represented by fixed-point integers, with lower bits
51 * storing the fractional part.
52 *
53 * @order:
54 * FT_Byte
55 * FT_Bytes
56 * FT_Char
57 * FT_Int
58 * FT_UInt
59 * FT_Int16
60 * FT_UInt16
61 * FT_Int32
62 * FT_UInt32
63 * FT_Int64
64 * FT_UInt64
65 * FT_Short
66 * FT_UShort
67 * FT_Long
68 * FT_ULong
69 * FT_Bool
70 * FT_Offset
71 * FT_PtrDist
72 * FT_String
73 * FT_Tag
74 * FT_Error
75 * FT_Fixed
76 * FT_Pointer
77 * FT_Pos
78 * FT_Vector
79 * FT_BBox
80 * FT_Matrix
81 * FT_FWord
82 * FT_UFWord
83 * FT_F2Dot14
84 * FT_UnitVector
85 * FT_F26Dot6
86 * FT_Data
87 *
88 * FT_MAKE_TAG
89 *
90 * FT_Generic
91 * FT_Generic_Finalizer
92 *
93 * FT_Bitmap
94 * FT_Pixel_Mode
95 * FT_Palette_Mode
96 * FT_Glyph_Format
97 * FT_IMAGE_TAG
98 *
99 */
100
101
102 /**************************************************************************
103 *
104 * @type:
105 * FT_Bool
106 *
107 * @description:
108 * A typedef of unsigned char, used for simple booleans. As usual,
109 * values 1 and~0 represent true and false, respectively.
110 */
111 typedef unsigned char FT_Bool;
112
113
114 /**************************************************************************
115 *
116 * @type:
117 * FT_FWord
118 *
119 * @description:
120 * A signed 16-bit integer used to store a distance in original font
121 * units.
122 */
123 typedef signed short FT_FWord; /* distance in FUnits */
124
125
126 /**************************************************************************
127 *
128 * @type:
129 * FT_UFWord
130 *
131 * @description:
132 * An unsigned 16-bit integer used to store a distance in original font
133 * units.
134 */
135 typedef unsigned short FT_UFWord; /* unsigned distance */
136
137
138 /**************************************************************************
139 *
140 * @type:
141 * FT_Char
142 *
143 * @description:
144 * A simple typedef for the _signed_ char type.
145 */
146 typedef signed char FT_Char;
147
148
149 /**************************************************************************
150 *
151 * @type:
152 * FT_Byte
153 *
154 * @description:
155 * A simple typedef for the _unsigned_ char type.
156 */
157 typedef unsigned char FT_Byte;
158
159
160 /**************************************************************************
161 *
162 * @type:
163 * FT_Bytes
164 *
165 * @description:
166 * A typedef for constant memory areas.
167 */
168 typedef const FT_Byte* FT_Bytes;
169
170
171 /**************************************************************************
172 *
173 * @type:
174 * FT_Tag
175 *
176 * @description:
177 * A typedef for 32-bit tags (as used in the SFNT format).
178 */
179 typedef FT_UInt32 FT_Tag;
180
181
182 /**************************************************************************
183 *
184 * @type:
185 * FT_String
186 *
187 * @description:
188 * A simple typedef for the char type, usually used for strings.
189 */
190 typedef char FT_String;
191
192
193 /**************************************************************************
194 *
195 * @type:
196 * FT_Short
197 *
198 * @description:
199 * A typedef for signed short.
200 */
201 typedef signed short FT_Short;
202
203
204 /**************************************************************************
205 *
206 * @type:
207 * FT_UShort
208 *
209 * @description:
210 * A typedef for unsigned short.
211 */
212 typedef unsigned short FT_UShort;
213
214
215 /**************************************************************************
216 *
217 * @type:
218 * FT_Int
219 *
220 * @description:
221 * A typedef for the int type.
222 */
223 typedef signed int FT_Int;
224
225
226 /**************************************************************************
227 *
228 * @type:
229 * FT_UInt
230 *
231 * @description:
232 * A typedef for the unsigned int type.
233 */
234 typedef unsigned int FT_UInt;
235
236
237 /**************************************************************************
238 *
239 * @type:
240 * FT_Long
241 *
242 * @description:
243 * A typedef for signed long.
244 */
245 typedef signed long FT_Long;
246
247
248 /**************************************************************************
249 *
250 * @type:
251 * FT_ULong
252 *
253 * @description:
254 * A typedef for unsigned long.
255 */
256 typedef unsigned long FT_ULong;
257
258
259 /**************************************************************************
260 *
261 * @type:
262 * FT_F2Dot14
263 *
264 * @description:
265 * A signed 2.14 fixed-point type used for unit vectors.
266 */
267 typedef signed short FT_F2Dot14;
268
269
270 /**************************************************************************
271 *
272 * @type:
273 * FT_F26Dot6
274 *
275 * @description:
276 * A signed 26.6 fixed-point type used for vectorial pixel coordinates.
277 */
278 typedef signed long FT_F26Dot6;
279
280
281 /**************************************************************************
282 *
283 * @type:
284 * FT_Fixed
285 *
286 * @description:
287 * This type is used to store 16.16 fixed-point values, like scaling
288 * values or matrix coefficients.
289 */
290 typedef signed long FT_Fixed;
291
292
293 /**************************************************************************
294 *
295 * @type:
296 * FT_Error
297 *
298 * @description:
299 * The FreeType error code type. A value of~0 is always interpreted as a
300 * successful operation.
301 */
302 typedef int FT_Error;
303
304
305 /**************************************************************************
306 *
307 * @type:
308 * FT_Pointer
309 *
310 * @description:
311 * A simple typedef for a typeless pointer.
312 */
313 typedef void* FT_Pointer;
314
315
316 /**************************************************************************
317 *
318 * @type:
319 * FT_Offset
320 *
321 * @description:
322 * This is equivalent to the ANSI~C `size_t` type, i.e., the largest
323 * _unsigned_ integer type used to express a file size or position, or a
324 * memory block size.
325 */
326 typedef size_t FT_Offset;
327
328
329 /**************************************************************************
330 *
331 * @type:
332 * FT_PtrDist
333 *
334 * @description:
335 * This is equivalent to the ANSI~C `ptrdiff_t` type, i.e., the largest
336 * _signed_ integer type used to express the distance between two
337 * pointers.
338 */
339 typedef ft_ptrdiff_t FT_PtrDist;
340
341
342 /**************************************************************************
343 *
344 * @struct:
345 * FT_UnitVector
346 *
347 * @description:
348 * A simple structure used to store a 2D vector unit vector. Uses
349 * FT_F2Dot14 types.
350 *
351 * @fields:
352 * x ::
353 * Horizontal coordinate.
354 *
355 * y ::
356 * Vertical coordinate.
357 */
358 typedef struct FT_UnitVector_
359 {
360 FT_F2Dot14 x;
361 FT_F2Dot14 y;
362
363 } FT_UnitVector;
364
365
366 /**************************************************************************
367 *
368 * @struct:
369 * FT_Matrix
370 *
371 * @description:
372 * A simple structure used to store a 2x2 matrix. Coefficients are in
373 * 16.16 fixed-point format. The computation performed is:
374 *
375 * ```
376 * x' = x*xx + y*xy
377 * y' = x*yx + y*yy
378 * ```
379 *
380 * @fields:
381 * xx ::
382 * Matrix coefficient.
383 *
384 * xy ::
385 * Matrix coefficient.
386 *
387 * yx ::
388 * Matrix coefficient.
389 *
390 * yy ::
391 * Matrix coefficient.
392 */
393 typedef struct FT_Matrix_
394 {
395 FT_Fixed xx, xy;
396 FT_Fixed yx, yy;
397
398 } FT_Matrix;
399
400
401 /**************************************************************************
402 *
403 * @struct:
404 * FT_Data
405 *
406 * @description:
407 * Read-only binary data represented as a pointer and a length.
408 *
409 * @fields:
410 * pointer ::
411 * The data.
412 *
413 * length ::
414 * The length of the data in bytes.
415 */
416 typedef struct FT_Data_
417 {
418 const FT_Byte* pointer;
419 FT_UInt length;
420
421 } FT_Data;
422
423
424 /**************************************************************************
425 *
426 * @functype:
427 * FT_Generic_Finalizer
428 *
429 * @description:
430 * Describe a function used to destroy the 'client' data of any FreeType
431 * object. See the description of the @FT_Generic type for details of
432 * usage.
433 *
434 * @input:
435 * The address of the FreeType object that is under finalization. Its
436 * client data is accessed through its `generic` field.
437 */
438 typedef void (*FT_Generic_Finalizer)( void* object );
439
440
441 /**************************************************************************
442 *
443 * @struct:
444 * FT_Generic
445 *
446 * @description:
447 * Client applications often need to associate their own data to a
448 * variety of FreeType core objects. For example, a text layout API
449 * might want to associate a glyph cache to a given size object.
450 *
451 * Some FreeType object contains a `generic` field, of type `FT_Generic`,
452 * which usage is left to client applications and font servers.
453 *
454 * It can be used to store a pointer to client-specific data, as well as
455 * the address of a 'finalizer' function, which will be called by
456 * FreeType when the object is destroyed (for example, the previous
457 * client example would put the address of the glyph cache destructor in
458 * the `finalizer` field).
459 *
460 * @fields:
461 * data ::
462 * A typeless pointer to any client-specified data. This field is
463 * completely ignored by the FreeType library.
464 *
465 * finalizer ::
466 * A pointer to a 'generic finalizer' function, which will be called
467 * when the object is destroyed. If this field is set to `NULL`, no
468 * code will be called.
469 */
470 typedef struct FT_Generic_
471 {
472 void* data;
473 FT_Generic_Finalizer finalizer;
474
475 } FT_Generic;
476
477
478 /**************************************************************************
479 *
480 * @macro:
481 * FT_MAKE_TAG
482 *
483 * @description:
484 * This macro converts four-letter tags that are used to label TrueType
485 * tables into an `FT_Tag` type, to be used within FreeType.
486 *
487 * @note:
488 * The produced values **must** be 32-bit integers. Don't redefine this
489 * macro.
490 */
491#define FT_MAKE_TAG( _x1, _x2, _x3, _x4 ) \
492 ( ( FT_STATIC_BYTE_CAST( FT_Tag, _x1 ) << 24 ) | \
493 ( FT_STATIC_BYTE_CAST( FT_Tag, _x2 ) << 16 ) | \
494 ( FT_STATIC_BYTE_CAST( FT_Tag, _x3 ) << 8 ) | \
495 FT_STATIC_BYTE_CAST( FT_Tag, _x4 ) )
496
497
498 /*************************************************************************/
499 /*************************************************************************/
500 /* */
501 /* L I S T M A N A G E M E N T */
502 /* */
503 /*************************************************************************/
504 /*************************************************************************/
505
506
507 /**************************************************************************
508 *
509 * @section:
510 * list_processing
511 *
512 */
513
514
515 /**************************************************************************
516 *
517 * @type:
518 * FT_ListNode
519 *
520 * @description:
521 * Many elements and objects in FreeType are listed through an @FT_List
522 * record (see @FT_ListRec). As its name suggests, an FT_ListNode is a
523 * handle to a single list element.
524 */
525 typedef struct FT_ListNodeRec_* FT_ListNode;
526
527
528 /**************************************************************************
529 *
530 * @type:
531 * FT_List
532 *
533 * @description:
534 * A handle to a list record (see @FT_ListRec).
535 */
536 typedef struct FT_ListRec_* FT_List;
537
538
539 /**************************************************************************
540 *
541 * @struct:
542 * FT_ListNodeRec
543 *
544 * @description:
545 * A structure used to hold a single list element.
546 *
547 * @fields:
548 * prev ::
549 * The previous element in the list. `NULL` if first.
550 *
551 * next ::
552 * The next element in the list. `NULL` if last.
553 *
554 * data ::
555 * A typeless pointer to the listed object.
556 */
557 typedef struct FT_ListNodeRec_
558 {
559 FT_ListNode prev;
560 FT_ListNode next;
561 void* data;
562
563 } FT_ListNodeRec;
564
565
566 /**************************************************************************
567 *
568 * @struct:
569 * FT_ListRec
570 *
571 * @description:
572 * A structure used to hold a simple doubly-linked list. These are used
573 * in many parts of FreeType.
574 *
575 * @fields:
576 * head ::
577 * The head (first element) of doubly-linked list.
578 *
579 * tail ::
580 * The tail (last element) of doubly-linked list.
581 */
582 typedef struct FT_ListRec_
583 {
584 FT_ListNode head;
585 FT_ListNode tail;
586
587 } FT_ListRec;
588
589 /* */
590
591
592#define FT_IS_EMPTY( list ) ( (list).head == 0 )
593#define FT_BOOL( x ) FT_STATIC_CAST( FT_Bool, (x) != 0 )
594
595 /* concatenate C tokens */
596#define FT_ERR_XCAT( x, y ) x ## y
597#define FT_ERR_CAT( x, y ) FT_ERR_XCAT( x, y )
598
599 /* see `ftmoderr.h` for descriptions of the following macros */
600
601#define FT_ERR( e ) FT_ERR_CAT( FT_ERR_PREFIX, e )
602
603#define FT_ERROR_BASE( x ) ( (x) & 0xFF )
604#define FT_ERROR_MODULE( x ) ( (x) & 0xFF00U )
605
606#define FT_ERR_EQ( x, e ) \
607 ( FT_ERROR_BASE( x ) == FT_ERROR_BASE( FT_ERR( e ) ) )
608#define FT_ERR_NEQ( x, e ) \
609 ( FT_ERROR_BASE( x ) != FT_ERROR_BASE( FT_ERR( e ) ) )
610
611
612FT_END_HEADER
613
614#endif /* FTTYPES_H_ */
615
616
617/* END */
618