1 | /**************************************************************************** |
2 | * |
3 | * ftglyph.h |
4 | * |
5 | * FreeType convenience functions to handle glyphs (specification). |
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 | /************************************************************************** |
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 <freetype/freetype.h> |
37 | |
38 | #ifdef FREETYPE_H |
39 | #error "freetype.h of FreeType 1 has been loaded!" |
40 | #error "Please fix the directory search order for header files" |
41 | #error "so that freetype.h of FreeType 2 is found first." |
42 | #endif |
43 | |
44 | |
45 | FT_BEGIN_HEADER |
46 | |
47 | |
48 | /************************************************************************** |
49 | * |
50 | * @section: |
51 | * glyph_management |
52 | * |
53 | * @title: |
54 | * Glyph Management |
55 | * |
56 | * @abstract: |
57 | * Generic interface to manage individual glyph data. |
58 | * |
59 | * @description: |
60 | * This section contains definitions used to manage glyph data through |
61 | * generic @FT_Glyph objects. Each of them can contain a bitmap, |
62 | * a vector outline, or even images in other formats. These objects are |
63 | * detached from @FT_Face, contrary to @FT_GlyphSlot. |
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 bitmap |
80 | * 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 advance |
97 | * width in 16.16 fixed-point format. |
98 | * |
99 | * @fields: |
100 | * library :: |
101 | * A handle to the FreeType library object. |
102 | * |
103 | * clazz :: |
104 | * A pointer to the glyph's class. Private. |
105 | * |
106 | * format :: |
107 | * The format of the glyph's image. |
108 | * |
109 | * advance :: |
110 | * A 16.16 vector that gives the glyph's advance width. |
111 | */ |
112 | typedef struct FT_GlyphRec_ |
113 | { |
114 | FT_Library library; |
115 | const FT_Glyph_Class* clazz; |
116 | FT_Glyph_Format format; |
117 | FT_Vector advance; |
118 | |
119 | } FT_GlyphRec; |
120 | |
121 | |
122 | /************************************************************************** |
123 | * |
124 | * @type: |
125 | * FT_BitmapGlyph |
126 | * |
127 | * @description: |
128 | * A handle to an object used to model a bitmap glyph image. This is a |
129 | * 'sub-class' of @FT_Glyph, and a pointer to @FT_BitmapGlyphRec. |
130 | */ |
131 | typedef struct FT_BitmapGlyphRec_* FT_BitmapGlyph; |
132 | |
133 | |
134 | /************************************************************************** |
135 | * |
136 | * @struct: |
137 | * FT_BitmapGlyphRec |
138 | * |
139 | * @description: |
140 | * A structure used for bitmap glyph images. This really is a |
141 | * 'sub-class' of @FT_GlyphRec. |
142 | * |
143 | * @fields: |
144 | * root :: |
145 | * The root fields of @FT_Glyph. |
146 | * |
147 | * left :: |
148 | * The left-side bearing, i.e., the horizontal distance from the |
149 | * current pen position to the left border of the glyph bitmap. |
150 | * |
151 | * top :: |
152 | * The top-side bearing, i.e., the vertical distance from the current |
153 | * pen position to the top border of the glyph bitmap. This distance |
154 | * is positive for upwards~y! |
155 | * |
156 | * bitmap :: |
157 | * A descriptor for the bitmap. |
158 | * |
159 | * @note: |
160 | * You can typecast an @FT_Glyph to @FT_BitmapGlyph if you have |
161 | * `glyph->format == FT_GLYPH_FORMAT_BITMAP`. This lets you access the |
162 | * bitmap's contents easily. |
163 | * |
164 | * The corresponding pixel buffer is always owned by @FT_BitmapGlyph and |
165 | * is thus created and destroyed with it. |
166 | */ |
167 | typedef struct FT_BitmapGlyphRec_ |
168 | { |
169 | FT_GlyphRec root; |
170 | FT_Int left; |
171 | FT_Int top; |
172 | FT_Bitmap bitmap; |
173 | |
174 | } FT_BitmapGlyphRec; |
175 | |
176 | |
177 | /************************************************************************** |
178 | * |
179 | * @type: |
180 | * FT_OutlineGlyph |
181 | * |
182 | * @description: |
183 | * A handle to an object used to model an outline glyph image. This is a |
184 | * 'sub-class' of @FT_Glyph, and a pointer to @FT_OutlineGlyphRec. |
185 | */ |
186 | typedef struct FT_OutlineGlyphRec_* FT_OutlineGlyph; |
187 | |
188 | |
189 | /************************************************************************** |
190 | * |
191 | * @struct: |
192 | * FT_OutlineGlyphRec |
193 | * |
194 | * @description: |
195 | * A structure used for outline (vectorial) glyph images. This really is |
196 | * a 'sub-class' of @FT_GlyphRec. |
197 | * |
198 | * @fields: |
199 | * root :: |
200 | * The root @FT_Glyph fields. |
201 | * |
202 | * outline :: |
203 | * A descriptor for the outline. |
204 | * |
205 | * @note: |
206 | * You can typecast an @FT_Glyph to @FT_OutlineGlyph if you have |
207 | * `glyph->format == FT_GLYPH_FORMAT_OUTLINE`. This lets you access the |
208 | * outline's content easily. |
209 | * |
210 | * As the outline is extracted from a glyph slot, its coordinates are |
211 | * expressed normally in 26.6 pixels, unless the flag @FT_LOAD_NO_SCALE |
212 | * was used in @FT_Load_Glyph or @FT_Load_Char. |
213 | * |
214 | * The outline's tables are always owned by the object and are destroyed |
215 | * with it. |
216 | */ |
217 | typedef struct FT_OutlineGlyphRec_ |
218 | { |
219 | FT_GlyphRec root; |
220 | FT_Outline outline; |
221 | |
222 | } FT_OutlineGlyphRec; |
223 | |
224 | |
225 | /************************************************************************** |
226 | * |
227 | * @type: |
228 | * FT_SvgGlyph |
229 | * |
230 | * @description: |
231 | * A handle to an object used to model an SVG glyph. This is a |
232 | * 'sub-class' of @FT_Glyph, and a pointer to @FT_SvgGlyphRec. |
233 | * |
234 | * @since: |
235 | * 2.12 |
236 | */ |
237 | typedef struct FT_SvgGlyphRec_* FT_SvgGlyph; |
238 | |
239 | |
240 | /************************************************************************** |
241 | * |
242 | * @struct: |
243 | * FT_SvgGlyphRec |
244 | * |
245 | * @description: |
246 | * A structure used for OT-SVG glyphs. This is a 'sub-class' of |
247 | * @FT_GlyphRec. |
248 | * |
249 | * @fields: |
250 | * root :: |
251 | * The root @FT_GlyphRec fields. |
252 | * |
253 | * svg_document :: |
254 | * A pointer to the SVG document. |
255 | * |
256 | * svg_document_length :: |
257 | * The length of `svg_document`. |
258 | * |
259 | * glyph_index :: |
260 | * The index of the glyph to be rendered. |
261 | * |
262 | * metrics :: |
263 | * A metrics object storing the size information. |
264 | * |
265 | * units_per_EM :: |
266 | * The size of the EM square. |
267 | * |
268 | * start_glyph_id :: |
269 | * The first glyph ID in the glyph range covered by this document. |
270 | * |
271 | * end_glyph_id :: |
272 | * The last glyph ID in the glyph range covered by this document. |
273 | * |
274 | * transform :: |
275 | * A 2x2 transformation matrix to apply to the glyph while rendering |
276 | * it. |
277 | * |
278 | * delta :: |
279 | * Translation to apply to the glyph while rendering. |
280 | * |
281 | * @note: |
282 | * The Glyph Management API requires @FT_Glyph or its 'sub-class' to have |
283 | * all the information needed to completely define the glyph's rendering. |
284 | * Outline-based glyphs can directly apply transformations to the outline |
285 | * but this is not possible for an SVG document that hasn't been parsed. |
286 | * Therefore, the transformation is stored along with the document. In |
287 | * the absence of a 'ViewBox' or 'Width'/'Height' attribute, the size of |
288 | * the ViewPort should be assumed to be 'units_per_EM'. |
289 | */ |
290 | typedef struct FT_SvgGlyphRec_ |
291 | { |
292 | FT_GlyphRec root; |
293 | |
294 | FT_Byte* svg_document; |
295 | FT_ULong svg_document_length; |
296 | |
297 | FT_UInt glyph_index; |
298 | |
299 | FT_Size_Metrics metrics; |
300 | FT_UShort units_per_EM; |
301 | |
302 | FT_UShort start_glyph_id; |
303 | FT_UShort end_glyph_id; |
304 | |
305 | FT_Matrix transform; |
306 | FT_Vector delta; |
307 | |
308 | } FT_SvgGlyphRec; |
309 | |
310 | |
311 | /************************************************************************** |
312 | * |
313 | * @function: |
314 | * FT_New_Glyph |
315 | * |
316 | * @description: |
317 | * A function used to create a new empty glyph image. Note that the |
318 | * created @FT_Glyph object must be released with @FT_Done_Glyph. |
319 | * |
320 | * @input: |
321 | * library :: |
322 | * A handle to the FreeType library object. |
323 | * |
324 | * format :: |
325 | * The format of the glyph's image. |
326 | * |
327 | * @output: |
328 | * aglyph :: |
329 | * A handle to the glyph object. |
330 | * |
331 | * @return: |
332 | * FreeType error code. 0~means success. |
333 | * |
334 | * @since: |
335 | * 2.10 |
336 | */ |
337 | FT_EXPORT( FT_Error ) |
338 | FT_New_Glyph( FT_Library library, |
339 | FT_Glyph_Format format, |
340 | FT_Glyph *aglyph ); |
341 | |
342 | |
343 | /************************************************************************** |
344 | * |
345 | * @function: |
346 | * FT_Get_Glyph |
347 | * |
348 | * @description: |
349 | * A function used to extract a glyph image from a slot. Note that the |
350 | * created @FT_Glyph object must be released with @FT_Done_Glyph. |
351 | * |
352 | * @input: |
353 | * slot :: |
354 | * A handle to the source glyph slot. |
355 | * |
356 | * @output: |
357 | * aglyph :: |
358 | * A handle to the glyph object. `NULL` in case of error. |
359 | * |
360 | * @return: |
361 | * FreeType error code. 0~means success. |
362 | * |
363 | * @note: |
364 | * Because `*aglyph->advance.x` and `*aglyph->advance.y` are 16.16 |
365 | * fixed-point numbers, `slot->advance.x` and `slot->advance.y` (which |
366 | * are in 26.6 fixed-point format) must be in the range ]-32768;32768[. |
367 | */ |
368 | FT_EXPORT( FT_Error ) |
369 | FT_Get_Glyph( FT_GlyphSlot slot, |
370 | FT_Glyph *aglyph ); |
371 | |
372 | |
373 | /************************************************************************** |
374 | * |
375 | * @function: |
376 | * FT_Glyph_Copy |
377 | * |
378 | * @description: |
379 | * A function used to copy a glyph image. Note that the created |
380 | * @FT_Glyph object must be released with @FT_Done_Glyph. |
381 | * |
382 | * @input: |
383 | * source :: |
384 | * A handle to the source glyph object. |
385 | * |
386 | * @output: |
387 | * target :: |
388 | * A handle to the target glyph object. `NULL` in case of error. |
389 | * |
390 | * @return: |
391 | * FreeType error code. 0~means success. |
392 | */ |
393 | FT_EXPORT( FT_Error ) |
394 | FT_Glyph_Copy( FT_Glyph source, |
395 | FT_Glyph *target ); |
396 | |
397 | |
398 | /************************************************************************** |
399 | * |
400 | * @function: |
401 | * FT_Glyph_Transform |
402 | * |
403 | * @description: |
404 | * Transform a glyph image if its format is scalable. |
405 | * |
406 | * @inout: |
407 | * glyph :: |
408 | * A handle to the target glyph object. |
409 | * |
410 | * @input: |
411 | * matrix :: |
412 | * A pointer to a 2x2 matrix to apply. |
413 | * |
414 | * delta :: |
415 | * A pointer to a 2d vector to apply. Coordinates are expressed in |
416 | * 1/64 of a pixel. |
417 | * |
418 | * @return: |
419 | * FreeType error code (if not 0, the glyph format is not scalable). |
420 | * |
421 | * @note: |
422 | * The 2x2 transformation matrix is also applied to the glyph's advance |
423 | * vector. |
424 | */ |
425 | FT_EXPORT( FT_Error ) |
426 | FT_Glyph_Transform( FT_Glyph glyph, |
427 | const FT_Matrix* matrix, |
428 | const FT_Vector* delta ); |
429 | |
430 | |
431 | /************************************************************************** |
432 | * |
433 | * @enum: |
434 | * FT_Glyph_BBox_Mode |
435 | * |
436 | * @description: |
437 | * The mode how the values of @FT_Glyph_Get_CBox are returned. |
438 | * |
439 | * @values: |
440 | * FT_GLYPH_BBOX_UNSCALED :: |
441 | * Return unscaled font units. |
442 | * |
443 | * FT_GLYPH_BBOX_SUBPIXELS :: |
444 | * Return unfitted 26.6 coordinates. |
445 | * |
446 | * FT_GLYPH_BBOX_GRIDFIT :: |
447 | * Return grid-fitted 26.6 coordinates. |
448 | * |
449 | * FT_GLYPH_BBOX_TRUNCATE :: |
450 | * Return coordinates in integer pixels. |
451 | * |
452 | * FT_GLYPH_BBOX_PIXELS :: |
453 | * Return grid-fitted pixel coordinates. |
454 | */ |
455 | typedef enum FT_Glyph_BBox_Mode_ |
456 | { |
457 | FT_GLYPH_BBOX_UNSCALED = 0, |
458 | FT_GLYPH_BBOX_SUBPIXELS = 0, |
459 | FT_GLYPH_BBOX_GRIDFIT = 1, |
460 | FT_GLYPH_BBOX_TRUNCATE = 2, |
461 | FT_GLYPH_BBOX_PIXELS = 3 |
462 | |
463 | } FT_Glyph_BBox_Mode; |
464 | |
465 | |
466 | /* these constants are deprecated; use the corresponding */ |
467 | /* `FT_Glyph_BBox_Mode` values instead */ |
468 | #define ft_glyph_bbox_unscaled FT_GLYPH_BBOX_UNSCALED |
469 | #define ft_glyph_bbox_subpixels FT_GLYPH_BBOX_SUBPIXELS |
470 | #define ft_glyph_bbox_gridfit FT_GLYPH_BBOX_GRIDFIT |
471 | #define ft_glyph_bbox_truncate FT_GLYPH_BBOX_TRUNCATE |
472 | #define ft_glyph_bbox_pixels FT_GLYPH_BBOX_PIXELS |
473 | |
474 | |
475 | /************************************************************************** |
476 | * |
477 | * @function: |
478 | * FT_Glyph_Get_CBox |
479 | * |
480 | * @description: |
481 | * Return a glyph's 'control box'. The control box encloses all the |
482 | * outline's points, including Bezier control points. Though it |
483 | * coincides with the exact bounding box for most glyphs, it can be |
484 | * slightly larger in some situations (like when rotating an outline that |
485 | * contains Bezier outside arcs). |
486 | * |
487 | * Computing the control box is very fast, while getting the bounding box |
488 | * can take much more time as it needs to walk over all segments and arcs |
489 | * in the outline. To get the latter, you can use the 'ftbbox' |
490 | * component, which is dedicated to this single task. |
491 | * |
492 | * @input: |
493 | * glyph :: |
494 | * A handle to the source glyph object. |
495 | * |
496 | * mode :: |
497 | * The mode that indicates how to interpret the returned bounding box |
498 | * values. |
499 | * |
500 | * @output: |
501 | * acbox :: |
502 | * The glyph coordinate bounding box. Coordinates are expressed in |
503 | * 1/64 of pixels if it is grid-fitted. |
504 | * |
505 | * @note: |
506 | * Coordinates are relative to the glyph origin, using the y~upwards |
507 | * convention. |
508 | * |
509 | * If the glyph has been loaded with @FT_LOAD_NO_SCALE, `bbox_mode` must |
510 | * be set to @FT_GLYPH_BBOX_UNSCALED to get unscaled font units in 26.6 |
511 | * pixel format. The value @FT_GLYPH_BBOX_SUBPIXELS is another name for |
512 | * this constant. |
513 | * |
514 | * If the font is tricky and the glyph has been loaded with |
515 | * @FT_LOAD_NO_SCALE, the resulting CBox is meaningless. To get |
516 | * reasonable values for the CBox it is necessary to load the glyph at a |
517 | * large ppem value (so that the hinting instructions can properly shift |
518 | * and scale the subglyphs), then extracting the CBox, which can be |
519 | * eventually converted back to font units. |
520 | * |
521 | * Note that the maximum coordinates are exclusive, which means that one |
522 | * can compute the width and height of the glyph image (be it in integer |
523 | * or 26.6 pixels) as: |
524 | * |
525 | * ``` |
526 | * width = bbox.xMax - bbox.xMin; |
527 | * height = bbox.yMax - bbox.yMin; |
528 | * ``` |
529 | * |
530 | * Note also that for 26.6 coordinates, if `bbox_mode` is set to |
531 | * @FT_GLYPH_BBOX_GRIDFIT, the coordinates will also be grid-fitted, |
532 | * which corresponds to: |
533 | * |
534 | * ``` |
535 | * bbox.xMin = FLOOR(bbox.xMin); |
536 | * bbox.yMin = FLOOR(bbox.yMin); |
537 | * bbox.xMax = CEILING(bbox.xMax); |
538 | * bbox.yMax = CEILING(bbox.yMax); |
539 | * ``` |
540 | * |
541 | * To get the bbox in pixel coordinates, set `bbox_mode` to |
542 | * @FT_GLYPH_BBOX_TRUNCATE. |
543 | * |
544 | * To get the bbox in grid-fitted pixel coordinates, set `bbox_mode` to |
545 | * @FT_GLYPH_BBOX_PIXELS. |
546 | */ |
547 | FT_EXPORT( void ) |
548 | FT_Glyph_Get_CBox( FT_Glyph glyph, |
549 | FT_UInt bbox_mode, |
550 | FT_BBox *acbox ); |
551 | |
552 | |
553 | /************************************************************************** |
554 | * |
555 | * @function: |
556 | * FT_Glyph_To_Bitmap |
557 | * |
558 | * @description: |
559 | * Convert a given glyph object to a bitmap glyph object. |
560 | * |
561 | * @inout: |
562 | * the_glyph :: |
563 | * A pointer to a handle to the target glyph. |
564 | * |
565 | * @input: |
566 | * render_mode :: |
567 | * An enumeration that describes how the data is rendered. |
568 | * |
569 | * origin :: |
570 | * A pointer to a vector used to translate the glyph image before |
571 | * rendering. Can be~0 (if no translation). The origin is expressed |
572 | * in 26.6 pixels. |
573 | * |
574 | * destroy :: |
575 | * A boolean that indicates that the original glyph image should be |
576 | * destroyed by this function. It is never destroyed in case of error. |
577 | * |
578 | * @return: |
579 | * FreeType error code. 0~means success. |
580 | * |
581 | * @note: |
582 | * This function does nothing if the glyph format isn't scalable. |
583 | * |
584 | * The glyph image is translated with the `origin` vector before |
585 | * rendering. |
586 | * |
587 | * The first parameter is a pointer to an @FT_Glyph handle that will be |
588 | * _replaced_ by this function (with newly allocated data). Typically, |
589 | * you would do something like the following (omitting error handling). |
590 | * |
591 | * ``` |
592 | * FT_Glyph glyph; |
593 | * FT_BitmapGlyph glyph_bitmap; |
594 | * |
595 | * |
596 | * // load glyph |
597 | * error = FT_Load_Char( face, glyph_index, FT_LOAD_DEFAULT ); |
598 | * |
599 | * // extract glyph image |
600 | * error = FT_Get_Glyph( face->glyph, &glyph ); |
601 | * |
602 | * // convert to a bitmap (default render mode + destroying old) |
603 | * if ( glyph->format != FT_GLYPH_FORMAT_BITMAP ) |
604 | * { |
605 | * error = FT_Glyph_To_Bitmap( &glyph, FT_RENDER_MODE_NORMAL, |
606 | * 0, 1 ); |
607 | * if ( error ) // `glyph' unchanged |
608 | * ... |
609 | * } |
610 | * |
611 | * // access bitmap content by typecasting |
612 | * glyph_bitmap = (FT_BitmapGlyph)glyph; |
613 | * |
614 | * // do funny stuff with it, like blitting/drawing |
615 | * ... |
616 | * |
617 | * // discard glyph image (bitmap or not) |
618 | * FT_Done_Glyph( glyph ); |
619 | * ``` |
620 | * |
621 | * Here is another example, again without error handling. |
622 | * |
623 | * ``` |
624 | * FT_Glyph glyphs[MAX_GLYPHS] |
625 | * |
626 | * |
627 | * ... |
628 | * |
629 | * for ( idx = 0; i < MAX_GLYPHS; i++ ) |
630 | * error = FT_Load_Glyph( face, idx, FT_LOAD_DEFAULT ) || |
631 | * FT_Get_Glyph ( face->glyph, &glyphs[idx] ); |
632 | * |
633 | * ... |
634 | * |
635 | * for ( idx = 0; i < MAX_GLYPHS; i++ ) |
636 | * { |
637 | * FT_Glyph bitmap = glyphs[idx]; |
638 | * |
639 | * |
640 | * ... |
641 | * |
642 | * // after this call, `bitmap' no longer points into |
643 | * // the `glyphs' array (and the old value isn't destroyed) |
644 | * FT_Glyph_To_Bitmap( &bitmap, FT_RENDER_MODE_MONO, 0, 0 ); |
645 | * |
646 | * ... |
647 | * |
648 | * FT_Done_Glyph( bitmap ); |
649 | * } |
650 | * |
651 | * ... |
652 | * |
653 | * for ( idx = 0; i < MAX_GLYPHS; i++ ) |
654 | * FT_Done_Glyph( glyphs[idx] ); |
655 | * ``` |
656 | */ |
657 | FT_EXPORT( FT_Error ) |
658 | FT_Glyph_To_Bitmap( FT_Glyph* the_glyph, |
659 | FT_Render_Mode render_mode, |
660 | const FT_Vector* origin, |
661 | FT_Bool destroy ); |
662 | |
663 | |
664 | /************************************************************************** |
665 | * |
666 | * @function: |
667 | * FT_Done_Glyph |
668 | * |
669 | * @description: |
670 | * Destroy a given glyph. |
671 | * |
672 | * @input: |
673 | * glyph :: |
674 | * A handle to the target glyph object. Can be `NULL`. |
675 | */ |
676 | FT_EXPORT( void ) |
677 | FT_Done_Glyph( FT_Glyph glyph ); |
678 | |
679 | /* */ |
680 | |
681 | |
682 | /* other helpful functions */ |
683 | |
684 | /************************************************************************** |
685 | * |
686 | * @section: |
687 | * computations |
688 | * |
689 | */ |
690 | |
691 | |
692 | /************************************************************************** |
693 | * |
694 | * @function: |
695 | * FT_Matrix_Multiply |
696 | * |
697 | * @description: |
698 | * Perform the matrix operation `b = a*b`. |
699 | * |
700 | * @input: |
701 | * a :: |
702 | * A pointer to matrix `a`. |
703 | * |
704 | * @inout: |
705 | * b :: |
706 | * A pointer to matrix `b`. |
707 | * |
708 | * @note: |
709 | * The result is undefined if either `a` or `b` is zero. |
710 | * |
711 | * Since the function uses wrap-around arithmetic, results become |
712 | * meaningless if the arguments are very large. |
713 | */ |
714 | FT_EXPORT( void ) |
715 | FT_Matrix_Multiply( const FT_Matrix* a, |
716 | FT_Matrix* b ); |
717 | |
718 | |
719 | /************************************************************************** |
720 | * |
721 | * @function: |
722 | * FT_Matrix_Invert |
723 | * |
724 | * @description: |
725 | * Invert a 2x2 matrix. Return an error if it can't be inverted. |
726 | * |
727 | * @inout: |
728 | * matrix :: |
729 | * A pointer to the target matrix. Remains untouched in case of error. |
730 | * |
731 | * @return: |
732 | * FreeType error code. 0~means success. |
733 | */ |
734 | FT_EXPORT( FT_Error ) |
735 | FT_Matrix_Invert( FT_Matrix* matrix ); |
736 | |
737 | /* */ |
738 | |
739 | |
740 | FT_END_HEADER |
741 | |
742 | #endif /* FTGLYPH_H_ */ |
743 | |
744 | |
745 | /* END */ |
746 | |
747 | |
748 | /* Local Variables: */ |
749 | /* coding: utf-8 */ |
750 | /* End: */ |
751 | |