1 /**************************************************************************** 2 * 3 * fttypes.h 4 * 5 * FreeType simple types definitions (specification only). 6 * 7 * Copyright (C) 1996-2020 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 31 FT_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_Int 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 unsigned long, 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_Tag) \ 490 ( ( (FT_ULong)_x1 << 24 ) | \ 491 ( (FT_ULong)_x2 << 16 ) | \ 492 ( (FT_ULong)_x3 << 8 ) | \ 493 (FT_ULong)_x4 ) 494 495 496 /*************************************************************************/ 497 /*************************************************************************/ 498 /* */ 499 /* L I S T M A N A G E M E N T */ 500 /* */ 501 /*************************************************************************/ 502 /*************************************************************************/ 503 504 505 /************************************************************************** 506 * 507 * @section: 508 * list_processing 509 * 510 */ 511 512 513 /************************************************************************** 514 * 515 * @type: 516 * FT_ListNode 517 * 518 * @description: 519 * Many elements and objects in FreeType are listed through an @FT_List 520 * record (see @FT_ListRec). As its name suggests, an FT_ListNode is a 521 * handle to a single list element. 522 */ 523 typedef struct FT_ListNodeRec_* FT_ListNode; 524 525 526 /************************************************************************** 527 * 528 * @type: 529 * FT_List 530 * 531 * @description: 532 * A handle to a list record (see @FT_ListRec). 533 */ 534 typedef struct FT_ListRec_* FT_List; 535 536 537 /************************************************************************** 538 * 539 * @struct: 540 * FT_ListNodeRec 541 * 542 * @description: 543 * A structure used to hold a single list element. 544 * 545 * @fields: 546 * prev :: 547 * The previous element in the list. `NULL` if first. 548 * 549 * next :: 550 * The next element in the list. `NULL` if last. 551 * 552 * data :: 553 * A typeless pointer to the listed object. 554 */ 555 typedef struct FT_ListNodeRec_ 556 { 557 FT_ListNode prev; 558 FT_ListNode next; 559 void* data; 560 561 } FT_ListNodeRec; 562 563 564 /************************************************************************** 565 * 566 * @struct: 567 * FT_ListRec 568 * 569 * @description: 570 * A structure used to hold a simple doubly-linked list. These are used 571 * in many parts of FreeType. 572 * 573 * @fields: 574 * head :: 575 * The head (first element) of doubly-linked list. 576 * 577 * tail :: 578 * The tail (last element) of doubly-linked list. 579 */ 580 typedef struct FT_ListRec_ 581 { 582 FT_ListNode head; 583 FT_ListNode tail; 584 585 } FT_ListRec; 586 587 /* */ 588 589 590 #define FT_IS_EMPTY( list ) ( (list).head == 0 ) 591 #define FT_BOOL( x ) ( (FT_Bool)( (x) != 0 ) ) 592 593 /* concatenate C tokens */ 594 #define FT_ERR_XCAT( x, y ) x ## y 595 #define FT_ERR_CAT( x, y ) FT_ERR_XCAT( x, y ) 596 597 /* see `ftmoderr.h` for descriptions of the following macros */ 598 599 #define FT_ERR( e ) FT_ERR_CAT( FT_ERR_PREFIX, e ) 600 601 #define FT_ERROR_BASE( x ) ( (x) & 0xFF ) 602 #define FT_ERROR_MODULE( x ) ( (x) & 0xFF00U ) 603 604 #define FT_ERR_EQ( x, e ) \ 605 ( FT_ERROR_BASE( x ) == FT_ERROR_BASE( FT_ERR( e ) ) ) 606 #define FT_ERR_NEQ( x, e ) \ 607 ( FT_ERROR_BASE( x ) != FT_ERROR_BASE( FT_ERR( e ) ) ) 608 609 610 FT_END_HEADER 611 612 #endif /* FTTYPES_H_ */ 613 614 615 /* END */ 616