Imported Upstream version 8.2.2
[platform/upstream/harfbuzz.git] / src / hb-font.h
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 */