xref: /aosp_15_r20/external/harfbuzz_ng/src/hb-font.h (revision 2d1272b857b1f7575e6e246373e1cb218663db8a)
1 /*
2  * Copyright © 2009  Red Hat, Inc.
3  *
4  *  This is part of HarfBuzz, a text shaping library.
5  *
6  * Permission is hereby granted, without written agreement and without
7  * license or royalty fees, to use, copy, modify, and distribute this
8  * software and its documentation for any purpose, provided that the
9  * above copyright notice and the following two paragraphs appear in
10  * all copies of this software.
11  *
12  * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
13  * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
14  * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
15  * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
16  * DAMAGE.
17  *
18  * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
19  * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
20  * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
21  * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
22  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
23  *
24  * Red Hat Author(s): Behdad Esfahbod
25  */
26 
27 #if !defined(HB_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
28 #error "Include <hb.h> instead."
29 #endif
30 
31 #ifndef HB_FONT_H
32 #define HB_FONT_H
33 
34 #include "hb-common.h"
35 #include "hb-face.h"
36 #include "hb-draw.h"
37 #include "hb-paint.h"
38 
39 HB_BEGIN_DECLS
40 
41 /*
42  * hb_font_funcs_t
43  */
44 
45 /**
46  * hb_font_funcs_t:
47  *
48  * Data type containing a set of virtual methods used for
49  * working on #hb_font_t font objects.
50  *
51  * HarfBuzz provides a lightweight default function for each of
52  * the methods in #hb_font_funcs_t. Client programs can implement
53  * their own replacements for the individual font functions, as
54  * needed, and replace the default by calling the setter for a
55  * method.
56  *
57  **/
58 typedef struct hb_font_funcs_t hb_font_funcs_t;
59 
60 HB_EXTERN hb_font_funcs_t *
61 hb_font_funcs_create (void);
62 
63 HB_EXTERN hb_font_funcs_t *
64 hb_font_funcs_get_empty (void);
65 
66 HB_EXTERN hb_font_funcs_t *
67 hb_font_funcs_reference (hb_font_funcs_t *ffuncs);
68 
69 HB_EXTERN void
70 hb_font_funcs_destroy (hb_font_funcs_t *ffuncs);
71 
72 HB_EXTERN hb_bool_t
73 hb_font_funcs_set_user_data (hb_font_funcs_t    *ffuncs,
74 			     hb_user_data_key_t *key,
75 			     void *              data,
76 			     hb_destroy_func_t   destroy,
77 			     hb_bool_t           replace);
78 
79 
80 HB_EXTERN void *
81 hb_font_funcs_get_user_data (const hb_font_funcs_t *ffuncs,
82 			     hb_user_data_key_t    *key);
83 
84 
85 HB_EXTERN void
86 hb_font_funcs_make_immutable (hb_font_funcs_t *ffuncs);
87 
88 HB_EXTERN hb_bool_t
89 hb_font_funcs_is_immutable (hb_font_funcs_t *ffuncs);
90 
91 
92 /* font extents */
93 
94 /**
95  * hb_font_extents_t:
96  * @ascender: The height of typographic ascenders.
97  * @descender: The depth of typographic descenders.
98  * @line_gap: The suggested line-spacing gap.
99  *
100  * Font-wide extent values, measured in font units.
101  *
102  * Note that typically @ascender is positive and @descender
103  * negative, in coordinate systems that grow up.
104  **/
105 typedef struct hb_font_extents_t {
106   hb_position_t ascender;
107   hb_position_t descender;
108   hb_position_t line_gap;
109   /*< private >*/
110   hb_position_t reserved9;
111   hb_position_t reserved8;
112   hb_position_t reserved7;
113   hb_position_t reserved6;
114   hb_position_t reserved5;
115   hb_position_t reserved4;
116   hb_position_t reserved3;
117   hb_position_t reserved2;
118   hb_position_t reserved1;
119 } hb_font_extents_t;
120 
121 /* func types */
122 
123 /**
124  * hb_font_get_font_extents_func_t:
125  * @font: #hb_font_t to work upon
126  * @font_data: @font user data pointer
127  * @extents: (out): The font extents retrieved
128  * @user_data: User data pointer passed by the caller
129  *
130  * This method should retrieve the extents for a font.
131  *
132  **/
133 typedef hb_bool_t (*hb_font_get_font_extents_func_t) (hb_font_t *font, void *font_data,
134 						       hb_font_extents_t *extents,
135 						       void *user_data);
136 
137 /**
138  * hb_font_get_font_h_extents_func_t:
139  *
140  * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
141  *
142  * This method should retrieve the extents for a font, for horizontal-direction
143  * text segments. Extents must be returned in an #hb_glyph_extents output
144  * parameter.
145  *
146  **/
147 typedef hb_font_get_font_extents_func_t hb_font_get_font_h_extents_func_t;
148 
149 /**
150  * hb_font_get_font_v_extents_func_t:
151  *
152  * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
153  *
154  * This method should retrieve the extents for a font, for vertical-direction
155  * text segments. Extents must be returned in an #hb_glyph_extents output
156  * parameter.
157  *
158  **/
159 typedef hb_font_get_font_extents_func_t hb_font_get_font_v_extents_func_t;
160 
161 
162 /**
163  * hb_font_get_nominal_glyph_func_t:
164  * @font: #hb_font_t to work upon
165  * @font_data: @font user data pointer
166  * @unicode: The Unicode code point to query
167  * @glyph: (out): The glyph ID retrieved
168  * @user_data: User data pointer passed by the caller
169  *
170  * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
171  *
172  * This method should retrieve the nominal glyph ID for a specified Unicode code
173  * point. Glyph IDs must be returned in a #hb_codepoint_t output parameter.
174  *
175  * Return value: `true` if data found, `false` otherwise
176  *
177  **/
178 typedef hb_bool_t (*hb_font_get_nominal_glyph_func_t) (hb_font_t *font, void *font_data,
179 						       hb_codepoint_t unicode,
180 						       hb_codepoint_t *glyph,
181 						       void *user_data);
182 
183 /**
184  * hb_font_get_variation_glyph_func_t:
185  * @font: #hb_font_t to work upon
186  * @font_data: @font user data pointer
187  * @unicode: The Unicode code point to query
188  * @variation_selector: The  variation-selector code point to query
189  * @glyph: (out): The glyph ID retrieved
190  * @user_data: User data pointer passed by the caller
191  *
192  * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
193  *
194  * This method should retrieve the glyph ID for a specified Unicode code point
195  * followed by a specified Variation Selector code point. Glyph IDs must be
196  * returned in a #hb_codepoint_t output parameter.
197  *
198  * Return value: `true` if data found, `false` otherwise
199  *
200  **/
201 typedef hb_bool_t (*hb_font_get_variation_glyph_func_t) (hb_font_t *font, void *font_data,
202 							 hb_codepoint_t unicode, hb_codepoint_t variation_selector,
203 							 hb_codepoint_t *glyph,
204 							 void *user_data);
205 
206 
207 /**
208  * hb_font_get_nominal_glyphs_func_t:
209  * @font: #hb_font_t to work upon
210  * @font_data: @font user data pointer
211  * @count: number of code points to query
212  * @first_unicode: The first Unicode code point to query
213  * @unicode_stride: The stride between successive code points
214  * @first_glyph: (out): The first glyph ID retrieved
215  * @glyph_stride: The stride between successive glyph IDs
216  * @user_data: User data pointer passed by the caller
217  *
218  * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
219  *
220  * This method should retrieve the nominal glyph IDs for a sequence of
221  * Unicode code points. Glyph IDs must be returned in a #hb_codepoint_t
222  * output parameter.
223  *
224  * Return value: the number of code points processed
225  *
226  **/
227 typedef unsigned int (*hb_font_get_nominal_glyphs_func_t) (hb_font_t *font, void *font_data,
228 							   unsigned int count,
229 							   const hb_codepoint_t *first_unicode,
230 							   unsigned int unicode_stride,
231 							   hb_codepoint_t *first_glyph,
232 							   unsigned int glyph_stride,
233 							   void *user_data);
234 
235 /**
236  * hb_font_get_glyph_advance_func_t:
237  * @font: #hb_font_t to work upon
238  * @font_data: @font user data pointer
239  * @glyph: The glyph ID to query
240  * @user_data: User data pointer passed by the caller
241  *
242  * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
243  *
244  * This method should retrieve the advance for a specified glyph. The
245  * method must return an #hb_position_t.
246  *
247  * Return value: The advance of @glyph within @font
248  *
249  **/
250 typedef hb_position_t (*hb_font_get_glyph_advance_func_t) (hb_font_t *font, void *font_data,
251 							   hb_codepoint_t glyph,
252 							   void *user_data);
253 
254 /**
255  * hb_font_get_glyph_h_advance_func_t:
256  *
257  * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
258  *
259  * This method should retrieve the advance for a specified glyph, in
260  * horizontal-direction text segments. Advances must be returned in
261  * an #hb_position_t output parameter.
262  *
263  **/
264 typedef hb_font_get_glyph_advance_func_t hb_font_get_glyph_h_advance_func_t;
265 
266 /**
267  * hb_font_get_glyph_v_advance_func_t:
268  *
269  * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
270  *
271  * This method should retrieve the advance for a specified glyph, in
272  * vertical-direction text segments. Advances must be returned in
273  * an #hb_position_t output parameter.
274  *
275  **/
276 typedef hb_font_get_glyph_advance_func_t hb_font_get_glyph_v_advance_func_t;
277 
278 /**
279  * hb_font_get_glyph_advances_func_t:
280  * @font: #hb_font_t to work upon
281  * @font_data: @font user data pointer
282  * @count: The number of glyph IDs in the sequence queried
283  * @first_glyph: The first glyph ID to query
284  * @glyph_stride: The stride between successive glyph IDs
285  * @first_advance: (out): The first advance retrieved
286  * @advance_stride: The stride between successive advances
287  * @user_data: User data pointer passed by the caller
288  *
289  * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
290  *
291  * This method should retrieve the advances for a sequence of glyphs.
292  *
293  **/
294 typedef void (*hb_font_get_glyph_advances_func_t) (hb_font_t* font, void* font_data,
295 						   unsigned int count,
296 						   const hb_codepoint_t *first_glyph,
297 						   unsigned glyph_stride,
298 						   hb_position_t *first_advance,
299 						   unsigned advance_stride,
300 						   void *user_data);
301 
302 /**
303  * hb_font_get_glyph_h_advances_func_t:
304  *
305  * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
306  *
307  * This method should retrieve the advances for a sequence of glyphs, in
308  * horizontal-direction text segments.
309  *
310  **/
311 typedef hb_font_get_glyph_advances_func_t hb_font_get_glyph_h_advances_func_t;
312 
313 /**
314  * hb_font_get_glyph_v_advances_func_t:
315  *
316  * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
317  *
318  * This method should retrieve the advances for a sequence of glyphs, in
319  * vertical-direction text segments.
320  *
321  **/
322 typedef hb_font_get_glyph_advances_func_t hb_font_get_glyph_v_advances_func_t;
323 
324 /**
325  * hb_font_get_glyph_origin_func_t:
326  * @font: #hb_font_t to work upon
327  * @font_data: @font user data pointer
328  * @glyph: The glyph ID to query
329  * @x: (out): The X coordinate of the origin
330  * @y: (out): The Y coordinate of the origin
331  * @user_data: User data pointer passed by the caller
332  *
333  * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
334  *
335  * This method should retrieve the (X,Y) coordinates (in font units) of the
336  * origin for a glyph. Each coordinate must be returned in an #hb_position_t
337  * output parameter.
338  *
339  * Return value: `true` if data found, `false` otherwise
340  *
341  **/
342 typedef hb_bool_t (*hb_font_get_glyph_origin_func_t) (hb_font_t *font, void *font_data,
343 						      hb_codepoint_t glyph,
344 						      hb_position_t *x, hb_position_t *y,
345 						      void *user_data);
346 
347 /**
348  * hb_font_get_glyph_h_origin_func_t:
349  *
350  * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
351  *
352  * This method should retrieve the (X,Y) coordinates (in font units) of the
353  * origin for a glyph, for horizontal-direction text segments. Each
354  * coordinate must be returned in an #hb_position_t output parameter.
355  *
356  **/
357 typedef hb_font_get_glyph_origin_func_t hb_font_get_glyph_h_origin_func_t;
358 
359 /**
360  * hb_font_get_glyph_v_origin_func_t:
361  *
362  * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
363  *
364  * This method should retrieve the (X,Y) coordinates (in font units) of the
365  * origin for a glyph, for vertical-direction text segments. Each coordinate
366  * must be returned in an #hb_position_t output parameter.
367  *
368  **/
369 typedef hb_font_get_glyph_origin_func_t hb_font_get_glyph_v_origin_func_t;
370 
371 /**
372  * hb_font_get_glyph_kerning_func_t:
373  * @font: #hb_font_t to work upon
374  * @font_data: @font user data pointer
375  * @first_glyph: The glyph ID of the first glyph in the glyph pair
376  * @second_glyph: The glyph ID of the second glyph in the glyph pair
377  * @user_data: User data pointer passed by the caller
378  *
379  * This method should retrieve the kerning-adjustment value for a glyph-pair in
380  * the specified font, for horizontal text segments.
381  *
382  **/
383 typedef hb_position_t (*hb_font_get_glyph_kerning_func_t) (hb_font_t *font, void *font_data,
384 							   hb_codepoint_t first_glyph, hb_codepoint_t second_glyph,
385 							   void *user_data);
386 /**
387  * hb_font_get_glyph_h_kerning_func_t:
388  *
389  * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
390  *
391  * This method should retrieve the kerning-adjustment value for a glyph-pair in
392  * the specified font, for horizontal text segments.
393  *
394  **/
395 typedef hb_font_get_glyph_kerning_func_t hb_font_get_glyph_h_kerning_func_t;
396 
397 
398 /**
399  * hb_font_get_glyph_extents_func_t:
400  * @font: #hb_font_t to work upon
401  * @font_data: @font user data pointer
402  * @glyph: The glyph ID to query
403  * @extents: (out): The #hb_glyph_extents_t retrieved
404  * @user_data: User data pointer passed by the caller
405  *
406  * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
407  *
408  * This method should retrieve the extents for a specified glyph. Extents must be
409  * returned in an #hb_glyph_extents output parameter.
410  *
411  * Return value: `true` if data found, `false` otherwise
412  *
413  **/
414 typedef hb_bool_t (*hb_font_get_glyph_extents_func_t) (hb_font_t *font, void *font_data,
415 						       hb_codepoint_t glyph,
416 						       hb_glyph_extents_t *extents,
417 						       void *user_data);
418 
419 /**
420  * hb_font_get_glyph_contour_point_func_t:
421  * @font: #hb_font_t to work upon
422  * @font_data: @font user data pointer
423  * @glyph: The glyph ID to query
424  * @point_index: The contour-point index to query
425  * @x: (out): The X value retrieved for the contour point
426  * @y: (out): The Y value retrieved for the contour point
427  * @user_data: User data pointer passed by the caller
428  *
429  * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
430  *
431  * This method should retrieve the (X,Y) coordinates (in font units) for a
432  * specified contour point in a glyph. Each coordinate must be returned as
433  * an #hb_position_t output parameter.
434  *
435  * Return value: `true` if data found, `false` otherwise
436  *
437  **/
438 typedef hb_bool_t (*hb_font_get_glyph_contour_point_func_t) (hb_font_t *font, void *font_data,
439 							     hb_codepoint_t glyph, unsigned int point_index,
440 							     hb_position_t *x, hb_position_t *y,
441 							     void *user_data);
442 
443 
444 /**
445  * hb_font_get_glyph_name_func_t:
446  * @font: #hb_font_t to work upon
447  * @font_data: @font user data pointer
448  * @glyph: The glyph ID to query
449  * @name: (out) (array length=size): Name string retrieved for the glyph ID
450  * @size: Length of the glyph-name string retrieved
451  * @user_data: User data pointer passed by the caller
452  *
453  * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
454  *
455  * This method should retrieve the glyph name that corresponds to a
456  * glyph ID. The name should be returned in a string output parameter.
457  *
458  * Return value: `true` if data found, `false` otherwise
459  *
460  **/
461 typedef hb_bool_t (*hb_font_get_glyph_name_func_t) (hb_font_t *font, void *font_data,
462 						    hb_codepoint_t glyph,
463 						    char *name, unsigned int size,
464 						    void *user_data);
465 
466 /**
467  * hb_font_get_glyph_from_name_func_t:
468  * @font: #hb_font_t to work upon
469  * @font_data: @font user data pointer
470  * @name: (array length=len): The name string to query
471  * @len: The length of the name queried
472  * @glyph: (out): The glyph ID retrieved
473  * @user_data: User data pointer passed by the caller
474  *
475  * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
476  *
477  * This method should retrieve the glyph ID that corresponds to a glyph-name
478  * string.
479  *
480  * Return value: `true` if data found, `false` otherwise
481  *
482  **/
483 typedef hb_bool_t (*hb_font_get_glyph_from_name_func_t) (hb_font_t *font, void *font_data,
484 							 const char *name, int len, /* -1 means nul-terminated */
485 							 hb_codepoint_t *glyph,
486 							 void *user_data);
487 
488 /**
489  * hb_font_draw_glyph_func_t:
490  * @font: #hb_font_t to work upon
491  * @font_data: @font user data pointer
492  * @glyph: The glyph ID to query
493  * @draw_funcs: The draw functions to send the shape data to
494  * @draw_data: The data accompanying the draw functions
495  * @user_data: User data pointer passed by the caller
496  *
497  * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
498  *
499  * Since: 7.0.0
500  *
501  **/
502 typedef void (*hb_font_draw_glyph_func_t) (hb_font_t *font, void *font_data,
503                                            hb_codepoint_t glyph,
504                                            hb_draw_funcs_t *draw_funcs, void *draw_data,
505                                            void *user_data);
506 
507 /**
508  * hb_font_paint_glyph_func_t:
509  * @font: #hb_font_t to work upon
510  * @font_data: @font user data pointer
511  * @glyph: The glyph ID to query
512  * @paint_funcs: The paint functions to use
513  * @paint_data: The data accompanying the paint functions
514  * @palette_index: The color palette to use
515  * @foreground: The foreground color
516  * @user_data: User data pointer passed by the caller
517  *
518  * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
519  *
520  * Since: 7.0.0
521  */
522 typedef void (*hb_font_paint_glyph_func_t) (hb_font_t *font, void *font_data,
523                                             hb_codepoint_t glyph,
524                                             hb_paint_funcs_t *paint_funcs, void *paint_data,
525                                             unsigned int palette_index,
526                                             hb_color_t foreground,
527                                             void *user_data);
528 
529 /* func setters */
530 
531 /**
532  * hb_font_funcs_set_font_h_extents_func:
533  * @ffuncs: A font-function structure
534  * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
535  * @user_data: Data to pass to @func
536  * @destroy: (nullable): The function to call when @user_data is not needed anymore
537  *
538  * Sets the implementation function for #hb_font_get_font_h_extents_func_t.
539  *
540  * Since: 1.1.2
541  **/
542 HB_EXTERN void
543 hb_font_funcs_set_font_h_extents_func (hb_font_funcs_t *ffuncs,
544 				       hb_font_get_font_h_extents_func_t func,
545 				       void *user_data, hb_destroy_func_t destroy);
546 
547 /**
548  * hb_font_funcs_set_font_v_extents_func:
549  * @ffuncs: A font-function structure
550  * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
551  * @user_data: Data to pass to @func
552  * @destroy: (nullable): The function to call when @user_data is not needed anymore
553  *
554  * Sets the implementation function for #hb_font_get_font_v_extents_func_t.
555  *
556  * Since: 1.1.2
557  **/
558 HB_EXTERN void
559 hb_font_funcs_set_font_v_extents_func (hb_font_funcs_t *ffuncs,
560 				       hb_font_get_font_v_extents_func_t func,
561 				       void *user_data, hb_destroy_func_t destroy);
562 
563 /**
564  * hb_font_funcs_set_nominal_glyph_func:
565  * @ffuncs: A font-function structure
566  * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
567  * @user_data: Data to pass to @func
568  * @destroy: (nullable): The function to call when @user_data is not needed anymore
569  *
570  * Sets the implementation function for #hb_font_get_nominal_glyph_func_t.
571  *
572  * Since: 1.2.3
573  **/
574 HB_EXTERN void
575 hb_font_funcs_set_nominal_glyph_func (hb_font_funcs_t *ffuncs,
576 				      hb_font_get_nominal_glyph_func_t func,
577 				      void *user_data, hb_destroy_func_t destroy);
578 
579 /**
580  * hb_font_funcs_set_nominal_glyphs_func:
581  * @ffuncs: A font-function structure
582  * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
583  * @user_data: Data to pass to @func
584  * @destroy: (nullable): The function to call when @user_data is not needed anymore
585  *
586  * Sets the implementation function for #hb_font_get_nominal_glyphs_func_t.
587  *
588  * Since: 2.0.0
589  **/
590 HB_EXTERN void
591 hb_font_funcs_set_nominal_glyphs_func (hb_font_funcs_t *ffuncs,
592 				       hb_font_get_nominal_glyphs_func_t func,
593 				       void *user_data, hb_destroy_func_t destroy);
594 
595 /**
596  * hb_font_funcs_set_variation_glyph_func:
597  * @ffuncs: A font-function structure
598  * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
599  * @user_data: Data to pass to @func
600  * @destroy: (nullable): The function to call when @user_data is not needed anymore
601  *
602  * Sets the implementation function for #hb_font_get_variation_glyph_func_t.
603  *
604  * Since: 1.2.3
605  **/
606 HB_EXTERN void
607 hb_font_funcs_set_variation_glyph_func (hb_font_funcs_t *ffuncs,
608 					hb_font_get_variation_glyph_func_t func,
609 					void *user_data, hb_destroy_func_t destroy);
610 
611 /**
612  * hb_font_funcs_set_glyph_h_advance_func:
613  * @ffuncs: A font-function structure
614  * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
615  * @user_data: Data to pass to @func
616  * @destroy: (nullable): The function to call when @user_data is not needed anymore
617  *
618  * Sets the implementation function for #hb_font_get_glyph_h_advance_func_t.
619  *
620  * Since: 0.9.2
621  **/
622 HB_EXTERN void
623 hb_font_funcs_set_glyph_h_advance_func (hb_font_funcs_t *ffuncs,
624 					hb_font_get_glyph_h_advance_func_t func,
625 					void *user_data, hb_destroy_func_t destroy);
626 
627 /**
628  * hb_font_funcs_set_glyph_v_advance_func:
629  * @ffuncs: A font-function structure
630  * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
631  * @user_data: Data to pass to @func
632  * @destroy: (nullable): The function to call when @user_data is not needed anymore
633  *
634  * Sets the implementation function for #hb_font_get_glyph_v_advance_func_t.
635  *
636  * Since: 0.9.2
637  **/
638 HB_EXTERN void
639 hb_font_funcs_set_glyph_v_advance_func (hb_font_funcs_t *ffuncs,
640 					hb_font_get_glyph_v_advance_func_t func,
641 					void *user_data, hb_destroy_func_t destroy);
642 
643 /**
644  * hb_font_funcs_set_glyph_h_advances_func:
645  * @ffuncs: A font-function structure
646  * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
647  * @user_data: Data to pass to @func
648  * @destroy: (nullable): The function to call when @user_data is not needed anymore
649  *
650  * Sets the implementation function for #hb_font_get_glyph_h_advances_func_t.
651  *
652  * Since: 1.8.6
653  **/
654 HB_EXTERN void
655 hb_font_funcs_set_glyph_h_advances_func (hb_font_funcs_t *ffuncs,
656 					hb_font_get_glyph_h_advances_func_t func,
657 					void *user_data, hb_destroy_func_t destroy);
658 
659 /**
660  * hb_font_funcs_set_glyph_v_advances_func:
661  * @ffuncs: A font-function structure
662  * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
663  * @user_data: Data to pass to @func
664  * @destroy: (nullable): The function to call when @user_data is not needed anymore
665  *
666  * Sets the implementation function for #hb_font_get_glyph_v_advances_func_t.
667  *
668  * Since: 1.8.6
669  **/
670 HB_EXTERN void
671 hb_font_funcs_set_glyph_v_advances_func (hb_font_funcs_t *ffuncs,
672 					hb_font_get_glyph_v_advances_func_t func,
673 					void *user_data, hb_destroy_func_t destroy);
674 
675 /**
676  * hb_font_funcs_set_glyph_h_origin_func:
677  * @ffuncs: A font-function structure
678  * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
679  * @user_data: Data to pass to @func
680  * @destroy: (nullable): The function to call when @user_data is not needed anymore
681  *
682  * Sets the implementation function for #hb_font_get_glyph_h_origin_func_t.
683  *
684  * Since: 0.9.2
685  **/
686 HB_EXTERN void
687 hb_font_funcs_set_glyph_h_origin_func (hb_font_funcs_t *ffuncs,
688 				       hb_font_get_glyph_h_origin_func_t func,
689 				       void *user_data, hb_destroy_func_t destroy);
690 
691 /**
692  * hb_font_funcs_set_glyph_v_origin_func:
693  * @ffuncs: A font-function structure
694  * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
695  * @user_data: Data to pass to @func
696  * @destroy: (nullable): The function to call when @user_data is not needed anymore
697  *
698  * Sets the implementation function for #hb_font_get_glyph_v_origin_func_t.
699  *
700  * Since: 0.9.2
701  **/
702 HB_EXTERN void
703 hb_font_funcs_set_glyph_v_origin_func (hb_font_funcs_t *ffuncs,
704 				       hb_font_get_glyph_v_origin_func_t func,
705 				       void *user_data, hb_destroy_func_t destroy);
706 
707 /**
708  * hb_font_funcs_set_glyph_h_kerning_func:
709  * @ffuncs: A font-function structure
710  * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
711  * @user_data: Data to pass to @func
712  * @destroy: (nullable): The function to call when @user_data is not needed anymore
713  *
714  * Sets the implementation function for #hb_font_get_glyph_h_kerning_func_t.
715  *
716  * Since: 0.9.2
717  **/
718 HB_EXTERN void
719 hb_font_funcs_set_glyph_h_kerning_func (hb_font_funcs_t *ffuncs,
720 					hb_font_get_glyph_h_kerning_func_t func,
721 					void *user_data, hb_destroy_func_t destroy);
722 
723 /**
724  * hb_font_funcs_set_glyph_extents_func:
725  * @ffuncs: A font-function structure
726  * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
727  * @user_data: Data to pass to @func
728  * @destroy: (nullable): The function to call when @user_data is not needed anymore
729  *
730  * Sets the implementation function for #hb_font_get_glyph_extents_func_t.
731  *
732  * Since: 0.9.2
733  **/
734 HB_EXTERN void
735 hb_font_funcs_set_glyph_extents_func (hb_font_funcs_t *ffuncs,
736 				      hb_font_get_glyph_extents_func_t func,
737 				      void *user_data, hb_destroy_func_t destroy);
738 
739 /**
740  * hb_font_funcs_set_glyph_contour_point_func:
741  * @ffuncs: A font-function structure
742  * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
743  * @user_data: Data to pass to @func
744  * @destroy: (nullable): The function to call when @user_data is not needed anymore
745  *
746  * Sets the implementation function for #hb_font_get_glyph_contour_point_func_t.
747  *
748  * Since: 0.9.2
749  **/
750 HB_EXTERN void
751 hb_font_funcs_set_glyph_contour_point_func (hb_font_funcs_t *ffuncs,
752 					    hb_font_get_glyph_contour_point_func_t func,
753 					    void *user_data, hb_destroy_func_t destroy);
754 
755 /**
756  * hb_font_funcs_set_glyph_name_func:
757  * @ffuncs: A font-function structure
758  * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
759  * @user_data: Data to pass to @func
760  * @destroy: (nullable): The function to call when @user_data is not needed anymore
761  *
762  * Sets the implementation function for #hb_font_get_glyph_name_func_t.
763  *
764  * Since: 0.9.2
765  **/
766 HB_EXTERN void
767 hb_font_funcs_set_glyph_name_func (hb_font_funcs_t *ffuncs,
768 				   hb_font_get_glyph_name_func_t func,
769 				   void *user_data, hb_destroy_func_t destroy);
770 
771 /**
772  * hb_font_funcs_set_glyph_from_name_func:
773  * @ffuncs: A font-function structure
774  * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
775  * @user_data: Data to pass to @func
776  * @destroy: (nullable): The function to call when @user_data is not needed anymore
777  *
778  * Sets the implementation function for #hb_font_get_glyph_from_name_func_t.
779  *
780  * Since: 0.9.2
781  **/
782 HB_EXTERN void
783 hb_font_funcs_set_glyph_from_name_func (hb_font_funcs_t *ffuncs,
784 					hb_font_get_glyph_from_name_func_t func,
785 					void *user_data, hb_destroy_func_t destroy);
786 
787 /**
788  * hb_font_funcs_set_draw_glyph_func:
789  * @ffuncs: A font-function structure
790  * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
791  * @user_data: Data to pass to @func
792  * @destroy: (nullable): The function to call when @user_data is not needed anymore
793  *
794  * Sets the implementation function for #hb_font_draw_glyph_func_t.
795  *
796  * Since: 7.0.0
797  **/
798 HB_EXTERN void
799 hb_font_funcs_set_draw_glyph_func (hb_font_funcs_t *ffuncs,
800                                    hb_font_draw_glyph_func_t func,
801                                    void *user_data, hb_destroy_func_t destroy);
802 
803 /**
804  * hb_font_funcs_set_paint_glyph_func:
805  * @ffuncs: A font-function structure
806  * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
807  * @user_data: Data to pass to @func
808  * @destroy: (nullable): The function to call when @user_data is no longer needed
809  *
810  * Sets the implementation function for #hb_font_paint_glyph_func_t.
811  *
812  * Since: 7.0.0
813  */
814 HB_EXTERN void
815 hb_font_funcs_set_paint_glyph_func (hb_font_funcs_t *ffuncs,
816                                     hb_font_paint_glyph_func_t func,
817                                     void *user_data, hb_destroy_func_t destroy);
818 
819 /* func dispatch */
820 
821 HB_EXTERN hb_bool_t
822 hb_font_get_h_extents (hb_font_t *font,
823 		       hb_font_extents_t *extents);
824 HB_EXTERN hb_bool_t
825 hb_font_get_v_extents (hb_font_t *font,
826 		       hb_font_extents_t *extents);
827 
828 HB_EXTERN hb_bool_t
829 hb_font_get_nominal_glyph (hb_font_t *font,
830 			   hb_codepoint_t unicode,
831 			   hb_codepoint_t *glyph);
832 HB_EXTERN hb_bool_t
833 hb_font_get_variation_glyph (hb_font_t *font,
834 			     hb_codepoint_t unicode, hb_codepoint_t variation_selector,
835 			     hb_codepoint_t *glyph);
836 
837 HB_EXTERN unsigned int
838 hb_font_get_nominal_glyphs (hb_font_t *font,
839 			    unsigned int count,
840 			    const hb_codepoint_t *first_unicode,
841 			    unsigned int unicode_stride,
842 			    hb_codepoint_t *first_glyph,
843 			    unsigned int glyph_stride);
844 
845 HB_EXTERN hb_position_t
846 hb_font_get_glyph_h_advance (hb_font_t *font,
847 			     hb_codepoint_t glyph);
848 HB_EXTERN hb_position_t
849 hb_font_get_glyph_v_advance (hb_font_t *font,
850 			     hb_codepoint_t glyph);
851 
852 HB_EXTERN void
853 hb_font_get_glyph_h_advances (hb_font_t* font,
854 			      unsigned int count,
855 			      const hb_codepoint_t *first_glyph,
856 			      unsigned glyph_stride,
857 			      hb_position_t *first_advance,
858 			      unsigned advance_stride);
859 HB_EXTERN void
860 hb_font_get_glyph_v_advances (hb_font_t* font,
861 			      unsigned int count,
862 			      const hb_codepoint_t *first_glyph,
863 			      unsigned glyph_stride,
864 			      hb_position_t *first_advance,
865 			      unsigned advance_stride);
866 
867 HB_EXTERN hb_bool_t
868 hb_font_get_glyph_h_origin (hb_font_t *font,
869 			    hb_codepoint_t glyph,
870 			    hb_position_t *x, hb_position_t *y);
871 HB_EXTERN hb_bool_t
872 hb_font_get_glyph_v_origin (hb_font_t *font,
873 			    hb_codepoint_t glyph,
874 			    hb_position_t *x, hb_position_t *y);
875 
876 HB_EXTERN hb_position_t
877 hb_font_get_glyph_h_kerning (hb_font_t *font,
878 			     hb_codepoint_t left_glyph, hb_codepoint_t right_glyph);
879 
880 HB_EXTERN hb_bool_t
881 hb_font_get_glyph_extents (hb_font_t *font,
882 			   hb_codepoint_t glyph,
883 			   hb_glyph_extents_t *extents);
884 
885 HB_EXTERN hb_bool_t
886 hb_font_get_glyph_contour_point (hb_font_t *font,
887 				 hb_codepoint_t glyph, unsigned int point_index,
888 				 hb_position_t *x, hb_position_t *y);
889 
890 HB_EXTERN hb_bool_t
891 hb_font_get_glyph_name (hb_font_t *font,
892 			hb_codepoint_t glyph,
893 			char *name, unsigned int size);
894 HB_EXTERN hb_bool_t
895 hb_font_get_glyph_from_name (hb_font_t *font,
896 			     const char *name, int len, /* -1 means nul-terminated */
897 			     hb_codepoint_t *glyph);
898 
899 HB_EXTERN void
900 hb_font_draw_glyph (hb_font_t *font,
901                     hb_codepoint_t glyph,
902                     hb_draw_funcs_t *dfuncs, void *draw_data);
903 
904 HB_EXTERN void
905 hb_font_paint_glyph (hb_font_t *font,
906                      hb_codepoint_t glyph,
907                      hb_paint_funcs_t *pfuncs, void *paint_data,
908                      unsigned int palette_index,
909                      hb_color_t foreground);
910 
911 /* high-level funcs, with fallback */
912 
913 /* Calls either hb_font_get_nominal_glyph() if variation_selector is 0,
914  * otherwise calls hb_font_get_variation_glyph(). */
915 HB_EXTERN hb_bool_t
916 hb_font_get_glyph (hb_font_t *font,
917 		   hb_codepoint_t unicode, hb_codepoint_t variation_selector,
918 		   hb_codepoint_t *glyph);
919 
920 HB_EXTERN void
921 hb_font_get_extents_for_direction (hb_font_t *font,
922 				   hb_direction_t direction,
923 				   hb_font_extents_t *extents);
924 HB_EXTERN void
925 hb_font_get_glyph_advance_for_direction (hb_font_t *font,
926 					 hb_codepoint_t glyph,
927 					 hb_direction_t direction,
928 					 hb_position_t *x, hb_position_t *y);
929 HB_EXTERN void
930 hb_font_get_glyph_advances_for_direction (hb_font_t* font,
931 					  hb_direction_t direction,
932 					  unsigned int count,
933 					  const hb_codepoint_t *first_glyph,
934 					  unsigned glyph_stride,
935 					  hb_position_t *first_advance,
936 					  unsigned advance_stride);
937 HB_EXTERN void
938 hb_font_get_glyph_origin_for_direction (hb_font_t *font,
939 					hb_codepoint_t glyph,
940 					hb_direction_t direction,
941 					hb_position_t *x, hb_position_t *y);
942 HB_EXTERN void
943 hb_font_add_glyph_origin_for_direction (hb_font_t *font,
944 					hb_codepoint_t glyph,
945 					hb_direction_t direction,
946 					hb_position_t *x, hb_position_t *y);
947 HB_EXTERN void
948 hb_font_subtract_glyph_origin_for_direction (hb_font_t *font,
949 					     hb_codepoint_t glyph,
950 					     hb_direction_t direction,
951 					     hb_position_t *x, hb_position_t *y);
952 
953 HB_EXTERN void
954 hb_font_get_glyph_kerning_for_direction (hb_font_t *font,
955 					 hb_codepoint_t first_glyph, hb_codepoint_t second_glyph,
956 					 hb_direction_t direction,
957 					 hb_position_t *x, hb_position_t *y);
958 
959 HB_EXTERN hb_bool_t
960 hb_font_get_glyph_extents_for_origin (hb_font_t *font,
961 				      hb_codepoint_t glyph,
962 				      hb_direction_t direction,
963 				      hb_glyph_extents_t *extents);
964 
965 HB_EXTERN hb_bool_t
966 hb_font_get_glyph_contour_point_for_origin (hb_font_t *font,
967 					    hb_codepoint_t glyph, unsigned int point_index,
968 					    hb_direction_t direction,
969 					    hb_position_t *x, hb_position_t *y);
970 
971 /* Generates gidDDD if glyph has no name. */
972 HB_EXTERN void
973 hb_font_glyph_to_string (hb_font_t *font,
974 			 hb_codepoint_t glyph,
975 			 char *s, unsigned int size);
976 /* Parses gidDDD and uniUUUU strings automatically. */
977 HB_EXTERN hb_bool_t
978 hb_font_glyph_from_string (hb_font_t *font,
979 			   const char *s, int len, /* -1 means nul-terminated */
980 			   hb_codepoint_t *glyph);
981 
982 
983 /*
984  * hb_font_t
985  */
986 
987 /* Fonts are very light-weight objects */
988 
989 HB_EXTERN hb_font_t *
990 hb_font_create (hb_face_t *face);
991 
992 HB_EXTERN hb_font_t *
993 hb_font_create_sub_font (hb_font_t *parent);
994 
995 HB_EXTERN hb_font_t *
996 hb_font_get_empty (void);
997 
998 HB_EXTERN hb_font_t *
999 hb_font_reference (hb_font_t *font);
1000 
1001 HB_EXTERN void
1002 hb_font_destroy (hb_font_t *font);
1003 
1004 HB_EXTERN hb_bool_t
1005 hb_font_set_user_data (hb_font_t          *font,
1006 		       hb_user_data_key_t *key,
1007 		       void *              data,
1008 		       hb_destroy_func_t   destroy,
1009 		       hb_bool_t           replace);
1010 
1011 
1012 HB_EXTERN void *
1013 hb_font_get_user_data (const hb_font_t    *font,
1014 		       hb_user_data_key_t *key);
1015 
1016 HB_EXTERN void
1017 hb_font_make_immutable (hb_font_t *font);
1018 
1019 HB_EXTERN hb_bool_t
1020 hb_font_is_immutable (hb_font_t *font);
1021 
1022 HB_EXTERN unsigned int
1023 hb_font_get_serial (hb_font_t *font);
1024 
1025 HB_EXTERN void
1026 hb_font_changed (hb_font_t *font);
1027 
1028 HB_EXTERN void
1029 hb_font_set_parent (hb_font_t *font,
1030 		    hb_font_t *parent);
1031 
1032 HB_EXTERN hb_font_t *
1033 hb_font_get_parent (hb_font_t *font);
1034 
1035 HB_EXTERN void
1036 hb_font_set_face (hb_font_t *font,
1037 		  hb_face_t *face);
1038 
1039 HB_EXTERN hb_face_t *
1040 hb_font_get_face (hb_font_t *font);
1041 
1042 
1043 HB_EXTERN void
1044 hb_font_set_funcs (hb_font_t         *font,
1045 		   hb_font_funcs_t   *klass,
1046 		   void              *font_data,
1047 		   hb_destroy_func_t  destroy);
1048 
1049 /* Be *very* careful with this function! */
1050 HB_EXTERN void
1051 hb_font_set_funcs_data (hb_font_t         *font,
1052 			void              *font_data,
1053 			hb_destroy_func_t  destroy);
1054 
1055 
1056 HB_EXTERN void
1057 hb_font_set_scale (hb_font_t *font,
1058 		   int x_scale,
1059 		   int y_scale);
1060 
1061 HB_EXTERN void
1062 hb_font_get_scale (hb_font_t *font,
1063 		   int *x_scale,
1064 		   int *y_scale);
1065 
1066 /*
1067  * A zero value means "no hinting in that direction"
1068  */
1069 HB_EXTERN void
1070 hb_font_set_ppem (hb_font_t *font,
1071 		  unsigned int x_ppem,
1072 		  unsigned int y_ppem);
1073 
1074 HB_EXTERN void
1075 hb_font_get_ppem (hb_font_t *font,
1076 		  unsigned int *x_ppem,
1077 		  unsigned int *y_ppem);
1078 
1079 /*
1080  * Point size per EM.  Used for optical-sizing in CoreText.
1081  * A value of zero means "not set".
1082  */
1083 HB_EXTERN void
1084 hb_font_set_ptem (hb_font_t *font, float ptem);
1085 
1086 HB_EXTERN float
1087 hb_font_get_ptem (hb_font_t *font);
1088 
1089 HB_EXTERN void
1090 hb_font_set_synthetic_bold (hb_font_t *font,
1091 			    float x_embolden, float y_embolden,
1092 			    hb_bool_t in_place);
1093 
1094 HB_EXTERN void
1095 hb_font_get_synthetic_bold (hb_font_t *font,
1096 			    float *x_embolden, float *y_embolden,
1097 			    hb_bool_t *in_place);
1098 
1099 HB_EXTERN void
1100 hb_font_set_synthetic_slant (hb_font_t *font, float slant);
1101 
1102 HB_EXTERN float
1103 hb_font_get_synthetic_slant (hb_font_t *font);
1104 
1105 HB_EXTERN void
1106 hb_font_set_variations (hb_font_t *font,
1107 			const hb_variation_t *variations,
1108 			unsigned int variations_length);
1109 
1110 HB_EXTERN void
1111 hb_font_set_variation (hb_font_t *font,
1112 		       hb_tag_t tag,
1113 		       float    value);
1114 
1115 HB_EXTERN void
1116 hb_font_set_var_coords_design (hb_font_t *font,
1117 			       const float *coords,
1118 			       unsigned int coords_length);
1119 
1120 HB_EXTERN const float *
1121 hb_font_get_var_coords_design (hb_font_t *font,
1122 			       unsigned int *length);
1123 
1124 HB_EXTERN void
1125 hb_font_set_var_coords_normalized (hb_font_t *font,
1126 				   const int *coords, /* 2.14 normalized */
1127 				   unsigned int coords_length);
1128 
1129 HB_EXTERN const int *
1130 hb_font_get_var_coords_normalized (hb_font_t *font,
1131 				   unsigned int *length);
1132 
1133 /**
1134  * HB_FONT_NO_VAR_NAMED_INSTANCE:
1135  *
1136  * Constant signifying that a font does not have any
1137  * named-instance index set.  This is the default of
1138  * a font.
1139  *
1140  * Since: 7.0.0
1141  */
1142 #define HB_FONT_NO_VAR_NAMED_INSTANCE 0xFFFFFFFF
1143 
1144 HB_EXTERN void
1145 hb_font_set_var_named_instance (hb_font_t *font,
1146 				unsigned int instance_index);
1147 
1148 HB_EXTERN unsigned int
1149 hb_font_get_var_named_instance (hb_font_t *font);
1150 
1151 HB_END_DECLS
1152 
1153 #endif /* HB_FONT_H */
1154