4658895f7a9624cd4a5e05ec31cea63dbd496d4d
[platform/upstream/freetype2.git] / include / freetype / ftglyph.h
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:             */