1 /***************************************************************************/ 2 /* */ 3 /* ftglyph.h */ 4 /* */ 5 /* FreeType convenience functions to handle glyphs (specification). */ 6 /* */ 7 /* Copyright 1996-2018 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 /*************************************************************************/ 20 /* */ 21 /* This file contains the definition of several convenience functions */ 22 /* that can be used by client applications to easily retrieve glyph */ 23 /* bitmaps and outlines from a given face. */ 24 /* */ 25 /* These functions should be optional if you are writing a font server */ 26 /* or text layout engine on top of FreeType. However, they are pretty */ 27 /* handy for many other simple uses of the library. */ 28 /* */ 29 /*************************************************************************/ 30 31 32 #ifndef FTGLYPH_H_ 33 #define FTGLYPH_H_ 34 35 36 #include <ft2build.h> 37 #include FT_FREETYPE_H 38 39 #ifdef FREETYPE_H 40 #error "freetype.h of FreeType 1 has been loaded!" 41 #error "Please fix the directory search order for header files" 42 #error "so that freetype.h of FreeType 2 is found first." 43 #endif 44 45 46 FT_BEGIN_HEADER 47 48 49 /*************************************************************************/ 50 /* */ 51 /* <Section> */ 52 /* glyph_management */ 53 /* */ 54 /* <Title> */ 55 /* Glyph Management */ 56 /* */ 57 /* <Abstract> */ 58 /* Generic interface to manage individual glyph data. */ 59 /* */ 60 /* <Description> */ 61 /* This section contains definitions used to manage glyph data */ 62 /* through generic FT_Glyph objects. Each of them can contain a */ 63 /* bitmap, a vector outline, or even images in other formats. */ 64 /* */ 65 /*************************************************************************/ 66 67 68 /* forward declaration to a private type */ 69 typedef struct FT_Glyph_Class_ FT_Glyph_Class; 70 71 72 /*************************************************************************/ 73 /* */ 74 /* <Type> */ 75 /* FT_Glyph */ 76 /* */ 77 /* <Description> */ 78 /* Handle to an object used to model generic glyph images. It is a */ 79 /* pointer to the @FT_GlyphRec structure and can contain a glyph */ 80 /* bitmap or pointer. */ 81 /* */ 82 /* <Note> */ 83 /* Glyph objects are not owned by the library. You must thus release */ 84 /* them manually (through @FT_Done_Glyph) _before_ calling */ 85 /* @FT_Done_FreeType. */ 86 /* */ 87 typedef struct FT_GlyphRec_* FT_Glyph; 88 89 90 /*************************************************************************/ 91 /* */ 92 /* <Struct> */ 93 /* FT_GlyphRec */ 94 /* */ 95 /* <Description> */ 96 /* The root glyph structure contains a given glyph image plus its */ 97 /* advance width in 16.16 fixed-point format. */ 98 /* */ 99 /* <Fields> */ 100 /* library :: A handle to the FreeType library object. */ 101 /* */ 102 /* clazz :: A pointer to the glyph's class. Private. */ 103 /* */ 104 /* format :: The format of the glyph's image. */ 105 /* */ 106 /* advance :: A 16.16 vector that gives the glyph's advance width. */ 107 /* */ 108 typedef struct FT_GlyphRec_ 109 { 110 FT_Library library; 111 const FT_Glyph_Class* clazz; 112 FT_Glyph_Format format; 113 FT_Vector advance; 114 115 } FT_GlyphRec; 116 117 118 /*************************************************************************/ 119 /* */ 120 /* <Type> */ 121 /* FT_BitmapGlyph */ 122 /* */ 123 /* <Description> */ 124 /* A handle to an object used to model a bitmap glyph image. This is */ 125 /* a sub-class of @FT_Glyph, and a pointer to @FT_BitmapGlyphRec. */ 126 /* */ 127 typedef struct FT_BitmapGlyphRec_* FT_BitmapGlyph; 128 129 130 /*************************************************************************/ 131 /* */ 132 /* <Struct> */ 133 /* FT_BitmapGlyphRec */ 134 /* */ 135 /* <Description> */ 136 /* A structure used for bitmap glyph images. This really is a */ 137 /* `sub-class' of @FT_GlyphRec. */ 138 /* */ 139 /* <Fields> */ 140 /* root :: The root @FT_Glyph fields. */ 141 /* */ 142 /* left :: The left-side bearing, i.e., the horizontal distance */ 143 /* from the current pen position to the left border of the */ 144 /* glyph bitmap. */ 145 /* */ 146 /* top :: The top-side bearing, i.e., the vertical distance from */ 147 /* the current pen position to the top border of the glyph */ 148 /* bitmap. This distance is positive for upwards~y! */ 149 /* */ 150 /* bitmap :: A descriptor for the bitmap. */ 151 /* */ 152 /* <Note> */ 153 /* You can typecast an @FT_Glyph to @FT_BitmapGlyph if you have */ 154 /* `glyph->format == FT_GLYPH_FORMAT_BITMAP'. This lets you access */ 155 /* the bitmap's contents easily. */ 156 /* */ 157 /* The corresponding pixel buffer is always owned by @FT_BitmapGlyph */ 158 /* and is thus created and destroyed with it. */ 159 /* */ 160 typedef struct FT_BitmapGlyphRec_ 161 { 162 FT_GlyphRec root; 163 FT_Int left; 164 FT_Int top; 165 FT_Bitmap bitmap; 166 167 } FT_BitmapGlyphRec; 168 169 170 /*************************************************************************/ 171 /* */ 172 /* <Type> */ 173 /* FT_OutlineGlyph */ 174 /* */ 175 /* <Description> */ 176 /* A handle to an object used to model an outline glyph image. This */ 177 /* is a sub-class of @FT_Glyph, and a pointer to @FT_OutlineGlyphRec. */ 178 /* */ 179 typedef struct FT_OutlineGlyphRec_* FT_OutlineGlyph; 180 181 182 /*************************************************************************/ 183 /* */ 184 /* <Struct> */ 185 /* FT_OutlineGlyphRec */ 186 /* */ 187 /* <Description> */ 188 /* A structure used for outline (vectorial) glyph images. This */ 189 /* really is a `sub-class' of @FT_GlyphRec. */ 190 /* */ 191 /* <Fields> */ 192 /* root :: The root @FT_Glyph fields. */ 193 /* */ 194 /* outline :: A descriptor for the outline. */ 195 /* */ 196 /* <Note> */ 197 /* You can typecast an @FT_Glyph to @FT_OutlineGlyph if you have */ 198 /* `glyph->format == FT_GLYPH_FORMAT_OUTLINE'. This lets you access */ 199 /* the outline's content easily. */ 200 /* */ 201 /* As the outline is extracted from a glyph slot, its coordinates are */ 202 /* expressed normally in 26.6 pixels, unless the flag */ 203 /* @FT_LOAD_NO_SCALE was used in @FT_Load_Glyph() or @FT_Load_Char(). */ 204 /* */ 205 /* The outline's tables are always owned by the object and are */ 206 /* destroyed with it. */ 207 /* */ 208 typedef struct FT_OutlineGlyphRec_ 209 { 210 FT_GlyphRec root; 211 FT_Outline outline; 212 213 } FT_OutlineGlyphRec; 214 215 216 /*************************************************************************/ 217 /* */ 218 /* <Function> */ 219 /* FT_Get_Glyph */ 220 /* */ 221 /* <Description> */ 222 /* A function used to extract a glyph image from a slot. Note that */ 223 /* the created @FT_Glyph object must be released with @FT_Done_Glyph. */ 224 /* */ 225 /* <Input> */ 226 /* slot :: A handle to the source glyph slot. */ 227 /* */ 228 /* <Output> */ 229 /* aglyph :: A handle to the glyph object. */ 230 /* */ 231 /* <Return> */ 232 /* FreeType error code. 0~means success. */ 233 /* */ 234 /* <Note> */ 235 /* Because `*aglyph->advance.x' and '*aglyph->advance.y' are 16.16 */ 236 /* fixed-point numbers, `slot->advance.x' and `slot->advance.y' */ 237 /* (which are in 26.6 fixed-point format) must be in the range */ 238 /* ]-32768;32768[. */ 239 /* */ 240 FT_EXPORT( FT_Error ) 241 FT_Get_Glyph( FT_GlyphSlot slot, 242 FT_Glyph *aglyph ); 243 244 245 /*************************************************************************/ 246 /* */ 247 /* <Function> */ 248 /* FT_Glyph_Copy */ 249 /* */ 250 /* <Description> */ 251 /* A function used to copy a glyph image. Note that the created */ 252 /* @FT_Glyph object must be released with @FT_Done_Glyph. */ 253 /* */ 254 /* <Input> */ 255 /* source :: A handle to the source glyph object. */ 256 /* */ 257 /* <Output> */ 258 /* target :: A handle to the target glyph object. 0~in case of */ 259 /* error. */ 260 /* */ 261 /* <Return> */ 262 /* FreeType error code. 0~means success. */ 263 /* */ 264 FT_EXPORT( FT_Error ) 265 FT_Glyph_Copy( FT_Glyph source, 266 FT_Glyph *target ); 267 268 269 /*************************************************************************/ 270 /* */ 271 /* <Function> */ 272 /* FT_Glyph_Transform */ 273 /* */ 274 /* <Description> */ 275 /* Transform a glyph image if its format is scalable. */ 276 /* */ 277 /* <InOut> */ 278 /* glyph :: A handle to the target glyph object. */ 279 /* */ 280 /* <Input> */ 281 /* matrix :: A pointer to a 2x2 matrix to apply. */ 282 /* */ 283 /* delta :: A pointer to a 2d vector to apply. Coordinates are */ 284 /* expressed in 1/64th of a pixel. */ 285 /* */ 286 /* <Return> */ 287 /* FreeType error code (if not 0, the glyph format is not scalable). */ 288 /* */ 289 /* <Note> */ 290 /* The 2x2 transformation matrix is also applied to the glyph's */ 291 /* advance vector. */ 292 /* */ 293 FT_EXPORT( FT_Error ) 294 FT_Glyph_Transform( FT_Glyph glyph, 295 FT_Matrix* matrix, 296 FT_Vector* delta ); 297 298 299 /*************************************************************************/ 300 /* */ 301 /* <Enum> */ 302 /* FT_Glyph_BBox_Mode */ 303 /* */ 304 /* <Description> */ 305 /* The mode how the values of @FT_Glyph_Get_CBox are returned. */ 306 /* */ 307 /* <Values> */ 308 /* FT_GLYPH_BBOX_UNSCALED :: */ 309 /* Return unscaled font units. */ 310 /* */ 311 /* FT_GLYPH_BBOX_SUBPIXELS :: */ 312 /* Return unfitted 26.6 coordinates. */ 313 /* */ 314 /* FT_GLYPH_BBOX_GRIDFIT :: */ 315 /* Return grid-fitted 26.6 coordinates. */ 316 /* */ 317 /* FT_GLYPH_BBOX_TRUNCATE :: */ 318 /* Return coordinates in integer pixels. */ 319 /* */ 320 /* FT_GLYPH_BBOX_PIXELS :: */ 321 /* Return grid-fitted pixel coordinates. */ 322 /* */ 323 typedef enum FT_Glyph_BBox_Mode_ 324 { 325 FT_GLYPH_BBOX_UNSCALED = 0, 326 FT_GLYPH_BBOX_SUBPIXELS = 0, 327 FT_GLYPH_BBOX_GRIDFIT = 1, 328 FT_GLYPH_BBOX_TRUNCATE = 2, 329 FT_GLYPH_BBOX_PIXELS = 3 330 331 } FT_Glyph_BBox_Mode; 332 333 334 /* these constants are deprecated; use the corresponding */ 335 /* `FT_Glyph_BBox_Mode' values instead */ 336 #define ft_glyph_bbox_unscaled FT_GLYPH_BBOX_UNSCALED 337 #define ft_glyph_bbox_subpixels FT_GLYPH_BBOX_SUBPIXELS 338 #define ft_glyph_bbox_gridfit FT_GLYPH_BBOX_GRIDFIT 339 #define ft_glyph_bbox_truncate FT_GLYPH_BBOX_TRUNCATE 340 #define ft_glyph_bbox_pixels FT_GLYPH_BBOX_PIXELS 341 342 343 /*************************************************************************/ 344 /* */ 345 /* <Function> */ 346 /* FT_Glyph_Get_CBox */ 347 /* */ 348 /* <Description> */ 349 /* Return a glyph's `control box'. The control box encloses all the */ 350 /* outline's points, including Bezier control points. Though it */ 351 /* coincides with the exact bounding box for most glyphs, it can be */ 352 /* slightly larger in some situations (like when rotating an outline */ 353 /* that contains Bezier outside arcs). */ 354 /* */ 355 /* Computing the control box is very fast, while getting the bounding */ 356 /* box can take much more time as it needs to walk over all segments */ 357 /* and arcs in the outline. To get the latter, you can use the */ 358 /* `ftbbox' component, which is dedicated to this single task. */ 359 /* */ 360 /* <Input> */ 361 /* glyph :: A handle to the source glyph object. */ 362 /* */ 363 /* mode :: The mode that indicates how to interpret the returned */ 364 /* bounding box values. */ 365 /* */ 366 /* <Output> */ 367 /* acbox :: The glyph coordinate bounding box. Coordinates are */ 368 /* expressed in 1/64th of pixels if it is grid-fitted. */ 369 /* */ 370 /* <Note> */ 371 /* Coordinates are relative to the glyph origin, using the y~upwards */ 372 /* convention. */ 373 /* */ 374 /* If the glyph has been loaded with @FT_LOAD_NO_SCALE, `bbox_mode' */ 375 /* must be set to @FT_GLYPH_BBOX_UNSCALED to get unscaled font */ 376 /* units in 26.6 pixel format. The value @FT_GLYPH_BBOX_SUBPIXELS */ 377 /* is another name for this constant. */ 378 /* */ 379 /* If the font is tricky and the glyph has been loaded with */ 380 /* @FT_LOAD_NO_SCALE, the resulting CBox is meaningless. To get */ 381 /* reasonable values for the CBox it is necessary to load the glyph */ 382 /* at a large ppem value (so that the hinting instructions can */ 383 /* properly shift and scale the subglyphs), then extracting the CBox, */ 384 /* which can be eventually converted back to font units. */ 385 /* */ 386 /* Note that the maximum coordinates are exclusive, which means that */ 387 /* one can compute the width and height of the glyph image (be it in */ 388 /* integer or 26.6 pixels) as: */ 389 /* */ 390 /* { */ 391 /* width = bbox.xMax - bbox.xMin; */ 392 /* height = bbox.yMax - bbox.yMin; */ 393 /* } */ 394 /* */ 395 /* Note also that for 26.6 coordinates, if `bbox_mode' is set to */ 396 /* @FT_GLYPH_BBOX_GRIDFIT, the coordinates will also be grid-fitted, */ 397 /* which corresponds to: */ 398 /* */ 399 /* { */ 400 /* bbox.xMin = FLOOR(bbox.xMin); */ 401 /* bbox.yMin = FLOOR(bbox.yMin); */ 402 /* bbox.xMax = CEILING(bbox.xMax); */ 403 /* bbox.yMax = CEILING(bbox.yMax); */ 404 /* } */ 405 /* */ 406 /* To get the bbox in pixel coordinates, set `bbox_mode' to */ 407 /* @FT_GLYPH_BBOX_TRUNCATE. */ 408 /* */ 409 /* To get the bbox in grid-fitted pixel coordinates, set `bbox_mode' */ 410 /* to @FT_GLYPH_BBOX_PIXELS. */ 411 /* */ 412 FT_EXPORT( void ) 413 FT_Glyph_Get_CBox( FT_Glyph glyph, 414 FT_UInt bbox_mode, 415 FT_BBox *acbox ); 416 417 418 /*************************************************************************/ 419 /* */ 420 /* <Function> */ 421 /* FT_Glyph_To_Bitmap */ 422 /* */ 423 /* <Description> */ 424 /* Convert a given glyph object to a bitmap glyph object. */ 425 /* */ 426 /* <InOut> */ 427 /* the_glyph :: A pointer to a handle to the target glyph. */ 428 /* */ 429 /* <Input> */ 430 /* render_mode :: An enumeration that describes how the data is */ 431 /* rendered. */ 432 /* */ 433 /* origin :: A pointer to a vector used to translate the glyph */ 434 /* image before rendering. Can be~0 (if no */ 435 /* translation). The origin is expressed in */ 436 /* 26.6 pixels. */ 437 /* */ 438 /* destroy :: A boolean that indicates that the original glyph */ 439 /* image should be destroyed by this function. It is */ 440 /* never destroyed in case of error. */ 441 /* */ 442 /* <Return> */ 443 /* FreeType error code. 0~means success. */ 444 /* */ 445 /* <Note> */ 446 /* This function does nothing if the glyph format isn't scalable. */ 447 /* */ 448 /* The glyph image is translated with the `origin' vector before */ 449 /* rendering. */ 450 /* */ 451 /* The first parameter is a pointer to an @FT_Glyph handle, that will */ 452 /* be _replaced_ by this function (with newly allocated data). */ 453 /* Typically, you would use (omitting error handling): */ 454 /* */ 455 /* */ 456 /* { */ 457 /* FT_Glyph glyph; */ 458 /* FT_BitmapGlyph glyph_bitmap; */ 459 /* */ 460 /* */ 461 /* // load glyph */ 462 /* error = FT_Load_Char( face, glyph_index, FT_LOAD_DEFAULT ); */ 463 /* */ 464 /* // extract glyph image */ 465 /* error = FT_Get_Glyph( face->glyph, &glyph ); */ 466 /* */ 467 /* // convert to a bitmap (default render mode + destroying old) */ 468 /* if ( glyph->format != FT_GLYPH_FORMAT_BITMAP ) */ 469 /* { */ 470 /* error = FT_Glyph_To_Bitmap( &glyph, FT_RENDER_MODE_NORMAL, */ 471 /* 0, 1 ); */ 472 /* if ( error ) // `glyph' unchanged */ 473 /* ... */ 474 /* } */ 475 /* */ 476 /* // access bitmap content by typecasting */ 477 /* glyph_bitmap = (FT_BitmapGlyph)glyph; */ 478 /* */ 479 /* // do funny stuff with it, like blitting/drawing */ 480 /* ... */ 481 /* */ 482 /* // discard glyph image (bitmap or not) */ 483 /* FT_Done_Glyph( glyph ); */ 484 /* } */ 485 /* */ 486 /* */ 487 /* Here another example, again without error handling: */ 488 /* */ 489 /* */ 490 /* { */ 491 /* FT_Glyph glyphs[MAX_GLYPHS] */ 492 /* */ 493 /* */ 494 /* ... */ 495 /* */ 496 /* for ( idx = 0; i < MAX_GLYPHS; i++ ) */ 497 /* error = FT_Load_Glyph( face, idx, FT_LOAD_DEFAULT ) || */ 498 /* FT_Get_Glyph ( face->glyph, &glyph[idx] ); */ 499 /* */ 500 /* ... */ 501 /* */ 502 /* for ( idx = 0; i < MAX_GLYPHS; i++ ) */ 503 /* { */ 504 /* FT_Glyph bitmap = glyphs[idx]; */ 505 /* */ 506 /* */ 507 /* ... */ 508 /* */ 509 /* // after this call, `bitmap' no longer points into */ 510 /* // the `glyphs' array (and the old value isn't destroyed) */ 511 /* FT_Glyph_To_Bitmap( &bitmap, FT_RENDER_MODE_MONO, 0, 0 ); */ 512 /* */ 513 /* ... */ 514 /* */ 515 /* FT_Done_Glyph( bitmap ); */ 516 /* } */ 517 /* */ 518 /* ... */ 519 /* */ 520 /* for ( idx = 0; i < MAX_GLYPHS; i++ ) */ 521 /* FT_Done_Glyph( glyphs[idx] ); */ 522 /* } */ 523 /* */ 524 FT_EXPORT( FT_Error ) 525 FT_Glyph_To_Bitmap( FT_Glyph* the_glyph, 526 FT_Render_Mode render_mode, 527 FT_Vector* origin, 528 FT_Bool destroy ); 529 530 531 /*************************************************************************/ 532 /* */ 533 /* <Function> */ 534 /* FT_Done_Glyph */ 535 /* */ 536 /* <Description> */ 537 /* Destroy a given glyph. */ 538 /* */ 539 /* <Input> */ 540 /* glyph :: A handle to the target glyph object. */ 541 /* */ 542 FT_EXPORT( void ) 543 FT_Done_Glyph( FT_Glyph glyph ); 544 545 /* */ 546 547 548 /* other helpful functions */ 549 550 /*************************************************************************/ 551 /* */ 552 /* <Section> */ 553 /* computations */ 554 /* */ 555 /*************************************************************************/ 556 557 558 /*************************************************************************/ 559 /* */ 560 /* <Function> */ 561 /* FT_Matrix_Multiply */ 562 /* */ 563 /* <Description> */ 564 /* Perform the matrix operation `b = a*b'. */ 565 /* */ 566 /* <Input> */ 567 /* a :: A pointer to matrix `a'. */ 568 /* */ 569 /* <InOut> */ 570 /* b :: A pointer to matrix `b'. */ 571 /* */ 572 /* <Note> */ 573 /* The result is undefined if either `a' or `b' is zero. */ 574 /* */ 575 /* Since the function uses wrap-around arithmetic, results become */ 576 /* meaningless if the arguments are very large. */ 577 /* */ 578 FT_EXPORT( void ) 579 FT_Matrix_Multiply( const FT_Matrix* a, 580 FT_Matrix* b ); 581 582 583 /*************************************************************************/ 584 /* */ 585 /* <Function> */ 586 /* FT_Matrix_Invert */ 587 /* */ 588 /* <Description> */ 589 /* Invert a 2x2 matrix. Return an error if it can't be inverted. */ 590 /* */ 591 /* <InOut> */ 592 /* matrix :: A pointer to the target matrix. Remains untouched in */ 593 /* case of error. */ 594 /* */ 595 /* <Return> */ 596 /* FreeType error code. 0~means success. */ 597 /* */ 598 FT_EXPORT( FT_Error ) 599 FT_Matrix_Invert( FT_Matrix* matrix ); 600 601 /* */ 602 603 604 FT_END_HEADER 605 606 #endif /* FTGLYPH_H_ */ 607 608 609 /* END */ 610 611 612 /* Local Variables: */ 613 /* coding: utf-8 */ 614 /* End: */ 615