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