1cb93a386Sopenharmony_ci/*
2cb93a386Sopenharmony_ci * Copyright © 2009  Red Hat, Inc.
3cb93a386Sopenharmony_ci * Copyright © 2012  Google, Inc.
4cb93a386Sopenharmony_ci *
5cb93a386Sopenharmony_ci *  This is part of HarfBuzz, a text shaping library.
6cb93a386Sopenharmony_ci *
7cb93a386Sopenharmony_ci * Permission is hereby granted, without written agreement and without
8cb93a386Sopenharmony_ci * license or royalty fees, to use, copy, modify, and distribute this
9cb93a386Sopenharmony_ci * software and its documentation for any purpose, provided that the
10cb93a386Sopenharmony_ci * above copyright notice and the following two paragraphs appear in
11cb93a386Sopenharmony_ci * all copies of this software.
12cb93a386Sopenharmony_ci *
13cb93a386Sopenharmony_ci * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
14cb93a386Sopenharmony_ci * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
15cb93a386Sopenharmony_ci * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
16cb93a386Sopenharmony_ci * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
17cb93a386Sopenharmony_ci * DAMAGE.
18cb93a386Sopenharmony_ci *
19cb93a386Sopenharmony_ci * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
20cb93a386Sopenharmony_ci * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
21cb93a386Sopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
22cb93a386Sopenharmony_ci * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
23cb93a386Sopenharmony_ci * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
24cb93a386Sopenharmony_ci *
25cb93a386Sopenharmony_ci * Red Hat Author(s): Behdad Esfahbod
26cb93a386Sopenharmony_ci * Google Author(s): Behdad Esfahbod
27cb93a386Sopenharmony_ci */
28cb93a386Sopenharmony_ci
29cb93a386Sopenharmony_ci#include "hb.hh"
30cb93a386Sopenharmony_ci
31cb93a386Sopenharmony_ci#include "hb-font.hh"
32cb93a386Sopenharmony_ci#include "hb-machinery.hh"
33cb93a386Sopenharmony_ci
34cb93a386Sopenharmony_ci#include "hb-ot.h"
35cb93a386Sopenharmony_ci
36cb93a386Sopenharmony_ci#include "hb-ot-var-avar-table.hh"
37cb93a386Sopenharmony_ci#include "hb-ot-var-fvar-table.hh"
38cb93a386Sopenharmony_ci
39cb93a386Sopenharmony_ci
40cb93a386Sopenharmony_ci/**
41cb93a386Sopenharmony_ci * SECTION:hb-font
42cb93a386Sopenharmony_ci * @title: hb-font
43cb93a386Sopenharmony_ci * @short_description: Font objects
44cb93a386Sopenharmony_ci * @include: hb.h
45cb93a386Sopenharmony_ci *
46cb93a386Sopenharmony_ci * Functions for working with font objects.
47cb93a386Sopenharmony_ci *
48cb93a386Sopenharmony_ci * A font object represents a font face at a specific size and with
49cb93a386Sopenharmony_ci * certain other parameters (pixels-per-em, points-per-em, variation
50cb93a386Sopenharmony_ci * settings) specified. Font objects are created from font face
51cb93a386Sopenharmony_ci * objects, and are used as input to hb_shape(), among other things.
52cb93a386Sopenharmony_ci *
53cb93a386Sopenharmony_ci * Client programs can optionally pass in their own functions that
54cb93a386Sopenharmony_ci * implement the basic, lower-level queries of font objects. This set
55cb93a386Sopenharmony_ci * of font functions is defined by the virtual methods in
56cb93a386Sopenharmony_ci * #hb_font_funcs_t.
57cb93a386Sopenharmony_ci *
58cb93a386Sopenharmony_ci * HarfBuzz provides a built-in set of lightweight default
59cb93a386Sopenharmony_ci * functions for each method in #hb_font_funcs_t.
60cb93a386Sopenharmony_ci **/
61cb93a386Sopenharmony_ci
62cb93a386Sopenharmony_ci
63cb93a386Sopenharmony_ci/*
64cb93a386Sopenharmony_ci * hb_font_funcs_t
65cb93a386Sopenharmony_ci */
66cb93a386Sopenharmony_ci
67cb93a386Sopenharmony_cistatic hb_bool_t
68cb93a386Sopenharmony_cihb_font_get_font_h_extents_nil (hb_font_t         *font HB_UNUSED,
69cb93a386Sopenharmony_ci				void              *font_data HB_UNUSED,
70cb93a386Sopenharmony_ci				hb_font_extents_t *extents,
71cb93a386Sopenharmony_ci				void              *user_data HB_UNUSED)
72cb93a386Sopenharmony_ci{
73cb93a386Sopenharmony_ci  memset (extents, 0, sizeof (*extents));
74cb93a386Sopenharmony_ci  return false;
75cb93a386Sopenharmony_ci}
76cb93a386Sopenharmony_ci
77cb93a386Sopenharmony_cistatic hb_bool_t
78cb93a386Sopenharmony_cihb_font_get_font_h_extents_default (hb_font_t         *font,
79cb93a386Sopenharmony_ci				    void              *font_data HB_UNUSED,
80cb93a386Sopenharmony_ci				    hb_font_extents_t *extents,
81cb93a386Sopenharmony_ci				    void              *user_data HB_UNUSED)
82cb93a386Sopenharmony_ci{
83cb93a386Sopenharmony_ci  hb_bool_t ret = font->parent->get_font_h_extents (extents);
84cb93a386Sopenharmony_ci  if (ret) {
85cb93a386Sopenharmony_ci    extents->ascender = font->parent_scale_y_distance (extents->ascender);
86cb93a386Sopenharmony_ci    extents->descender = font->parent_scale_y_distance (extents->descender);
87cb93a386Sopenharmony_ci    extents->line_gap = font->parent_scale_y_distance (extents->line_gap);
88cb93a386Sopenharmony_ci  }
89cb93a386Sopenharmony_ci  return ret;
90cb93a386Sopenharmony_ci}
91cb93a386Sopenharmony_ci
92cb93a386Sopenharmony_cistatic hb_bool_t
93cb93a386Sopenharmony_cihb_font_get_font_v_extents_nil (hb_font_t         *font HB_UNUSED,
94cb93a386Sopenharmony_ci				void              *font_data HB_UNUSED,
95cb93a386Sopenharmony_ci				hb_font_extents_t *extents,
96cb93a386Sopenharmony_ci				void              *user_data HB_UNUSED)
97cb93a386Sopenharmony_ci{
98cb93a386Sopenharmony_ci  memset (extents, 0, sizeof (*extents));
99cb93a386Sopenharmony_ci  return false;
100cb93a386Sopenharmony_ci}
101cb93a386Sopenharmony_ci
102cb93a386Sopenharmony_cistatic hb_bool_t
103cb93a386Sopenharmony_cihb_font_get_font_v_extents_default (hb_font_t         *font,
104cb93a386Sopenharmony_ci				    void              *font_data HB_UNUSED,
105cb93a386Sopenharmony_ci				    hb_font_extents_t *extents,
106cb93a386Sopenharmony_ci				    void              *user_data HB_UNUSED)
107cb93a386Sopenharmony_ci{
108cb93a386Sopenharmony_ci  hb_bool_t ret = font->parent->get_font_v_extents (extents);
109cb93a386Sopenharmony_ci  if (ret) {
110cb93a386Sopenharmony_ci    extents->ascender = font->parent_scale_x_distance (extents->ascender);
111cb93a386Sopenharmony_ci    extents->descender = font->parent_scale_x_distance (extents->descender);
112cb93a386Sopenharmony_ci    extents->line_gap = font->parent_scale_x_distance (extents->line_gap);
113cb93a386Sopenharmony_ci  }
114cb93a386Sopenharmony_ci  return ret;
115cb93a386Sopenharmony_ci}
116cb93a386Sopenharmony_ci
117cb93a386Sopenharmony_cistatic hb_bool_t
118cb93a386Sopenharmony_cihb_font_get_nominal_glyph_nil (hb_font_t      *font HB_UNUSED,
119cb93a386Sopenharmony_ci			       void           *font_data HB_UNUSED,
120cb93a386Sopenharmony_ci			       hb_codepoint_t  unicode HB_UNUSED,
121cb93a386Sopenharmony_ci			       hb_codepoint_t *glyph,
122cb93a386Sopenharmony_ci			       void           *user_data HB_UNUSED)
123cb93a386Sopenharmony_ci{
124cb93a386Sopenharmony_ci  *glyph = 0;
125cb93a386Sopenharmony_ci  return false;
126cb93a386Sopenharmony_ci}
127cb93a386Sopenharmony_ci
128cb93a386Sopenharmony_cistatic hb_bool_t
129cb93a386Sopenharmony_cihb_font_get_nominal_glyph_default (hb_font_t      *font,
130cb93a386Sopenharmony_ci				   void           *font_data HB_UNUSED,
131cb93a386Sopenharmony_ci				   hb_codepoint_t  unicode,
132cb93a386Sopenharmony_ci				   hb_codepoint_t *glyph,
133cb93a386Sopenharmony_ci				   void           *user_data HB_UNUSED)
134cb93a386Sopenharmony_ci{
135cb93a386Sopenharmony_ci  if (font->has_nominal_glyphs_func_set ())
136cb93a386Sopenharmony_ci  {
137cb93a386Sopenharmony_ci    return font->get_nominal_glyphs (1, &unicode, 0, glyph, 0);
138cb93a386Sopenharmony_ci  }
139cb93a386Sopenharmony_ci  return font->parent->get_nominal_glyph (unicode, glyph);
140cb93a386Sopenharmony_ci}
141cb93a386Sopenharmony_ci
142cb93a386Sopenharmony_ci#define hb_font_get_nominal_glyphs_nil hb_font_get_nominal_glyphs_default
143cb93a386Sopenharmony_ci
144cb93a386Sopenharmony_cistatic unsigned int
145cb93a386Sopenharmony_cihb_font_get_nominal_glyphs_default (hb_font_t            *font,
146cb93a386Sopenharmony_ci				    void                 *font_data HB_UNUSED,
147cb93a386Sopenharmony_ci				    unsigned int          count,
148cb93a386Sopenharmony_ci				    const hb_codepoint_t *first_unicode,
149cb93a386Sopenharmony_ci				    unsigned int          unicode_stride,
150cb93a386Sopenharmony_ci				    hb_codepoint_t       *first_glyph,
151cb93a386Sopenharmony_ci				    unsigned int          glyph_stride,
152cb93a386Sopenharmony_ci				    void                 *user_data HB_UNUSED)
153cb93a386Sopenharmony_ci{
154cb93a386Sopenharmony_ci  if (font->has_nominal_glyph_func_set ())
155cb93a386Sopenharmony_ci  {
156cb93a386Sopenharmony_ci    for (unsigned int i = 0; i < count; i++)
157cb93a386Sopenharmony_ci    {
158cb93a386Sopenharmony_ci      if (!font->get_nominal_glyph (*first_unicode, first_glyph))
159cb93a386Sopenharmony_ci	return i;
160cb93a386Sopenharmony_ci
161cb93a386Sopenharmony_ci      first_unicode = &StructAtOffsetUnaligned<hb_codepoint_t> (first_unicode, unicode_stride);
162cb93a386Sopenharmony_ci      first_glyph = &StructAtOffsetUnaligned<hb_codepoint_t> (first_glyph, glyph_stride);
163cb93a386Sopenharmony_ci    }
164cb93a386Sopenharmony_ci    return count;
165cb93a386Sopenharmony_ci  }
166cb93a386Sopenharmony_ci
167cb93a386Sopenharmony_ci  return font->parent->get_nominal_glyphs (count,
168cb93a386Sopenharmony_ci					   first_unicode, unicode_stride,
169cb93a386Sopenharmony_ci					   first_glyph, glyph_stride);
170cb93a386Sopenharmony_ci}
171cb93a386Sopenharmony_ci
172cb93a386Sopenharmony_cistatic hb_bool_t
173cb93a386Sopenharmony_cihb_font_get_variation_glyph_nil (hb_font_t      *font HB_UNUSED,
174cb93a386Sopenharmony_ci				 void           *font_data HB_UNUSED,
175cb93a386Sopenharmony_ci				 hb_codepoint_t  unicode HB_UNUSED,
176cb93a386Sopenharmony_ci				 hb_codepoint_t  variation_selector HB_UNUSED,
177cb93a386Sopenharmony_ci				 hb_codepoint_t *glyph,
178cb93a386Sopenharmony_ci				 void           *user_data HB_UNUSED)
179cb93a386Sopenharmony_ci{
180cb93a386Sopenharmony_ci  *glyph = 0;
181cb93a386Sopenharmony_ci  return false;
182cb93a386Sopenharmony_ci}
183cb93a386Sopenharmony_ci
184cb93a386Sopenharmony_cistatic hb_bool_t
185cb93a386Sopenharmony_cihb_font_get_variation_glyph_default (hb_font_t      *font,
186cb93a386Sopenharmony_ci				     void           *font_data HB_UNUSED,
187cb93a386Sopenharmony_ci				     hb_codepoint_t  unicode,
188cb93a386Sopenharmony_ci				     hb_codepoint_t  variation_selector,
189cb93a386Sopenharmony_ci				     hb_codepoint_t *glyph,
190cb93a386Sopenharmony_ci				     void           *user_data HB_UNUSED)
191cb93a386Sopenharmony_ci{
192cb93a386Sopenharmony_ci  return font->parent->get_variation_glyph (unicode, variation_selector, glyph);
193cb93a386Sopenharmony_ci}
194cb93a386Sopenharmony_ci
195cb93a386Sopenharmony_ci
196cb93a386Sopenharmony_cistatic hb_position_t
197cb93a386Sopenharmony_cihb_font_get_glyph_h_advance_nil (hb_font_t      *font,
198cb93a386Sopenharmony_ci				 void           *font_data HB_UNUSED,
199cb93a386Sopenharmony_ci				 hb_codepoint_t  glyph HB_UNUSED,
200cb93a386Sopenharmony_ci				 void           *user_data HB_UNUSED)
201cb93a386Sopenharmony_ci{
202cb93a386Sopenharmony_ci  return font->x_scale;
203cb93a386Sopenharmony_ci}
204cb93a386Sopenharmony_ci
205cb93a386Sopenharmony_cistatic hb_position_t
206cb93a386Sopenharmony_cihb_font_get_glyph_h_advance_default (hb_font_t      *font,
207cb93a386Sopenharmony_ci				     void           *font_data HB_UNUSED,
208cb93a386Sopenharmony_ci				     hb_codepoint_t  glyph,
209cb93a386Sopenharmony_ci				     void           *user_data HB_UNUSED)
210cb93a386Sopenharmony_ci{
211cb93a386Sopenharmony_ci  if (font->has_glyph_h_advances_func_set ())
212cb93a386Sopenharmony_ci  {
213cb93a386Sopenharmony_ci    hb_position_t ret;
214cb93a386Sopenharmony_ci    font->get_glyph_h_advances (1, &glyph, 0, &ret, 0);
215cb93a386Sopenharmony_ci    return ret;
216cb93a386Sopenharmony_ci  }
217cb93a386Sopenharmony_ci  return font->parent_scale_x_distance (font->parent->get_glyph_h_advance (glyph));
218cb93a386Sopenharmony_ci}
219cb93a386Sopenharmony_ci
220cb93a386Sopenharmony_cistatic hb_position_t
221cb93a386Sopenharmony_cihb_font_get_glyph_v_advance_nil (hb_font_t      *font,
222cb93a386Sopenharmony_ci				 void           *font_data HB_UNUSED,
223cb93a386Sopenharmony_ci				 hb_codepoint_t  glyph HB_UNUSED,
224cb93a386Sopenharmony_ci				 void           *user_data HB_UNUSED)
225cb93a386Sopenharmony_ci{
226cb93a386Sopenharmony_ci  /* TODO use font_extents.ascender+descender */
227cb93a386Sopenharmony_ci  return font->y_scale;
228cb93a386Sopenharmony_ci}
229cb93a386Sopenharmony_ci
230cb93a386Sopenharmony_cistatic hb_position_t
231cb93a386Sopenharmony_cihb_font_get_glyph_v_advance_default (hb_font_t      *font,
232cb93a386Sopenharmony_ci				     void           *font_data HB_UNUSED,
233cb93a386Sopenharmony_ci				     hb_codepoint_t  glyph,
234cb93a386Sopenharmony_ci				     void           *user_data HB_UNUSED)
235cb93a386Sopenharmony_ci{
236cb93a386Sopenharmony_ci  if (font->has_glyph_v_advances_func_set ())
237cb93a386Sopenharmony_ci  {
238cb93a386Sopenharmony_ci    hb_position_t ret;
239cb93a386Sopenharmony_ci    font->get_glyph_v_advances (1, &glyph, 0, &ret, 0);
240cb93a386Sopenharmony_ci    return ret;
241cb93a386Sopenharmony_ci  }
242cb93a386Sopenharmony_ci  return font->parent_scale_y_distance (font->parent->get_glyph_v_advance (glyph));
243cb93a386Sopenharmony_ci}
244cb93a386Sopenharmony_ci
245cb93a386Sopenharmony_ci#define hb_font_get_glyph_h_advances_nil hb_font_get_glyph_h_advances_default
246cb93a386Sopenharmony_ci
247cb93a386Sopenharmony_cistatic void
248cb93a386Sopenharmony_cihb_font_get_glyph_h_advances_default (hb_font_t*            font,
249cb93a386Sopenharmony_ci				      void*                 font_data HB_UNUSED,
250cb93a386Sopenharmony_ci				      unsigned int          count,
251cb93a386Sopenharmony_ci				      const hb_codepoint_t *first_glyph,
252cb93a386Sopenharmony_ci				      unsigned int          glyph_stride,
253cb93a386Sopenharmony_ci				      hb_position_t        *first_advance,
254cb93a386Sopenharmony_ci				      unsigned int          advance_stride,
255cb93a386Sopenharmony_ci				      void                 *user_data HB_UNUSED)
256cb93a386Sopenharmony_ci{
257cb93a386Sopenharmony_ci  if (font->has_glyph_h_advance_func_set ())
258cb93a386Sopenharmony_ci  {
259cb93a386Sopenharmony_ci    for (unsigned int i = 0; i < count; i++)
260cb93a386Sopenharmony_ci    {
261cb93a386Sopenharmony_ci      *first_advance = font->get_glyph_h_advance (*first_glyph);
262cb93a386Sopenharmony_ci      first_glyph = &StructAtOffsetUnaligned<hb_codepoint_t> (first_glyph, glyph_stride);
263cb93a386Sopenharmony_ci      first_advance = &StructAtOffsetUnaligned<hb_position_t> (first_advance, advance_stride);
264cb93a386Sopenharmony_ci    }
265cb93a386Sopenharmony_ci    return;
266cb93a386Sopenharmony_ci  }
267cb93a386Sopenharmony_ci
268cb93a386Sopenharmony_ci  font->parent->get_glyph_h_advances (count,
269cb93a386Sopenharmony_ci				      first_glyph, glyph_stride,
270cb93a386Sopenharmony_ci				      first_advance, advance_stride);
271cb93a386Sopenharmony_ci  for (unsigned int i = 0; i < count; i++)
272cb93a386Sopenharmony_ci  {
273cb93a386Sopenharmony_ci    *first_advance = font->parent_scale_x_distance (*first_advance);
274cb93a386Sopenharmony_ci    first_advance = &StructAtOffsetUnaligned<hb_position_t> (first_advance, advance_stride);
275cb93a386Sopenharmony_ci  }
276cb93a386Sopenharmony_ci}
277cb93a386Sopenharmony_ci
278cb93a386Sopenharmony_ci#define hb_font_get_glyph_v_advances_nil hb_font_get_glyph_v_advances_default
279cb93a386Sopenharmony_cistatic void
280cb93a386Sopenharmony_cihb_font_get_glyph_v_advances_default (hb_font_t*            font,
281cb93a386Sopenharmony_ci				      void*                 font_data HB_UNUSED,
282cb93a386Sopenharmony_ci				      unsigned int          count,
283cb93a386Sopenharmony_ci				      const hb_codepoint_t *first_glyph,
284cb93a386Sopenharmony_ci				      unsigned int          glyph_stride,
285cb93a386Sopenharmony_ci				      hb_position_t        *first_advance,
286cb93a386Sopenharmony_ci				      unsigned int          advance_stride,
287cb93a386Sopenharmony_ci				      void                 *user_data HB_UNUSED)
288cb93a386Sopenharmony_ci{
289cb93a386Sopenharmony_ci  if (font->has_glyph_v_advance_func_set ())
290cb93a386Sopenharmony_ci  {
291cb93a386Sopenharmony_ci    for (unsigned int i = 0; i < count; i++)
292cb93a386Sopenharmony_ci    {
293cb93a386Sopenharmony_ci      *first_advance = font->get_glyph_v_advance (*first_glyph);
294cb93a386Sopenharmony_ci      first_glyph = &StructAtOffsetUnaligned<hb_codepoint_t> (first_glyph, glyph_stride);
295cb93a386Sopenharmony_ci      first_advance = &StructAtOffsetUnaligned<hb_position_t> (first_advance, advance_stride);
296cb93a386Sopenharmony_ci    }
297cb93a386Sopenharmony_ci    return;
298cb93a386Sopenharmony_ci  }
299cb93a386Sopenharmony_ci
300cb93a386Sopenharmony_ci  font->parent->get_glyph_v_advances (count,
301cb93a386Sopenharmony_ci				      first_glyph, glyph_stride,
302cb93a386Sopenharmony_ci				      first_advance, advance_stride);
303cb93a386Sopenharmony_ci  for (unsigned int i = 0; i < count; i++)
304cb93a386Sopenharmony_ci  {
305cb93a386Sopenharmony_ci    *first_advance = font->parent_scale_y_distance (*first_advance);
306cb93a386Sopenharmony_ci    first_advance = &StructAtOffsetUnaligned<hb_position_t> (first_advance, advance_stride);
307cb93a386Sopenharmony_ci  }
308cb93a386Sopenharmony_ci}
309cb93a386Sopenharmony_ci
310cb93a386Sopenharmony_cistatic hb_bool_t
311cb93a386Sopenharmony_cihb_font_get_glyph_h_origin_nil (hb_font_t      *font HB_UNUSED,
312cb93a386Sopenharmony_ci				void           *font_data HB_UNUSED,
313cb93a386Sopenharmony_ci				hb_codepoint_t  glyph HB_UNUSED,
314cb93a386Sopenharmony_ci				hb_position_t  *x,
315cb93a386Sopenharmony_ci				hb_position_t  *y,
316cb93a386Sopenharmony_ci				void           *user_data HB_UNUSED)
317cb93a386Sopenharmony_ci{
318cb93a386Sopenharmony_ci  *x = *y = 0;
319cb93a386Sopenharmony_ci  return true;
320cb93a386Sopenharmony_ci}
321cb93a386Sopenharmony_ci
322cb93a386Sopenharmony_cistatic hb_bool_t
323cb93a386Sopenharmony_cihb_font_get_glyph_h_origin_default (hb_font_t      *font,
324cb93a386Sopenharmony_ci				    void           *font_data HB_UNUSED,
325cb93a386Sopenharmony_ci				    hb_codepoint_t  glyph,
326cb93a386Sopenharmony_ci				    hb_position_t  *x,
327cb93a386Sopenharmony_ci				    hb_position_t  *y,
328cb93a386Sopenharmony_ci				    void           *user_data HB_UNUSED)
329cb93a386Sopenharmony_ci{
330cb93a386Sopenharmony_ci  hb_bool_t ret = font->parent->get_glyph_h_origin (glyph, x, y);
331cb93a386Sopenharmony_ci  if (ret)
332cb93a386Sopenharmony_ci    font->parent_scale_position (x, y);
333cb93a386Sopenharmony_ci  return ret;
334cb93a386Sopenharmony_ci}
335cb93a386Sopenharmony_ci
336cb93a386Sopenharmony_cistatic hb_bool_t
337cb93a386Sopenharmony_cihb_font_get_glyph_v_origin_nil (hb_font_t      *font HB_UNUSED,
338cb93a386Sopenharmony_ci				void           *font_data HB_UNUSED,
339cb93a386Sopenharmony_ci				hb_codepoint_t  glyph HB_UNUSED,
340cb93a386Sopenharmony_ci				hb_position_t  *x,
341cb93a386Sopenharmony_ci				hb_position_t  *y,
342cb93a386Sopenharmony_ci				void           *user_data HB_UNUSED)
343cb93a386Sopenharmony_ci{
344cb93a386Sopenharmony_ci  *x = *y = 0;
345cb93a386Sopenharmony_ci  return false;
346cb93a386Sopenharmony_ci}
347cb93a386Sopenharmony_ci
348cb93a386Sopenharmony_cistatic hb_bool_t
349cb93a386Sopenharmony_cihb_font_get_glyph_v_origin_default (hb_font_t      *font,
350cb93a386Sopenharmony_ci				    void           *font_data HB_UNUSED,
351cb93a386Sopenharmony_ci				    hb_codepoint_t  glyph,
352cb93a386Sopenharmony_ci				    hb_position_t  *x,
353cb93a386Sopenharmony_ci				    hb_position_t  *y,
354cb93a386Sopenharmony_ci				    void           *user_data HB_UNUSED)
355cb93a386Sopenharmony_ci{
356cb93a386Sopenharmony_ci  hb_bool_t ret = font->parent->get_glyph_v_origin (glyph, x, y);
357cb93a386Sopenharmony_ci  if (ret)
358cb93a386Sopenharmony_ci    font->parent_scale_position (x, y);
359cb93a386Sopenharmony_ci  return ret;
360cb93a386Sopenharmony_ci}
361cb93a386Sopenharmony_ci
362cb93a386Sopenharmony_cistatic hb_position_t
363cb93a386Sopenharmony_cihb_font_get_glyph_h_kerning_nil (hb_font_t      *font HB_UNUSED,
364cb93a386Sopenharmony_ci				 void           *font_data HB_UNUSED,
365cb93a386Sopenharmony_ci				 hb_codepoint_t  left_glyph HB_UNUSED,
366cb93a386Sopenharmony_ci				 hb_codepoint_t  right_glyph HB_UNUSED,
367cb93a386Sopenharmony_ci				 void           *user_data HB_UNUSED)
368cb93a386Sopenharmony_ci{
369cb93a386Sopenharmony_ci  return 0;
370cb93a386Sopenharmony_ci}
371cb93a386Sopenharmony_ci
372cb93a386Sopenharmony_cistatic hb_position_t
373cb93a386Sopenharmony_cihb_font_get_glyph_h_kerning_default (hb_font_t      *font,
374cb93a386Sopenharmony_ci				     void           *font_data HB_UNUSED,
375cb93a386Sopenharmony_ci				     hb_codepoint_t  left_glyph,
376cb93a386Sopenharmony_ci				     hb_codepoint_t  right_glyph,
377cb93a386Sopenharmony_ci				     void           *user_data HB_UNUSED)
378cb93a386Sopenharmony_ci{
379cb93a386Sopenharmony_ci  return font->parent_scale_x_distance (font->parent->get_glyph_h_kerning (left_glyph, right_glyph));
380cb93a386Sopenharmony_ci}
381cb93a386Sopenharmony_ci
382cb93a386Sopenharmony_ci#ifndef HB_DISABLE_DEPRECATED
383cb93a386Sopenharmony_cistatic hb_position_t
384cb93a386Sopenharmony_cihb_font_get_glyph_v_kerning_nil (hb_font_t      *font HB_UNUSED,
385cb93a386Sopenharmony_ci				 void           *font_data HB_UNUSED,
386cb93a386Sopenharmony_ci				 hb_codepoint_t  top_glyph HB_UNUSED,
387cb93a386Sopenharmony_ci				 hb_codepoint_t  bottom_glyph HB_UNUSED,
388cb93a386Sopenharmony_ci				 void           *user_data HB_UNUSED)
389cb93a386Sopenharmony_ci{
390cb93a386Sopenharmony_ci  return 0;
391cb93a386Sopenharmony_ci}
392cb93a386Sopenharmony_ci
393cb93a386Sopenharmony_cistatic hb_position_t
394cb93a386Sopenharmony_cihb_font_get_glyph_v_kerning_default (hb_font_t      *font,
395cb93a386Sopenharmony_ci				     void           *font_data HB_UNUSED,
396cb93a386Sopenharmony_ci				     hb_codepoint_t  top_glyph,
397cb93a386Sopenharmony_ci				     hb_codepoint_t  bottom_glyph,
398cb93a386Sopenharmony_ci				     void           *user_data HB_UNUSED)
399cb93a386Sopenharmony_ci{
400cb93a386Sopenharmony_ci  return font->parent_scale_y_distance (font->parent->get_glyph_v_kerning (top_glyph, bottom_glyph));
401cb93a386Sopenharmony_ci}
402cb93a386Sopenharmony_ci#endif
403cb93a386Sopenharmony_ci
404cb93a386Sopenharmony_cistatic hb_bool_t
405cb93a386Sopenharmony_cihb_font_get_glyph_extents_nil (hb_font_t          *font HB_UNUSED,
406cb93a386Sopenharmony_ci			       void               *font_data HB_UNUSED,
407cb93a386Sopenharmony_ci			       hb_codepoint_t      glyph HB_UNUSED,
408cb93a386Sopenharmony_ci			       hb_glyph_extents_t *extents,
409cb93a386Sopenharmony_ci			       void               *user_data HB_UNUSED)
410cb93a386Sopenharmony_ci{
411cb93a386Sopenharmony_ci  memset (extents, 0, sizeof (*extents));
412cb93a386Sopenharmony_ci  return false;
413cb93a386Sopenharmony_ci}
414cb93a386Sopenharmony_ci
415cb93a386Sopenharmony_cistatic hb_bool_t
416cb93a386Sopenharmony_cihb_font_get_glyph_extents_default (hb_font_t          *font,
417cb93a386Sopenharmony_ci				   void               *font_data HB_UNUSED,
418cb93a386Sopenharmony_ci				   hb_codepoint_t      glyph,
419cb93a386Sopenharmony_ci				   hb_glyph_extents_t *extents,
420cb93a386Sopenharmony_ci				   void               *user_data HB_UNUSED)
421cb93a386Sopenharmony_ci{
422cb93a386Sopenharmony_ci  hb_bool_t ret = font->parent->get_glyph_extents (glyph, extents);
423cb93a386Sopenharmony_ci  if (ret) {
424cb93a386Sopenharmony_ci    font->parent_scale_position (&extents->x_bearing, &extents->y_bearing);
425cb93a386Sopenharmony_ci    font->parent_scale_distance (&extents->width, &extents->height);
426cb93a386Sopenharmony_ci  }
427cb93a386Sopenharmony_ci  return ret;
428cb93a386Sopenharmony_ci}
429cb93a386Sopenharmony_ci
430cb93a386Sopenharmony_cistatic hb_bool_t
431cb93a386Sopenharmony_cihb_font_get_glyph_contour_point_nil (hb_font_t      *font HB_UNUSED,
432cb93a386Sopenharmony_ci				     void           *font_data HB_UNUSED,
433cb93a386Sopenharmony_ci				     hb_codepoint_t  glyph HB_UNUSED,
434cb93a386Sopenharmony_ci				     unsigned int    point_index HB_UNUSED,
435cb93a386Sopenharmony_ci				     hb_position_t  *x,
436cb93a386Sopenharmony_ci				     hb_position_t  *y,
437cb93a386Sopenharmony_ci				     void           *user_data HB_UNUSED)
438cb93a386Sopenharmony_ci{
439cb93a386Sopenharmony_ci  *x = *y = 0;
440cb93a386Sopenharmony_ci  return false;
441cb93a386Sopenharmony_ci}
442cb93a386Sopenharmony_ci
443cb93a386Sopenharmony_cistatic hb_bool_t
444cb93a386Sopenharmony_cihb_font_get_glyph_contour_point_default (hb_font_t      *font,
445cb93a386Sopenharmony_ci					 void           *font_data HB_UNUSED,
446cb93a386Sopenharmony_ci					 hb_codepoint_t  glyph,
447cb93a386Sopenharmony_ci					 unsigned int    point_index,
448cb93a386Sopenharmony_ci					 hb_position_t  *x,
449cb93a386Sopenharmony_ci					 hb_position_t  *y,
450cb93a386Sopenharmony_ci					 void           *user_data HB_UNUSED)
451cb93a386Sopenharmony_ci{
452cb93a386Sopenharmony_ci  hb_bool_t ret = font->parent->get_glyph_contour_point (glyph, point_index, x, y);
453cb93a386Sopenharmony_ci  if (ret)
454cb93a386Sopenharmony_ci    font->parent_scale_position (x, y);
455cb93a386Sopenharmony_ci  return ret;
456cb93a386Sopenharmony_ci}
457cb93a386Sopenharmony_ci
458cb93a386Sopenharmony_cistatic hb_bool_t
459cb93a386Sopenharmony_cihb_font_get_glyph_name_nil (hb_font_t      *font HB_UNUSED,
460cb93a386Sopenharmony_ci			    void           *font_data HB_UNUSED,
461cb93a386Sopenharmony_ci			    hb_codepoint_t  glyph HB_UNUSED,
462cb93a386Sopenharmony_ci			    char           *name,
463cb93a386Sopenharmony_ci			    unsigned int    size,
464cb93a386Sopenharmony_ci			    void           *user_data HB_UNUSED)
465cb93a386Sopenharmony_ci{
466cb93a386Sopenharmony_ci  if (size) *name = '\0';
467cb93a386Sopenharmony_ci  return false;
468cb93a386Sopenharmony_ci}
469cb93a386Sopenharmony_ci
470cb93a386Sopenharmony_cistatic hb_bool_t
471cb93a386Sopenharmony_cihb_font_get_glyph_name_default (hb_font_t      *font,
472cb93a386Sopenharmony_ci				void           *font_data HB_UNUSED,
473cb93a386Sopenharmony_ci				hb_codepoint_t  glyph,
474cb93a386Sopenharmony_ci				char           *name,
475cb93a386Sopenharmony_ci				unsigned int    size,
476cb93a386Sopenharmony_ci				void           *user_data HB_UNUSED)
477cb93a386Sopenharmony_ci{
478cb93a386Sopenharmony_ci  return font->parent->get_glyph_name (glyph, name, size);
479cb93a386Sopenharmony_ci}
480cb93a386Sopenharmony_ci
481cb93a386Sopenharmony_cistatic hb_bool_t
482cb93a386Sopenharmony_cihb_font_get_glyph_from_name_nil (hb_font_t      *font HB_UNUSED,
483cb93a386Sopenharmony_ci				 void           *font_data HB_UNUSED,
484cb93a386Sopenharmony_ci				 const char     *name HB_UNUSED,
485cb93a386Sopenharmony_ci				 int             len HB_UNUSED, /* -1 means nul-terminated */
486cb93a386Sopenharmony_ci				 hb_codepoint_t *glyph,
487cb93a386Sopenharmony_ci				 void           *user_data HB_UNUSED)
488cb93a386Sopenharmony_ci{
489cb93a386Sopenharmony_ci  *glyph = 0;
490cb93a386Sopenharmony_ci  return false;
491cb93a386Sopenharmony_ci}
492cb93a386Sopenharmony_ci
493cb93a386Sopenharmony_cistatic hb_bool_t
494cb93a386Sopenharmony_cihb_font_get_glyph_from_name_default (hb_font_t      *font,
495cb93a386Sopenharmony_ci				     void           *font_data HB_UNUSED,
496cb93a386Sopenharmony_ci				     const char     *name,
497cb93a386Sopenharmony_ci				     int             len, /* -1 means nul-terminated */
498cb93a386Sopenharmony_ci				     hb_codepoint_t *glyph,
499cb93a386Sopenharmony_ci				     void           *user_data HB_UNUSED)
500cb93a386Sopenharmony_ci{
501cb93a386Sopenharmony_ci  return font->parent->get_glyph_from_name (name, len, glyph);
502cb93a386Sopenharmony_ci}
503cb93a386Sopenharmony_ci
504cb93a386Sopenharmony_ciDEFINE_NULL_INSTANCE (hb_font_funcs_t) =
505cb93a386Sopenharmony_ci{
506cb93a386Sopenharmony_ci  HB_OBJECT_HEADER_STATIC,
507cb93a386Sopenharmony_ci
508cb93a386Sopenharmony_ci  {
509cb93a386Sopenharmony_ci#define HB_FONT_FUNC_IMPLEMENT(name) nullptr,
510cb93a386Sopenharmony_ci    HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
511cb93a386Sopenharmony_ci#undef HB_FONT_FUNC_IMPLEMENT
512cb93a386Sopenharmony_ci  },
513cb93a386Sopenharmony_ci  {
514cb93a386Sopenharmony_ci#define HB_FONT_FUNC_IMPLEMENT(name) nullptr,
515cb93a386Sopenharmony_ci    HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
516cb93a386Sopenharmony_ci#undef HB_FONT_FUNC_IMPLEMENT
517cb93a386Sopenharmony_ci  },
518cb93a386Sopenharmony_ci  {
519cb93a386Sopenharmony_ci    {
520cb93a386Sopenharmony_ci#define HB_FONT_FUNC_IMPLEMENT(name) hb_font_get_##name##_nil,
521cb93a386Sopenharmony_ci      HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
522cb93a386Sopenharmony_ci#undef HB_FONT_FUNC_IMPLEMENT
523cb93a386Sopenharmony_ci    }
524cb93a386Sopenharmony_ci  }
525cb93a386Sopenharmony_ci};
526cb93a386Sopenharmony_ci
527cb93a386Sopenharmony_cistatic const hb_font_funcs_t _hb_font_funcs_default = {
528cb93a386Sopenharmony_ci  HB_OBJECT_HEADER_STATIC,
529cb93a386Sopenharmony_ci
530cb93a386Sopenharmony_ci  {
531cb93a386Sopenharmony_ci#define HB_FONT_FUNC_IMPLEMENT(name) nullptr,
532cb93a386Sopenharmony_ci    HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
533cb93a386Sopenharmony_ci#undef HB_FONT_FUNC_IMPLEMENT
534cb93a386Sopenharmony_ci  },
535cb93a386Sopenharmony_ci  {
536cb93a386Sopenharmony_ci#define HB_FONT_FUNC_IMPLEMENT(name) nullptr,
537cb93a386Sopenharmony_ci    HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
538cb93a386Sopenharmony_ci#undef HB_FONT_FUNC_IMPLEMENT
539cb93a386Sopenharmony_ci  },
540cb93a386Sopenharmony_ci  {
541cb93a386Sopenharmony_ci    {
542cb93a386Sopenharmony_ci#define HB_FONT_FUNC_IMPLEMENT(name) hb_font_get_##name##_default,
543cb93a386Sopenharmony_ci      HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
544cb93a386Sopenharmony_ci#undef HB_FONT_FUNC_IMPLEMENT
545cb93a386Sopenharmony_ci    }
546cb93a386Sopenharmony_ci  }
547cb93a386Sopenharmony_ci};
548cb93a386Sopenharmony_ci
549cb93a386Sopenharmony_ci
550cb93a386Sopenharmony_ci/**
551cb93a386Sopenharmony_ci * hb_font_funcs_create: (Xconstructor)
552cb93a386Sopenharmony_ci *
553cb93a386Sopenharmony_ci * Creates a new #hb_font_funcs_t structure of font functions.
554cb93a386Sopenharmony_ci *
555cb93a386Sopenharmony_ci * Return value: (transfer full): The font-functions structure
556cb93a386Sopenharmony_ci *
557cb93a386Sopenharmony_ci * Since: 0.9.2
558cb93a386Sopenharmony_ci **/
559cb93a386Sopenharmony_cihb_font_funcs_t *
560cb93a386Sopenharmony_cihb_font_funcs_create ()
561cb93a386Sopenharmony_ci{
562cb93a386Sopenharmony_ci  hb_font_funcs_t *ffuncs;
563cb93a386Sopenharmony_ci
564cb93a386Sopenharmony_ci  if (!(ffuncs = hb_object_create<hb_font_funcs_t> ()))
565cb93a386Sopenharmony_ci    return hb_font_funcs_get_empty ();
566cb93a386Sopenharmony_ci
567cb93a386Sopenharmony_ci  ffuncs->get = _hb_font_funcs_default.get;
568cb93a386Sopenharmony_ci
569cb93a386Sopenharmony_ci  return ffuncs;
570cb93a386Sopenharmony_ci}
571cb93a386Sopenharmony_ci
572cb93a386Sopenharmony_ci/**
573cb93a386Sopenharmony_ci * hb_font_funcs_get_empty:
574cb93a386Sopenharmony_ci *
575cb93a386Sopenharmony_ci * Fetches an empty font-functions structure.
576cb93a386Sopenharmony_ci *
577cb93a386Sopenharmony_ci * Return value: (transfer full): The font-functions structure
578cb93a386Sopenharmony_ci *
579cb93a386Sopenharmony_ci * Since: 0.9.2
580cb93a386Sopenharmony_ci **/
581cb93a386Sopenharmony_cihb_font_funcs_t *
582cb93a386Sopenharmony_cihb_font_funcs_get_empty ()
583cb93a386Sopenharmony_ci{
584cb93a386Sopenharmony_ci  return const_cast<hb_font_funcs_t *> (&_hb_font_funcs_default);
585cb93a386Sopenharmony_ci}
586cb93a386Sopenharmony_ci
587cb93a386Sopenharmony_ci/**
588cb93a386Sopenharmony_ci * hb_font_funcs_reference: (skip)
589cb93a386Sopenharmony_ci * @ffuncs: The font-functions structure
590cb93a386Sopenharmony_ci *
591cb93a386Sopenharmony_ci * Increases the reference count on a font-functions structure.
592cb93a386Sopenharmony_ci *
593cb93a386Sopenharmony_ci * Return value: The font-functions structure
594cb93a386Sopenharmony_ci *
595cb93a386Sopenharmony_ci * Since: 0.9.2
596cb93a386Sopenharmony_ci **/
597cb93a386Sopenharmony_cihb_font_funcs_t *
598cb93a386Sopenharmony_cihb_font_funcs_reference (hb_font_funcs_t *ffuncs)
599cb93a386Sopenharmony_ci{
600cb93a386Sopenharmony_ci  return hb_object_reference (ffuncs);
601cb93a386Sopenharmony_ci}
602cb93a386Sopenharmony_ci
603cb93a386Sopenharmony_ci/**
604cb93a386Sopenharmony_ci * hb_font_funcs_destroy: (skip)
605cb93a386Sopenharmony_ci * @ffuncs: The font-functions structure
606cb93a386Sopenharmony_ci *
607cb93a386Sopenharmony_ci * Decreases the reference count on a font-functions structure. When
608cb93a386Sopenharmony_ci * the reference count reaches zero, the font-functions structure is
609cb93a386Sopenharmony_ci * destroyed, freeing all memory.
610cb93a386Sopenharmony_ci *
611cb93a386Sopenharmony_ci * Since: 0.9.2
612cb93a386Sopenharmony_ci **/
613cb93a386Sopenharmony_civoid
614cb93a386Sopenharmony_cihb_font_funcs_destroy (hb_font_funcs_t *ffuncs)
615cb93a386Sopenharmony_ci{
616cb93a386Sopenharmony_ci  if (!hb_object_destroy (ffuncs)) return;
617cb93a386Sopenharmony_ci
618cb93a386Sopenharmony_ci#define HB_FONT_FUNC_IMPLEMENT(name) if (ffuncs->destroy.name) \
619cb93a386Sopenharmony_ci  ffuncs->destroy.name (ffuncs->user_data.name);
620cb93a386Sopenharmony_ci  HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
621cb93a386Sopenharmony_ci#undef HB_FONT_FUNC_IMPLEMENT
622cb93a386Sopenharmony_ci
623cb93a386Sopenharmony_ci  hb_free (ffuncs);
624cb93a386Sopenharmony_ci}
625cb93a386Sopenharmony_ci
626cb93a386Sopenharmony_ci/**
627cb93a386Sopenharmony_ci * hb_font_funcs_set_user_data: (skip)
628cb93a386Sopenharmony_ci * @ffuncs: The font-functions structure
629cb93a386Sopenharmony_ci * @key: The user-data key to set
630cb93a386Sopenharmony_ci * @data: A pointer to the user data set
631cb93a386Sopenharmony_ci * @destroy: (nullable): A callback to call when @data is not needed anymore
632cb93a386Sopenharmony_ci * @replace: Whether to replace an existing data with the same key
633cb93a386Sopenharmony_ci *
634cb93a386Sopenharmony_ci * Attaches a user-data key/data pair to the specified font-functions structure.
635cb93a386Sopenharmony_ci *
636cb93a386Sopenharmony_ci * Return value: %true if success, %false otherwise
637cb93a386Sopenharmony_ci *
638cb93a386Sopenharmony_ci * Since: 0.9.2
639cb93a386Sopenharmony_ci **/
640cb93a386Sopenharmony_cihb_bool_t
641cb93a386Sopenharmony_cihb_font_funcs_set_user_data (hb_font_funcs_t    *ffuncs,
642cb93a386Sopenharmony_ci			     hb_user_data_key_t *key,
643cb93a386Sopenharmony_ci			     void *              data,
644cb93a386Sopenharmony_ci			     hb_destroy_func_t   destroy /* May be NULL. */,
645cb93a386Sopenharmony_ci			     hb_bool_t           replace)
646cb93a386Sopenharmony_ci{
647cb93a386Sopenharmony_ci  return hb_object_set_user_data (ffuncs, key, data, destroy, replace);
648cb93a386Sopenharmony_ci}
649cb93a386Sopenharmony_ci
650cb93a386Sopenharmony_ci/**
651cb93a386Sopenharmony_ci * hb_font_funcs_get_user_data: (skip)
652cb93a386Sopenharmony_ci * @ffuncs: The font-functions structure
653cb93a386Sopenharmony_ci * @key: The user-data key to query
654cb93a386Sopenharmony_ci *
655cb93a386Sopenharmony_ci * Fetches the user data associated with the specified key,
656cb93a386Sopenharmony_ci * attached to the specified font-functions structure.
657cb93a386Sopenharmony_ci *
658cb93a386Sopenharmony_ci * Return value: (transfer none): A pointer to the user data
659cb93a386Sopenharmony_ci *
660cb93a386Sopenharmony_ci * Since: 0.9.2
661cb93a386Sopenharmony_ci **/
662cb93a386Sopenharmony_civoid *
663cb93a386Sopenharmony_cihb_font_funcs_get_user_data (hb_font_funcs_t    *ffuncs,
664cb93a386Sopenharmony_ci			     hb_user_data_key_t *key)
665cb93a386Sopenharmony_ci{
666cb93a386Sopenharmony_ci  return hb_object_get_user_data (ffuncs, key);
667cb93a386Sopenharmony_ci}
668cb93a386Sopenharmony_ci
669cb93a386Sopenharmony_ci
670cb93a386Sopenharmony_ci/**
671cb93a386Sopenharmony_ci * hb_font_funcs_make_immutable:
672cb93a386Sopenharmony_ci * @ffuncs: The font-functions structure
673cb93a386Sopenharmony_ci *
674cb93a386Sopenharmony_ci * Makes a font-functions structure immutable.
675cb93a386Sopenharmony_ci *
676cb93a386Sopenharmony_ci * Since: 0.9.2
677cb93a386Sopenharmony_ci **/
678cb93a386Sopenharmony_civoid
679cb93a386Sopenharmony_cihb_font_funcs_make_immutable (hb_font_funcs_t *ffuncs)
680cb93a386Sopenharmony_ci{
681cb93a386Sopenharmony_ci  if (hb_object_is_immutable (ffuncs))
682cb93a386Sopenharmony_ci    return;
683cb93a386Sopenharmony_ci
684cb93a386Sopenharmony_ci  hb_object_make_immutable (ffuncs);
685cb93a386Sopenharmony_ci}
686cb93a386Sopenharmony_ci
687cb93a386Sopenharmony_ci/**
688cb93a386Sopenharmony_ci * hb_font_funcs_is_immutable:
689cb93a386Sopenharmony_ci * @ffuncs: The font-functions structure
690cb93a386Sopenharmony_ci *
691cb93a386Sopenharmony_ci * Tests whether a font-functions structure is immutable.
692cb93a386Sopenharmony_ci *
693cb93a386Sopenharmony_ci * Return value: %true if @ffuncs is immutable, %false otherwise
694cb93a386Sopenharmony_ci *
695cb93a386Sopenharmony_ci * Since: 0.9.2
696cb93a386Sopenharmony_ci **/
697cb93a386Sopenharmony_cihb_bool_t
698cb93a386Sopenharmony_cihb_font_funcs_is_immutable (hb_font_funcs_t *ffuncs)
699cb93a386Sopenharmony_ci{
700cb93a386Sopenharmony_ci  return hb_object_is_immutable (ffuncs);
701cb93a386Sopenharmony_ci}
702cb93a386Sopenharmony_ci
703cb93a386Sopenharmony_ci
704cb93a386Sopenharmony_ci#define HB_FONT_FUNC_IMPLEMENT(name) \
705cb93a386Sopenharmony_ci									 \
706cb93a386Sopenharmony_civoid                                                                     \
707cb93a386Sopenharmony_cihb_font_funcs_set_##name##_func (hb_font_funcs_t             *ffuncs,    \
708cb93a386Sopenharmony_ci				 hb_font_get_##name##_func_t  func,      \
709cb93a386Sopenharmony_ci				 void                        *user_data, \
710cb93a386Sopenharmony_ci				 hb_destroy_func_t            destroy)   \
711cb93a386Sopenharmony_ci{                                                                        \
712cb93a386Sopenharmony_ci  if (hb_object_is_immutable (ffuncs))                                   \
713cb93a386Sopenharmony_ci  {                                                                      \
714cb93a386Sopenharmony_ci    if (destroy)                                                         \
715cb93a386Sopenharmony_ci      destroy (user_data);                                               \
716cb93a386Sopenharmony_ci    return;                                                              \
717cb93a386Sopenharmony_ci  }                                                                      \
718cb93a386Sopenharmony_ci									 \
719cb93a386Sopenharmony_ci  if (ffuncs->destroy.name)                                              \
720cb93a386Sopenharmony_ci    ffuncs->destroy.name (ffuncs->user_data.name);                       \
721cb93a386Sopenharmony_ci									 \
722cb93a386Sopenharmony_ci  if (func) {                                                            \
723cb93a386Sopenharmony_ci    ffuncs->get.f.name = func;                                           \
724cb93a386Sopenharmony_ci    ffuncs->user_data.name = user_data;                                  \
725cb93a386Sopenharmony_ci    ffuncs->destroy.name = destroy;                                      \
726cb93a386Sopenharmony_ci  } else {                                                               \
727cb93a386Sopenharmony_ci    ffuncs->get.f.name = hb_font_get_##name##_default;                   \
728cb93a386Sopenharmony_ci    ffuncs->user_data.name = nullptr;                                    \
729cb93a386Sopenharmony_ci    ffuncs->destroy.name = nullptr;                                      \
730cb93a386Sopenharmony_ci  }                                                                      \
731cb93a386Sopenharmony_ci}
732cb93a386Sopenharmony_ci
733cb93a386Sopenharmony_ciHB_FONT_FUNCS_IMPLEMENT_CALLBACKS
734cb93a386Sopenharmony_ci#undef HB_FONT_FUNC_IMPLEMENT
735cb93a386Sopenharmony_ci
736cb93a386Sopenharmony_cibool
737cb93a386Sopenharmony_cihb_font_t::has_func_set (unsigned int i)
738cb93a386Sopenharmony_ci{
739cb93a386Sopenharmony_ci  return this->klass->get.array[i] != _hb_font_funcs_default.get.array[i];
740cb93a386Sopenharmony_ci}
741cb93a386Sopenharmony_ci
742cb93a386Sopenharmony_cibool
743cb93a386Sopenharmony_cihb_font_t::has_func (unsigned int i)
744cb93a386Sopenharmony_ci{
745cb93a386Sopenharmony_ci  return has_func_set (i) ||
746cb93a386Sopenharmony_ci	 (parent && parent != &_hb_Null_hb_font_t && parent->has_func (i));
747cb93a386Sopenharmony_ci}
748cb93a386Sopenharmony_ci
749cb93a386Sopenharmony_ci/* Public getters */
750cb93a386Sopenharmony_ci
751cb93a386Sopenharmony_ci/**
752cb93a386Sopenharmony_ci * hb_font_get_h_extents:
753cb93a386Sopenharmony_ci * @font: #hb_font_t to work upon
754cb93a386Sopenharmony_ci * @extents: (out): The font extents retrieved
755cb93a386Sopenharmony_ci *
756cb93a386Sopenharmony_ci * Fetches the extents for a specified font, for horizontal
757cb93a386Sopenharmony_ci * text segments.
758cb93a386Sopenharmony_ci *
759cb93a386Sopenharmony_ci * Return value: %true if data found, %false otherwise
760cb93a386Sopenharmony_ci *
761cb93a386Sopenharmony_ci * Since: 1.1.3
762cb93a386Sopenharmony_ci **/
763cb93a386Sopenharmony_cihb_bool_t
764cb93a386Sopenharmony_cihb_font_get_h_extents (hb_font_t         *font,
765cb93a386Sopenharmony_ci		       hb_font_extents_t *extents)
766cb93a386Sopenharmony_ci{
767cb93a386Sopenharmony_ci  return font->get_font_h_extents (extents);
768cb93a386Sopenharmony_ci}
769cb93a386Sopenharmony_ci
770cb93a386Sopenharmony_ci/**
771cb93a386Sopenharmony_ci * hb_font_get_v_extents:
772cb93a386Sopenharmony_ci * @font: #hb_font_t to work upon
773cb93a386Sopenharmony_ci * @extents: (out): The font extents retrieved
774cb93a386Sopenharmony_ci *
775cb93a386Sopenharmony_ci * Fetches the extents for a specified font, for vertical
776cb93a386Sopenharmony_ci * text segments.
777cb93a386Sopenharmony_ci *
778cb93a386Sopenharmony_ci * Return value: %true if data found, %false otherwise
779cb93a386Sopenharmony_ci *
780cb93a386Sopenharmony_ci * Since: 1.1.3
781cb93a386Sopenharmony_ci **/
782cb93a386Sopenharmony_cihb_bool_t
783cb93a386Sopenharmony_cihb_font_get_v_extents (hb_font_t         *font,
784cb93a386Sopenharmony_ci		       hb_font_extents_t *extents)
785cb93a386Sopenharmony_ci{
786cb93a386Sopenharmony_ci  return font->get_font_v_extents (extents);
787cb93a386Sopenharmony_ci}
788cb93a386Sopenharmony_ci
789cb93a386Sopenharmony_ci/**
790cb93a386Sopenharmony_ci * hb_font_get_glyph:
791cb93a386Sopenharmony_ci * @font: #hb_font_t to work upon
792cb93a386Sopenharmony_ci * @unicode: The Unicode code point to query
793cb93a386Sopenharmony_ci * @variation_selector: A variation-selector code point
794cb93a386Sopenharmony_ci * @glyph: (out): The glyph ID retrieved
795cb93a386Sopenharmony_ci *
796cb93a386Sopenharmony_ci * Fetches the glyph ID for a Unicode code point in the specified
797cb93a386Sopenharmony_ci * font, with an optional variation selector.
798cb93a386Sopenharmony_ci *
799cb93a386Sopenharmony_ci * If @variation_selector is 0, calls hb_font_get_nominal_glyph();
800cb93a386Sopenharmony_ci * otherwise calls hb_font_get_variation_glyph().
801cb93a386Sopenharmony_ci *
802cb93a386Sopenharmony_ci * Return value: %true if data found, %false otherwise
803cb93a386Sopenharmony_ci *
804cb93a386Sopenharmony_ci * Since: 0.9.2
805cb93a386Sopenharmony_ci **/
806cb93a386Sopenharmony_cihb_bool_t
807cb93a386Sopenharmony_cihb_font_get_glyph (hb_font_t      *font,
808cb93a386Sopenharmony_ci		   hb_codepoint_t  unicode,
809cb93a386Sopenharmony_ci		   hb_codepoint_t  variation_selector,
810cb93a386Sopenharmony_ci		   hb_codepoint_t *glyph)
811cb93a386Sopenharmony_ci{
812cb93a386Sopenharmony_ci  if (unlikely (variation_selector))
813cb93a386Sopenharmony_ci    return font->get_variation_glyph (unicode, variation_selector, glyph);
814cb93a386Sopenharmony_ci  return font->get_nominal_glyph (unicode, glyph);
815cb93a386Sopenharmony_ci}
816cb93a386Sopenharmony_ci
817cb93a386Sopenharmony_ci/**
818cb93a386Sopenharmony_ci * hb_font_get_nominal_glyph:
819cb93a386Sopenharmony_ci * @font: #hb_font_t to work upon
820cb93a386Sopenharmony_ci * @unicode: The Unicode code point to query
821cb93a386Sopenharmony_ci * @glyph: (out): The glyph ID retrieved
822cb93a386Sopenharmony_ci *
823cb93a386Sopenharmony_ci * Fetches the nominal glyph ID for a Unicode code point in the
824cb93a386Sopenharmony_ci * specified font.
825cb93a386Sopenharmony_ci *
826cb93a386Sopenharmony_ci * This version of the function should not be used to fetch glyph IDs
827cb93a386Sopenharmony_ci * for code points modified by variation selectors. For variation-selector
828cb93a386Sopenharmony_ci * support, user hb_font_get_variation_glyph() or use hb_font_get_glyph().
829cb93a386Sopenharmony_ci *
830cb93a386Sopenharmony_ci * Return value: %true if data found, %false otherwise
831cb93a386Sopenharmony_ci *
832cb93a386Sopenharmony_ci * Since: 1.2.3
833cb93a386Sopenharmony_ci **/
834cb93a386Sopenharmony_cihb_bool_t
835cb93a386Sopenharmony_cihb_font_get_nominal_glyph (hb_font_t      *font,
836cb93a386Sopenharmony_ci			   hb_codepoint_t  unicode,
837cb93a386Sopenharmony_ci			   hb_codepoint_t *glyph)
838cb93a386Sopenharmony_ci{
839cb93a386Sopenharmony_ci  return font->get_nominal_glyph (unicode, glyph);
840cb93a386Sopenharmony_ci}
841cb93a386Sopenharmony_ci
842cb93a386Sopenharmony_ci/**
843cb93a386Sopenharmony_ci * hb_font_get_nominal_glyphs:
844cb93a386Sopenharmony_ci * @font: #hb_font_t to work upon
845cb93a386Sopenharmony_ci * @count: number of code points to query
846cb93a386Sopenharmony_ci * @first_unicode: The first Unicode code point to query
847cb93a386Sopenharmony_ci * @unicode_stride: The stride between successive code points
848cb93a386Sopenharmony_ci * @first_glyph: (out): The first glyph ID retrieved
849cb93a386Sopenharmony_ci * @glyph_stride: The stride between successive glyph IDs
850cb93a386Sopenharmony_ci *
851cb93a386Sopenharmony_ci * Fetches the nominal glyph IDs for a sequence of Unicode code points. Glyph
852cb93a386Sopenharmony_ci * IDs must be returned in a #hb_codepoint_t output parameter.
853cb93a386Sopenharmony_ci *
854cb93a386Sopenharmony_ci * Return value: the number of code points processed
855cb93a386Sopenharmony_ci *
856cb93a386Sopenharmony_ci * Since: 2.6.3
857cb93a386Sopenharmony_ci **/
858cb93a386Sopenharmony_ciunsigned int
859cb93a386Sopenharmony_cihb_font_get_nominal_glyphs (hb_font_t *font,
860cb93a386Sopenharmony_ci			    unsigned int count,
861cb93a386Sopenharmony_ci			    const hb_codepoint_t *first_unicode,
862cb93a386Sopenharmony_ci			    unsigned int unicode_stride,
863cb93a386Sopenharmony_ci			    hb_codepoint_t *first_glyph,
864cb93a386Sopenharmony_ci			    unsigned int glyph_stride)
865cb93a386Sopenharmony_ci{
866cb93a386Sopenharmony_ci  return font->get_nominal_glyphs (count,
867cb93a386Sopenharmony_ci				   first_unicode, unicode_stride,
868cb93a386Sopenharmony_ci				   first_glyph, glyph_stride);
869cb93a386Sopenharmony_ci}
870cb93a386Sopenharmony_ci
871cb93a386Sopenharmony_ci/**
872cb93a386Sopenharmony_ci * hb_font_get_variation_glyph:
873cb93a386Sopenharmony_ci * @font: #hb_font_t to work upon
874cb93a386Sopenharmony_ci * @unicode: The Unicode code point to query
875cb93a386Sopenharmony_ci * @variation_selector: The  variation-selector code point to query
876cb93a386Sopenharmony_ci * @glyph: (out): The glyph ID retrieved
877cb93a386Sopenharmony_ci *
878cb93a386Sopenharmony_ci * Fetches the glyph ID for a Unicode code point when followed by
879cb93a386Sopenharmony_ci * by the specified variation-selector code point, in the specified
880cb93a386Sopenharmony_ci * font.
881cb93a386Sopenharmony_ci *
882cb93a386Sopenharmony_ci * Return value: %true if data found, %false otherwise
883cb93a386Sopenharmony_ci *
884cb93a386Sopenharmony_ci * Since: 1.2.3
885cb93a386Sopenharmony_ci **/
886cb93a386Sopenharmony_cihb_bool_t
887cb93a386Sopenharmony_cihb_font_get_variation_glyph (hb_font_t      *font,
888cb93a386Sopenharmony_ci			     hb_codepoint_t  unicode,
889cb93a386Sopenharmony_ci			     hb_codepoint_t  variation_selector,
890cb93a386Sopenharmony_ci			     hb_codepoint_t *glyph)
891cb93a386Sopenharmony_ci{
892cb93a386Sopenharmony_ci  return font->get_variation_glyph (unicode, variation_selector, glyph);
893cb93a386Sopenharmony_ci}
894cb93a386Sopenharmony_ci
895cb93a386Sopenharmony_ci/**
896cb93a386Sopenharmony_ci * hb_font_get_glyph_h_advance:
897cb93a386Sopenharmony_ci * @font: #hb_font_t to work upon
898cb93a386Sopenharmony_ci * @glyph: The glyph ID to query
899cb93a386Sopenharmony_ci *
900cb93a386Sopenharmony_ci * Fetches the advance for a glyph ID in the specified font,
901cb93a386Sopenharmony_ci * for horizontal text segments.
902cb93a386Sopenharmony_ci *
903cb93a386Sopenharmony_ci * Return value: The advance of @glyph within @font
904cb93a386Sopenharmony_ci *
905cb93a386Sopenharmony_ci * Since: 0.9.2
906cb93a386Sopenharmony_ci **/
907cb93a386Sopenharmony_cihb_position_t
908cb93a386Sopenharmony_cihb_font_get_glyph_h_advance (hb_font_t      *font,
909cb93a386Sopenharmony_ci			     hb_codepoint_t  glyph)
910cb93a386Sopenharmony_ci{
911cb93a386Sopenharmony_ci  return font->get_glyph_h_advance (glyph);
912cb93a386Sopenharmony_ci}
913cb93a386Sopenharmony_ci
914cb93a386Sopenharmony_ci/**
915cb93a386Sopenharmony_ci * hb_font_get_glyph_v_advance:
916cb93a386Sopenharmony_ci * @font: #hb_font_t to work upon
917cb93a386Sopenharmony_ci * @glyph: The glyph ID to query
918cb93a386Sopenharmony_ci *
919cb93a386Sopenharmony_ci * Fetches the advance for a glyph ID in the specified font,
920cb93a386Sopenharmony_ci * for vertical text segments.
921cb93a386Sopenharmony_ci *
922cb93a386Sopenharmony_ci * Return value: The advance of @glyph within @font
923cb93a386Sopenharmony_ci *
924cb93a386Sopenharmony_ci * Since: 0.9.2
925cb93a386Sopenharmony_ci **/
926cb93a386Sopenharmony_cihb_position_t
927cb93a386Sopenharmony_cihb_font_get_glyph_v_advance (hb_font_t      *font,
928cb93a386Sopenharmony_ci			     hb_codepoint_t  glyph)
929cb93a386Sopenharmony_ci{
930cb93a386Sopenharmony_ci  return font->get_glyph_v_advance (glyph);
931cb93a386Sopenharmony_ci}
932cb93a386Sopenharmony_ci
933cb93a386Sopenharmony_ci/**
934cb93a386Sopenharmony_ci * hb_font_get_glyph_h_advances:
935cb93a386Sopenharmony_ci * @font: #hb_font_t to work upon
936cb93a386Sopenharmony_ci * @count: The number of glyph IDs in the sequence queried
937cb93a386Sopenharmony_ci * @first_glyph: The first glyph ID to query
938cb93a386Sopenharmony_ci * @glyph_stride: The stride between successive glyph IDs
939cb93a386Sopenharmony_ci * @first_advance: (out): The first advance retrieved
940cb93a386Sopenharmony_ci * @advance_stride: The stride between successive advances
941cb93a386Sopenharmony_ci *
942cb93a386Sopenharmony_ci * Fetches the advances for a sequence of glyph IDs in the specified
943cb93a386Sopenharmony_ci * font, for horizontal text segments.
944cb93a386Sopenharmony_ci *
945cb93a386Sopenharmony_ci * Since: 1.8.6
946cb93a386Sopenharmony_ci **/
947cb93a386Sopenharmony_civoid
948cb93a386Sopenharmony_cihb_font_get_glyph_h_advances (hb_font_t*            font,
949cb93a386Sopenharmony_ci			      unsigned int          count,
950cb93a386Sopenharmony_ci			      const hb_codepoint_t *first_glyph,
951cb93a386Sopenharmony_ci			      unsigned              glyph_stride,
952cb93a386Sopenharmony_ci			      hb_position_t        *first_advance,
953cb93a386Sopenharmony_ci			      unsigned              advance_stride)
954cb93a386Sopenharmony_ci{
955cb93a386Sopenharmony_ci  font->get_glyph_h_advances (count, first_glyph, glyph_stride, first_advance, advance_stride);
956cb93a386Sopenharmony_ci}
957cb93a386Sopenharmony_ci/**
958cb93a386Sopenharmony_ci * hb_font_get_glyph_v_advances:
959cb93a386Sopenharmony_ci * @font: #hb_font_t to work upon
960cb93a386Sopenharmony_ci * @count: The number of glyph IDs in the sequence queried
961cb93a386Sopenharmony_ci * @first_glyph: The first glyph ID to query
962cb93a386Sopenharmony_ci * @glyph_stride: The stride between successive glyph IDs
963cb93a386Sopenharmony_ci * @first_advance: (out): The first advance retrieved
964cb93a386Sopenharmony_ci * @advance_stride: (out): The stride between successive advances
965cb93a386Sopenharmony_ci *
966cb93a386Sopenharmony_ci * Fetches the advances for a sequence of glyph IDs in the specified
967cb93a386Sopenharmony_ci * font, for vertical text segments.
968cb93a386Sopenharmony_ci *
969cb93a386Sopenharmony_ci * Since: 1.8.6
970cb93a386Sopenharmony_ci **/
971cb93a386Sopenharmony_civoid
972cb93a386Sopenharmony_cihb_font_get_glyph_v_advances (hb_font_t*            font,
973cb93a386Sopenharmony_ci			      unsigned int          count,
974cb93a386Sopenharmony_ci			      const hb_codepoint_t *first_glyph,
975cb93a386Sopenharmony_ci			      unsigned              glyph_stride,
976cb93a386Sopenharmony_ci			      hb_position_t        *first_advance,
977cb93a386Sopenharmony_ci			      unsigned              advance_stride)
978cb93a386Sopenharmony_ci{
979cb93a386Sopenharmony_ci  font->get_glyph_v_advances (count, first_glyph, glyph_stride, first_advance, advance_stride);
980cb93a386Sopenharmony_ci}
981cb93a386Sopenharmony_ci
982cb93a386Sopenharmony_ci/**
983cb93a386Sopenharmony_ci * hb_font_get_glyph_h_origin:
984cb93a386Sopenharmony_ci * @font: #hb_font_t to work upon
985cb93a386Sopenharmony_ci * @glyph: The glyph ID to query
986cb93a386Sopenharmony_ci * @x: (out): The X coordinate of the origin
987cb93a386Sopenharmony_ci * @y: (out): The Y coordinate of the origin
988cb93a386Sopenharmony_ci *
989cb93a386Sopenharmony_ci * Fetches the (X,Y) coordinates of the origin for a glyph ID
990cb93a386Sopenharmony_ci * in the specified font, for horizontal text segments.
991cb93a386Sopenharmony_ci *
992cb93a386Sopenharmony_ci * Return value: %true if data found, %false otherwise
993cb93a386Sopenharmony_ci *
994cb93a386Sopenharmony_ci * Since: 0.9.2
995cb93a386Sopenharmony_ci **/
996cb93a386Sopenharmony_cihb_bool_t
997cb93a386Sopenharmony_cihb_font_get_glyph_h_origin (hb_font_t      *font,
998cb93a386Sopenharmony_ci			    hb_codepoint_t  glyph,
999cb93a386Sopenharmony_ci			    hb_position_t  *x,
1000cb93a386Sopenharmony_ci			    hb_position_t  *y)
1001cb93a386Sopenharmony_ci{
1002cb93a386Sopenharmony_ci  return font->get_glyph_h_origin (glyph, x, y);
1003cb93a386Sopenharmony_ci}
1004cb93a386Sopenharmony_ci
1005cb93a386Sopenharmony_ci/**
1006cb93a386Sopenharmony_ci * hb_font_get_glyph_v_origin:
1007cb93a386Sopenharmony_ci * @font: #hb_font_t to work upon
1008cb93a386Sopenharmony_ci * @glyph: The glyph ID to query
1009cb93a386Sopenharmony_ci * @x: (out): The X coordinate of the origin
1010cb93a386Sopenharmony_ci * @y: (out): The Y coordinate of the origin
1011cb93a386Sopenharmony_ci *
1012cb93a386Sopenharmony_ci * Fetches the (X,Y) coordinates of the origin for a glyph ID
1013cb93a386Sopenharmony_ci * in the specified font, for vertical text segments.
1014cb93a386Sopenharmony_ci *
1015cb93a386Sopenharmony_ci * Return value: %true if data found, %false otherwise
1016cb93a386Sopenharmony_ci *
1017cb93a386Sopenharmony_ci * Since: 0.9.2
1018cb93a386Sopenharmony_ci **/
1019cb93a386Sopenharmony_cihb_bool_t
1020cb93a386Sopenharmony_cihb_font_get_glyph_v_origin (hb_font_t      *font,
1021cb93a386Sopenharmony_ci			    hb_codepoint_t  glyph,
1022cb93a386Sopenharmony_ci			    hb_position_t  *x,
1023cb93a386Sopenharmony_ci			    hb_position_t  *y)
1024cb93a386Sopenharmony_ci{
1025cb93a386Sopenharmony_ci  return font->get_glyph_v_origin (glyph, x, y);
1026cb93a386Sopenharmony_ci}
1027cb93a386Sopenharmony_ci
1028cb93a386Sopenharmony_ci/**
1029cb93a386Sopenharmony_ci * hb_font_get_glyph_h_kerning:
1030cb93a386Sopenharmony_ci * @font: #hb_font_t to work upon
1031cb93a386Sopenharmony_ci * @left_glyph: The glyph ID of the left glyph in the glyph pair
1032cb93a386Sopenharmony_ci * @right_glyph: The glyph ID of the right glyph in the glyph pair
1033cb93a386Sopenharmony_ci *
1034cb93a386Sopenharmony_ci * Fetches the kerning-adjustment value for a glyph-pair in
1035cb93a386Sopenharmony_ci * the specified font, for horizontal text segments.
1036cb93a386Sopenharmony_ci *
1037cb93a386Sopenharmony_ci * <note>It handles legacy kerning only (as returned by the corresponding
1038cb93a386Sopenharmony_ci * #hb_font_funcs_t function).</note>
1039cb93a386Sopenharmony_ci *
1040cb93a386Sopenharmony_ci * Return value: The kerning adjustment value
1041cb93a386Sopenharmony_ci *
1042cb93a386Sopenharmony_ci * Since: 0.9.2
1043cb93a386Sopenharmony_ci **/
1044cb93a386Sopenharmony_cihb_position_t
1045cb93a386Sopenharmony_cihb_font_get_glyph_h_kerning (hb_font_t      *font,
1046cb93a386Sopenharmony_ci			     hb_codepoint_t  left_glyph,
1047cb93a386Sopenharmony_ci			     hb_codepoint_t  right_glyph)
1048cb93a386Sopenharmony_ci{
1049cb93a386Sopenharmony_ci  return font->get_glyph_h_kerning (left_glyph, right_glyph);
1050cb93a386Sopenharmony_ci}
1051cb93a386Sopenharmony_ci
1052cb93a386Sopenharmony_ci#ifndef HB_DISABLE_DEPRECATED
1053cb93a386Sopenharmony_ci/**
1054cb93a386Sopenharmony_ci * hb_font_get_glyph_v_kerning:
1055cb93a386Sopenharmony_ci * @font: #hb_font_t to work upon
1056cb93a386Sopenharmony_ci * @top_glyph: The glyph ID of the top glyph in the glyph pair
1057cb93a386Sopenharmony_ci * @bottom_glyph: The glyph ID of the bottom glyph in the glyph pair
1058cb93a386Sopenharmony_ci *
1059cb93a386Sopenharmony_ci * Fetches the kerning-adjustment value for a glyph-pair in
1060cb93a386Sopenharmony_ci * the specified font, for vertical text segments.
1061cb93a386Sopenharmony_ci *
1062cb93a386Sopenharmony_ci * <note>It handles legacy kerning only (as returned by the corresponding
1063cb93a386Sopenharmony_ci * #hb_font_funcs_t function).</note>
1064cb93a386Sopenharmony_ci *
1065cb93a386Sopenharmony_ci * Return value: The kerning adjustment value
1066cb93a386Sopenharmony_ci *
1067cb93a386Sopenharmony_ci * Since: 0.9.2
1068cb93a386Sopenharmony_ci * Deprecated: 2.0.0
1069cb93a386Sopenharmony_ci **/
1070cb93a386Sopenharmony_cihb_position_t
1071cb93a386Sopenharmony_cihb_font_get_glyph_v_kerning (hb_font_t      *font,
1072cb93a386Sopenharmony_ci			     hb_codepoint_t  top_glyph,
1073cb93a386Sopenharmony_ci			     hb_codepoint_t  bottom_glyph)
1074cb93a386Sopenharmony_ci{
1075cb93a386Sopenharmony_ci  return font->get_glyph_v_kerning (top_glyph, bottom_glyph);
1076cb93a386Sopenharmony_ci}
1077cb93a386Sopenharmony_ci#endif
1078cb93a386Sopenharmony_ci
1079cb93a386Sopenharmony_ci/**
1080cb93a386Sopenharmony_ci * hb_font_get_glyph_extents:
1081cb93a386Sopenharmony_ci * @font: #hb_font_t to work upon
1082cb93a386Sopenharmony_ci * @glyph: The glyph ID to query
1083cb93a386Sopenharmony_ci * @extents: (out): The #hb_glyph_extents_t retrieved
1084cb93a386Sopenharmony_ci *
1085cb93a386Sopenharmony_ci * Fetches the #hb_glyph_extents_t data for a glyph ID
1086cb93a386Sopenharmony_ci * in the specified font.
1087cb93a386Sopenharmony_ci *
1088cb93a386Sopenharmony_ci * Return value: %true if data found, %false otherwise
1089cb93a386Sopenharmony_ci *
1090cb93a386Sopenharmony_ci * Since: 0.9.2
1091cb93a386Sopenharmony_ci **/
1092cb93a386Sopenharmony_cihb_bool_t
1093cb93a386Sopenharmony_cihb_font_get_glyph_extents (hb_font_t          *font,
1094cb93a386Sopenharmony_ci			   hb_codepoint_t      glyph,
1095cb93a386Sopenharmony_ci			   hb_glyph_extents_t *extents)
1096cb93a386Sopenharmony_ci{
1097cb93a386Sopenharmony_ci  return font->get_glyph_extents (glyph, extents);
1098cb93a386Sopenharmony_ci}
1099cb93a386Sopenharmony_ci
1100cb93a386Sopenharmony_ci/**
1101cb93a386Sopenharmony_ci * hb_font_get_glyph_contour_point:
1102cb93a386Sopenharmony_ci * @font: #hb_font_t to work upon
1103cb93a386Sopenharmony_ci * @glyph: The glyph ID to query
1104cb93a386Sopenharmony_ci * @point_index: The contour-point index to query
1105cb93a386Sopenharmony_ci * @x: (out): The X value retrieved for the contour point
1106cb93a386Sopenharmony_ci * @y: (out): The Y value retrieved for the contour point
1107cb93a386Sopenharmony_ci *
1108cb93a386Sopenharmony_ci * Fetches the (x,y) coordinates of a specified contour-point index
1109cb93a386Sopenharmony_ci * in the specified glyph, within the specified font.
1110cb93a386Sopenharmony_ci *
1111cb93a386Sopenharmony_ci * Return value: %true if data found, %false otherwise
1112cb93a386Sopenharmony_ci *
1113cb93a386Sopenharmony_ci * Since: 0.9.2
1114cb93a386Sopenharmony_ci **/
1115cb93a386Sopenharmony_cihb_bool_t
1116cb93a386Sopenharmony_cihb_font_get_glyph_contour_point (hb_font_t      *font,
1117cb93a386Sopenharmony_ci				 hb_codepoint_t  glyph,
1118cb93a386Sopenharmony_ci				 unsigned int    point_index,
1119cb93a386Sopenharmony_ci				 hb_position_t  *x,
1120cb93a386Sopenharmony_ci				 hb_position_t  *y)
1121cb93a386Sopenharmony_ci{
1122cb93a386Sopenharmony_ci  return font->get_glyph_contour_point (glyph, point_index, x, y);
1123cb93a386Sopenharmony_ci}
1124cb93a386Sopenharmony_ci
1125cb93a386Sopenharmony_ci/**
1126cb93a386Sopenharmony_ci * hb_font_get_glyph_name:
1127cb93a386Sopenharmony_ci * @font: #hb_font_t to work upon
1128cb93a386Sopenharmony_ci * @glyph: The glyph ID to query
1129cb93a386Sopenharmony_ci * @name: (out) (array length=size): Name string retrieved for the glyph ID
1130cb93a386Sopenharmony_ci * @size: Length of the glyph-name string retrieved
1131cb93a386Sopenharmony_ci *
1132cb93a386Sopenharmony_ci * Fetches the glyph-name string for a glyph ID in the specified @font.
1133cb93a386Sopenharmony_ci *
1134cb93a386Sopenharmony_ci * Return value: %true if data found, %false otherwise
1135cb93a386Sopenharmony_ci *
1136cb93a386Sopenharmony_ci * Since: 0.9.2
1137cb93a386Sopenharmony_ci **/
1138cb93a386Sopenharmony_cihb_bool_t
1139cb93a386Sopenharmony_cihb_font_get_glyph_name (hb_font_t      *font,
1140cb93a386Sopenharmony_ci			hb_codepoint_t  glyph,
1141cb93a386Sopenharmony_ci			char           *name,
1142cb93a386Sopenharmony_ci			unsigned int    size)
1143cb93a386Sopenharmony_ci{
1144cb93a386Sopenharmony_ci  return font->get_glyph_name (glyph, name, size);
1145cb93a386Sopenharmony_ci}
1146cb93a386Sopenharmony_ci
1147cb93a386Sopenharmony_ci/**
1148cb93a386Sopenharmony_ci * hb_font_get_glyph_from_name:
1149cb93a386Sopenharmony_ci * @font: #hb_font_t to work upon
1150cb93a386Sopenharmony_ci * @name: (array length=len): The name string to query
1151cb93a386Sopenharmony_ci * @len: The length of the name queried
1152cb93a386Sopenharmony_ci * @glyph: (out): The glyph ID retrieved
1153cb93a386Sopenharmony_ci *
1154cb93a386Sopenharmony_ci * Fetches the glyph ID that corresponds to a name string in the specified @font.
1155cb93a386Sopenharmony_ci *
1156cb93a386Sopenharmony_ci * <note>Note: @len == -1 means the name string is null-terminated.</note>
1157cb93a386Sopenharmony_ci *
1158cb93a386Sopenharmony_ci * Return value: %true if data found, %false otherwise
1159cb93a386Sopenharmony_ci *
1160cb93a386Sopenharmony_ci * Since: 0.9.2
1161cb93a386Sopenharmony_ci **/
1162cb93a386Sopenharmony_cihb_bool_t
1163cb93a386Sopenharmony_cihb_font_get_glyph_from_name (hb_font_t      *font,
1164cb93a386Sopenharmony_ci			     const char     *name,
1165cb93a386Sopenharmony_ci			     int             len, /* -1 means nul-terminated */
1166cb93a386Sopenharmony_ci			     hb_codepoint_t *glyph)
1167cb93a386Sopenharmony_ci{
1168cb93a386Sopenharmony_ci  return font->get_glyph_from_name (name, len, glyph);
1169cb93a386Sopenharmony_ci}
1170cb93a386Sopenharmony_ci
1171cb93a386Sopenharmony_ci
1172cb93a386Sopenharmony_ci/* A bit higher-level, and with fallback */
1173cb93a386Sopenharmony_ci
1174cb93a386Sopenharmony_ci/**
1175cb93a386Sopenharmony_ci * hb_font_get_extents_for_direction:
1176cb93a386Sopenharmony_ci * @font: #hb_font_t to work upon
1177cb93a386Sopenharmony_ci * @direction: The direction of the text segment
1178cb93a386Sopenharmony_ci * @extents: (out): The #hb_font_extents_t retrieved
1179cb93a386Sopenharmony_ci *
1180cb93a386Sopenharmony_ci * Fetches the extents for a font in a text segment of the
1181cb93a386Sopenharmony_ci * specified direction.
1182cb93a386Sopenharmony_ci *
1183cb93a386Sopenharmony_ci * Calls the appropriate direction-specific variant (horizontal
1184cb93a386Sopenharmony_ci * or vertical) depending on the value of @direction.
1185cb93a386Sopenharmony_ci *
1186cb93a386Sopenharmony_ci * Since: 1.1.3
1187cb93a386Sopenharmony_ci **/
1188cb93a386Sopenharmony_civoid
1189cb93a386Sopenharmony_cihb_font_get_extents_for_direction (hb_font_t         *font,
1190cb93a386Sopenharmony_ci				   hb_direction_t     direction,
1191cb93a386Sopenharmony_ci				   hb_font_extents_t *extents)
1192cb93a386Sopenharmony_ci{
1193cb93a386Sopenharmony_ci  return font->get_extents_for_direction (direction, extents);
1194cb93a386Sopenharmony_ci}
1195cb93a386Sopenharmony_ci/**
1196cb93a386Sopenharmony_ci * hb_font_get_glyph_advance_for_direction:
1197cb93a386Sopenharmony_ci * @font: #hb_font_t to work upon
1198cb93a386Sopenharmony_ci * @glyph: The glyph ID to query
1199cb93a386Sopenharmony_ci * @direction: The direction of the text segment
1200cb93a386Sopenharmony_ci * @x: (out): The horizontal advance retrieved
1201cb93a386Sopenharmony_ci * @y: (out):  The vertical advance retrieved
1202cb93a386Sopenharmony_ci *
1203cb93a386Sopenharmony_ci * Fetches the advance for a glyph ID from the specified font,
1204cb93a386Sopenharmony_ci * in a text segment of the specified direction.
1205cb93a386Sopenharmony_ci *
1206cb93a386Sopenharmony_ci * Calls the appropriate direction-specific variant (horizontal
1207cb93a386Sopenharmony_ci * or vertical) depending on the value of @direction.
1208cb93a386Sopenharmony_ci *
1209cb93a386Sopenharmony_ci * Since: 0.9.2
1210cb93a386Sopenharmony_ci **/
1211cb93a386Sopenharmony_civoid
1212cb93a386Sopenharmony_cihb_font_get_glyph_advance_for_direction (hb_font_t      *font,
1213cb93a386Sopenharmony_ci					 hb_codepoint_t  glyph,
1214cb93a386Sopenharmony_ci					 hb_direction_t  direction,
1215cb93a386Sopenharmony_ci					 hb_position_t  *x,
1216cb93a386Sopenharmony_ci					 hb_position_t  *y)
1217cb93a386Sopenharmony_ci{
1218cb93a386Sopenharmony_ci  return font->get_glyph_advance_for_direction (glyph, direction, x, y);
1219cb93a386Sopenharmony_ci}
1220cb93a386Sopenharmony_ci/**
1221cb93a386Sopenharmony_ci * hb_font_get_glyph_advances_for_direction:
1222cb93a386Sopenharmony_ci * @font: #hb_font_t to work upon
1223cb93a386Sopenharmony_ci * @direction: The direction of the text segment
1224cb93a386Sopenharmony_ci * @count: The number of glyph IDs in the sequence queried
1225cb93a386Sopenharmony_ci * @first_glyph: The first glyph ID to query
1226cb93a386Sopenharmony_ci * @glyph_stride: The stride between successive glyph IDs
1227cb93a386Sopenharmony_ci * @first_advance: (out): The first advance retrieved
1228cb93a386Sopenharmony_ci * @advance_stride: (out): The stride between successive advances
1229cb93a386Sopenharmony_ci *
1230cb93a386Sopenharmony_ci * Fetches the advances for a sequence of glyph IDs in the specified
1231cb93a386Sopenharmony_ci * font, in a text segment of the specified direction.
1232cb93a386Sopenharmony_ci *
1233cb93a386Sopenharmony_ci * Calls the appropriate direction-specific variant (horizontal
1234cb93a386Sopenharmony_ci * or vertical) depending on the value of @direction.
1235cb93a386Sopenharmony_ci *
1236cb93a386Sopenharmony_ci * Since: 1.8.6
1237cb93a386Sopenharmony_ci **/
1238cb93a386Sopenharmony_ciHB_EXTERN void
1239cb93a386Sopenharmony_cihb_font_get_glyph_advances_for_direction (hb_font_t*            font,
1240cb93a386Sopenharmony_ci					  hb_direction_t        direction,
1241cb93a386Sopenharmony_ci					  unsigned int          count,
1242cb93a386Sopenharmony_ci					  const hb_codepoint_t *first_glyph,
1243cb93a386Sopenharmony_ci					  unsigned              glyph_stride,
1244cb93a386Sopenharmony_ci					  hb_position_t        *first_advance,
1245cb93a386Sopenharmony_ci					  unsigned              advance_stride)
1246cb93a386Sopenharmony_ci{
1247cb93a386Sopenharmony_ci  font->get_glyph_advances_for_direction (direction, count, first_glyph, glyph_stride, first_advance, advance_stride);
1248cb93a386Sopenharmony_ci}
1249cb93a386Sopenharmony_ci
1250cb93a386Sopenharmony_ci/**
1251cb93a386Sopenharmony_ci * hb_font_get_glyph_origin_for_direction:
1252cb93a386Sopenharmony_ci * @font: #hb_font_t to work upon
1253cb93a386Sopenharmony_ci * @glyph: The glyph ID to query
1254cb93a386Sopenharmony_ci * @direction: The direction of the text segment
1255cb93a386Sopenharmony_ci * @x: (out): The X coordinate retrieved for the origin
1256cb93a386Sopenharmony_ci * @y: (out): The Y coordinate retrieved for the origin
1257cb93a386Sopenharmony_ci *
1258cb93a386Sopenharmony_ci * Fetches the (X,Y) coordinates of the origin for a glyph in
1259cb93a386Sopenharmony_ci * the specified font.
1260cb93a386Sopenharmony_ci *
1261cb93a386Sopenharmony_ci * Calls the appropriate direction-specific variant (horizontal
1262cb93a386Sopenharmony_ci * or vertical) depending on the value of @direction.
1263cb93a386Sopenharmony_ci *
1264cb93a386Sopenharmony_ci * Since: 0.9.2
1265cb93a386Sopenharmony_ci **/
1266cb93a386Sopenharmony_civoid
1267cb93a386Sopenharmony_cihb_font_get_glyph_origin_for_direction (hb_font_t      *font,
1268cb93a386Sopenharmony_ci					hb_codepoint_t  glyph,
1269cb93a386Sopenharmony_ci					hb_direction_t  direction,
1270cb93a386Sopenharmony_ci					hb_position_t  *x,
1271cb93a386Sopenharmony_ci					hb_position_t  *y)
1272cb93a386Sopenharmony_ci{
1273cb93a386Sopenharmony_ci  return font->get_glyph_origin_for_direction (glyph, direction, x, y);
1274cb93a386Sopenharmony_ci}
1275cb93a386Sopenharmony_ci
1276cb93a386Sopenharmony_ci/**
1277cb93a386Sopenharmony_ci * hb_font_add_glyph_origin_for_direction:
1278cb93a386Sopenharmony_ci * @font: #hb_font_t to work upon
1279cb93a386Sopenharmony_ci * @glyph: The glyph ID to query
1280cb93a386Sopenharmony_ci * @direction: The direction of the text segment
1281cb93a386Sopenharmony_ci * @x: (inout): Input = The original X coordinate
1282cb93a386Sopenharmony_ci *     Output = The X coordinate plus the X-coordinate of the origin
1283cb93a386Sopenharmony_ci * @y: (inout): Input = The original Y coordinate
1284cb93a386Sopenharmony_ci *     Output = The Y coordinate plus the Y-coordinate of the origin
1285cb93a386Sopenharmony_ci *
1286cb93a386Sopenharmony_ci * Adds the origin coordinates to an (X,Y) point coordinate, in
1287cb93a386Sopenharmony_ci * the specified glyph ID in the specified font.
1288cb93a386Sopenharmony_ci *
1289cb93a386Sopenharmony_ci * Calls the appropriate direction-specific variant (horizontal
1290cb93a386Sopenharmony_ci * or vertical) depending on the value of @direction.
1291cb93a386Sopenharmony_ci *
1292cb93a386Sopenharmony_ci * Since: 0.9.2
1293cb93a386Sopenharmony_ci **/
1294cb93a386Sopenharmony_civoid
1295cb93a386Sopenharmony_cihb_font_add_glyph_origin_for_direction (hb_font_t      *font,
1296cb93a386Sopenharmony_ci					hb_codepoint_t  glyph,
1297cb93a386Sopenharmony_ci					hb_direction_t  direction,
1298cb93a386Sopenharmony_ci					hb_position_t  *x,
1299cb93a386Sopenharmony_ci					hb_position_t  *y)
1300cb93a386Sopenharmony_ci{
1301cb93a386Sopenharmony_ci  return font->add_glyph_origin_for_direction (glyph, direction, x, y);
1302cb93a386Sopenharmony_ci}
1303cb93a386Sopenharmony_ci
1304cb93a386Sopenharmony_ci/**
1305cb93a386Sopenharmony_ci * hb_font_subtract_glyph_origin_for_direction:
1306cb93a386Sopenharmony_ci * @font: #hb_font_t to work upon
1307cb93a386Sopenharmony_ci * @glyph: The glyph ID to query
1308cb93a386Sopenharmony_ci * @direction: The direction of the text segment
1309cb93a386Sopenharmony_ci * @x: (inout): Input = The original X coordinate
1310cb93a386Sopenharmony_ci *     Output = The X coordinate minus the X-coordinate of the origin
1311cb93a386Sopenharmony_ci * @y: (inout): Input = The original Y coordinate
1312cb93a386Sopenharmony_ci *     Output = The Y coordinate minus the Y-coordinate of the origin
1313cb93a386Sopenharmony_ci *
1314cb93a386Sopenharmony_ci * Subtracts the origin coordinates from an (X,Y) point coordinate,
1315cb93a386Sopenharmony_ci * in the specified glyph ID in the specified font.
1316cb93a386Sopenharmony_ci *
1317cb93a386Sopenharmony_ci * Calls the appropriate direction-specific variant (horizontal
1318cb93a386Sopenharmony_ci * or vertical) depending on the value of @direction.
1319cb93a386Sopenharmony_ci *
1320cb93a386Sopenharmony_ci * Since: 0.9.2
1321cb93a386Sopenharmony_ci **/
1322cb93a386Sopenharmony_civoid
1323cb93a386Sopenharmony_cihb_font_subtract_glyph_origin_for_direction (hb_font_t      *font,
1324cb93a386Sopenharmony_ci					     hb_codepoint_t  glyph,
1325cb93a386Sopenharmony_ci					     hb_direction_t  direction,
1326cb93a386Sopenharmony_ci					     hb_position_t  *x,
1327cb93a386Sopenharmony_ci					     hb_position_t  *y)
1328cb93a386Sopenharmony_ci{
1329cb93a386Sopenharmony_ci  return font->subtract_glyph_origin_for_direction (glyph, direction, x, y);
1330cb93a386Sopenharmony_ci}
1331cb93a386Sopenharmony_ci
1332cb93a386Sopenharmony_ci/**
1333cb93a386Sopenharmony_ci * hb_font_get_glyph_kerning_for_direction:
1334cb93a386Sopenharmony_ci * @font: #hb_font_t to work upon
1335cb93a386Sopenharmony_ci * @first_glyph: The glyph ID of the first glyph in the glyph pair to query
1336cb93a386Sopenharmony_ci * @second_glyph: The glyph ID of the second glyph in the glyph pair to query
1337cb93a386Sopenharmony_ci * @direction: The direction of the text segment
1338cb93a386Sopenharmony_ci * @x: (out): The horizontal kerning-adjustment value retrieved
1339cb93a386Sopenharmony_ci * @y: (out): The vertical kerning-adjustment value retrieved
1340cb93a386Sopenharmony_ci *
1341cb93a386Sopenharmony_ci * Fetches the kerning-adjustment value for a glyph-pair in the specified font.
1342cb93a386Sopenharmony_ci *
1343cb93a386Sopenharmony_ci * Calls the appropriate direction-specific variant (horizontal
1344cb93a386Sopenharmony_ci * or vertical) depending on the value of @direction.
1345cb93a386Sopenharmony_ci *
1346cb93a386Sopenharmony_ci * Since: 0.9.2
1347cb93a386Sopenharmony_ci **/
1348cb93a386Sopenharmony_civoid
1349cb93a386Sopenharmony_cihb_font_get_glyph_kerning_for_direction (hb_font_t      *font,
1350cb93a386Sopenharmony_ci					 hb_codepoint_t  first_glyph,
1351cb93a386Sopenharmony_ci					 hb_codepoint_t  second_glyph,
1352cb93a386Sopenharmony_ci					 hb_direction_t  direction,
1353cb93a386Sopenharmony_ci					 hb_position_t  *x,
1354cb93a386Sopenharmony_ci					 hb_position_t  *y)
1355cb93a386Sopenharmony_ci{
1356cb93a386Sopenharmony_ci  return font->get_glyph_kerning_for_direction (first_glyph, second_glyph, direction, x, y);
1357cb93a386Sopenharmony_ci}
1358cb93a386Sopenharmony_ci
1359cb93a386Sopenharmony_ci/**
1360cb93a386Sopenharmony_ci * hb_font_get_glyph_extents_for_origin:
1361cb93a386Sopenharmony_ci * @font: #hb_font_t to work upon
1362cb93a386Sopenharmony_ci * @glyph: The glyph ID to query
1363cb93a386Sopenharmony_ci * @direction: The direction of the text segment
1364cb93a386Sopenharmony_ci * @extents: (out): The #hb_glyph_extents_t retrieved
1365cb93a386Sopenharmony_ci *
1366cb93a386Sopenharmony_ci * Fetches the #hb_glyph_extents_t data for a glyph ID
1367cb93a386Sopenharmony_ci * in the specified font, with respect to the origin in
1368cb93a386Sopenharmony_ci * a text segment in the specified direction.
1369cb93a386Sopenharmony_ci *
1370cb93a386Sopenharmony_ci * Calls the appropriate direction-specific variant (horizontal
1371cb93a386Sopenharmony_ci * or vertical) depending on the value of @direction.
1372cb93a386Sopenharmony_ci *
1373cb93a386Sopenharmony_ci * Return value: %true if data found, %false otherwise
1374cb93a386Sopenharmony_ci *
1375cb93a386Sopenharmony_ci * Since: 0.9.2
1376cb93a386Sopenharmony_ci **/
1377cb93a386Sopenharmony_cihb_bool_t
1378cb93a386Sopenharmony_cihb_font_get_glyph_extents_for_origin (hb_font_t          *font,
1379cb93a386Sopenharmony_ci				      hb_codepoint_t      glyph,
1380cb93a386Sopenharmony_ci				      hb_direction_t      direction,
1381cb93a386Sopenharmony_ci				      hb_glyph_extents_t *extents)
1382cb93a386Sopenharmony_ci{
1383cb93a386Sopenharmony_ci  return font->get_glyph_extents_for_origin (glyph, direction, extents);
1384cb93a386Sopenharmony_ci}
1385cb93a386Sopenharmony_ci
1386cb93a386Sopenharmony_ci/**
1387cb93a386Sopenharmony_ci * hb_font_get_glyph_contour_point_for_origin:
1388cb93a386Sopenharmony_ci * @font: #hb_font_t to work upon
1389cb93a386Sopenharmony_ci * @glyph: The glyph ID to query
1390cb93a386Sopenharmony_ci * @point_index: The contour-point index to query
1391cb93a386Sopenharmony_ci * @direction: The direction of the text segment
1392cb93a386Sopenharmony_ci * @x: (out): The X value retrieved for the contour point
1393cb93a386Sopenharmony_ci * @y: (out): The Y value retrieved for the contour point
1394cb93a386Sopenharmony_ci *
1395cb93a386Sopenharmony_ci * Fetches the (X,Y) coordinates of a specified contour-point index
1396cb93a386Sopenharmony_ci * in the specified glyph ID in the specified font, with respect
1397cb93a386Sopenharmony_ci * to the origin in a text segment in the specified direction.
1398cb93a386Sopenharmony_ci *
1399cb93a386Sopenharmony_ci * Calls the appropriate direction-specific variant (horizontal
1400cb93a386Sopenharmony_ci * or vertical) depending on the value of @direction.
1401cb93a386Sopenharmony_ci *
1402cb93a386Sopenharmony_ci * Return value: %true if data found, %false otherwise
1403cb93a386Sopenharmony_ci *
1404cb93a386Sopenharmony_ci * Since: 0.9.2
1405cb93a386Sopenharmony_ci **/
1406cb93a386Sopenharmony_cihb_bool_t
1407cb93a386Sopenharmony_cihb_font_get_glyph_contour_point_for_origin (hb_font_t      *font,
1408cb93a386Sopenharmony_ci					    hb_codepoint_t  glyph,
1409cb93a386Sopenharmony_ci					    unsigned int    point_index,
1410cb93a386Sopenharmony_ci					    hb_direction_t  direction,
1411cb93a386Sopenharmony_ci					    hb_position_t  *x,
1412cb93a386Sopenharmony_ci					    hb_position_t  *y)
1413cb93a386Sopenharmony_ci{
1414cb93a386Sopenharmony_ci  return font->get_glyph_contour_point_for_origin (glyph, point_index, direction, x, y);
1415cb93a386Sopenharmony_ci}
1416cb93a386Sopenharmony_ci
1417cb93a386Sopenharmony_ci/**
1418cb93a386Sopenharmony_ci * hb_font_glyph_to_string:
1419cb93a386Sopenharmony_ci * @font: #hb_font_t to work upon
1420cb93a386Sopenharmony_ci * @glyph: The glyph ID to query
1421cb93a386Sopenharmony_ci * @s: (out) (array length=size): The string containing the glyph name
1422cb93a386Sopenharmony_ci * @size: Length of string @s
1423cb93a386Sopenharmony_ci *
1424cb93a386Sopenharmony_ci * Fetches the name of the specified glyph ID in @font and returns
1425cb93a386Sopenharmony_ci * it in string @s.
1426cb93a386Sopenharmony_ci *
1427cb93a386Sopenharmony_ci * If the glyph ID has no name in @font, a string of the form `gidDDD` is
1428cb93a386Sopenharmony_ci * generated, with `DDD` being the glyph ID.
1429cb93a386Sopenharmony_ci *
1430cb93a386Sopenharmony_ci * Since: 0.9.2
1431cb93a386Sopenharmony_ci **/
1432cb93a386Sopenharmony_civoid
1433cb93a386Sopenharmony_cihb_font_glyph_to_string (hb_font_t      *font,
1434cb93a386Sopenharmony_ci			 hb_codepoint_t  glyph,
1435cb93a386Sopenharmony_ci			 char           *s,
1436cb93a386Sopenharmony_ci			 unsigned int    size)
1437cb93a386Sopenharmony_ci{
1438cb93a386Sopenharmony_ci  font->glyph_to_string (glyph, s, size);
1439cb93a386Sopenharmony_ci}
1440cb93a386Sopenharmony_ci
1441cb93a386Sopenharmony_ci/**
1442cb93a386Sopenharmony_ci * hb_font_glyph_from_string:
1443cb93a386Sopenharmony_ci * @font: #hb_font_t to work upon
1444cb93a386Sopenharmony_ci * @s: (array length=len) (element-type uint8_t): string to query
1445cb93a386Sopenharmony_ci * @len: The length of the string @s
1446cb93a386Sopenharmony_ci * @glyph: (out): The glyph ID corresponding to the string requested
1447cb93a386Sopenharmony_ci *
1448cb93a386Sopenharmony_ci * Fetches the glyph ID from @font that matches the specified string.
1449cb93a386Sopenharmony_ci * Strings of the format `gidDDD` or `uniUUUU` are parsed automatically.
1450cb93a386Sopenharmony_ci *
1451cb93a386Sopenharmony_ci * <note>Note: @len == -1 means the string is null-terminated.</note>
1452cb93a386Sopenharmony_ci *
1453cb93a386Sopenharmony_ci * Return value: %true if data found, %false otherwise
1454cb93a386Sopenharmony_ci *
1455cb93a386Sopenharmony_ci * Since: 0.9.2
1456cb93a386Sopenharmony_ci **/
1457cb93a386Sopenharmony_cihb_bool_t
1458cb93a386Sopenharmony_cihb_font_glyph_from_string (hb_font_t      *font,
1459cb93a386Sopenharmony_ci			   const char     *s,
1460cb93a386Sopenharmony_ci			   int             len,
1461cb93a386Sopenharmony_ci			   hb_codepoint_t *glyph)
1462cb93a386Sopenharmony_ci{
1463cb93a386Sopenharmony_ci  return font->glyph_from_string (s, len, glyph);
1464cb93a386Sopenharmony_ci}
1465cb93a386Sopenharmony_ci
1466cb93a386Sopenharmony_ci
1467cb93a386Sopenharmony_ci/*
1468cb93a386Sopenharmony_ci * hb_font_t
1469cb93a386Sopenharmony_ci */
1470cb93a386Sopenharmony_ci
1471cb93a386Sopenharmony_ciDEFINE_NULL_INSTANCE (hb_font_t) =
1472cb93a386Sopenharmony_ci{
1473cb93a386Sopenharmony_ci  HB_OBJECT_HEADER_STATIC,
1474cb93a386Sopenharmony_ci
1475cb93a386Sopenharmony_ci  nullptr, /* parent */
1476cb93a386Sopenharmony_ci  const_cast<hb_face_t *> (&_hb_Null_hb_face_t),
1477cb93a386Sopenharmony_ci
1478cb93a386Sopenharmony_ci  1000, /* x_scale */
1479cb93a386Sopenharmony_ci  1000, /* y_scale */
1480cb93a386Sopenharmony_ci  1<<16, /* x_mult */
1481cb93a386Sopenharmony_ci  1<<16, /* y_mult */
1482cb93a386Sopenharmony_ci
1483cb93a386Sopenharmony_ci  0, /* x_ppem */
1484cb93a386Sopenharmony_ci  0, /* y_ppem */
1485cb93a386Sopenharmony_ci  0, /* ptem */
1486cb93a386Sopenharmony_ci
1487cb93a386Sopenharmony_ci  0, /* num_coords */
1488cb93a386Sopenharmony_ci  nullptr, /* coords */
1489cb93a386Sopenharmony_ci  nullptr, /* design_coords */
1490cb93a386Sopenharmony_ci
1491cb93a386Sopenharmony_ci  const_cast<hb_font_funcs_t *> (&_hb_Null_hb_font_funcs_t),
1492cb93a386Sopenharmony_ci
1493cb93a386Sopenharmony_ci  /* Zero for the rest is fine. */
1494cb93a386Sopenharmony_ci};
1495cb93a386Sopenharmony_ci
1496cb93a386Sopenharmony_ci
1497cb93a386Sopenharmony_cistatic hb_font_t *
1498cb93a386Sopenharmony_ci_hb_font_create (hb_face_t *face)
1499cb93a386Sopenharmony_ci{
1500cb93a386Sopenharmony_ci  hb_font_t *font;
1501cb93a386Sopenharmony_ci
1502cb93a386Sopenharmony_ci  if (unlikely (!face))
1503cb93a386Sopenharmony_ci    face = hb_face_get_empty ();
1504cb93a386Sopenharmony_ci  if (!(font = hb_object_create<hb_font_t> ()))
1505cb93a386Sopenharmony_ci    return hb_font_get_empty ();
1506cb93a386Sopenharmony_ci
1507cb93a386Sopenharmony_ci  hb_face_make_immutable (face);
1508cb93a386Sopenharmony_ci  font->parent = hb_font_get_empty ();
1509cb93a386Sopenharmony_ci  font->face = hb_face_reference (face);
1510cb93a386Sopenharmony_ci  font->klass = hb_font_funcs_get_empty ();
1511cb93a386Sopenharmony_ci  font->data.init0 (font);
1512cb93a386Sopenharmony_ci  font->x_scale = font->y_scale = hb_face_get_upem (face);
1513cb93a386Sopenharmony_ci  font->x_mult = font->y_mult = 1 << 16;
1514cb93a386Sopenharmony_ci
1515cb93a386Sopenharmony_ci  return font;
1516cb93a386Sopenharmony_ci}
1517cb93a386Sopenharmony_ci
1518cb93a386Sopenharmony_ci/**
1519cb93a386Sopenharmony_ci * hb_font_create: (Xconstructor)
1520cb93a386Sopenharmony_ci * @face: a face.
1521cb93a386Sopenharmony_ci *
1522cb93a386Sopenharmony_ci * Constructs a new font object from the specified face.
1523cb93a386Sopenharmony_ci *
1524cb93a386Sopenharmony_ci * Return value: (transfer full): The new font object
1525cb93a386Sopenharmony_ci *
1526cb93a386Sopenharmony_ci * Since: 0.9.2
1527cb93a386Sopenharmony_ci **/
1528cb93a386Sopenharmony_cihb_font_t *
1529cb93a386Sopenharmony_cihb_font_create (hb_face_t *face)
1530cb93a386Sopenharmony_ci{
1531cb93a386Sopenharmony_ci  hb_font_t *font = _hb_font_create (face);
1532cb93a386Sopenharmony_ci
1533cb93a386Sopenharmony_ci#ifndef HB_NO_OT_FONT
1534cb93a386Sopenharmony_ci  /* Install our in-house, very lightweight, funcs. */
1535cb93a386Sopenharmony_ci  hb_ot_font_set_funcs (font);
1536cb93a386Sopenharmony_ci#endif
1537cb93a386Sopenharmony_ci
1538cb93a386Sopenharmony_ci  return font;
1539cb93a386Sopenharmony_ci}
1540cb93a386Sopenharmony_ci
1541cb93a386Sopenharmony_cistatic void
1542cb93a386Sopenharmony_ci_hb_font_adopt_var_coords (hb_font_t *font,
1543cb93a386Sopenharmony_ci			   int *coords, /* 2.14 normalized */
1544cb93a386Sopenharmony_ci			   float *design_coords,
1545cb93a386Sopenharmony_ci			   unsigned int coords_length)
1546cb93a386Sopenharmony_ci{
1547cb93a386Sopenharmony_ci  hb_free (font->coords);
1548cb93a386Sopenharmony_ci  hb_free (font->design_coords);
1549cb93a386Sopenharmony_ci
1550cb93a386Sopenharmony_ci  font->coords = coords;
1551cb93a386Sopenharmony_ci  font->design_coords = design_coords;
1552cb93a386Sopenharmony_ci  font->num_coords = coords_length;
1553cb93a386Sopenharmony_ci}
1554cb93a386Sopenharmony_ci
1555cb93a386Sopenharmony_ci/**
1556cb93a386Sopenharmony_ci * hb_font_create_sub_font:
1557cb93a386Sopenharmony_ci * @parent: The parent font object
1558cb93a386Sopenharmony_ci *
1559cb93a386Sopenharmony_ci * Constructs a sub-font font object from the specified @parent font,
1560cb93a386Sopenharmony_ci * replicating the parent's properties.
1561cb93a386Sopenharmony_ci *
1562cb93a386Sopenharmony_ci * Return value: (transfer full): The new sub-font font object
1563cb93a386Sopenharmony_ci *
1564cb93a386Sopenharmony_ci * Since: 0.9.2
1565cb93a386Sopenharmony_ci **/
1566cb93a386Sopenharmony_cihb_font_t *
1567cb93a386Sopenharmony_cihb_font_create_sub_font (hb_font_t *parent)
1568cb93a386Sopenharmony_ci{
1569cb93a386Sopenharmony_ci  if (unlikely (!parent))
1570cb93a386Sopenharmony_ci    parent = hb_font_get_empty ();
1571cb93a386Sopenharmony_ci
1572cb93a386Sopenharmony_ci  hb_font_t *font = _hb_font_create (parent->face);
1573cb93a386Sopenharmony_ci
1574cb93a386Sopenharmony_ci  if (unlikely (hb_object_is_immutable (font)))
1575cb93a386Sopenharmony_ci    return font;
1576cb93a386Sopenharmony_ci
1577cb93a386Sopenharmony_ci  font->parent = hb_font_reference (parent);
1578cb93a386Sopenharmony_ci
1579cb93a386Sopenharmony_ci  font->x_scale = parent->x_scale;
1580cb93a386Sopenharmony_ci  font->y_scale = parent->y_scale;
1581cb93a386Sopenharmony_ci  font->mults_changed ();
1582cb93a386Sopenharmony_ci  font->x_ppem = parent->x_ppem;
1583cb93a386Sopenharmony_ci  font->y_ppem = parent->y_ppem;
1584cb93a386Sopenharmony_ci  font->ptem = parent->ptem;
1585cb93a386Sopenharmony_ci
1586cb93a386Sopenharmony_ci  unsigned int num_coords = parent->num_coords;
1587cb93a386Sopenharmony_ci  if (num_coords)
1588cb93a386Sopenharmony_ci  {
1589cb93a386Sopenharmony_ci    int *coords = (int *) hb_calloc (num_coords, sizeof (parent->coords[0]));
1590cb93a386Sopenharmony_ci    float *design_coords = (float *) hb_calloc (num_coords, sizeof (parent->design_coords[0]));
1591cb93a386Sopenharmony_ci    if (likely (coords && design_coords))
1592cb93a386Sopenharmony_ci    {
1593cb93a386Sopenharmony_ci      memcpy (coords, parent->coords, num_coords * sizeof (parent->coords[0]));
1594cb93a386Sopenharmony_ci      memcpy (design_coords, parent->design_coords, num_coords * sizeof (parent->design_coords[0]));
1595cb93a386Sopenharmony_ci      _hb_font_adopt_var_coords (font, coords, design_coords, num_coords);
1596cb93a386Sopenharmony_ci    }
1597cb93a386Sopenharmony_ci    else
1598cb93a386Sopenharmony_ci    {
1599cb93a386Sopenharmony_ci      hb_free (coords);
1600cb93a386Sopenharmony_ci      hb_free (design_coords);
1601cb93a386Sopenharmony_ci    }
1602cb93a386Sopenharmony_ci  }
1603cb93a386Sopenharmony_ci
1604cb93a386Sopenharmony_ci  return font;
1605cb93a386Sopenharmony_ci}
1606cb93a386Sopenharmony_ci
1607cb93a386Sopenharmony_ci/**
1608cb93a386Sopenharmony_ci * hb_font_get_empty:
1609cb93a386Sopenharmony_ci *
1610cb93a386Sopenharmony_ci * Fetches the empty font object.
1611cb93a386Sopenharmony_ci *
1612cb93a386Sopenharmony_ci * Return value: (transfer full): The empty font object
1613cb93a386Sopenharmony_ci *
1614cb93a386Sopenharmony_ci * Since: 0.9.2
1615cb93a386Sopenharmony_ci **/
1616cb93a386Sopenharmony_cihb_font_t *
1617cb93a386Sopenharmony_cihb_font_get_empty ()
1618cb93a386Sopenharmony_ci{
1619cb93a386Sopenharmony_ci  return const_cast<hb_font_t *> (&Null (hb_font_t));
1620cb93a386Sopenharmony_ci}
1621cb93a386Sopenharmony_ci
1622cb93a386Sopenharmony_ci/**
1623cb93a386Sopenharmony_ci * hb_font_reference: (skip)
1624cb93a386Sopenharmony_ci * @font: #hb_font_t to work upon
1625cb93a386Sopenharmony_ci *
1626cb93a386Sopenharmony_ci * Increases the reference count on the given font object.
1627cb93a386Sopenharmony_ci *
1628cb93a386Sopenharmony_ci * Return value: (transfer full): The @font object
1629cb93a386Sopenharmony_ci *
1630cb93a386Sopenharmony_ci * Since: 0.9.2
1631cb93a386Sopenharmony_ci **/
1632cb93a386Sopenharmony_cihb_font_t *
1633cb93a386Sopenharmony_cihb_font_reference (hb_font_t *font)
1634cb93a386Sopenharmony_ci{
1635cb93a386Sopenharmony_ci  return hb_object_reference (font);
1636cb93a386Sopenharmony_ci}
1637cb93a386Sopenharmony_ci
1638cb93a386Sopenharmony_ci/**
1639cb93a386Sopenharmony_ci * hb_font_destroy: (skip)
1640cb93a386Sopenharmony_ci * @font: #hb_font_t to work upon
1641cb93a386Sopenharmony_ci *
1642cb93a386Sopenharmony_ci * Decreases the reference count on the given font object. When the
1643cb93a386Sopenharmony_ci * reference count reaches zero, the font is destroyed,
1644cb93a386Sopenharmony_ci * freeing all memory.
1645cb93a386Sopenharmony_ci *
1646cb93a386Sopenharmony_ci * Since: 0.9.2
1647cb93a386Sopenharmony_ci **/
1648cb93a386Sopenharmony_civoid
1649cb93a386Sopenharmony_cihb_font_destroy (hb_font_t *font)
1650cb93a386Sopenharmony_ci{
1651cb93a386Sopenharmony_ci  if (!hb_object_destroy (font)) return;
1652cb93a386Sopenharmony_ci
1653cb93a386Sopenharmony_ci  font->data.fini ();
1654cb93a386Sopenharmony_ci
1655cb93a386Sopenharmony_ci  if (font->destroy)
1656cb93a386Sopenharmony_ci    font->destroy (font->user_data);
1657cb93a386Sopenharmony_ci
1658cb93a386Sopenharmony_ci  hb_font_destroy (font->parent);
1659cb93a386Sopenharmony_ci  hb_face_destroy (font->face);
1660cb93a386Sopenharmony_ci  hb_font_funcs_destroy (font->klass);
1661cb93a386Sopenharmony_ci
1662cb93a386Sopenharmony_ci  hb_free (font->coords);
1663cb93a386Sopenharmony_ci  hb_free (font->design_coords);
1664cb93a386Sopenharmony_ci
1665cb93a386Sopenharmony_ci  hb_free (font);
1666cb93a386Sopenharmony_ci}
1667cb93a386Sopenharmony_ci
1668cb93a386Sopenharmony_ci/**
1669cb93a386Sopenharmony_ci * hb_font_set_user_data: (skip)
1670cb93a386Sopenharmony_ci * @font: #hb_font_t to work upon
1671cb93a386Sopenharmony_ci * @key: The user-data key
1672cb93a386Sopenharmony_ci * @data: A pointer to the user data
1673cb93a386Sopenharmony_ci * @destroy: (nullable): A callback to call when @data is not needed anymore
1674cb93a386Sopenharmony_ci * @replace: Whether to replace an existing data with the same key
1675cb93a386Sopenharmony_ci *
1676cb93a386Sopenharmony_ci * Attaches a user-data key/data pair to the specified font object.
1677cb93a386Sopenharmony_ci *
1678cb93a386Sopenharmony_ci * Return value: %true if success, %false otherwise
1679cb93a386Sopenharmony_ci *
1680cb93a386Sopenharmony_ci * Since: 0.9.2
1681cb93a386Sopenharmony_ci **/
1682cb93a386Sopenharmony_cihb_bool_t
1683cb93a386Sopenharmony_cihb_font_set_user_data (hb_font_t          *font,
1684cb93a386Sopenharmony_ci		       hb_user_data_key_t *key,
1685cb93a386Sopenharmony_ci		       void *              data,
1686cb93a386Sopenharmony_ci		       hb_destroy_func_t   destroy /* May be NULL. */,
1687cb93a386Sopenharmony_ci		       hb_bool_t           replace)
1688cb93a386Sopenharmony_ci{
1689cb93a386Sopenharmony_ci  return hb_object_set_user_data (font, key, data, destroy, replace);
1690cb93a386Sopenharmony_ci}
1691cb93a386Sopenharmony_ci
1692cb93a386Sopenharmony_ci/**
1693cb93a386Sopenharmony_ci * hb_font_get_user_data: (skip)
1694cb93a386Sopenharmony_ci * @font: #hb_font_t to work upon
1695cb93a386Sopenharmony_ci * @key: The user-data key to query
1696cb93a386Sopenharmony_ci *
1697cb93a386Sopenharmony_ci * Fetches the user-data object associated with the specified key,
1698cb93a386Sopenharmony_ci * attached to the specified font object.
1699cb93a386Sopenharmony_ci *
1700cb93a386Sopenharmony_ci * Return value: (transfer none): Pointer to the user data
1701cb93a386Sopenharmony_ci *
1702cb93a386Sopenharmony_ci * Since: 0.9.2
1703cb93a386Sopenharmony_ci **/
1704cb93a386Sopenharmony_civoid *
1705cb93a386Sopenharmony_cihb_font_get_user_data (hb_font_t          *font,
1706cb93a386Sopenharmony_ci		       hb_user_data_key_t *key)
1707cb93a386Sopenharmony_ci{
1708cb93a386Sopenharmony_ci  return hb_object_get_user_data (font, key);
1709cb93a386Sopenharmony_ci}
1710cb93a386Sopenharmony_ci
1711cb93a386Sopenharmony_ci/**
1712cb93a386Sopenharmony_ci * hb_font_make_immutable:
1713cb93a386Sopenharmony_ci * @font: #hb_font_t to work upon
1714cb93a386Sopenharmony_ci *
1715cb93a386Sopenharmony_ci * Makes @font immutable.
1716cb93a386Sopenharmony_ci *
1717cb93a386Sopenharmony_ci * Since: 0.9.2
1718cb93a386Sopenharmony_ci **/
1719cb93a386Sopenharmony_civoid
1720cb93a386Sopenharmony_cihb_font_make_immutable (hb_font_t *font)
1721cb93a386Sopenharmony_ci{
1722cb93a386Sopenharmony_ci  if (hb_object_is_immutable (font))
1723cb93a386Sopenharmony_ci    return;
1724cb93a386Sopenharmony_ci
1725cb93a386Sopenharmony_ci  if (font->parent)
1726cb93a386Sopenharmony_ci    hb_font_make_immutable (font->parent);
1727cb93a386Sopenharmony_ci
1728cb93a386Sopenharmony_ci  hb_object_make_immutable (font);
1729cb93a386Sopenharmony_ci}
1730cb93a386Sopenharmony_ci
1731cb93a386Sopenharmony_ci/**
1732cb93a386Sopenharmony_ci * hb_font_is_immutable:
1733cb93a386Sopenharmony_ci * @font: #hb_font_t to work upon
1734cb93a386Sopenharmony_ci *
1735cb93a386Sopenharmony_ci * Tests whether a font object is immutable.
1736cb93a386Sopenharmony_ci *
1737cb93a386Sopenharmony_ci * Return value: %true if @font is immutable, %false otherwise
1738cb93a386Sopenharmony_ci *
1739cb93a386Sopenharmony_ci * Since: 0.9.2
1740cb93a386Sopenharmony_ci **/
1741cb93a386Sopenharmony_cihb_bool_t
1742cb93a386Sopenharmony_cihb_font_is_immutable (hb_font_t *font)
1743cb93a386Sopenharmony_ci{
1744cb93a386Sopenharmony_ci  return hb_object_is_immutable (font);
1745cb93a386Sopenharmony_ci}
1746cb93a386Sopenharmony_ci
1747cb93a386Sopenharmony_ci/**
1748cb93a386Sopenharmony_ci * hb_font_set_parent:
1749cb93a386Sopenharmony_ci * @font: #hb_font_t to work upon
1750cb93a386Sopenharmony_ci * @parent: The parent font object to assign
1751cb93a386Sopenharmony_ci *
1752cb93a386Sopenharmony_ci * Sets the parent font of @font.
1753cb93a386Sopenharmony_ci *
1754cb93a386Sopenharmony_ci * Since: 1.0.5
1755cb93a386Sopenharmony_ci **/
1756cb93a386Sopenharmony_civoid
1757cb93a386Sopenharmony_cihb_font_set_parent (hb_font_t *font,
1758cb93a386Sopenharmony_ci		    hb_font_t *parent)
1759cb93a386Sopenharmony_ci{
1760cb93a386Sopenharmony_ci  if (hb_object_is_immutable (font))
1761cb93a386Sopenharmony_ci    return;
1762cb93a386Sopenharmony_ci
1763cb93a386Sopenharmony_ci  if (!parent)
1764cb93a386Sopenharmony_ci    parent = hb_font_get_empty ();
1765cb93a386Sopenharmony_ci
1766cb93a386Sopenharmony_ci  hb_font_t *old = font->parent;
1767cb93a386Sopenharmony_ci
1768cb93a386Sopenharmony_ci  font->parent = hb_font_reference (parent);
1769cb93a386Sopenharmony_ci
1770cb93a386Sopenharmony_ci  hb_font_destroy (old);
1771cb93a386Sopenharmony_ci}
1772cb93a386Sopenharmony_ci
1773cb93a386Sopenharmony_ci/**
1774cb93a386Sopenharmony_ci * hb_font_get_parent:
1775cb93a386Sopenharmony_ci * @font: #hb_font_t to work upon
1776cb93a386Sopenharmony_ci *
1777cb93a386Sopenharmony_ci * Fetches the parent font of @font.
1778cb93a386Sopenharmony_ci *
1779cb93a386Sopenharmony_ci * Return value: (transfer none): The parent font object
1780cb93a386Sopenharmony_ci *
1781cb93a386Sopenharmony_ci * Since: 0.9.2
1782cb93a386Sopenharmony_ci **/
1783cb93a386Sopenharmony_cihb_font_t *
1784cb93a386Sopenharmony_cihb_font_get_parent (hb_font_t *font)
1785cb93a386Sopenharmony_ci{
1786cb93a386Sopenharmony_ci  return font->parent;
1787cb93a386Sopenharmony_ci}
1788cb93a386Sopenharmony_ci
1789cb93a386Sopenharmony_ci/**
1790cb93a386Sopenharmony_ci * hb_font_set_face:
1791cb93a386Sopenharmony_ci * @font: #hb_font_t to work upon
1792cb93a386Sopenharmony_ci * @face: The #hb_face_t to assign
1793cb93a386Sopenharmony_ci *
1794cb93a386Sopenharmony_ci * Sets @face as the font-face value of @font.
1795cb93a386Sopenharmony_ci *
1796cb93a386Sopenharmony_ci * Since: 1.4.3
1797cb93a386Sopenharmony_ci **/
1798cb93a386Sopenharmony_civoid
1799cb93a386Sopenharmony_cihb_font_set_face (hb_font_t *font,
1800cb93a386Sopenharmony_ci		  hb_face_t *face)
1801cb93a386Sopenharmony_ci{
1802cb93a386Sopenharmony_ci  if (hb_object_is_immutable (font))
1803cb93a386Sopenharmony_ci    return;
1804cb93a386Sopenharmony_ci
1805cb93a386Sopenharmony_ci  if (unlikely (!face))
1806cb93a386Sopenharmony_ci    face = hb_face_get_empty ();
1807cb93a386Sopenharmony_ci
1808cb93a386Sopenharmony_ci  hb_face_t *old = font->face;
1809cb93a386Sopenharmony_ci
1810cb93a386Sopenharmony_ci  hb_face_make_immutable (face);
1811cb93a386Sopenharmony_ci  font->face = hb_face_reference (face);
1812cb93a386Sopenharmony_ci  font->mults_changed ();
1813cb93a386Sopenharmony_ci
1814cb93a386Sopenharmony_ci  hb_face_destroy (old);
1815cb93a386Sopenharmony_ci}
1816cb93a386Sopenharmony_ci
1817cb93a386Sopenharmony_ci/**
1818cb93a386Sopenharmony_ci * hb_font_get_face:
1819cb93a386Sopenharmony_ci * @font: #hb_font_t to work upon
1820cb93a386Sopenharmony_ci *
1821cb93a386Sopenharmony_ci * Fetches the face associated with the specified font object.
1822cb93a386Sopenharmony_ci *
1823cb93a386Sopenharmony_ci * Return value: (transfer none): The #hb_face_t value
1824cb93a386Sopenharmony_ci *
1825cb93a386Sopenharmony_ci * Since: 0.9.2
1826cb93a386Sopenharmony_ci **/
1827cb93a386Sopenharmony_cihb_face_t *
1828cb93a386Sopenharmony_cihb_font_get_face (hb_font_t *font)
1829cb93a386Sopenharmony_ci{
1830cb93a386Sopenharmony_ci  return font->face;
1831cb93a386Sopenharmony_ci}
1832cb93a386Sopenharmony_ci
1833cb93a386Sopenharmony_ci
1834cb93a386Sopenharmony_ci/**
1835cb93a386Sopenharmony_ci * hb_font_set_funcs:
1836cb93a386Sopenharmony_ci * @font: #hb_font_t to work upon
1837cb93a386Sopenharmony_ci * @klass: (closure font_data) (destroy destroy) (scope notified): The font-functions structure.
1838cb93a386Sopenharmony_ci * @font_data: Data to attach to @font
1839cb93a386Sopenharmony_ci * @destroy: (nullable): The function to call when @font_data is not needed anymore
1840cb93a386Sopenharmony_ci *
1841cb93a386Sopenharmony_ci * Replaces the font-functions structure attached to a font, updating
1842cb93a386Sopenharmony_ci * the font's user-data with @font-data and the @destroy callback.
1843cb93a386Sopenharmony_ci *
1844cb93a386Sopenharmony_ci * Since: 0.9.2
1845cb93a386Sopenharmony_ci **/
1846cb93a386Sopenharmony_civoid
1847cb93a386Sopenharmony_cihb_font_set_funcs (hb_font_t         *font,
1848cb93a386Sopenharmony_ci		   hb_font_funcs_t   *klass,
1849cb93a386Sopenharmony_ci		   void              *font_data,
1850cb93a386Sopenharmony_ci		   hb_destroy_func_t  destroy /* May be NULL. */)
1851cb93a386Sopenharmony_ci{
1852cb93a386Sopenharmony_ci  if (hb_object_is_immutable (font))
1853cb93a386Sopenharmony_ci  {
1854cb93a386Sopenharmony_ci    if (destroy)
1855cb93a386Sopenharmony_ci      destroy (font_data);
1856cb93a386Sopenharmony_ci    return;
1857cb93a386Sopenharmony_ci  }
1858cb93a386Sopenharmony_ci
1859cb93a386Sopenharmony_ci  if (font->destroy)
1860cb93a386Sopenharmony_ci    font->destroy (font->user_data);
1861cb93a386Sopenharmony_ci
1862cb93a386Sopenharmony_ci  if (!klass)
1863cb93a386Sopenharmony_ci    klass = hb_font_funcs_get_empty ();
1864cb93a386Sopenharmony_ci
1865cb93a386Sopenharmony_ci  hb_font_funcs_reference (klass);
1866cb93a386Sopenharmony_ci  hb_font_funcs_destroy (font->klass);
1867cb93a386Sopenharmony_ci  font->klass = klass;
1868cb93a386Sopenharmony_ci  font->user_data = font_data;
1869cb93a386Sopenharmony_ci  font->destroy = destroy;
1870cb93a386Sopenharmony_ci}
1871cb93a386Sopenharmony_ci
1872cb93a386Sopenharmony_ci/**
1873cb93a386Sopenharmony_ci * hb_font_set_funcs_data:
1874cb93a386Sopenharmony_ci * @font: #hb_font_t to work upon
1875cb93a386Sopenharmony_ci * @font_data: (destroy destroy) (scope notified): Data to attach to @font
1876cb93a386Sopenharmony_ci * @destroy: (nullable): The function to call when @font_data is not needed anymore
1877cb93a386Sopenharmony_ci *
1878cb93a386Sopenharmony_ci * Replaces the user data attached to a font, updating the font's
1879cb93a386Sopenharmony_ci * @destroy callback.
1880cb93a386Sopenharmony_ci *
1881cb93a386Sopenharmony_ci * Since: 0.9.2
1882cb93a386Sopenharmony_ci **/
1883cb93a386Sopenharmony_civoid
1884cb93a386Sopenharmony_cihb_font_set_funcs_data (hb_font_t         *font,
1885cb93a386Sopenharmony_ci		        void              *font_data,
1886cb93a386Sopenharmony_ci		        hb_destroy_func_t  destroy /* May be NULL. */)
1887cb93a386Sopenharmony_ci{
1888cb93a386Sopenharmony_ci  /* Destroy user_data? */
1889cb93a386Sopenharmony_ci  if (hb_object_is_immutable (font))
1890cb93a386Sopenharmony_ci  {
1891cb93a386Sopenharmony_ci    if (destroy)
1892cb93a386Sopenharmony_ci      destroy (font_data);
1893cb93a386Sopenharmony_ci    return;
1894cb93a386Sopenharmony_ci  }
1895cb93a386Sopenharmony_ci
1896cb93a386Sopenharmony_ci  if (font->destroy)
1897cb93a386Sopenharmony_ci    font->destroy (font->user_data);
1898cb93a386Sopenharmony_ci
1899cb93a386Sopenharmony_ci  font->user_data = font_data;
1900cb93a386Sopenharmony_ci  font->destroy = destroy;
1901cb93a386Sopenharmony_ci}
1902cb93a386Sopenharmony_ci
1903cb93a386Sopenharmony_ci
1904cb93a386Sopenharmony_ci/**
1905cb93a386Sopenharmony_ci * hb_font_set_scale:
1906cb93a386Sopenharmony_ci * @font: #hb_font_t to work upon
1907cb93a386Sopenharmony_ci * @x_scale: Horizontal scale value to assign
1908cb93a386Sopenharmony_ci * @y_scale: Vertical scale value to assign
1909cb93a386Sopenharmony_ci *
1910cb93a386Sopenharmony_ci * Sets the horizontal and vertical scale of a font.
1911cb93a386Sopenharmony_ci *
1912cb93a386Sopenharmony_ci * Since: 0.9.2
1913cb93a386Sopenharmony_ci **/
1914cb93a386Sopenharmony_civoid
1915cb93a386Sopenharmony_cihb_font_set_scale (hb_font_t *font,
1916cb93a386Sopenharmony_ci		   int        x_scale,
1917cb93a386Sopenharmony_ci		   int        y_scale)
1918cb93a386Sopenharmony_ci{
1919cb93a386Sopenharmony_ci  if (hb_object_is_immutable (font))
1920cb93a386Sopenharmony_ci    return;
1921cb93a386Sopenharmony_ci
1922cb93a386Sopenharmony_ci  font->x_scale = x_scale;
1923cb93a386Sopenharmony_ci  font->y_scale = y_scale;
1924cb93a386Sopenharmony_ci  font->mults_changed ();
1925cb93a386Sopenharmony_ci}
1926cb93a386Sopenharmony_ci
1927cb93a386Sopenharmony_ci/**
1928cb93a386Sopenharmony_ci * hb_font_get_scale:
1929cb93a386Sopenharmony_ci * @font: #hb_font_t to work upon
1930cb93a386Sopenharmony_ci * @x_scale: (out): Horizontal scale value
1931cb93a386Sopenharmony_ci * @y_scale: (out): Vertical scale value
1932cb93a386Sopenharmony_ci *
1933cb93a386Sopenharmony_ci * Fetches the horizontal and vertical scale of a font.
1934cb93a386Sopenharmony_ci *
1935cb93a386Sopenharmony_ci * Since: 0.9.2
1936cb93a386Sopenharmony_ci **/
1937cb93a386Sopenharmony_civoid
1938cb93a386Sopenharmony_cihb_font_get_scale (hb_font_t *font,
1939cb93a386Sopenharmony_ci		   int       *x_scale,
1940cb93a386Sopenharmony_ci		   int       *y_scale)
1941cb93a386Sopenharmony_ci{
1942cb93a386Sopenharmony_ci  if (x_scale) *x_scale = font->x_scale;
1943cb93a386Sopenharmony_ci  if (y_scale) *y_scale = font->y_scale;
1944cb93a386Sopenharmony_ci}
1945cb93a386Sopenharmony_ci
1946cb93a386Sopenharmony_ci/**
1947cb93a386Sopenharmony_ci * hb_font_set_ppem:
1948cb93a386Sopenharmony_ci * @font: #hb_font_t to work upon
1949cb93a386Sopenharmony_ci * @x_ppem: Horizontal ppem value to assign
1950cb93a386Sopenharmony_ci * @y_ppem: Vertical ppem value to assign
1951cb93a386Sopenharmony_ci *
1952cb93a386Sopenharmony_ci * Sets the horizontal and vertical pixels-per-em (ppem) of a font.
1953cb93a386Sopenharmony_ci *
1954cb93a386Sopenharmony_ci * Since: 0.9.2
1955cb93a386Sopenharmony_ci **/
1956cb93a386Sopenharmony_civoid
1957cb93a386Sopenharmony_cihb_font_set_ppem (hb_font_t    *font,
1958cb93a386Sopenharmony_ci		  unsigned int  x_ppem,
1959cb93a386Sopenharmony_ci		  unsigned int  y_ppem)
1960cb93a386Sopenharmony_ci{
1961cb93a386Sopenharmony_ci  if (hb_object_is_immutable (font))
1962cb93a386Sopenharmony_ci    return;
1963cb93a386Sopenharmony_ci
1964cb93a386Sopenharmony_ci  font->x_ppem = x_ppem;
1965cb93a386Sopenharmony_ci  font->y_ppem = y_ppem;
1966cb93a386Sopenharmony_ci}
1967cb93a386Sopenharmony_ci
1968cb93a386Sopenharmony_ci/**
1969cb93a386Sopenharmony_ci * hb_font_get_ppem:
1970cb93a386Sopenharmony_ci * @font: #hb_font_t to work upon
1971cb93a386Sopenharmony_ci * @x_ppem: (out): Horizontal ppem value
1972cb93a386Sopenharmony_ci * @y_ppem: (out): Vertical ppem value
1973cb93a386Sopenharmony_ci *
1974cb93a386Sopenharmony_ci * Fetches the horizontal and vertical points-per-em (ppem) of a font.
1975cb93a386Sopenharmony_ci *
1976cb93a386Sopenharmony_ci * Since: 0.9.2
1977cb93a386Sopenharmony_ci **/
1978cb93a386Sopenharmony_civoid
1979cb93a386Sopenharmony_cihb_font_get_ppem (hb_font_t    *font,
1980cb93a386Sopenharmony_ci		  unsigned int *x_ppem,
1981cb93a386Sopenharmony_ci		  unsigned int *y_ppem)
1982cb93a386Sopenharmony_ci{
1983cb93a386Sopenharmony_ci  if (x_ppem) *x_ppem = font->x_ppem;
1984cb93a386Sopenharmony_ci  if (y_ppem) *y_ppem = font->y_ppem;
1985cb93a386Sopenharmony_ci}
1986cb93a386Sopenharmony_ci
1987cb93a386Sopenharmony_ci/**
1988cb93a386Sopenharmony_ci * hb_font_set_ptem:
1989cb93a386Sopenharmony_ci * @font: #hb_font_t to work upon
1990cb93a386Sopenharmony_ci * @ptem: font size in points.
1991cb93a386Sopenharmony_ci *
1992cb93a386Sopenharmony_ci * Sets the "point size" of a font. Set to zero to unset.
1993cb93a386Sopenharmony_ci * Used in CoreText to implement optical sizing.
1994cb93a386Sopenharmony_ci *
1995cb93a386Sopenharmony_ci * <note>Note: There are 72 points in an inch.</note>
1996cb93a386Sopenharmony_ci *
1997cb93a386Sopenharmony_ci * Since: 1.6.0
1998cb93a386Sopenharmony_ci **/
1999cb93a386Sopenharmony_civoid
2000cb93a386Sopenharmony_cihb_font_set_ptem (hb_font_t *font,
2001cb93a386Sopenharmony_ci		  float      ptem)
2002cb93a386Sopenharmony_ci{
2003cb93a386Sopenharmony_ci  if (hb_object_is_immutable (font))
2004cb93a386Sopenharmony_ci    return;
2005cb93a386Sopenharmony_ci
2006cb93a386Sopenharmony_ci  font->ptem = ptem;
2007cb93a386Sopenharmony_ci}
2008cb93a386Sopenharmony_ci
2009cb93a386Sopenharmony_ci/**
2010cb93a386Sopenharmony_ci * hb_font_get_ptem:
2011cb93a386Sopenharmony_ci * @font: #hb_font_t to work upon
2012cb93a386Sopenharmony_ci *
2013cb93a386Sopenharmony_ci * Fetches the "point size" of a font. Used in CoreText to
2014cb93a386Sopenharmony_ci * implement optical sizing.
2015cb93a386Sopenharmony_ci *
2016cb93a386Sopenharmony_ci * Return value: Point size.  A value of zero means "not set."
2017cb93a386Sopenharmony_ci *
2018cb93a386Sopenharmony_ci * Since: 0.9.2
2019cb93a386Sopenharmony_ci **/
2020cb93a386Sopenharmony_cifloat
2021cb93a386Sopenharmony_cihb_font_get_ptem (hb_font_t *font)
2022cb93a386Sopenharmony_ci{
2023cb93a386Sopenharmony_ci  return font->ptem;
2024cb93a386Sopenharmony_ci}
2025cb93a386Sopenharmony_ci
2026cb93a386Sopenharmony_ci#ifndef HB_NO_VAR
2027cb93a386Sopenharmony_ci/*
2028cb93a386Sopenharmony_ci * Variations
2029cb93a386Sopenharmony_ci */
2030cb93a386Sopenharmony_ci
2031cb93a386Sopenharmony_ci/**
2032cb93a386Sopenharmony_ci * hb_font_set_variations:
2033cb93a386Sopenharmony_ci * @font: #hb_font_t to work upon
2034cb93a386Sopenharmony_ci * @variations: (array length=variations_length): Array of variation settings to apply
2035cb93a386Sopenharmony_ci * @variations_length: Number of variations to apply
2036cb93a386Sopenharmony_ci *
2037cb93a386Sopenharmony_ci * Applies a list of font-variation settings to a font.
2038cb93a386Sopenharmony_ci *
2039cb93a386Sopenharmony_ci * Since: 1.4.2
2040cb93a386Sopenharmony_ci */
2041cb93a386Sopenharmony_civoid
2042cb93a386Sopenharmony_cihb_font_set_variations (hb_font_t            *font,
2043cb93a386Sopenharmony_ci			const hb_variation_t *variations,
2044cb93a386Sopenharmony_ci			unsigned int          variations_length)
2045cb93a386Sopenharmony_ci{
2046cb93a386Sopenharmony_ci  if (hb_object_is_immutable (font))
2047cb93a386Sopenharmony_ci    return;
2048cb93a386Sopenharmony_ci
2049cb93a386Sopenharmony_ci  if (!variations_length)
2050cb93a386Sopenharmony_ci  {
2051cb93a386Sopenharmony_ci    hb_font_set_var_coords_normalized (font, nullptr, 0);
2052cb93a386Sopenharmony_ci    return;
2053cb93a386Sopenharmony_ci  }
2054cb93a386Sopenharmony_ci
2055cb93a386Sopenharmony_ci  const OT::fvar &fvar = *font->face->table.fvar;
2056cb93a386Sopenharmony_ci  auto axes = fvar.get_axes ();
2057cb93a386Sopenharmony_ci  const unsigned coords_length = axes.length;
2058cb93a386Sopenharmony_ci
2059cb93a386Sopenharmony_ci  int *normalized = coords_length ? (int *) hb_calloc (coords_length, sizeof (int)) : nullptr;
2060cb93a386Sopenharmony_ci  float *design_coords = coords_length ? (float *) hb_calloc (coords_length, sizeof (float)) : nullptr;
2061cb93a386Sopenharmony_ci
2062cb93a386Sopenharmony_ci  if (unlikely (coords_length && !(normalized && design_coords)))
2063cb93a386Sopenharmony_ci  {
2064cb93a386Sopenharmony_ci    hb_free (normalized);
2065cb93a386Sopenharmony_ci    hb_free (design_coords);
2066cb93a386Sopenharmony_ci    return;
2067cb93a386Sopenharmony_ci  }
2068cb93a386Sopenharmony_ci
2069cb93a386Sopenharmony_ci  for (unsigned int i = 0; i < variations_length; i++)
2070cb93a386Sopenharmony_ci  {
2071cb93a386Sopenharmony_ci    const auto tag = variations[i].tag;
2072cb93a386Sopenharmony_ci    const auto v = variations[i].value;
2073cb93a386Sopenharmony_ci    for (unsigned axis_index = 0; axis_index < coords_length; axis_index++)
2074cb93a386Sopenharmony_ci      if (axes[axis_index].axisTag == tag)
2075cb93a386Sopenharmony_ci      {
2076cb93a386Sopenharmony_ci	design_coords[axis_index] = v;
2077cb93a386Sopenharmony_ci	normalized[axis_index] = fvar.normalize_axis_value (axis_index, v);
2078cb93a386Sopenharmony_ci      }
2079cb93a386Sopenharmony_ci  }
2080cb93a386Sopenharmony_ci  font->face->table.avar->map_coords (normalized, coords_length);
2081cb93a386Sopenharmony_ci
2082cb93a386Sopenharmony_ci  _hb_font_adopt_var_coords (font, normalized, design_coords, coords_length);
2083cb93a386Sopenharmony_ci}
2084cb93a386Sopenharmony_ci
2085cb93a386Sopenharmony_ci/**
2086cb93a386Sopenharmony_ci * hb_font_set_var_coords_design:
2087cb93a386Sopenharmony_ci * @font: #hb_font_t to work upon
2088cb93a386Sopenharmony_ci * @coords: (array length=coords_length): Array of variation coordinates to apply
2089cb93a386Sopenharmony_ci * @coords_length: Number of coordinates to apply
2090cb93a386Sopenharmony_ci *
2091cb93a386Sopenharmony_ci * Applies a list of variation coordinates (in design-space units)
2092cb93a386Sopenharmony_ci * to a font.
2093cb93a386Sopenharmony_ci *
2094cb93a386Sopenharmony_ci * Since: 1.4.2
2095cb93a386Sopenharmony_ci */
2096cb93a386Sopenharmony_civoid
2097cb93a386Sopenharmony_cihb_font_set_var_coords_design (hb_font_t    *font,
2098cb93a386Sopenharmony_ci			       const float  *coords,
2099cb93a386Sopenharmony_ci			       unsigned int  coords_length)
2100cb93a386Sopenharmony_ci{
2101cb93a386Sopenharmony_ci  if (hb_object_is_immutable (font))
2102cb93a386Sopenharmony_ci    return;
2103cb93a386Sopenharmony_ci
2104cb93a386Sopenharmony_ci  int *normalized = coords_length ? (int *) hb_calloc (coords_length, sizeof (int)) : nullptr;
2105cb93a386Sopenharmony_ci  float *design_coords = coords_length ? (float *) hb_calloc (coords_length, sizeof (float)) : nullptr;
2106cb93a386Sopenharmony_ci
2107cb93a386Sopenharmony_ci  if (unlikely (coords_length && !(normalized && design_coords)))
2108cb93a386Sopenharmony_ci  {
2109cb93a386Sopenharmony_ci    hb_free (normalized);
2110cb93a386Sopenharmony_ci    hb_free (design_coords);
2111cb93a386Sopenharmony_ci    return;
2112cb93a386Sopenharmony_ci  }
2113cb93a386Sopenharmony_ci
2114cb93a386Sopenharmony_ci  if (coords_length)
2115cb93a386Sopenharmony_ci    memcpy (design_coords, coords, coords_length * sizeof (font->design_coords[0]));
2116cb93a386Sopenharmony_ci
2117cb93a386Sopenharmony_ci  hb_ot_var_normalize_coords (font->face, coords_length, coords, normalized);
2118cb93a386Sopenharmony_ci  _hb_font_adopt_var_coords (font, normalized, design_coords, coords_length);
2119cb93a386Sopenharmony_ci}
2120cb93a386Sopenharmony_ci
2121cb93a386Sopenharmony_ci/**
2122cb93a386Sopenharmony_ci * hb_font_set_var_named_instance:
2123cb93a386Sopenharmony_ci * @font: a font.
2124cb93a386Sopenharmony_ci * @instance_index: named instance index.
2125cb93a386Sopenharmony_ci *
2126cb93a386Sopenharmony_ci * Sets design coords of a font from a named instance index.
2127cb93a386Sopenharmony_ci *
2128cb93a386Sopenharmony_ci * Since: 2.6.0
2129cb93a386Sopenharmony_ci */
2130cb93a386Sopenharmony_civoid
2131cb93a386Sopenharmony_cihb_font_set_var_named_instance (hb_font_t *font,
2132cb93a386Sopenharmony_ci				unsigned instance_index)
2133cb93a386Sopenharmony_ci{
2134cb93a386Sopenharmony_ci  if (hb_object_is_immutable (font))
2135cb93a386Sopenharmony_ci    return;
2136cb93a386Sopenharmony_ci
2137cb93a386Sopenharmony_ci  unsigned int coords_length = hb_ot_var_named_instance_get_design_coords (font->face, instance_index, nullptr, nullptr);
2138cb93a386Sopenharmony_ci
2139cb93a386Sopenharmony_ci  float *coords = coords_length ? (float *) hb_calloc (coords_length, sizeof (float)) : nullptr;
2140cb93a386Sopenharmony_ci  if (unlikely (coords_length && !coords))
2141cb93a386Sopenharmony_ci    return;
2142cb93a386Sopenharmony_ci
2143cb93a386Sopenharmony_ci  hb_ot_var_named_instance_get_design_coords (font->face, instance_index, &coords_length, coords);
2144cb93a386Sopenharmony_ci  hb_font_set_var_coords_design (font, coords, coords_length);
2145cb93a386Sopenharmony_ci  hb_free (coords);
2146cb93a386Sopenharmony_ci}
2147cb93a386Sopenharmony_ci
2148cb93a386Sopenharmony_ci/**
2149cb93a386Sopenharmony_ci * hb_font_set_var_coords_normalized:
2150cb93a386Sopenharmony_ci * @font: #hb_font_t to work upon
2151cb93a386Sopenharmony_ci * @coords: (array length=coords_length): Array of variation coordinates to apply
2152cb93a386Sopenharmony_ci * @coords_length: Number of coordinates to apply
2153cb93a386Sopenharmony_ci *
2154cb93a386Sopenharmony_ci * Applies a list of variation coordinates (in normalized units)
2155cb93a386Sopenharmony_ci * to a font.
2156cb93a386Sopenharmony_ci *
2157cb93a386Sopenharmony_ci * <note>Note: Coordinates should be normalized to 2.14.</note>
2158cb93a386Sopenharmony_ci *
2159cb93a386Sopenharmony_ci * Since: 1.4.2
2160cb93a386Sopenharmony_ci */
2161cb93a386Sopenharmony_civoid
2162cb93a386Sopenharmony_cihb_font_set_var_coords_normalized (hb_font_t    *font,
2163cb93a386Sopenharmony_ci				   const int    *coords, /* 2.14 normalized */
2164cb93a386Sopenharmony_ci				   unsigned int  coords_length)
2165cb93a386Sopenharmony_ci{
2166cb93a386Sopenharmony_ci  if (hb_object_is_immutable (font))
2167cb93a386Sopenharmony_ci    return;
2168cb93a386Sopenharmony_ci
2169cb93a386Sopenharmony_ci  int *copy = coords_length ? (int *) hb_calloc (coords_length, sizeof (coords[0])) : nullptr;
2170cb93a386Sopenharmony_ci  int *unmapped = coords_length ? (int *) hb_calloc (coords_length, sizeof (coords[0])) : nullptr;
2171cb93a386Sopenharmony_ci  float *design_coords = coords_length ? (float *) hb_calloc (coords_length, sizeof (design_coords[0])) : nullptr;
2172cb93a386Sopenharmony_ci
2173cb93a386Sopenharmony_ci  if (unlikely (coords_length && !(copy && unmapped && design_coords)))
2174cb93a386Sopenharmony_ci  {
2175cb93a386Sopenharmony_ci    hb_free (copy);
2176cb93a386Sopenharmony_ci    hb_free (unmapped);
2177cb93a386Sopenharmony_ci    hb_free (design_coords);
2178cb93a386Sopenharmony_ci    return;
2179cb93a386Sopenharmony_ci  }
2180cb93a386Sopenharmony_ci
2181cb93a386Sopenharmony_ci  if (coords_length)
2182cb93a386Sopenharmony_ci  {
2183cb93a386Sopenharmony_ci    memcpy (copy, coords, coords_length * sizeof (coords[0]));
2184cb93a386Sopenharmony_ci    memcpy (unmapped, coords, coords_length * sizeof (coords[0]));
2185cb93a386Sopenharmony_ci  }
2186cb93a386Sopenharmony_ci
2187cb93a386Sopenharmony_ci  /* Best effort design coords simulation */
2188cb93a386Sopenharmony_ci  font->face->table.avar->unmap_coords (unmapped, coords_length);
2189cb93a386Sopenharmony_ci  for (unsigned int i = 0; i < coords_length; ++i)
2190cb93a386Sopenharmony_ci    design_coords[i] = font->face->table.fvar->unnormalize_axis_value (i, unmapped[i]);
2191cb93a386Sopenharmony_ci  hb_free (unmapped);
2192cb93a386Sopenharmony_ci
2193cb93a386Sopenharmony_ci  _hb_font_adopt_var_coords (font, copy, design_coords, coords_length);
2194cb93a386Sopenharmony_ci}
2195cb93a386Sopenharmony_ci
2196cb93a386Sopenharmony_ci/**
2197cb93a386Sopenharmony_ci * hb_font_get_var_coords_normalized:
2198cb93a386Sopenharmony_ci * @font: #hb_font_t to work upon
2199cb93a386Sopenharmony_ci * @length: Number of coordinates retrieved
2200cb93a386Sopenharmony_ci *
2201cb93a386Sopenharmony_ci * Fetches the list of normalized variation coordinates currently
2202cb93a386Sopenharmony_ci * set on a font.
2203cb93a386Sopenharmony_ci *
2204cb93a386Sopenharmony_ci * Return value is valid as long as variation coordinates of the font
2205cb93a386Sopenharmony_ci * are not modified.
2206cb93a386Sopenharmony_ci *
2207cb93a386Sopenharmony_ci * Since: 1.4.2
2208cb93a386Sopenharmony_ci */
2209cb93a386Sopenharmony_ciconst int *
2210cb93a386Sopenharmony_cihb_font_get_var_coords_normalized (hb_font_t    *font,
2211cb93a386Sopenharmony_ci				   unsigned int *length)
2212cb93a386Sopenharmony_ci{
2213cb93a386Sopenharmony_ci  if (length)
2214cb93a386Sopenharmony_ci    *length = font->num_coords;
2215cb93a386Sopenharmony_ci
2216cb93a386Sopenharmony_ci  return font->coords;
2217cb93a386Sopenharmony_ci}
2218cb93a386Sopenharmony_ci
2219cb93a386Sopenharmony_ci#ifdef HB_EXPERIMENTAL_API
2220cb93a386Sopenharmony_ci/**
2221cb93a386Sopenharmony_ci * hb_font_get_var_coords_design:
2222cb93a386Sopenharmony_ci * @font: #hb_font_t to work upon
2223cb93a386Sopenharmony_ci * @length: (out): number of coordinates
2224cb93a386Sopenharmony_ci *
2225cb93a386Sopenharmony_ci * Return value is valid as long as variation coordinates of the font
2226cb93a386Sopenharmony_ci * are not modified.
2227cb93a386Sopenharmony_ci *
2228cb93a386Sopenharmony_ci * Return value: coordinates array
2229cb93a386Sopenharmony_ci *
2230cb93a386Sopenharmony_ci * Since: EXPERIMENTAL
2231cb93a386Sopenharmony_ci */
2232cb93a386Sopenharmony_ciconst float *
2233cb93a386Sopenharmony_cihb_font_get_var_coords_design (hb_font_t *font,
2234cb93a386Sopenharmony_ci			       unsigned int *length)
2235cb93a386Sopenharmony_ci{
2236cb93a386Sopenharmony_ci  if (length)
2237cb93a386Sopenharmony_ci    *length = font->num_coords;
2238cb93a386Sopenharmony_ci
2239cb93a386Sopenharmony_ci  return font->design_coords;
2240cb93a386Sopenharmony_ci}
2241cb93a386Sopenharmony_ci#endif
2242cb93a386Sopenharmony_ci#endif
2243cb93a386Sopenharmony_ci
2244cb93a386Sopenharmony_ci#ifndef HB_DISABLE_DEPRECATED
2245cb93a386Sopenharmony_ci/*
2246cb93a386Sopenharmony_ci * Deprecated get_glyph_func():
2247cb93a386Sopenharmony_ci */
2248cb93a386Sopenharmony_ci
2249cb93a386Sopenharmony_cistruct hb_trampoline_closure_t
2250cb93a386Sopenharmony_ci{
2251cb93a386Sopenharmony_ci  void *user_data;
2252cb93a386Sopenharmony_ci  hb_destroy_func_t destroy;
2253cb93a386Sopenharmony_ci  unsigned int ref_count;
2254cb93a386Sopenharmony_ci};
2255cb93a386Sopenharmony_ci
2256cb93a386Sopenharmony_citemplate <typename FuncType>
2257cb93a386Sopenharmony_cistruct hb_trampoline_t
2258cb93a386Sopenharmony_ci{
2259cb93a386Sopenharmony_ci  hb_trampoline_closure_t closure; /* Must be first. */
2260cb93a386Sopenharmony_ci  FuncType func;
2261cb93a386Sopenharmony_ci};
2262cb93a386Sopenharmony_ci
2263cb93a386Sopenharmony_citemplate <typename FuncType>
2264cb93a386Sopenharmony_cistatic hb_trampoline_t<FuncType> *
2265cb93a386Sopenharmony_citrampoline_create (FuncType           func,
2266cb93a386Sopenharmony_ci		   void              *user_data,
2267cb93a386Sopenharmony_ci		   hb_destroy_func_t  destroy)
2268cb93a386Sopenharmony_ci{
2269cb93a386Sopenharmony_ci  typedef hb_trampoline_t<FuncType> trampoline_t;
2270cb93a386Sopenharmony_ci
2271cb93a386Sopenharmony_ci  trampoline_t *trampoline = (trampoline_t *) hb_calloc (1, sizeof (trampoline_t));
2272cb93a386Sopenharmony_ci
2273cb93a386Sopenharmony_ci  if (unlikely (!trampoline))
2274cb93a386Sopenharmony_ci    return nullptr;
2275cb93a386Sopenharmony_ci
2276cb93a386Sopenharmony_ci  trampoline->closure.user_data = user_data;
2277cb93a386Sopenharmony_ci  trampoline->closure.destroy = destroy;
2278cb93a386Sopenharmony_ci  trampoline->closure.ref_count = 1;
2279cb93a386Sopenharmony_ci  trampoline->func = func;
2280cb93a386Sopenharmony_ci
2281cb93a386Sopenharmony_ci  return trampoline;
2282cb93a386Sopenharmony_ci}
2283cb93a386Sopenharmony_ci
2284cb93a386Sopenharmony_cistatic void
2285cb93a386Sopenharmony_citrampoline_reference (hb_trampoline_closure_t *closure)
2286cb93a386Sopenharmony_ci{
2287cb93a386Sopenharmony_ci  closure->ref_count++;
2288cb93a386Sopenharmony_ci}
2289cb93a386Sopenharmony_ci
2290cb93a386Sopenharmony_cistatic void
2291cb93a386Sopenharmony_citrampoline_destroy (void *user_data)
2292cb93a386Sopenharmony_ci{
2293cb93a386Sopenharmony_ci  hb_trampoline_closure_t *closure = (hb_trampoline_closure_t *) user_data;
2294cb93a386Sopenharmony_ci
2295cb93a386Sopenharmony_ci  if (--closure->ref_count)
2296cb93a386Sopenharmony_ci    return;
2297cb93a386Sopenharmony_ci
2298cb93a386Sopenharmony_ci  if (closure->destroy)
2299cb93a386Sopenharmony_ci    closure->destroy (closure->user_data);
2300cb93a386Sopenharmony_ci  hb_free (closure);
2301cb93a386Sopenharmony_ci}
2302cb93a386Sopenharmony_ci
2303cb93a386Sopenharmony_citypedef hb_trampoline_t<hb_font_get_glyph_func_t> hb_font_get_glyph_trampoline_t;
2304cb93a386Sopenharmony_ci
2305cb93a386Sopenharmony_cistatic hb_bool_t
2306cb93a386Sopenharmony_cihb_font_get_nominal_glyph_trampoline (hb_font_t      *font,
2307cb93a386Sopenharmony_ci				      void           *font_data,
2308cb93a386Sopenharmony_ci				      hb_codepoint_t  unicode,
2309cb93a386Sopenharmony_ci				      hb_codepoint_t *glyph,
2310cb93a386Sopenharmony_ci				      void           *user_data)
2311cb93a386Sopenharmony_ci{
2312cb93a386Sopenharmony_ci  hb_font_get_glyph_trampoline_t *trampoline = (hb_font_get_glyph_trampoline_t *) user_data;
2313cb93a386Sopenharmony_ci  return trampoline->func (font, font_data, unicode, 0, glyph, trampoline->closure.user_data);
2314cb93a386Sopenharmony_ci}
2315cb93a386Sopenharmony_ci
2316cb93a386Sopenharmony_cistatic hb_bool_t
2317cb93a386Sopenharmony_cihb_font_get_variation_glyph_trampoline (hb_font_t      *font,
2318cb93a386Sopenharmony_ci					void           *font_data,
2319cb93a386Sopenharmony_ci					hb_codepoint_t  unicode,
2320cb93a386Sopenharmony_ci					hb_codepoint_t  variation_selector,
2321cb93a386Sopenharmony_ci					hb_codepoint_t *glyph,
2322cb93a386Sopenharmony_ci					void           *user_data)
2323cb93a386Sopenharmony_ci{
2324cb93a386Sopenharmony_ci  hb_font_get_glyph_trampoline_t *trampoline = (hb_font_get_glyph_trampoline_t *) user_data;
2325cb93a386Sopenharmony_ci  return trampoline->func (font, font_data, unicode, variation_selector, glyph, trampoline->closure.user_data);
2326cb93a386Sopenharmony_ci}
2327cb93a386Sopenharmony_ci
2328cb93a386Sopenharmony_ci/**
2329cb93a386Sopenharmony_ci * hb_font_funcs_set_glyph_func:
2330cb93a386Sopenharmony_ci * @ffuncs: The font-functions structure
2331cb93a386Sopenharmony_ci * @func: (closure user_data) (destroy destroy) (scope notified): callback function
2332cb93a386Sopenharmony_ci * @user_data: data to pass to @func
2333cb93a386Sopenharmony_ci * @destroy: (nullable): function to call when @user_data is not needed anymore
2334cb93a386Sopenharmony_ci *
2335cb93a386Sopenharmony_ci * Deprecated.  Use hb_font_funcs_set_nominal_glyph_func() and
2336cb93a386Sopenharmony_ci * hb_font_funcs_set_variation_glyph_func() instead.
2337cb93a386Sopenharmony_ci *
2338cb93a386Sopenharmony_ci * Since: 0.9.2
2339cb93a386Sopenharmony_ci * Deprecated: 1.2.3
2340cb93a386Sopenharmony_ci **/
2341cb93a386Sopenharmony_civoid
2342cb93a386Sopenharmony_cihb_font_funcs_set_glyph_func (hb_font_funcs_t          *ffuncs,
2343cb93a386Sopenharmony_ci			      hb_font_get_glyph_func_t  func,
2344cb93a386Sopenharmony_ci			      void                     *user_data,
2345cb93a386Sopenharmony_ci			      hb_destroy_func_t         destroy /* May be NULL. */)
2346cb93a386Sopenharmony_ci{
2347cb93a386Sopenharmony_ci  if (hb_object_is_immutable (ffuncs))
2348cb93a386Sopenharmony_ci  {
2349cb93a386Sopenharmony_ci    if (destroy)
2350cb93a386Sopenharmony_ci      destroy (user_data);
2351cb93a386Sopenharmony_ci    return;
2352cb93a386Sopenharmony_ci  }
2353cb93a386Sopenharmony_ci
2354cb93a386Sopenharmony_ci  hb_font_get_glyph_trampoline_t *trampoline;
2355cb93a386Sopenharmony_ci
2356cb93a386Sopenharmony_ci  trampoline = trampoline_create (func, user_data, destroy);
2357cb93a386Sopenharmony_ci  if (unlikely (!trampoline))
2358cb93a386Sopenharmony_ci  {
2359cb93a386Sopenharmony_ci    if (destroy)
2360cb93a386Sopenharmony_ci      destroy (user_data);
2361cb93a386Sopenharmony_ci    return;
2362cb93a386Sopenharmony_ci  }
2363cb93a386Sopenharmony_ci
2364cb93a386Sopenharmony_ci  hb_font_funcs_set_nominal_glyph_func (ffuncs,
2365cb93a386Sopenharmony_ci					hb_font_get_nominal_glyph_trampoline,
2366cb93a386Sopenharmony_ci					trampoline,
2367cb93a386Sopenharmony_ci					trampoline_destroy);
2368cb93a386Sopenharmony_ci
2369cb93a386Sopenharmony_ci  trampoline_reference (&trampoline->closure);
2370cb93a386Sopenharmony_ci  hb_font_funcs_set_variation_glyph_func (ffuncs,
2371cb93a386Sopenharmony_ci					  hb_font_get_variation_glyph_trampoline,
2372cb93a386Sopenharmony_ci					  trampoline,
2373cb93a386Sopenharmony_ci					  trampoline_destroy);
2374cb93a386Sopenharmony_ci}
2375cb93a386Sopenharmony_ci#endif
2376