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