1*2d1272b8SAndroid Build Coastguard Worker /*
2*2d1272b8SAndroid Build Coastguard Worker * Copyright © 2009 Red Hat, Inc.
3*2d1272b8SAndroid Build Coastguard Worker * Copyright © 2012 Google, Inc.
4*2d1272b8SAndroid Build Coastguard Worker *
5*2d1272b8SAndroid Build Coastguard Worker * This is part of HarfBuzz, a text shaping library.
6*2d1272b8SAndroid Build Coastguard Worker *
7*2d1272b8SAndroid Build Coastguard Worker * Permission is hereby granted, without written agreement and without
8*2d1272b8SAndroid Build Coastguard Worker * license or royalty fees, to use, copy, modify, and distribute this
9*2d1272b8SAndroid Build Coastguard Worker * software and its documentation for any purpose, provided that the
10*2d1272b8SAndroid Build Coastguard Worker * above copyright notice and the following two paragraphs appear in
11*2d1272b8SAndroid Build Coastguard Worker * all copies of this software.
12*2d1272b8SAndroid Build Coastguard Worker *
13*2d1272b8SAndroid Build Coastguard Worker * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
14*2d1272b8SAndroid Build Coastguard Worker * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
15*2d1272b8SAndroid Build Coastguard Worker * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
16*2d1272b8SAndroid Build Coastguard Worker * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
17*2d1272b8SAndroid Build Coastguard Worker * DAMAGE.
18*2d1272b8SAndroid Build Coastguard Worker *
19*2d1272b8SAndroid Build Coastguard Worker * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
20*2d1272b8SAndroid Build Coastguard Worker * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
21*2d1272b8SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
22*2d1272b8SAndroid Build Coastguard Worker * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
23*2d1272b8SAndroid Build Coastguard Worker * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
24*2d1272b8SAndroid Build Coastguard Worker *
25*2d1272b8SAndroid Build Coastguard Worker * Red Hat Author(s): Behdad Esfahbod
26*2d1272b8SAndroid Build Coastguard Worker * Google Author(s): Behdad Esfahbod
27*2d1272b8SAndroid Build Coastguard Worker */
28*2d1272b8SAndroid Build Coastguard Worker
29*2d1272b8SAndroid Build Coastguard Worker #include "hb.hh"
30*2d1272b8SAndroid Build Coastguard Worker
31*2d1272b8SAndroid Build Coastguard Worker #include "hb-font.hh"
32*2d1272b8SAndroid Build Coastguard Worker #include "hb-draw.hh"
33*2d1272b8SAndroid Build Coastguard Worker #include "hb-paint.hh"
34*2d1272b8SAndroid Build Coastguard Worker #include "hb-machinery.hh"
35*2d1272b8SAndroid Build Coastguard Worker
36*2d1272b8SAndroid Build Coastguard Worker #include "hb-ot.h"
37*2d1272b8SAndroid Build Coastguard Worker
38*2d1272b8SAndroid Build Coastguard Worker #include "hb-ot-var-avar-table.hh"
39*2d1272b8SAndroid Build Coastguard Worker #include "hb-ot-var-fvar-table.hh"
40*2d1272b8SAndroid Build Coastguard Worker
41*2d1272b8SAndroid Build Coastguard Worker
42*2d1272b8SAndroid Build Coastguard Worker /**
43*2d1272b8SAndroid Build Coastguard Worker * SECTION:hb-font
44*2d1272b8SAndroid Build Coastguard Worker * @title: hb-font
45*2d1272b8SAndroid Build Coastguard Worker * @short_description: Font objects
46*2d1272b8SAndroid Build Coastguard Worker * @include: hb.h
47*2d1272b8SAndroid Build Coastguard Worker *
48*2d1272b8SAndroid Build Coastguard Worker * Functions for working with font objects.
49*2d1272b8SAndroid Build Coastguard Worker *
50*2d1272b8SAndroid Build Coastguard Worker * A font object represents a font face at a specific size and with
51*2d1272b8SAndroid Build Coastguard Worker * certain other parameters (pixels-per-em, points-per-em, variation
52*2d1272b8SAndroid Build Coastguard Worker * settings) specified. Font objects are created from font face
53*2d1272b8SAndroid Build Coastguard Worker * objects, and are used as input to hb_shape(), among other things.
54*2d1272b8SAndroid Build Coastguard Worker *
55*2d1272b8SAndroid Build Coastguard Worker * Client programs can optionally pass in their own functions that
56*2d1272b8SAndroid Build Coastguard Worker * implement the basic, lower-level queries of font objects. This set
57*2d1272b8SAndroid Build Coastguard Worker * of font functions is defined by the virtual methods in
58*2d1272b8SAndroid Build Coastguard Worker * #hb_font_funcs_t.
59*2d1272b8SAndroid Build Coastguard Worker *
60*2d1272b8SAndroid Build Coastguard Worker * HarfBuzz provides a built-in set of lightweight default
61*2d1272b8SAndroid Build Coastguard Worker * functions for each method in #hb_font_funcs_t.
62*2d1272b8SAndroid Build Coastguard Worker *
63*2d1272b8SAndroid Build Coastguard Worker * The default font functions are implemented in terms of the
64*2d1272b8SAndroid Build Coastguard Worker * #hb_font_funcs_t methods of the parent font object. This allows
65*2d1272b8SAndroid Build Coastguard Worker * client programs to override only the methods they need to, and
66*2d1272b8SAndroid Build Coastguard Worker * otherwise inherit the parent font's implementation, if any.
67*2d1272b8SAndroid Build Coastguard Worker **/
68*2d1272b8SAndroid Build Coastguard Worker
69*2d1272b8SAndroid Build Coastguard Worker
70*2d1272b8SAndroid Build Coastguard Worker /*
71*2d1272b8SAndroid Build Coastguard Worker * hb_font_funcs_t
72*2d1272b8SAndroid Build Coastguard Worker */
73*2d1272b8SAndroid Build Coastguard Worker
74*2d1272b8SAndroid Build Coastguard Worker static hb_bool_t
hb_font_get_font_h_extents_nil(hb_font_t * font HB_UNUSED,void * font_data HB_UNUSED,hb_font_extents_t * extents,void * user_data HB_UNUSED)75*2d1272b8SAndroid Build Coastguard Worker hb_font_get_font_h_extents_nil (hb_font_t *font HB_UNUSED,
76*2d1272b8SAndroid Build Coastguard Worker void *font_data HB_UNUSED,
77*2d1272b8SAndroid Build Coastguard Worker hb_font_extents_t *extents,
78*2d1272b8SAndroid Build Coastguard Worker void *user_data HB_UNUSED)
79*2d1272b8SAndroid Build Coastguard Worker {
80*2d1272b8SAndroid Build Coastguard Worker hb_memset (extents, 0, sizeof (*extents));
81*2d1272b8SAndroid Build Coastguard Worker return false;
82*2d1272b8SAndroid Build Coastguard Worker }
83*2d1272b8SAndroid Build Coastguard Worker
84*2d1272b8SAndroid Build Coastguard Worker static hb_bool_t
hb_font_get_font_h_extents_default(hb_font_t * font,void * font_data HB_UNUSED,hb_font_extents_t * extents,void * user_data HB_UNUSED)85*2d1272b8SAndroid Build Coastguard Worker hb_font_get_font_h_extents_default (hb_font_t *font,
86*2d1272b8SAndroid Build Coastguard Worker void *font_data HB_UNUSED,
87*2d1272b8SAndroid Build Coastguard Worker hb_font_extents_t *extents,
88*2d1272b8SAndroid Build Coastguard Worker void *user_data HB_UNUSED)
89*2d1272b8SAndroid Build Coastguard Worker {
90*2d1272b8SAndroid Build Coastguard Worker hb_bool_t ret = font->parent->get_font_h_extents (extents);
91*2d1272b8SAndroid Build Coastguard Worker if (ret) {
92*2d1272b8SAndroid Build Coastguard Worker extents->ascender = font->parent_scale_y_distance (extents->ascender);
93*2d1272b8SAndroid Build Coastguard Worker extents->descender = font->parent_scale_y_distance (extents->descender);
94*2d1272b8SAndroid Build Coastguard Worker extents->line_gap = font->parent_scale_y_distance (extents->line_gap);
95*2d1272b8SAndroid Build Coastguard Worker }
96*2d1272b8SAndroid Build Coastguard Worker return ret;
97*2d1272b8SAndroid Build Coastguard Worker }
98*2d1272b8SAndroid Build Coastguard Worker
99*2d1272b8SAndroid Build Coastguard Worker static hb_bool_t
hb_font_get_font_v_extents_nil(hb_font_t * font HB_UNUSED,void * font_data HB_UNUSED,hb_font_extents_t * extents,void * user_data HB_UNUSED)100*2d1272b8SAndroid Build Coastguard Worker hb_font_get_font_v_extents_nil (hb_font_t *font HB_UNUSED,
101*2d1272b8SAndroid Build Coastguard Worker void *font_data HB_UNUSED,
102*2d1272b8SAndroid Build Coastguard Worker hb_font_extents_t *extents,
103*2d1272b8SAndroid Build Coastguard Worker void *user_data HB_UNUSED)
104*2d1272b8SAndroid Build Coastguard Worker {
105*2d1272b8SAndroid Build Coastguard Worker hb_memset (extents, 0, sizeof (*extents));
106*2d1272b8SAndroid Build Coastguard Worker return false;
107*2d1272b8SAndroid Build Coastguard Worker }
108*2d1272b8SAndroid Build Coastguard Worker
109*2d1272b8SAndroid Build Coastguard Worker static hb_bool_t
hb_font_get_font_v_extents_default(hb_font_t * font,void * font_data HB_UNUSED,hb_font_extents_t * extents,void * user_data HB_UNUSED)110*2d1272b8SAndroid Build Coastguard Worker hb_font_get_font_v_extents_default (hb_font_t *font,
111*2d1272b8SAndroid Build Coastguard Worker void *font_data HB_UNUSED,
112*2d1272b8SAndroid Build Coastguard Worker hb_font_extents_t *extents,
113*2d1272b8SAndroid Build Coastguard Worker void *user_data HB_UNUSED)
114*2d1272b8SAndroid Build Coastguard Worker {
115*2d1272b8SAndroid Build Coastguard Worker hb_bool_t ret = font->parent->get_font_v_extents (extents);
116*2d1272b8SAndroid Build Coastguard Worker if (ret) {
117*2d1272b8SAndroid Build Coastguard Worker extents->ascender = font->parent_scale_x_distance (extents->ascender);
118*2d1272b8SAndroid Build Coastguard Worker extents->descender = font->parent_scale_x_distance (extents->descender);
119*2d1272b8SAndroid Build Coastguard Worker extents->line_gap = font->parent_scale_x_distance (extents->line_gap);
120*2d1272b8SAndroid Build Coastguard Worker }
121*2d1272b8SAndroid Build Coastguard Worker return ret;
122*2d1272b8SAndroid Build Coastguard Worker }
123*2d1272b8SAndroid Build Coastguard Worker
124*2d1272b8SAndroid Build Coastguard Worker static hb_bool_t
hb_font_get_nominal_glyph_nil(hb_font_t * font HB_UNUSED,void * font_data HB_UNUSED,hb_codepoint_t unicode HB_UNUSED,hb_codepoint_t * glyph,void * user_data HB_UNUSED)125*2d1272b8SAndroid Build Coastguard Worker hb_font_get_nominal_glyph_nil (hb_font_t *font HB_UNUSED,
126*2d1272b8SAndroid Build Coastguard Worker void *font_data HB_UNUSED,
127*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t unicode HB_UNUSED,
128*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t *glyph,
129*2d1272b8SAndroid Build Coastguard Worker void *user_data HB_UNUSED)
130*2d1272b8SAndroid Build Coastguard Worker {
131*2d1272b8SAndroid Build Coastguard Worker *glyph = 0;
132*2d1272b8SAndroid Build Coastguard Worker return false;
133*2d1272b8SAndroid Build Coastguard Worker }
134*2d1272b8SAndroid Build Coastguard Worker
135*2d1272b8SAndroid Build Coastguard Worker static hb_bool_t
hb_font_get_nominal_glyph_default(hb_font_t * font,void * font_data HB_UNUSED,hb_codepoint_t unicode,hb_codepoint_t * glyph,void * user_data HB_UNUSED)136*2d1272b8SAndroid Build Coastguard Worker hb_font_get_nominal_glyph_default (hb_font_t *font,
137*2d1272b8SAndroid Build Coastguard Worker void *font_data HB_UNUSED,
138*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t unicode,
139*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t *glyph,
140*2d1272b8SAndroid Build Coastguard Worker void *user_data HB_UNUSED)
141*2d1272b8SAndroid Build Coastguard Worker {
142*2d1272b8SAndroid Build Coastguard Worker if (font->has_nominal_glyphs_func_set ())
143*2d1272b8SAndroid Build Coastguard Worker {
144*2d1272b8SAndroid Build Coastguard Worker return font->get_nominal_glyphs (1, &unicode, 0, glyph, 0);
145*2d1272b8SAndroid Build Coastguard Worker }
146*2d1272b8SAndroid Build Coastguard Worker return font->parent->get_nominal_glyph (unicode, glyph);
147*2d1272b8SAndroid Build Coastguard Worker }
148*2d1272b8SAndroid Build Coastguard Worker
149*2d1272b8SAndroid Build Coastguard Worker #define hb_font_get_nominal_glyphs_nil hb_font_get_nominal_glyphs_default
150*2d1272b8SAndroid Build Coastguard Worker
151*2d1272b8SAndroid Build Coastguard Worker static unsigned int
hb_font_get_nominal_glyphs_default(hb_font_t * font,void * font_data HB_UNUSED,unsigned int count,const hb_codepoint_t * first_unicode,unsigned int unicode_stride,hb_codepoint_t * first_glyph,unsigned int glyph_stride,void * user_data HB_UNUSED)152*2d1272b8SAndroid Build Coastguard Worker hb_font_get_nominal_glyphs_default (hb_font_t *font,
153*2d1272b8SAndroid Build Coastguard Worker void *font_data HB_UNUSED,
154*2d1272b8SAndroid Build Coastguard Worker unsigned int count,
155*2d1272b8SAndroid Build Coastguard Worker const hb_codepoint_t *first_unicode,
156*2d1272b8SAndroid Build Coastguard Worker unsigned int unicode_stride,
157*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t *first_glyph,
158*2d1272b8SAndroid Build Coastguard Worker unsigned int glyph_stride,
159*2d1272b8SAndroid Build Coastguard Worker void *user_data HB_UNUSED)
160*2d1272b8SAndroid Build Coastguard Worker {
161*2d1272b8SAndroid Build Coastguard Worker if (font->has_nominal_glyph_func_set ())
162*2d1272b8SAndroid Build Coastguard Worker {
163*2d1272b8SAndroid Build Coastguard Worker for (unsigned int i = 0; i < count; i++)
164*2d1272b8SAndroid Build Coastguard Worker {
165*2d1272b8SAndroid Build Coastguard Worker if (!font->get_nominal_glyph (*first_unicode, first_glyph))
166*2d1272b8SAndroid Build Coastguard Worker return i;
167*2d1272b8SAndroid Build Coastguard Worker
168*2d1272b8SAndroid Build Coastguard Worker first_unicode = &StructAtOffsetUnaligned<hb_codepoint_t> (first_unicode, unicode_stride);
169*2d1272b8SAndroid Build Coastguard Worker first_glyph = &StructAtOffsetUnaligned<hb_codepoint_t> (first_glyph, glyph_stride);
170*2d1272b8SAndroid Build Coastguard Worker }
171*2d1272b8SAndroid Build Coastguard Worker return count;
172*2d1272b8SAndroid Build Coastguard Worker }
173*2d1272b8SAndroid Build Coastguard Worker
174*2d1272b8SAndroid Build Coastguard Worker return font->parent->get_nominal_glyphs (count,
175*2d1272b8SAndroid Build Coastguard Worker first_unicode, unicode_stride,
176*2d1272b8SAndroid Build Coastguard Worker first_glyph, glyph_stride);
177*2d1272b8SAndroid Build Coastguard Worker }
178*2d1272b8SAndroid Build Coastguard Worker
179*2d1272b8SAndroid Build Coastguard Worker static hb_bool_t
hb_font_get_variation_glyph_nil(hb_font_t * font HB_UNUSED,void * font_data HB_UNUSED,hb_codepoint_t unicode HB_UNUSED,hb_codepoint_t variation_selector HB_UNUSED,hb_codepoint_t * glyph,void * user_data HB_UNUSED)180*2d1272b8SAndroid Build Coastguard Worker hb_font_get_variation_glyph_nil (hb_font_t *font HB_UNUSED,
181*2d1272b8SAndroid Build Coastguard Worker void *font_data HB_UNUSED,
182*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t unicode HB_UNUSED,
183*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t variation_selector HB_UNUSED,
184*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t *glyph,
185*2d1272b8SAndroid Build Coastguard Worker void *user_data HB_UNUSED)
186*2d1272b8SAndroid Build Coastguard Worker {
187*2d1272b8SAndroid Build Coastguard Worker *glyph = 0;
188*2d1272b8SAndroid Build Coastguard Worker return false;
189*2d1272b8SAndroid Build Coastguard Worker }
190*2d1272b8SAndroid Build Coastguard Worker
191*2d1272b8SAndroid Build Coastguard Worker static hb_bool_t
hb_font_get_variation_glyph_default(hb_font_t * font,void * font_data HB_UNUSED,hb_codepoint_t unicode,hb_codepoint_t variation_selector,hb_codepoint_t * glyph,void * user_data HB_UNUSED)192*2d1272b8SAndroid Build Coastguard Worker hb_font_get_variation_glyph_default (hb_font_t *font,
193*2d1272b8SAndroid Build Coastguard Worker void *font_data HB_UNUSED,
194*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t unicode,
195*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t variation_selector,
196*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t *glyph,
197*2d1272b8SAndroid Build Coastguard Worker void *user_data HB_UNUSED)
198*2d1272b8SAndroid Build Coastguard Worker {
199*2d1272b8SAndroid Build Coastguard Worker return font->parent->get_variation_glyph (unicode, variation_selector, glyph);
200*2d1272b8SAndroid Build Coastguard Worker }
201*2d1272b8SAndroid Build Coastguard Worker
202*2d1272b8SAndroid Build Coastguard Worker
203*2d1272b8SAndroid Build Coastguard Worker static hb_position_t
hb_font_get_glyph_h_advance_nil(hb_font_t * font,void * font_data HB_UNUSED,hb_codepoint_t glyph HB_UNUSED,void * user_data HB_UNUSED)204*2d1272b8SAndroid Build Coastguard Worker hb_font_get_glyph_h_advance_nil (hb_font_t *font,
205*2d1272b8SAndroid Build Coastguard Worker void *font_data HB_UNUSED,
206*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t glyph HB_UNUSED,
207*2d1272b8SAndroid Build Coastguard Worker void *user_data HB_UNUSED)
208*2d1272b8SAndroid Build Coastguard Worker {
209*2d1272b8SAndroid Build Coastguard Worker return font->x_scale;
210*2d1272b8SAndroid Build Coastguard Worker }
211*2d1272b8SAndroid Build Coastguard Worker
212*2d1272b8SAndroid Build Coastguard Worker static hb_position_t
hb_font_get_glyph_h_advance_default(hb_font_t * font,void * font_data HB_UNUSED,hb_codepoint_t glyph,void * user_data HB_UNUSED)213*2d1272b8SAndroid Build Coastguard Worker hb_font_get_glyph_h_advance_default (hb_font_t *font,
214*2d1272b8SAndroid Build Coastguard Worker void *font_data HB_UNUSED,
215*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t glyph,
216*2d1272b8SAndroid Build Coastguard Worker void *user_data HB_UNUSED)
217*2d1272b8SAndroid Build Coastguard Worker {
218*2d1272b8SAndroid Build Coastguard Worker if (font->has_glyph_h_advances_func_set ())
219*2d1272b8SAndroid Build Coastguard Worker {
220*2d1272b8SAndroid Build Coastguard Worker hb_position_t ret;
221*2d1272b8SAndroid Build Coastguard Worker font->get_glyph_h_advances (1, &glyph, 0, &ret, 0);
222*2d1272b8SAndroid Build Coastguard Worker return ret;
223*2d1272b8SAndroid Build Coastguard Worker }
224*2d1272b8SAndroid Build Coastguard Worker return font->parent_scale_x_distance (font->parent->get_glyph_h_advance (glyph));
225*2d1272b8SAndroid Build Coastguard Worker }
226*2d1272b8SAndroid Build Coastguard Worker
227*2d1272b8SAndroid Build Coastguard Worker static hb_position_t
hb_font_get_glyph_v_advance_nil(hb_font_t * font,void * font_data HB_UNUSED,hb_codepoint_t glyph HB_UNUSED,void * user_data HB_UNUSED)228*2d1272b8SAndroid Build Coastguard Worker hb_font_get_glyph_v_advance_nil (hb_font_t *font,
229*2d1272b8SAndroid Build Coastguard Worker void *font_data HB_UNUSED,
230*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t glyph HB_UNUSED,
231*2d1272b8SAndroid Build Coastguard Worker void *user_data HB_UNUSED)
232*2d1272b8SAndroid Build Coastguard Worker {
233*2d1272b8SAndroid Build Coastguard Worker /* TODO use font_extents.ascender+descender */
234*2d1272b8SAndroid Build Coastguard Worker return -font->y_scale;
235*2d1272b8SAndroid Build Coastguard Worker }
236*2d1272b8SAndroid Build Coastguard Worker
237*2d1272b8SAndroid Build Coastguard Worker static hb_position_t
hb_font_get_glyph_v_advance_default(hb_font_t * font,void * font_data HB_UNUSED,hb_codepoint_t glyph,void * user_data HB_UNUSED)238*2d1272b8SAndroid Build Coastguard Worker hb_font_get_glyph_v_advance_default (hb_font_t *font,
239*2d1272b8SAndroid Build Coastguard Worker void *font_data HB_UNUSED,
240*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t glyph,
241*2d1272b8SAndroid Build Coastguard Worker void *user_data HB_UNUSED)
242*2d1272b8SAndroid Build Coastguard Worker {
243*2d1272b8SAndroid Build Coastguard Worker if (font->has_glyph_v_advances_func_set ())
244*2d1272b8SAndroid Build Coastguard Worker {
245*2d1272b8SAndroid Build Coastguard Worker hb_position_t ret;
246*2d1272b8SAndroid Build Coastguard Worker font->get_glyph_v_advances (1, &glyph, 0, &ret, 0);
247*2d1272b8SAndroid Build Coastguard Worker return ret;
248*2d1272b8SAndroid Build Coastguard Worker }
249*2d1272b8SAndroid Build Coastguard Worker return font->parent_scale_y_distance (font->parent->get_glyph_v_advance (glyph));
250*2d1272b8SAndroid Build Coastguard Worker }
251*2d1272b8SAndroid Build Coastguard Worker
252*2d1272b8SAndroid Build Coastguard Worker #define hb_font_get_glyph_h_advances_nil hb_font_get_glyph_h_advances_default
253*2d1272b8SAndroid Build Coastguard Worker
254*2d1272b8SAndroid Build Coastguard Worker static void
hb_font_get_glyph_h_advances_default(hb_font_t * font,void * font_data HB_UNUSED,unsigned int count,const hb_codepoint_t * first_glyph,unsigned int glyph_stride,hb_position_t * first_advance,unsigned int advance_stride,void * user_data HB_UNUSED)255*2d1272b8SAndroid Build Coastguard Worker hb_font_get_glyph_h_advances_default (hb_font_t* font,
256*2d1272b8SAndroid Build Coastguard Worker void* font_data HB_UNUSED,
257*2d1272b8SAndroid Build Coastguard Worker unsigned int count,
258*2d1272b8SAndroid Build Coastguard Worker const hb_codepoint_t *first_glyph,
259*2d1272b8SAndroid Build Coastguard Worker unsigned int glyph_stride,
260*2d1272b8SAndroid Build Coastguard Worker hb_position_t *first_advance,
261*2d1272b8SAndroid Build Coastguard Worker unsigned int advance_stride,
262*2d1272b8SAndroid Build Coastguard Worker void *user_data HB_UNUSED)
263*2d1272b8SAndroid Build Coastguard Worker {
264*2d1272b8SAndroid Build Coastguard Worker if (font->has_glyph_h_advance_func_set ())
265*2d1272b8SAndroid Build Coastguard Worker {
266*2d1272b8SAndroid Build Coastguard Worker for (unsigned int i = 0; i < count; i++)
267*2d1272b8SAndroid Build Coastguard Worker {
268*2d1272b8SAndroid Build Coastguard Worker *first_advance = font->get_glyph_h_advance (*first_glyph);
269*2d1272b8SAndroid Build Coastguard Worker first_glyph = &StructAtOffsetUnaligned<hb_codepoint_t> (first_glyph, glyph_stride);
270*2d1272b8SAndroid Build Coastguard Worker first_advance = &StructAtOffsetUnaligned<hb_position_t> (first_advance, advance_stride);
271*2d1272b8SAndroid Build Coastguard Worker }
272*2d1272b8SAndroid Build Coastguard Worker return;
273*2d1272b8SAndroid Build Coastguard Worker }
274*2d1272b8SAndroid Build Coastguard Worker
275*2d1272b8SAndroid Build Coastguard Worker font->parent->get_glyph_h_advances (count,
276*2d1272b8SAndroid Build Coastguard Worker first_glyph, glyph_stride,
277*2d1272b8SAndroid Build Coastguard Worker first_advance, advance_stride);
278*2d1272b8SAndroid Build Coastguard Worker for (unsigned int i = 0; i < count; i++)
279*2d1272b8SAndroid Build Coastguard Worker {
280*2d1272b8SAndroid Build Coastguard Worker *first_advance = font->parent_scale_x_distance (*first_advance);
281*2d1272b8SAndroid Build Coastguard Worker first_advance = &StructAtOffsetUnaligned<hb_position_t> (first_advance, advance_stride);
282*2d1272b8SAndroid Build Coastguard Worker }
283*2d1272b8SAndroid Build Coastguard Worker }
284*2d1272b8SAndroid Build Coastguard Worker
285*2d1272b8SAndroid Build Coastguard Worker #define hb_font_get_glyph_v_advances_nil hb_font_get_glyph_v_advances_default
286*2d1272b8SAndroid Build Coastguard Worker static void
hb_font_get_glyph_v_advances_default(hb_font_t * font,void * font_data HB_UNUSED,unsigned int count,const hb_codepoint_t * first_glyph,unsigned int glyph_stride,hb_position_t * first_advance,unsigned int advance_stride,void * user_data HB_UNUSED)287*2d1272b8SAndroid Build Coastguard Worker hb_font_get_glyph_v_advances_default (hb_font_t* font,
288*2d1272b8SAndroid Build Coastguard Worker void* font_data HB_UNUSED,
289*2d1272b8SAndroid Build Coastguard Worker unsigned int count,
290*2d1272b8SAndroid Build Coastguard Worker const hb_codepoint_t *first_glyph,
291*2d1272b8SAndroid Build Coastguard Worker unsigned int glyph_stride,
292*2d1272b8SAndroid Build Coastguard Worker hb_position_t *first_advance,
293*2d1272b8SAndroid Build Coastguard Worker unsigned int advance_stride,
294*2d1272b8SAndroid Build Coastguard Worker void *user_data HB_UNUSED)
295*2d1272b8SAndroid Build Coastguard Worker {
296*2d1272b8SAndroid Build Coastguard Worker if (font->has_glyph_v_advance_func_set ())
297*2d1272b8SAndroid Build Coastguard Worker {
298*2d1272b8SAndroid Build Coastguard Worker for (unsigned int i = 0; i < count; i++)
299*2d1272b8SAndroid Build Coastguard Worker {
300*2d1272b8SAndroid Build Coastguard Worker *first_advance = font->get_glyph_v_advance (*first_glyph);
301*2d1272b8SAndroid Build Coastguard Worker first_glyph = &StructAtOffsetUnaligned<hb_codepoint_t> (first_glyph, glyph_stride);
302*2d1272b8SAndroid Build Coastguard Worker first_advance = &StructAtOffsetUnaligned<hb_position_t> (first_advance, advance_stride);
303*2d1272b8SAndroid Build Coastguard Worker }
304*2d1272b8SAndroid Build Coastguard Worker return;
305*2d1272b8SAndroid Build Coastguard Worker }
306*2d1272b8SAndroid Build Coastguard Worker
307*2d1272b8SAndroid Build Coastguard Worker font->parent->get_glyph_v_advances (count,
308*2d1272b8SAndroid Build Coastguard Worker first_glyph, glyph_stride,
309*2d1272b8SAndroid Build Coastguard Worker first_advance, advance_stride);
310*2d1272b8SAndroid Build Coastguard Worker for (unsigned int i = 0; i < count; i++)
311*2d1272b8SAndroid Build Coastguard Worker {
312*2d1272b8SAndroid Build Coastguard Worker *first_advance = font->parent_scale_y_distance (*first_advance);
313*2d1272b8SAndroid Build Coastguard Worker first_advance = &StructAtOffsetUnaligned<hb_position_t> (first_advance, advance_stride);
314*2d1272b8SAndroid Build Coastguard Worker }
315*2d1272b8SAndroid Build Coastguard Worker }
316*2d1272b8SAndroid Build Coastguard Worker
317*2d1272b8SAndroid Build Coastguard Worker static hb_bool_t
hb_font_get_glyph_h_origin_nil(hb_font_t * font HB_UNUSED,void * font_data HB_UNUSED,hb_codepoint_t glyph HB_UNUSED,hb_position_t * x,hb_position_t * y,void * user_data HB_UNUSED)318*2d1272b8SAndroid Build Coastguard Worker hb_font_get_glyph_h_origin_nil (hb_font_t *font HB_UNUSED,
319*2d1272b8SAndroid Build Coastguard Worker void *font_data HB_UNUSED,
320*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t glyph HB_UNUSED,
321*2d1272b8SAndroid Build Coastguard Worker hb_position_t *x,
322*2d1272b8SAndroid Build Coastguard Worker hb_position_t *y,
323*2d1272b8SAndroid Build Coastguard Worker void *user_data HB_UNUSED)
324*2d1272b8SAndroid Build Coastguard Worker {
325*2d1272b8SAndroid Build Coastguard Worker *x = *y = 0;
326*2d1272b8SAndroid Build Coastguard Worker return true;
327*2d1272b8SAndroid Build Coastguard Worker }
328*2d1272b8SAndroid Build Coastguard Worker
329*2d1272b8SAndroid Build Coastguard Worker static hb_bool_t
hb_font_get_glyph_h_origin_default(hb_font_t * font,void * font_data HB_UNUSED,hb_codepoint_t glyph,hb_position_t * x,hb_position_t * y,void * user_data HB_UNUSED)330*2d1272b8SAndroid Build Coastguard Worker hb_font_get_glyph_h_origin_default (hb_font_t *font,
331*2d1272b8SAndroid Build Coastguard Worker void *font_data HB_UNUSED,
332*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t glyph,
333*2d1272b8SAndroid Build Coastguard Worker hb_position_t *x,
334*2d1272b8SAndroid Build Coastguard Worker hb_position_t *y,
335*2d1272b8SAndroid Build Coastguard Worker void *user_data HB_UNUSED)
336*2d1272b8SAndroid Build Coastguard Worker {
337*2d1272b8SAndroid Build Coastguard Worker hb_bool_t ret = font->parent->get_glyph_h_origin (glyph, x, y);
338*2d1272b8SAndroid Build Coastguard Worker if (ret)
339*2d1272b8SAndroid Build Coastguard Worker font->parent_scale_position (x, y);
340*2d1272b8SAndroid Build Coastguard Worker return ret;
341*2d1272b8SAndroid Build Coastguard Worker }
342*2d1272b8SAndroid Build Coastguard Worker
343*2d1272b8SAndroid Build Coastguard Worker static hb_bool_t
hb_font_get_glyph_v_origin_nil(hb_font_t * font HB_UNUSED,void * font_data HB_UNUSED,hb_codepoint_t glyph HB_UNUSED,hb_position_t * x,hb_position_t * y,void * user_data HB_UNUSED)344*2d1272b8SAndroid Build Coastguard Worker hb_font_get_glyph_v_origin_nil (hb_font_t *font HB_UNUSED,
345*2d1272b8SAndroid Build Coastguard Worker void *font_data HB_UNUSED,
346*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t glyph HB_UNUSED,
347*2d1272b8SAndroid Build Coastguard Worker hb_position_t *x,
348*2d1272b8SAndroid Build Coastguard Worker hb_position_t *y,
349*2d1272b8SAndroid Build Coastguard Worker void *user_data HB_UNUSED)
350*2d1272b8SAndroid Build Coastguard Worker {
351*2d1272b8SAndroid Build Coastguard Worker *x = *y = 0;
352*2d1272b8SAndroid Build Coastguard Worker return false;
353*2d1272b8SAndroid Build Coastguard Worker }
354*2d1272b8SAndroid Build Coastguard Worker
355*2d1272b8SAndroid Build Coastguard Worker static hb_bool_t
hb_font_get_glyph_v_origin_default(hb_font_t * font,void * font_data HB_UNUSED,hb_codepoint_t glyph,hb_position_t * x,hb_position_t * y,void * user_data HB_UNUSED)356*2d1272b8SAndroid Build Coastguard Worker hb_font_get_glyph_v_origin_default (hb_font_t *font,
357*2d1272b8SAndroid Build Coastguard Worker void *font_data HB_UNUSED,
358*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t glyph,
359*2d1272b8SAndroid Build Coastguard Worker hb_position_t *x,
360*2d1272b8SAndroid Build Coastguard Worker hb_position_t *y,
361*2d1272b8SAndroid Build Coastguard Worker void *user_data HB_UNUSED)
362*2d1272b8SAndroid Build Coastguard Worker {
363*2d1272b8SAndroid Build Coastguard Worker hb_bool_t ret = font->parent->get_glyph_v_origin (glyph, x, y);
364*2d1272b8SAndroid Build Coastguard Worker if (ret)
365*2d1272b8SAndroid Build Coastguard Worker font->parent_scale_position (x, y);
366*2d1272b8SAndroid Build Coastguard Worker return ret;
367*2d1272b8SAndroid Build Coastguard Worker }
368*2d1272b8SAndroid Build Coastguard Worker
369*2d1272b8SAndroid Build Coastguard Worker static hb_position_t
hb_font_get_glyph_h_kerning_nil(hb_font_t * font HB_UNUSED,void * font_data HB_UNUSED,hb_codepoint_t left_glyph HB_UNUSED,hb_codepoint_t right_glyph HB_UNUSED,void * user_data HB_UNUSED)370*2d1272b8SAndroid Build Coastguard Worker hb_font_get_glyph_h_kerning_nil (hb_font_t *font HB_UNUSED,
371*2d1272b8SAndroid Build Coastguard Worker void *font_data HB_UNUSED,
372*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t left_glyph HB_UNUSED,
373*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t right_glyph HB_UNUSED,
374*2d1272b8SAndroid Build Coastguard Worker void *user_data HB_UNUSED)
375*2d1272b8SAndroid Build Coastguard Worker {
376*2d1272b8SAndroid Build Coastguard Worker return 0;
377*2d1272b8SAndroid Build Coastguard Worker }
378*2d1272b8SAndroid Build Coastguard Worker
379*2d1272b8SAndroid Build Coastguard Worker static hb_position_t
hb_font_get_glyph_h_kerning_default(hb_font_t * font,void * font_data HB_UNUSED,hb_codepoint_t left_glyph,hb_codepoint_t right_glyph,void * user_data HB_UNUSED)380*2d1272b8SAndroid Build Coastguard Worker hb_font_get_glyph_h_kerning_default (hb_font_t *font,
381*2d1272b8SAndroid Build Coastguard Worker void *font_data HB_UNUSED,
382*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t left_glyph,
383*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t right_glyph,
384*2d1272b8SAndroid Build Coastguard Worker void *user_data HB_UNUSED)
385*2d1272b8SAndroid Build Coastguard Worker {
386*2d1272b8SAndroid Build Coastguard Worker return font->parent_scale_x_distance (font->parent->get_glyph_h_kerning (left_glyph, right_glyph));
387*2d1272b8SAndroid Build Coastguard Worker }
388*2d1272b8SAndroid Build Coastguard Worker
389*2d1272b8SAndroid Build Coastguard Worker #ifndef HB_DISABLE_DEPRECATED
390*2d1272b8SAndroid Build Coastguard Worker static hb_position_t
hb_font_get_glyph_v_kerning_nil(hb_font_t * font HB_UNUSED,void * font_data HB_UNUSED,hb_codepoint_t top_glyph HB_UNUSED,hb_codepoint_t bottom_glyph HB_UNUSED,void * user_data HB_UNUSED)391*2d1272b8SAndroid Build Coastguard Worker hb_font_get_glyph_v_kerning_nil (hb_font_t *font HB_UNUSED,
392*2d1272b8SAndroid Build Coastguard Worker void *font_data HB_UNUSED,
393*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t top_glyph HB_UNUSED,
394*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t bottom_glyph HB_UNUSED,
395*2d1272b8SAndroid Build Coastguard Worker void *user_data HB_UNUSED)
396*2d1272b8SAndroid Build Coastguard Worker {
397*2d1272b8SAndroid Build Coastguard Worker return 0;
398*2d1272b8SAndroid Build Coastguard Worker }
399*2d1272b8SAndroid Build Coastguard Worker
400*2d1272b8SAndroid Build Coastguard Worker static hb_position_t
hb_font_get_glyph_v_kerning_default(hb_font_t * font,void * font_data HB_UNUSED,hb_codepoint_t top_glyph,hb_codepoint_t bottom_glyph,void * user_data HB_UNUSED)401*2d1272b8SAndroid Build Coastguard Worker hb_font_get_glyph_v_kerning_default (hb_font_t *font,
402*2d1272b8SAndroid Build Coastguard Worker void *font_data HB_UNUSED,
403*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t top_glyph,
404*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t bottom_glyph,
405*2d1272b8SAndroid Build Coastguard Worker void *user_data HB_UNUSED)
406*2d1272b8SAndroid Build Coastguard Worker {
407*2d1272b8SAndroid Build Coastguard Worker return font->parent_scale_y_distance (font->parent->get_glyph_v_kerning (top_glyph, bottom_glyph));
408*2d1272b8SAndroid Build Coastguard Worker }
409*2d1272b8SAndroid Build Coastguard Worker #endif
410*2d1272b8SAndroid Build Coastguard Worker
411*2d1272b8SAndroid Build Coastguard Worker static hb_bool_t
hb_font_get_glyph_extents_nil(hb_font_t * font HB_UNUSED,void * font_data HB_UNUSED,hb_codepoint_t glyph HB_UNUSED,hb_glyph_extents_t * extents,void * user_data HB_UNUSED)412*2d1272b8SAndroid Build Coastguard Worker hb_font_get_glyph_extents_nil (hb_font_t *font HB_UNUSED,
413*2d1272b8SAndroid Build Coastguard Worker void *font_data HB_UNUSED,
414*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t glyph HB_UNUSED,
415*2d1272b8SAndroid Build Coastguard Worker hb_glyph_extents_t *extents,
416*2d1272b8SAndroid Build Coastguard Worker void *user_data HB_UNUSED)
417*2d1272b8SAndroid Build Coastguard Worker {
418*2d1272b8SAndroid Build Coastguard Worker hb_memset (extents, 0, sizeof (*extents));
419*2d1272b8SAndroid Build Coastguard Worker return false;
420*2d1272b8SAndroid Build Coastguard Worker }
421*2d1272b8SAndroid Build Coastguard Worker
422*2d1272b8SAndroid Build Coastguard Worker static hb_bool_t
hb_font_get_glyph_extents_default(hb_font_t * font,void * font_data HB_UNUSED,hb_codepoint_t glyph,hb_glyph_extents_t * extents,void * user_data HB_UNUSED)423*2d1272b8SAndroid Build Coastguard Worker hb_font_get_glyph_extents_default (hb_font_t *font,
424*2d1272b8SAndroid Build Coastguard Worker void *font_data HB_UNUSED,
425*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t glyph,
426*2d1272b8SAndroid Build Coastguard Worker hb_glyph_extents_t *extents,
427*2d1272b8SAndroid Build Coastguard Worker void *user_data HB_UNUSED)
428*2d1272b8SAndroid Build Coastguard Worker {
429*2d1272b8SAndroid Build Coastguard Worker hb_bool_t ret = font->parent->get_glyph_extents (glyph, extents);
430*2d1272b8SAndroid Build Coastguard Worker if (ret) {
431*2d1272b8SAndroid Build Coastguard Worker font->parent_scale_position (&extents->x_bearing, &extents->y_bearing);
432*2d1272b8SAndroid Build Coastguard Worker font->parent_scale_distance (&extents->width, &extents->height);
433*2d1272b8SAndroid Build Coastguard Worker }
434*2d1272b8SAndroid Build Coastguard Worker return ret;
435*2d1272b8SAndroid Build Coastguard Worker }
436*2d1272b8SAndroid Build Coastguard Worker
437*2d1272b8SAndroid Build Coastguard Worker static hb_bool_t
hb_font_get_glyph_contour_point_nil(hb_font_t * font HB_UNUSED,void * font_data HB_UNUSED,hb_codepoint_t glyph HB_UNUSED,unsigned int point_index HB_UNUSED,hb_position_t * x,hb_position_t * y,void * user_data HB_UNUSED)438*2d1272b8SAndroid Build Coastguard Worker hb_font_get_glyph_contour_point_nil (hb_font_t *font HB_UNUSED,
439*2d1272b8SAndroid Build Coastguard Worker void *font_data HB_UNUSED,
440*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t glyph HB_UNUSED,
441*2d1272b8SAndroid Build Coastguard Worker unsigned int point_index HB_UNUSED,
442*2d1272b8SAndroid Build Coastguard Worker hb_position_t *x,
443*2d1272b8SAndroid Build Coastguard Worker hb_position_t *y,
444*2d1272b8SAndroid Build Coastguard Worker void *user_data HB_UNUSED)
445*2d1272b8SAndroid Build Coastguard Worker {
446*2d1272b8SAndroid Build Coastguard Worker *x = *y = 0;
447*2d1272b8SAndroid Build Coastguard Worker return false;
448*2d1272b8SAndroid Build Coastguard Worker }
449*2d1272b8SAndroid Build Coastguard Worker
450*2d1272b8SAndroid Build Coastguard Worker static hb_bool_t
hb_font_get_glyph_contour_point_default(hb_font_t * font,void * font_data HB_UNUSED,hb_codepoint_t glyph,unsigned int point_index,hb_position_t * x,hb_position_t * y,void * user_data HB_UNUSED)451*2d1272b8SAndroid Build Coastguard Worker hb_font_get_glyph_contour_point_default (hb_font_t *font,
452*2d1272b8SAndroid Build Coastguard Worker void *font_data HB_UNUSED,
453*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t glyph,
454*2d1272b8SAndroid Build Coastguard Worker unsigned int point_index,
455*2d1272b8SAndroid Build Coastguard Worker hb_position_t *x,
456*2d1272b8SAndroid Build Coastguard Worker hb_position_t *y,
457*2d1272b8SAndroid Build Coastguard Worker void *user_data HB_UNUSED)
458*2d1272b8SAndroid Build Coastguard Worker {
459*2d1272b8SAndroid Build Coastguard Worker hb_bool_t ret = font->parent->get_glyph_contour_point (glyph, point_index, x, y);
460*2d1272b8SAndroid Build Coastguard Worker if (ret)
461*2d1272b8SAndroid Build Coastguard Worker font->parent_scale_position (x, y);
462*2d1272b8SAndroid Build Coastguard Worker return ret;
463*2d1272b8SAndroid Build Coastguard Worker }
464*2d1272b8SAndroid Build Coastguard Worker
465*2d1272b8SAndroid Build Coastguard Worker static hb_bool_t
hb_font_get_glyph_name_nil(hb_font_t * font HB_UNUSED,void * font_data HB_UNUSED,hb_codepoint_t glyph HB_UNUSED,char * name,unsigned int size,void * user_data HB_UNUSED)466*2d1272b8SAndroid Build Coastguard Worker hb_font_get_glyph_name_nil (hb_font_t *font HB_UNUSED,
467*2d1272b8SAndroid Build Coastguard Worker void *font_data HB_UNUSED,
468*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t glyph HB_UNUSED,
469*2d1272b8SAndroid Build Coastguard Worker char *name,
470*2d1272b8SAndroid Build Coastguard Worker unsigned int size,
471*2d1272b8SAndroid Build Coastguard Worker void *user_data HB_UNUSED)
472*2d1272b8SAndroid Build Coastguard Worker {
473*2d1272b8SAndroid Build Coastguard Worker if (size) *name = '\0';
474*2d1272b8SAndroid Build Coastguard Worker return false;
475*2d1272b8SAndroid Build Coastguard Worker }
476*2d1272b8SAndroid Build Coastguard Worker
477*2d1272b8SAndroid Build Coastguard Worker static hb_bool_t
hb_font_get_glyph_name_default(hb_font_t * font,void * font_data HB_UNUSED,hb_codepoint_t glyph,char * name,unsigned int size,void * user_data HB_UNUSED)478*2d1272b8SAndroid Build Coastguard Worker hb_font_get_glyph_name_default (hb_font_t *font,
479*2d1272b8SAndroid Build Coastguard Worker void *font_data HB_UNUSED,
480*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t glyph,
481*2d1272b8SAndroid Build Coastguard Worker char *name,
482*2d1272b8SAndroid Build Coastguard Worker unsigned int size,
483*2d1272b8SAndroid Build Coastguard Worker void *user_data HB_UNUSED)
484*2d1272b8SAndroid Build Coastguard Worker {
485*2d1272b8SAndroid Build Coastguard Worker return font->parent->get_glyph_name (glyph, name, size);
486*2d1272b8SAndroid Build Coastguard Worker }
487*2d1272b8SAndroid Build Coastguard Worker
488*2d1272b8SAndroid Build Coastguard Worker static hb_bool_t
hb_font_get_glyph_from_name_nil(hb_font_t * font HB_UNUSED,void * font_data HB_UNUSED,const char * name HB_UNUSED,int len HB_UNUSED,hb_codepoint_t * glyph,void * user_data HB_UNUSED)489*2d1272b8SAndroid Build Coastguard Worker hb_font_get_glyph_from_name_nil (hb_font_t *font HB_UNUSED,
490*2d1272b8SAndroid Build Coastguard Worker void *font_data HB_UNUSED,
491*2d1272b8SAndroid Build Coastguard Worker const char *name HB_UNUSED,
492*2d1272b8SAndroid Build Coastguard Worker int len HB_UNUSED, /* -1 means nul-terminated */
493*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t *glyph,
494*2d1272b8SAndroid Build Coastguard Worker void *user_data HB_UNUSED)
495*2d1272b8SAndroid Build Coastguard Worker {
496*2d1272b8SAndroid Build Coastguard Worker *glyph = 0;
497*2d1272b8SAndroid Build Coastguard Worker return false;
498*2d1272b8SAndroid Build Coastguard Worker }
499*2d1272b8SAndroid Build Coastguard Worker
500*2d1272b8SAndroid Build Coastguard Worker static hb_bool_t
hb_font_get_glyph_from_name_default(hb_font_t * font,void * font_data HB_UNUSED,const char * name,int len,hb_codepoint_t * glyph,void * user_data HB_UNUSED)501*2d1272b8SAndroid Build Coastguard Worker hb_font_get_glyph_from_name_default (hb_font_t *font,
502*2d1272b8SAndroid Build Coastguard Worker void *font_data HB_UNUSED,
503*2d1272b8SAndroid Build Coastguard Worker const char *name,
504*2d1272b8SAndroid Build Coastguard Worker int len, /* -1 means nul-terminated */
505*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t *glyph,
506*2d1272b8SAndroid Build Coastguard Worker void *user_data HB_UNUSED)
507*2d1272b8SAndroid Build Coastguard Worker {
508*2d1272b8SAndroid Build Coastguard Worker return font->parent->get_glyph_from_name (name, len, glyph);
509*2d1272b8SAndroid Build Coastguard Worker }
510*2d1272b8SAndroid Build Coastguard Worker
511*2d1272b8SAndroid Build Coastguard Worker static void
hb_font_draw_glyph_nil(hb_font_t * font HB_UNUSED,void * font_data HB_UNUSED,hb_codepoint_t glyph,hb_draw_funcs_t * draw_funcs,void * draw_data,void * user_data HB_UNUSED)512*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph_nil (hb_font_t *font HB_UNUSED,
513*2d1272b8SAndroid Build Coastguard Worker void *font_data HB_UNUSED,
514*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t glyph,
515*2d1272b8SAndroid Build Coastguard Worker hb_draw_funcs_t *draw_funcs,
516*2d1272b8SAndroid Build Coastguard Worker void *draw_data,
517*2d1272b8SAndroid Build Coastguard Worker void *user_data HB_UNUSED)
518*2d1272b8SAndroid Build Coastguard Worker {
519*2d1272b8SAndroid Build Coastguard Worker }
520*2d1272b8SAndroid Build Coastguard Worker
521*2d1272b8SAndroid Build Coastguard Worker static void
hb_font_paint_glyph_nil(hb_font_t * font HB_UNUSED,void * font_data HB_UNUSED,hb_codepoint_t glyph HB_UNUSED,hb_paint_funcs_t * paint_funcs HB_UNUSED,void * paint_data HB_UNUSED,unsigned int palette HB_UNUSED,hb_color_t foreground HB_UNUSED,void * user_data HB_UNUSED)522*2d1272b8SAndroid Build Coastguard Worker hb_font_paint_glyph_nil (hb_font_t *font HB_UNUSED,
523*2d1272b8SAndroid Build Coastguard Worker void *font_data HB_UNUSED,
524*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t glyph HB_UNUSED,
525*2d1272b8SAndroid Build Coastguard Worker hb_paint_funcs_t *paint_funcs HB_UNUSED,
526*2d1272b8SAndroid Build Coastguard Worker void *paint_data HB_UNUSED,
527*2d1272b8SAndroid Build Coastguard Worker unsigned int palette HB_UNUSED,
528*2d1272b8SAndroid Build Coastguard Worker hb_color_t foreground HB_UNUSED,
529*2d1272b8SAndroid Build Coastguard Worker void *user_data HB_UNUSED)
530*2d1272b8SAndroid Build Coastguard Worker {
531*2d1272b8SAndroid Build Coastguard Worker }
532*2d1272b8SAndroid Build Coastguard Worker
533*2d1272b8SAndroid Build Coastguard Worker typedef struct hb_font_draw_glyph_default_adaptor_t {
534*2d1272b8SAndroid Build Coastguard Worker hb_draw_funcs_t *draw_funcs;
535*2d1272b8SAndroid Build Coastguard Worker void *draw_data;
536*2d1272b8SAndroid Build Coastguard Worker float x_scale;
537*2d1272b8SAndroid Build Coastguard Worker float y_scale;
538*2d1272b8SAndroid Build Coastguard Worker float slant;
539*2d1272b8SAndroid Build Coastguard Worker } hb_font_draw_glyph_default_adaptor_t;
540*2d1272b8SAndroid Build Coastguard Worker
541*2d1272b8SAndroid Build Coastguard Worker static void
hb_draw_move_to_default(hb_draw_funcs_t * dfuncs HB_UNUSED,void * draw_data,hb_draw_state_t * st,float to_x,float to_y,void * user_data HB_UNUSED)542*2d1272b8SAndroid Build Coastguard Worker hb_draw_move_to_default (hb_draw_funcs_t *dfuncs HB_UNUSED,
543*2d1272b8SAndroid Build Coastguard Worker void *draw_data,
544*2d1272b8SAndroid Build Coastguard Worker hb_draw_state_t *st,
545*2d1272b8SAndroid Build Coastguard Worker float to_x, float to_y,
546*2d1272b8SAndroid Build Coastguard Worker void *user_data HB_UNUSED)
547*2d1272b8SAndroid Build Coastguard Worker {
548*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph_default_adaptor_t *adaptor = (hb_font_draw_glyph_default_adaptor_t *) draw_data;
549*2d1272b8SAndroid Build Coastguard Worker float x_scale = adaptor->x_scale;
550*2d1272b8SAndroid Build Coastguard Worker float y_scale = adaptor->y_scale;
551*2d1272b8SAndroid Build Coastguard Worker float slant = adaptor->slant;
552*2d1272b8SAndroid Build Coastguard Worker
553*2d1272b8SAndroid Build Coastguard Worker adaptor->draw_funcs->emit_move_to (adaptor->draw_data, *st,
554*2d1272b8SAndroid Build Coastguard Worker x_scale * to_x + slant * to_y, y_scale * to_y);
555*2d1272b8SAndroid Build Coastguard Worker }
556*2d1272b8SAndroid Build Coastguard Worker
557*2d1272b8SAndroid Build Coastguard Worker static void
hb_draw_line_to_default(hb_draw_funcs_t * dfuncs HB_UNUSED,void * draw_data,hb_draw_state_t * st,float to_x,float to_y,void * user_data HB_UNUSED)558*2d1272b8SAndroid Build Coastguard Worker hb_draw_line_to_default (hb_draw_funcs_t *dfuncs HB_UNUSED, void *draw_data,
559*2d1272b8SAndroid Build Coastguard Worker hb_draw_state_t *st,
560*2d1272b8SAndroid Build Coastguard Worker float to_x, float to_y,
561*2d1272b8SAndroid Build Coastguard Worker void *user_data HB_UNUSED)
562*2d1272b8SAndroid Build Coastguard Worker {
563*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph_default_adaptor_t *adaptor = (hb_font_draw_glyph_default_adaptor_t *) draw_data;
564*2d1272b8SAndroid Build Coastguard Worker float x_scale = adaptor->x_scale;
565*2d1272b8SAndroid Build Coastguard Worker float y_scale = adaptor->y_scale;
566*2d1272b8SAndroid Build Coastguard Worker float slant = adaptor->slant;
567*2d1272b8SAndroid Build Coastguard Worker
568*2d1272b8SAndroid Build Coastguard Worker st->current_x = st->current_x * x_scale + st->current_y * slant;
569*2d1272b8SAndroid Build Coastguard Worker st->current_y = st->current_y * y_scale;
570*2d1272b8SAndroid Build Coastguard Worker
571*2d1272b8SAndroid Build Coastguard Worker adaptor->draw_funcs->emit_line_to (adaptor->draw_data, *st,
572*2d1272b8SAndroid Build Coastguard Worker x_scale * to_x + slant * to_y, y_scale * to_y);
573*2d1272b8SAndroid Build Coastguard Worker }
574*2d1272b8SAndroid Build Coastguard Worker
575*2d1272b8SAndroid Build Coastguard Worker static void
hb_draw_quadratic_to_default(hb_draw_funcs_t * dfuncs HB_UNUSED,void * draw_data,hb_draw_state_t * st,float control_x,float control_y,float to_x,float to_y,void * user_data HB_UNUSED)576*2d1272b8SAndroid Build Coastguard Worker hb_draw_quadratic_to_default (hb_draw_funcs_t *dfuncs HB_UNUSED, void *draw_data,
577*2d1272b8SAndroid Build Coastguard Worker hb_draw_state_t *st,
578*2d1272b8SAndroid Build Coastguard Worker float control_x, float control_y,
579*2d1272b8SAndroid Build Coastguard Worker float to_x, float to_y,
580*2d1272b8SAndroid Build Coastguard Worker void *user_data HB_UNUSED)
581*2d1272b8SAndroid Build Coastguard Worker {
582*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph_default_adaptor_t *adaptor = (hb_font_draw_glyph_default_adaptor_t *) draw_data;
583*2d1272b8SAndroid Build Coastguard Worker float x_scale = adaptor->x_scale;
584*2d1272b8SAndroid Build Coastguard Worker float y_scale = adaptor->y_scale;
585*2d1272b8SAndroid Build Coastguard Worker float slant = adaptor->slant;
586*2d1272b8SAndroid Build Coastguard Worker
587*2d1272b8SAndroid Build Coastguard Worker st->current_x = st->current_x * x_scale + st->current_y * slant;
588*2d1272b8SAndroid Build Coastguard Worker st->current_y = st->current_y * y_scale;
589*2d1272b8SAndroid Build Coastguard Worker
590*2d1272b8SAndroid Build Coastguard Worker adaptor->draw_funcs->emit_quadratic_to (adaptor->draw_data, *st,
591*2d1272b8SAndroid Build Coastguard Worker x_scale * control_x + slant * control_y, y_scale * control_y,
592*2d1272b8SAndroid Build Coastguard Worker x_scale * to_x + slant * to_y, y_scale * to_y);
593*2d1272b8SAndroid Build Coastguard Worker }
594*2d1272b8SAndroid Build Coastguard Worker
595*2d1272b8SAndroid Build Coastguard Worker static void
hb_draw_cubic_to_default(hb_draw_funcs_t * dfuncs HB_UNUSED,void * draw_data,hb_draw_state_t * st,float control1_x,float control1_y,float control2_x,float control2_y,float to_x,float to_y,void * user_data HB_UNUSED)596*2d1272b8SAndroid Build Coastguard Worker hb_draw_cubic_to_default (hb_draw_funcs_t *dfuncs HB_UNUSED, void *draw_data,
597*2d1272b8SAndroid Build Coastguard Worker hb_draw_state_t *st,
598*2d1272b8SAndroid Build Coastguard Worker float control1_x, float control1_y,
599*2d1272b8SAndroid Build Coastguard Worker float control2_x, float control2_y,
600*2d1272b8SAndroid Build Coastguard Worker float to_x, float to_y,
601*2d1272b8SAndroid Build Coastguard Worker void *user_data HB_UNUSED)
602*2d1272b8SAndroid Build Coastguard Worker {
603*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph_default_adaptor_t *adaptor = (hb_font_draw_glyph_default_adaptor_t *) draw_data;
604*2d1272b8SAndroid Build Coastguard Worker float x_scale = adaptor->x_scale;
605*2d1272b8SAndroid Build Coastguard Worker float y_scale = adaptor->y_scale;
606*2d1272b8SAndroid Build Coastguard Worker float slant = adaptor->slant;
607*2d1272b8SAndroid Build Coastguard Worker
608*2d1272b8SAndroid Build Coastguard Worker st->current_x = st->current_x * x_scale + st->current_y * slant;
609*2d1272b8SAndroid Build Coastguard Worker st->current_y = st->current_y * y_scale;
610*2d1272b8SAndroid Build Coastguard Worker
611*2d1272b8SAndroid Build Coastguard Worker adaptor->draw_funcs->emit_cubic_to (adaptor->draw_data, *st,
612*2d1272b8SAndroid Build Coastguard Worker x_scale * control1_x + slant * control1_y, y_scale * control1_y,
613*2d1272b8SAndroid Build Coastguard Worker x_scale * control2_x + slant * control2_y, y_scale * control2_y,
614*2d1272b8SAndroid Build Coastguard Worker x_scale * to_x + slant * to_y, y_scale * to_y);
615*2d1272b8SAndroid Build Coastguard Worker }
616*2d1272b8SAndroid Build Coastguard Worker
617*2d1272b8SAndroid Build Coastguard Worker static void
hb_draw_close_path_default(hb_draw_funcs_t * dfuncs HB_UNUSED,void * draw_data,hb_draw_state_t * st,void * user_data HB_UNUSED)618*2d1272b8SAndroid Build Coastguard Worker hb_draw_close_path_default (hb_draw_funcs_t *dfuncs HB_UNUSED, void *draw_data,
619*2d1272b8SAndroid Build Coastguard Worker hb_draw_state_t *st,
620*2d1272b8SAndroid Build Coastguard Worker void *user_data HB_UNUSED)
621*2d1272b8SAndroid Build Coastguard Worker {
622*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph_default_adaptor_t *adaptor = (hb_font_draw_glyph_default_adaptor_t *) draw_data;
623*2d1272b8SAndroid Build Coastguard Worker
624*2d1272b8SAndroid Build Coastguard Worker adaptor->draw_funcs->emit_close_path (adaptor->draw_data, *st);
625*2d1272b8SAndroid Build Coastguard Worker }
626*2d1272b8SAndroid Build Coastguard Worker
627*2d1272b8SAndroid Build Coastguard Worker static const hb_draw_funcs_t _hb_draw_funcs_default = {
628*2d1272b8SAndroid Build Coastguard Worker HB_OBJECT_HEADER_STATIC,
629*2d1272b8SAndroid Build Coastguard Worker
630*2d1272b8SAndroid Build Coastguard Worker {
631*2d1272b8SAndroid Build Coastguard Worker #define HB_DRAW_FUNC_IMPLEMENT(name) hb_draw_##name##_default,
632*2d1272b8SAndroid Build Coastguard Worker HB_DRAW_FUNCS_IMPLEMENT_CALLBACKS
633*2d1272b8SAndroid Build Coastguard Worker #undef HB_DRAW_FUNC_IMPLEMENT
634*2d1272b8SAndroid Build Coastguard Worker }
635*2d1272b8SAndroid Build Coastguard Worker };
636*2d1272b8SAndroid Build Coastguard Worker
637*2d1272b8SAndroid Build Coastguard Worker static void
hb_font_draw_glyph_default(hb_font_t * font,void * font_data HB_UNUSED,hb_codepoint_t glyph,hb_draw_funcs_t * draw_funcs,void * draw_data,void * user_data HB_UNUSED)638*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph_default (hb_font_t *font,
639*2d1272b8SAndroid Build Coastguard Worker void *font_data HB_UNUSED,
640*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t glyph,
641*2d1272b8SAndroid Build Coastguard Worker hb_draw_funcs_t *draw_funcs,
642*2d1272b8SAndroid Build Coastguard Worker void *draw_data,
643*2d1272b8SAndroid Build Coastguard Worker void *user_data HB_UNUSED)
644*2d1272b8SAndroid Build Coastguard Worker {
645*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph_default_adaptor_t adaptor = {
646*2d1272b8SAndroid Build Coastguard Worker draw_funcs,
647*2d1272b8SAndroid Build Coastguard Worker draw_data,
648*2d1272b8SAndroid Build Coastguard Worker font->parent->x_scale ? (float) font->x_scale / (float) font->parent->x_scale : 0.f,
649*2d1272b8SAndroid Build Coastguard Worker font->parent->y_scale ? (float) font->y_scale / (float) font->parent->y_scale : 0.f,
650*2d1272b8SAndroid Build Coastguard Worker font->parent->y_scale ? (font->slant - font->parent->slant) *
651*2d1272b8SAndroid Build Coastguard Worker (float) font->x_scale / (float) font->parent->y_scale : 0.f
652*2d1272b8SAndroid Build Coastguard Worker };
653*2d1272b8SAndroid Build Coastguard Worker
654*2d1272b8SAndroid Build Coastguard Worker font->parent->draw_glyph (glyph,
655*2d1272b8SAndroid Build Coastguard Worker const_cast<hb_draw_funcs_t *> (&_hb_draw_funcs_default),
656*2d1272b8SAndroid Build Coastguard Worker &adaptor);
657*2d1272b8SAndroid Build Coastguard Worker }
658*2d1272b8SAndroid Build Coastguard Worker
659*2d1272b8SAndroid Build Coastguard Worker static void
hb_font_paint_glyph_default(hb_font_t * font,void * font_data,hb_codepoint_t glyph,hb_paint_funcs_t * paint_funcs,void * paint_data,unsigned int palette,hb_color_t foreground,void * user_data)660*2d1272b8SAndroid Build Coastguard Worker hb_font_paint_glyph_default (hb_font_t *font,
661*2d1272b8SAndroid Build Coastguard Worker void *font_data,
662*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t glyph,
663*2d1272b8SAndroid Build Coastguard Worker hb_paint_funcs_t *paint_funcs,
664*2d1272b8SAndroid Build Coastguard Worker void *paint_data,
665*2d1272b8SAndroid Build Coastguard Worker unsigned int palette,
666*2d1272b8SAndroid Build Coastguard Worker hb_color_t foreground,
667*2d1272b8SAndroid Build Coastguard Worker void *user_data)
668*2d1272b8SAndroid Build Coastguard Worker {
669*2d1272b8SAndroid Build Coastguard Worker paint_funcs->push_transform (paint_data,
670*2d1272b8SAndroid Build Coastguard Worker font->parent->x_scale ? (float) font->x_scale / (float) font->parent->x_scale : 0.f,
671*2d1272b8SAndroid Build Coastguard Worker font->parent->y_scale ? (font->slant - font->parent->slant) *
672*2d1272b8SAndroid Build Coastguard Worker (float) font->x_scale / (float) font->parent->y_scale : 0.f,
673*2d1272b8SAndroid Build Coastguard Worker 0.f,
674*2d1272b8SAndroid Build Coastguard Worker font->parent->y_scale ? (float) font->y_scale / (float) font->parent->y_scale : 0.f,
675*2d1272b8SAndroid Build Coastguard Worker 0.f, 0.f);
676*2d1272b8SAndroid Build Coastguard Worker
677*2d1272b8SAndroid Build Coastguard Worker font->parent->paint_glyph (glyph, paint_funcs, paint_data, palette, foreground);
678*2d1272b8SAndroid Build Coastguard Worker
679*2d1272b8SAndroid Build Coastguard Worker paint_funcs->pop_transform (paint_data);
680*2d1272b8SAndroid Build Coastguard Worker }
681*2d1272b8SAndroid Build Coastguard Worker
682*2d1272b8SAndroid Build Coastguard Worker DEFINE_NULL_INSTANCE (hb_font_funcs_t) =
683*2d1272b8SAndroid Build Coastguard Worker {
684*2d1272b8SAndroid Build Coastguard Worker HB_OBJECT_HEADER_STATIC,
685*2d1272b8SAndroid Build Coastguard Worker
686*2d1272b8SAndroid Build Coastguard Worker nullptr,
687*2d1272b8SAndroid Build Coastguard Worker nullptr,
688*2d1272b8SAndroid Build Coastguard Worker {
689*2d1272b8SAndroid Build Coastguard Worker {
690*2d1272b8SAndroid Build Coastguard Worker #define HB_FONT_FUNC_IMPLEMENT(get_,name) hb_font_##get_##name##_nil,
691*2d1272b8SAndroid Build Coastguard Worker HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
692*2d1272b8SAndroid Build Coastguard Worker #undef HB_FONT_FUNC_IMPLEMENT
693*2d1272b8SAndroid Build Coastguard Worker }
694*2d1272b8SAndroid Build Coastguard Worker }
695*2d1272b8SAndroid Build Coastguard Worker };
696*2d1272b8SAndroid Build Coastguard Worker
697*2d1272b8SAndroid Build Coastguard Worker static const hb_font_funcs_t _hb_font_funcs_default = {
698*2d1272b8SAndroid Build Coastguard Worker HB_OBJECT_HEADER_STATIC,
699*2d1272b8SAndroid Build Coastguard Worker
700*2d1272b8SAndroid Build Coastguard Worker nullptr,
701*2d1272b8SAndroid Build Coastguard Worker nullptr,
702*2d1272b8SAndroid Build Coastguard Worker {
703*2d1272b8SAndroid Build Coastguard Worker {
704*2d1272b8SAndroid Build Coastguard Worker #define HB_FONT_FUNC_IMPLEMENT(get_,name) hb_font_##get_##name##_default,
705*2d1272b8SAndroid Build Coastguard Worker HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
706*2d1272b8SAndroid Build Coastguard Worker #undef HB_FONT_FUNC_IMPLEMENT
707*2d1272b8SAndroid Build Coastguard Worker }
708*2d1272b8SAndroid Build Coastguard Worker }
709*2d1272b8SAndroid Build Coastguard Worker };
710*2d1272b8SAndroid Build Coastguard Worker
711*2d1272b8SAndroid Build Coastguard Worker
712*2d1272b8SAndroid Build Coastguard Worker /**
713*2d1272b8SAndroid Build Coastguard Worker * hb_font_funcs_create:
714*2d1272b8SAndroid Build Coastguard Worker *
715*2d1272b8SAndroid Build Coastguard Worker * Creates a new #hb_font_funcs_t structure of font functions.
716*2d1272b8SAndroid Build Coastguard Worker *
717*2d1272b8SAndroid Build Coastguard Worker * Return value: (transfer full): The font-functions structure
718*2d1272b8SAndroid Build Coastguard Worker *
719*2d1272b8SAndroid Build Coastguard Worker * Since: 0.9.2
720*2d1272b8SAndroid Build Coastguard Worker **/
721*2d1272b8SAndroid Build Coastguard Worker hb_font_funcs_t *
hb_font_funcs_create()722*2d1272b8SAndroid Build Coastguard Worker hb_font_funcs_create ()
723*2d1272b8SAndroid Build Coastguard Worker {
724*2d1272b8SAndroid Build Coastguard Worker hb_font_funcs_t *ffuncs;
725*2d1272b8SAndroid Build Coastguard Worker
726*2d1272b8SAndroid Build Coastguard Worker if (!(ffuncs = hb_object_create<hb_font_funcs_t> ()))
727*2d1272b8SAndroid Build Coastguard Worker return hb_font_funcs_get_empty ();
728*2d1272b8SAndroid Build Coastguard Worker
729*2d1272b8SAndroid Build Coastguard Worker ffuncs->get = _hb_font_funcs_default.get;
730*2d1272b8SAndroid Build Coastguard Worker
731*2d1272b8SAndroid Build Coastguard Worker return ffuncs;
732*2d1272b8SAndroid Build Coastguard Worker }
733*2d1272b8SAndroid Build Coastguard Worker
734*2d1272b8SAndroid Build Coastguard Worker /**
735*2d1272b8SAndroid Build Coastguard Worker * hb_font_funcs_get_empty:
736*2d1272b8SAndroid Build Coastguard Worker *
737*2d1272b8SAndroid Build Coastguard Worker * Fetches an empty font-functions structure.
738*2d1272b8SAndroid Build Coastguard Worker *
739*2d1272b8SAndroid Build Coastguard Worker * Return value: (transfer full): The font-functions structure
740*2d1272b8SAndroid Build Coastguard Worker *
741*2d1272b8SAndroid Build Coastguard Worker * Since: 0.9.2
742*2d1272b8SAndroid Build Coastguard Worker **/
743*2d1272b8SAndroid Build Coastguard Worker hb_font_funcs_t *
hb_font_funcs_get_empty()744*2d1272b8SAndroid Build Coastguard Worker hb_font_funcs_get_empty ()
745*2d1272b8SAndroid Build Coastguard Worker {
746*2d1272b8SAndroid Build Coastguard Worker return const_cast<hb_font_funcs_t *> (&_hb_font_funcs_default);
747*2d1272b8SAndroid Build Coastguard Worker }
748*2d1272b8SAndroid Build Coastguard Worker
749*2d1272b8SAndroid Build Coastguard Worker /**
750*2d1272b8SAndroid Build Coastguard Worker * hb_font_funcs_reference: (skip)
751*2d1272b8SAndroid Build Coastguard Worker * @ffuncs: The font-functions structure
752*2d1272b8SAndroid Build Coastguard Worker *
753*2d1272b8SAndroid Build Coastguard Worker * Increases the reference count on a font-functions structure.
754*2d1272b8SAndroid Build Coastguard Worker *
755*2d1272b8SAndroid Build Coastguard Worker * Return value: The font-functions structure
756*2d1272b8SAndroid Build Coastguard Worker *
757*2d1272b8SAndroid Build Coastguard Worker * Since: 0.9.2
758*2d1272b8SAndroid Build Coastguard Worker **/
759*2d1272b8SAndroid Build Coastguard Worker hb_font_funcs_t *
hb_font_funcs_reference(hb_font_funcs_t * ffuncs)760*2d1272b8SAndroid Build Coastguard Worker hb_font_funcs_reference (hb_font_funcs_t *ffuncs)
761*2d1272b8SAndroid Build Coastguard Worker {
762*2d1272b8SAndroid Build Coastguard Worker return hb_object_reference (ffuncs);
763*2d1272b8SAndroid Build Coastguard Worker }
764*2d1272b8SAndroid Build Coastguard Worker
765*2d1272b8SAndroid Build Coastguard Worker /**
766*2d1272b8SAndroid Build Coastguard Worker * hb_font_funcs_destroy: (skip)
767*2d1272b8SAndroid Build Coastguard Worker * @ffuncs: The font-functions structure
768*2d1272b8SAndroid Build Coastguard Worker *
769*2d1272b8SAndroid Build Coastguard Worker * Decreases the reference count on a font-functions structure. When
770*2d1272b8SAndroid Build Coastguard Worker * the reference count reaches zero, the font-functions structure is
771*2d1272b8SAndroid Build Coastguard Worker * destroyed, freeing all memory.
772*2d1272b8SAndroid Build Coastguard Worker *
773*2d1272b8SAndroid Build Coastguard Worker * Since: 0.9.2
774*2d1272b8SAndroid Build Coastguard Worker **/
775*2d1272b8SAndroid Build Coastguard Worker void
hb_font_funcs_destroy(hb_font_funcs_t * ffuncs)776*2d1272b8SAndroid Build Coastguard Worker hb_font_funcs_destroy (hb_font_funcs_t *ffuncs)
777*2d1272b8SAndroid Build Coastguard Worker {
778*2d1272b8SAndroid Build Coastguard Worker if (!hb_object_destroy (ffuncs)) return;
779*2d1272b8SAndroid Build Coastguard Worker
780*2d1272b8SAndroid Build Coastguard Worker if (ffuncs->destroy)
781*2d1272b8SAndroid Build Coastguard Worker {
782*2d1272b8SAndroid Build Coastguard Worker #define HB_FONT_FUNC_IMPLEMENT(get_,name) if (ffuncs->destroy->name) \
783*2d1272b8SAndroid Build Coastguard Worker ffuncs->destroy->name (!ffuncs->user_data ? nullptr : ffuncs->user_data->name);
784*2d1272b8SAndroid Build Coastguard Worker HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
785*2d1272b8SAndroid Build Coastguard Worker #undef HB_FONT_FUNC_IMPLEMENT
786*2d1272b8SAndroid Build Coastguard Worker }
787*2d1272b8SAndroid Build Coastguard Worker
788*2d1272b8SAndroid Build Coastguard Worker hb_free (ffuncs->destroy);
789*2d1272b8SAndroid Build Coastguard Worker hb_free (ffuncs->user_data);
790*2d1272b8SAndroid Build Coastguard Worker
791*2d1272b8SAndroid Build Coastguard Worker hb_free (ffuncs);
792*2d1272b8SAndroid Build Coastguard Worker }
793*2d1272b8SAndroid Build Coastguard Worker
794*2d1272b8SAndroid Build Coastguard Worker /**
795*2d1272b8SAndroid Build Coastguard Worker * hb_font_funcs_set_user_data: (skip)
796*2d1272b8SAndroid Build Coastguard Worker * @ffuncs: The font-functions structure
797*2d1272b8SAndroid Build Coastguard Worker * @key: The user-data key to set
798*2d1272b8SAndroid Build Coastguard Worker * @data: A pointer to the user data set
799*2d1272b8SAndroid Build Coastguard Worker * @destroy: (nullable): A callback to call when @data is not needed anymore
800*2d1272b8SAndroid Build Coastguard Worker * @replace: Whether to replace an existing data with the same key
801*2d1272b8SAndroid Build Coastguard Worker *
802*2d1272b8SAndroid Build Coastguard Worker * Attaches a user-data key/data pair to the specified font-functions structure.
803*2d1272b8SAndroid Build Coastguard Worker *
804*2d1272b8SAndroid Build Coastguard Worker * Return value: `true` if success, `false` otherwise
805*2d1272b8SAndroid Build Coastguard Worker *
806*2d1272b8SAndroid Build Coastguard Worker * Since: 0.9.2
807*2d1272b8SAndroid Build Coastguard Worker **/
808*2d1272b8SAndroid Build Coastguard Worker hb_bool_t
hb_font_funcs_set_user_data(hb_font_funcs_t * ffuncs,hb_user_data_key_t * key,void * data,hb_destroy_func_t destroy,hb_bool_t replace)809*2d1272b8SAndroid Build Coastguard Worker hb_font_funcs_set_user_data (hb_font_funcs_t *ffuncs,
810*2d1272b8SAndroid Build Coastguard Worker hb_user_data_key_t *key,
811*2d1272b8SAndroid Build Coastguard Worker void * data,
812*2d1272b8SAndroid Build Coastguard Worker hb_destroy_func_t destroy /* May be NULL. */,
813*2d1272b8SAndroid Build Coastguard Worker hb_bool_t replace)
814*2d1272b8SAndroid Build Coastguard Worker {
815*2d1272b8SAndroid Build Coastguard Worker return hb_object_set_user_data (ffuncs, key, data, destroy, replace);
816*2d1272b8SAndroid Build Coastguard Worker }
817*2d1272b8SAndroid Build Coastguard Worker
818*2d1272b8SAndroid Build Coastguard Worker /**
819*2d1272b8SAndroid Build Coastguard Worker * hb_font_funcs_get_user_data: (skip)
820*2d1272b8SAndroid Build Coastguard Worker * @ffuncs: The font-functions structure
821*2d1272b8SAndroid Build Coastguard Worker * @key: The user-data key to query
822*2d1272b8SAndroid Build Coastguard Worker *
823*2d1272b8SAndroid Build Coastguard Worker * Fetches the user data associated with the specified key,
824*2d1272b8SAndroid Build Coastguard Worker * attached to the specified font-functions structure.
825*2d1272b8SAndroid Build Coastguard Worker *
826*2d1272b8SAndroid Build Coastguard Worker * Return value: (transfer none): A pointer to the user data
827*2d1272b8SAndroid Build Coastguard Worker *
828*2d1272b8SAndroid Build Coastguard Worker * Since: 0.9.2
829*2d1272b8SAndroid Build Coastguard Worker **/
830*2d1272b8SAndroid Build Coastguard Worker void *
hb_font_funcs_get_user_data(const hb_font_funcs_t * ffuncs,hb_user_data_key_t * key)831*2d1272b8SAndroid Build Coastguard Worker hb_font_funcs_get_user_data (const hb_font_funcs_t *ffuncs,
832*2d1272b8SAndroid Build Coastguard Worker hb_user_data_key_t *key)
833*2d1272b8SAndroid Build Coastguard Worker {
834*2d1272b8SAndroid Build Coastguard Worker return hb_object_get_user_data (ffuncs, key);
835*2d1272b8SAndroid Build Coastguard Worker }
836*2d1272b8SAndroid Build Coastguard Worker
837*2d1272b8SAndroid Build Coastguard Worker
838*2d1272b8SAndroid Build Coastguard Worker /**
839*2d1272b8SAndroid Build Coastguard Worker * hb_font_funcs_make_immutable:
840*2d1272b8SAndroid Build Coastguard Worker * @ffuncs: The font-functions structure
841*2d1272b8SAndroid Build Coastguard Worker *
842*2d1272b8SAndroid Build Coastguard Worker * Makes a font-functions structure immutable.
843*2d1272b8SAndroid Build Coastguard Worker *
844*2d1272b8SAndroid Build Coastguard Worker * Since: 0.9.2
845*2d1272b8SAndroid Build Coastguard Worker **/
846*2d1272b8SAndroid Build Coastguard Worker void
hb_font_funcs_make_immutable(hb_font_funcs_t * ffuncs)847*2d1272b8SAndroid Build Coastguard Worker hb_font_funcs_make_immutable (hb_font_funcs_t *ffuncs)
848*2d1272b8SAndroid Build Coastguard Worker {
849*2d1272b8SAndroid Build Coastguard Worker if (hb_object_is_immutable (ffuncs))
850*2d1272b8SAndroid Build Coastguard Worker return;
851*2d1272b8SAndroid Build Coastguard Worker
852*2d1272b8SAndroid Build Coastguard Worker hb_object_make_immutable (ffuncs);
853*2d1272b8SAndroid Build Coastguard Worker }
854*2d1272b8SAndroid Build Coastguard Worker
855*2d1272b8SAndroid Build Coastguard Worker /**
856*2d1272b8SAndroid Build Coastguard Worker * hb_font_funcs_is_immutable:
857*2d1272b8SAndroid Build Coastguard Worker * @ffuncs: The font-functions structure
858*2d1272b8SAndroid Build Coastguard Worker *
859*2d1272b8SAndroid Build Coastguard Worker * Tests whether a font-functions structure is immutable.
860*2d1272b8SAndroid Build Coastguard Worker *
861*2d1272b8SAndroid Build Coastguard Worker * Return value: `true` if @ffuncs is immutable, `false` otherwise
862*2d1272b8SAndroid Build Coastguard Worker *
863*2d1272b8SAndroid Build Coastguard Worker * Since: 0.9.2
864*2d1272b8SAndroid Build Coastguard Worker **/
865*2d1272b8SAndroid Build Coastguard Worker hb_bool_t
hb_font_funcs_is_immutable(hb_font_funcs_t * ffuncs)866*2d1272b8SAndroid Build Coastguard Worker hb_font_funcs_is_immutable (hb_font_funcs_t *ffuncs)
867*2d1272b8SAndroid Build Coastguard Worker {
868*2d1272b8SAndroid Build Coastguard Worker return hb_object_is_immutable (ffuncs);
869*2d1272b8SAndroid Build Coastguard Worker }
870*2d1272b8SAndroid Build Coastguard Worker
871*2d1272b8SAndroid Build Coastguard Worker
872*2d1272b8SAndroid Build Coastguard Worker static bool
_hb_font_funcs_set_preamble(hb_font_funcs_t * ffuncs,bool func_is_null,void ** user_data,hb_destroy_func_t * destroy)873*2d1272b8SAndroid Build Coastguard Worker _hb_font_funcs_set_preamble (hb_font_funcs_t *ffuncs,
874*2d1272b8SAndroid Build Coastguard Worker bool func_is_null,
875*2d1272b8SAndroid Build Coastguard Worker void **user_data,
876*2d1272b8SAndroid Build Coastguard Worker hb_destroy_func_t *destroy)
877*2d1272b8SAndroid Build Coastguard Worker {
878*2d1272b8SAndroid Build Coastguard Worker if (hb_object_is_immutable (ffuncs))
879*2d1272b8SAndroid Build Coastguard Worker {
880*2d1272b8SAndroid Build Coastguard Worker if (*destroy)
881*2d1272b8SAndroid Build Coastguard Worker (*destroy) (*user_data);
882*2d1272b8SAndroid Build Coastguard Worker return false;
883*2d1272b8SAndroid Build Coastguard Worker }
884*2d1272b8SAndroid Build Coastguard Worker
885*2d1272b8SAndroid Build Coastguard Worker if (func_is_null)
886*2d1272b8SAndroid Build Coastguard Worker {
887*2d1272b8SAndroid Build Coastguard Worker if (*destroy)
888*2d1272b8SAndroid Build Coastguard Worker (*destroy) (*user_data);
889*2d1272b8SAndroid Build Coastguard Worker *destroy = nullptr;
890*2d1272b8SAndroid Build Coastguard Worker *user_data = nullptr;
891*2d1272b8SAndroid Build Coastguard Worker }
892*2d1272b8SAndroid Build Coastguard Worker
893*2d1272b8SAndroid Build Coastguard Worker return true;
894*2d1272b8SAndroid Build Coastguard Worker }
895*2d1272b8SAndroid Build Coastguard Worker
896*2d1272b8SAndroid Build Coastguard Worker static bool
_hb_font_funcs_set_middle(hb_font_funcs_t * ffuncs,void * user_data,hb_destroy_func_t destroy)897*2d1272b8SAndroid Build Coastguard Worker _hb_font_funcs_set_middle (hb_font_funcs_t *ffuncs,
898*2d1272b8SAndroid Build Coastguard Worker void *user_data,
899*2d1272b8SAndroid Build Coastguard Worker hb_destroy_func_t destroy)
900*2d1272b8SAndroid Build Coastguard Worker {
901*2d1272b8SAndroid Build Coastguard Worker if (user_data && !ffuncs->user_data)
902*2d1272b8SAndroid Build Coastguard Worker {
903*2d1272b8SAndroid Build Coastguard Worker ffuncs->user_data = (decltype (ffuncs->user_data)) hb_calloc (1, sizeof (*ffuncs->user_data));
904*2d1272b8SAndroid Build Coastguard Worker if (unlikely (!ffuncs->user_data))
905*2d1272b8SAndroid Build Coastguard Worker goto fail;
906*2d1272b8SAndroid Build Coastguard Worker }
907*2d1272b8SAndroid Build Coastguard Worker if (destroy && !ffuncs->destroy)
908*2d1272b8SAndroid Build Coastguard Worker {
909*2d1272b8SAndroid Build Coastguard Worker ffuncs->destroy = (decltype (ffuncs->destroy)) hb_calloc (1, sizeof (*ffuncs->destroy));
910*2d1272b8SAndroid Build Coastguard Worker if (unlikely (!ffuncs->destroy))
911*2d1272b8SAndroid Build Coastguard Worker goto fail;
912*2d1272b8SAndroid Build Coastguard Worker }
913*2d1272b8SAndroid Build Coastguard Worker
914*2d1272b8SAndroid Build Coastguard Worker return true;
915*2d1272b8SAndroid Build Coastguard Worker
916*2d1272b8SAndroid Build Coastguard Worker fail:
917*2d1272b8SAndroid Build Coastguard Worker if (destroy)
918*2d1272b8SAndroid Build Coastguard Worker (destroy) (user_data);
919*2d1272b8SAndroid Build Coastguard Worker return false;
920*2d1272b8SAndroid Build Coastguard Worker }
921*2d1272b8SAndroid Build Coastguard Worker
922*2d1272b8SAndroid Build Coastguard Worker #define HB_FONT_FUNC_IMPLEMENT(get_,name) \
923*2d1272b8SAndroid Build Coastguard Worker \
924*2d1272b8SAndroid Build Coastguard Worker void \
925*2d1272b8SAndroid Build Coastguard Worker hb_font_funcs_set_##name##_func (hb_font_funcs_t *ffuncs, \
926*2d1272b8SAndroid Build Coastguard Worker hb_font_##get_##name##_func_t func, \
927*2d1272b8SAndroid Build Coastguard Worker void *user_data, \
928*2d1272b8SAndroid Build Coastguard Worker hb_destroy_func_t destroy) \
929*2d1272b8SAndroid Build Coastguard Worker { \
930*2d1272b8SAndroid Build Coastguard Worker if (!_hb_font_funcs_set_preamble (ffuncs, !func, &user_data, &destroy))\
931*2d1272b8SAndroid Build Coastguard Worker return; \
932*2d1272b8SAndroid Build Coastguard Worker \
933*2d1272b8SAndroid Build Coastguard Worker if (ffuncs->destroy && ffuncs->destroy->name) \
934*2d1272b8SAndroid Build Coastguard Worker ffuncs->destroy->name (!ffuncs->user_data ? nullptr : ffuncs->user_data->name); \
935*2d1272b8SAndroid Build Coastguard Worker \
936*2d1272b8SAndroid Build Coastguard Worker if (!_hb_font_funcs_set_middle (ffuncs, user_data, destroy)) \
937*2d1272b8SAndroid Build Coastguard Worker return; \
938*2d1272b8SAndroid Build Coastguard Worker \
939*2d1272b8SAndroid Build Coastguard Worker if (func) \
940*2d1272b8SAndroid Build Coastguard Worker ffuncs->get.f.name = func; \
941*2d1272b8SAndroid Build Coastguard Worker else \
942*2d1272b8SAndroid Build Coastguard Worker ffuncs->get.f.name = hb_font_##get_##name##_default; \
943*2d1272b8SAndroid Build Coastguard Worker \
944*2d1272b8SAndroid Build Coastguard Worker if (ffuncs->user_data) \
945*2d1272b8SAndroid Build Coastguard Worker ffuncs->user_data->name = user_data; \
946*2d1272b8SAndroid Build Coastguard Worker if (ffuncs->destroy) \
947*2d1272b8SAndroid Build Coastguard Worker ffuncs->destroy->name = destroy; \
948*2d1272b8SAndroid Build Coastguard Worker }
949*2d1272b8SAndroid Build Coastguard Worker
950*2d1272b8SAndroid Build Coastguard Worker HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
951*2d1272b8SAndroid Build Coastguard Worker #undef HB_FONT_FUNC_IMPLEMENT
952*2d1272b8SAndroid Build Coastguard Worker
953*2d1272b8SAndroid Build Coastguard Worker bool
has_func_set(unsigned int i)954*2d1272b8SAndroid Build Coastguard Worker hb_font_t::has_func_set (unsigned int i)
955*2d1272b8SAndroid Build Coastguard Worker {
956*2d1272b8SAndroid Build Coastguard Worker return this->klass->get.array[i] != _hb_font_funcs_default.get.array[i];
957*2d1272b8SAndroid Build Coastguard Worker }
958*2d1272b8SAndroid Build Coastguard Worker
959*2d1272b8SAndroid Build Coastguard Worker bool
has_func(unsigned int i)960*2d1272b8SAndroid Build Coastguard Worker hb_font_t::has_func (unsigned int i)
961*2d1272b8SAndroid Build Coastguard Worker {
962*2d1272b8SAndroid Build Coastguard Worker return has_func_set (i) ||
963*2d1272b8SAndroid Build Coastguard Worker (parent && parent != &_hb_Null_hb_font_t && parent->has_func (i));
964*2d1272b8SAndroid Build Coastguard Worker }
965*2d1272b8SAndroid Build Coastguard Worker
966*2d1272b8SAndroid Build Coastguard Worker /* Public getters */
967*2d1272b8SAndroid Build Coastguard Worker
968*2d1272b8SAndroid Build Coastguard Worker /**
969*2d1272b8SAndroid Build Coastguard Worker * hb_font_get_h_extents:
970*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
971*2d1272b8SAndroid Build Coastguard Worker * @extents: (out): The font extents retrieved
972*2d1272b8SAndroid Build Coastguard Worker *
973*2d1272b8SAndroid Build Coastguard Worker * Fetches the extents for a specified font, for horizontal
974*2d1272b8SAndroid Build Coastguard Worker * text segments.
975*2d1272b8SAndroid Build Coastguard Worker *
976*2d1272b8SAndroid Build Coastguard Worker * Return value: `true` if data found, `false` otherwise
977*2d1272b8SAndroid Build Coastguard Worker *
978*2d1272b8SAndroid Build Coastguard Worker * Since: 1.1.3
979*2d1272b8SAndroid Build Coastguard Worker **/
980*2d1272b8SAndroid Build Coastguard Worker hb_bool_t
hb_font_get_h_extents(hb_font_t * font,hb_font_extents_t * extents)981*2d1272b8SAndroid Build Coastguard Worker hb_font_get_h_extents (hb_font_t *font,
982*2d1272b8SAndroid Build Coastguard Worker hb_font_extents_t *extents)
983*2d1272b8SAndroid Build Coastguard Worker {
984*2d1272b8SAndroid Build Coastguard Worker return font->get_font_h_extents (extents);
985*2d1272b8SAndroid Build Coastguard Worker }
986*2d1272b8SAndroid Build Coastguard Worker
987*2d1272b8SAndroid Build Coastguard Worker /**
988*2d1272b8SAndroid Build Coastguard Worker * hb_font_get_v_extents:
989*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
990*2d1272b8SAndroid Build Coastguard Worker * @extents: (out): The font extents retrieved
991*2d1272b8SAndroid Build Coastguard Worker *
992*2d1272b8SAndroid Build Coastguard Worker * Fetches the extents for a specified font, for vertical
993*2d1272b8SAndroid Build Coastguard Worker * text segments.
994*2d1272b8SAndroid Build Coastguard Worker *
995*2d1272b8SAndroid Build Coastguard Worker * Return value: `true` if data found, `false` otherwise
996*2d1272b8SAndroid Build Coastguard Worker *
997*2d1272b8SAndroid Build Coastguard Worker * Since: 1.1.3
998*2d1272b8SAndroid Build Coastguard Worker **/
999*2d1272b8SAndroid Build Coastguard Worker hb_bool_t
hb_font_get_v_extents(hb_font_t * font,hb_font_extents_t * extents)1000*2d1272b8SAndroid Build Coastguard Worker hb_font_get_v_extents (hb_font_t *font,
1001*2d1272b8SAndroid Build Coastguard Worker hb_font_extents_t *extents)
1002*2d1272b8SAndroid Build Coastguard Worker {
1003*2d1272b8SAndroid Build Coastguard Worker return font->get_font_v_extents (extents);
1004*2d1272b8SAndroid Build Coastguard Worker }
1005*2d1272b8SAndroid Build Coastguard Worker
1006*2d1272b8SAndroid Build Coastguard Worker /**
1007*2d1272b8SAndroid Build Coastguard Worker * hb_font_get_glyph:
1008*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
1009*2d1272b8SAndroid Build Coastguard Worker * @unicode: The Unicode code point to query
1010*2d1272b8SAndroid Build Coastguard Worker * @variation_selector: A variation-selector code point
1011*2d1272b8SAndroid Build Coastguard Worker * @glyph: (out): The glyph ID retrieved
1012*2d1272b8SAndroid Build Coastguard Worker *
1013*2d1272b8SAndroid Build Coastguard Worker * Fetches the glyph ID for a Unicode code point in the specified
1014*2d1272b8SAndroid Build Coastguard Worker * font, with an optional variation selector.
1015*2d1272b8SAndroid Build Coastguard Worker *
1016*2d1272b8SAndroid Build Coastguard Worker * If @variation_selector is 0, calls hb_font_get_nominal_glyph();
1017*2d1272b8SAndroid Build Coastguard Worker * otherwise calls hb_font_get_variation_glyph().
1018*2d1272b8SAndroid Build Coastguard Worker *
1019*2d1272b8SAndroid Build Coastguard Worker * Return value: `true` if data found, `false` otherwise
1020*2d1272b8SAndroid Build Coastguard Worker *
1021*2d1272b8SAndroid Build Coastguard Worker * Since: 0.9.2
1022*2d1272b8SAndroid Build Coastguard Worker **/
1023*2d1272b8SAndroid Build Coastguard Worker hb_bool_t
hb_font_get_glyph(hb_font_t * font,hb_codepoint_t unicode,hb_codepoint_t variation_selector,hb_codepoint_t * glyph)1024*2d1272b8SAndroid Build Coastguard Worker hb_font_get_glyph (hb_font_t *font,
1025*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t unicode,
1026*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t variation_selector,
1027*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t *glyph)
1028*2d1272b8SAndroid Build Coastguard Worker {
1029*2d1272b8SAndroid Build Coastguard Worker if (unlikely (variation_selector))
1030*2d1272b8SAndroid Build Coastguard Worker return font->get_variation_glyph (unicode, variation_selector, glyph);
1031*2d1272b8SAndroid Build Coastguard Worker return font->get_nominal_glyph (unicode, glyph);
1032*2d1272b8SAndroid Build Coastguard Worker }
1033*2d1272b8SAndroid Build Coastguard Worker
1034*2d1272b8SAndroid Build Coastguard Worker /**
1035*2d1272b8SAndroid Build Coastguard Worker * hb_font_get_nominal_glyph:
1036*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
1037*2d1272b8SAndroid Build Coastguard Worker * @unicode: The Unicode code point to query
1038*2d1272b8SAndroid Build Coastguard Worker * @glyph: (out): The glyph ID retrieved
1039*2d1272b8SAndroid Build Coastguard Worker *
1040*2d1272b8SAndroid Build Coastguard Worker * Fetches the nominal glyph ID for a Unicode code point in the
1041*2d1272b8SAndroid Build Coastguard Worker * specified font.
1042*2d1272b8SAndroid Build Coastguard Worker *
1043*2d1272b8SAndroid Build Coastguard Worker * This version of the function should not be used to fetch glyph IDs
1044*2d1272b8SAndroid Build Coastguard Worker * for code points modified by variation selectors. For variation-selector
1045*2d1272b8SAndroid Build Coastguard Worker * support, user hb_font_get_variation_glyph() or use hb_font_get_glyph().
1046*2d1272b8SAndroid Build Coastguard Worker *
1047*2d1272b8SAndroid Build Coastguard Worker * Return value: `true` if data found, `false` otherwise
1048*2d1272b8SAndroid Build Coastguard Worker *
1049*2d1272b8SAndroid Build Coastguard Worker * Since: 1.2.3
1050*2d1272b8SAndroid Build Coastguard Worker **/
1051*2d1272b8SAndroid Build Coastguard Worker hb_bool_t
hb_font_get_nominal_glyph(hb_font_t * font,hb_codepoint_t unicode,hb_codepoint_t * glyph)1052*2d1272b8SAndroid Build Coastguard Worker hb_font_get_nominal_glyph (hb_font_t *font,
1053*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t unicode,
1054*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t *glyph)
1055*2d1272b8SAndroid Build Coastguard Worker {
1056*2d1272b8SAndroid Build Coastguard Worker return font->get_nominal_glyph (unicode, glyph);
1057*2d1272b8SAndroid Build Coastguard Worker }
1058*2d1272b8SAndroid Build Coastguard Worker
1059*2d1272b8SAndroid Build Coastguard Worker /**
1060*2d1272b8SAndroid Build Coastguard Worker * hb_font_get_nominal_glyphs:
1061*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
1062*2d1272b8SAndroid Build Coastguard Worker * @count: number of code points to query
1063*2d1272b8SAndroid Build Coastguard Worker * @first_unicode: The first Unicode code point to query
1064*2d1272b8SAndroid Build Coastguard Worker * @unicode_stride: The stride between successive code points
1065*2d1272b8SAndroid Build Coastguard Worker * @first_glyph: (out): The first glyph ID retrieved
1066*2d1272b8SAndroid Build Coastguard Worker * @glyph_stride: The stride between successive glyph IDs
1067*2d1272b8SAndroid Build Coastguard Worker *
1068*2d1272b8SAndroid Build Coastguard Worker * Fetches the nominal glyph IDs for a sequence of Unicode code points. Glyph
1069*2d1272b8SAndroid Build Coastguard Worker * IDs must be returned in a #hb_codepoint_t output parameter. Stops at the
1070*2d1272b8SAndroid Build Coastguard Worker * first unsupported glyph ID.
1071*2d1272b8SAndroid Build Coastguard Worker *
1072*2d1272b8SAndroid Build Coastguard Worker * Return value: the number of code points processed
1073*2d1272b8SAndroid Build Coastguard Worker *
1074*2d1272b8SAndroid Build Coastguard Worker * Since: 2.6.3
1075*2d1272b8SAndroid Build Coastguard Worker **/
1076*2d1272b8SAndroid Build Coastguard Worker unsigned int
hb_font_get_nominal_glyphs(hb_font_t * font,unsigned int count,const hb_codepoint_t * first_unicode,unsigned int unicode_stride,hb_codepoint_t * first_glyph,unsigned int glyph_stride)1077*2d1272b8SAndroid Build Coastguard Worker hb_font_get_nominal_glyphs (hb_font_t *font,
1078*2d1272b8SAndroid Build Coastguard Worker unsigned int count,
1079*2d1272b8SAndroid Build Coastguard Worker const hb_codepoint_t *first_unicode,
1080*2d1272b8SAndroid Build Coastguard Worker unsigned int unicode_stride,
1081*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t *first_glyph,
1082*2d1272b8SAndroid Build Coastguard Worker unsigned int glyph_stride)
1083*2d1272b8SAndroid Build Coastguard Worker {
1084*2d1272b8SAndroid Build Coastguard Worker return font->get_nominal_glyphs (count,
1085*2d1272b8SAndroid Build Coastguard Worker first_unicode, unicode_stride,
1086*2d1272b8SAndroid Build Coastguard Worker first_glyph, glyph_stride);
1087*2d1272b8SAndroid Build Coastguard Worker }
1088*2d1272b8SAndroid Build Coastguard Worker
1089*2d1272b8SAndroid Build Coastguard Worker /**
1090*2d1272b8SAndroid Build Coastguard Worker * hb_font_get_variation_glyph:
1091*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
1092*2d1272b8SAndroid Build Coastguard Worker * @unicode: The Unicode code point to query
1093*2d1272b8SAndroid Build Coastguard Worker * @variation_selector: The variation-selector code point to query
1094*2d1272b8SAndroid Build Coastguard Worker * @glyph: (out): The glyph ID retrieved
1095*2d1272b8SAndroid Build Coastguard Worker *
1096*2d1272b8SAndroid Build Coastguard Worker * Fetches the glyph ID for a Unicode code point when followed by
1097*2d1272b8SAndroid Build Coastguard Worker * by the specified variation-selector code point, in the specified
1098*2d1272b8SAndroid Build Coastguard Worker * font.
1099*2d1272b8SAndroid Build Coastguard Worker *
1100*2d1272b8SAndroid Build Coastguard Worker * Return value: `true` if data found, `false` otherwise
1101*2d1272b8SAndroid Build Coastguard Worker *
1102*2d1272b8SAndroid Build Coastguard Worker * Since: 1.2.3
1103*2d1272b8SAndroid Build Coastguard Worker **/
1104*2d1272b8SAndroid Build Coastguard Worker hb_bool_t
hb_font_get_variation_glyph(hb_font_t * font,hb_codepoint_t unicode,hb_codepoint_t variation_selector,hb_codepoint_t * glyph)1105*2d1272b8SAndroid Build Coastguard Worker hb_font_get_variation_glyph (hb_font_t *font,
1106*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t unicode,
1107*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t variation_selector,
1108*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t *glyph)
1109*2d1272b8SAndroid Build Coastguard Worker {
1110*2d1272b8SAndroid Build Coastguard Worker return font->get_variation_glyph (unicode, variation_selector, glyph);
1111*2d1272b8SAndroid Build Coastguard Worker }
1112*2d1272b8SAndroid Build Coastguard Worker
1113*2d1272b8SAndroid Build Coastguard Worker /**
1114*2d1272b8SAndroid Build Coastguard Worker * hb_font_get_glyph_h_advance:
1115*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
1116*2d1272b8SAndroid Build Coastguard Worker * @glyph: The glyph ID to query
1117*2d1272b8SAndroid Build Coastguard Worker *
1118*2d1272b8SAndroid Build Coastguard Worker * Fetches the advance for a glyph ID in the specified font,
1119*2d1272b8SAndroid Build Coastguard Worker * for horizontal text segments.
1120*2d1272b8SAndroid Build Coastguard Worker *
1121*2d1272b8SAndroid Build Coastguard Worker * Return value: The advance of @glyph within @font
1122*2d1272b8SAndroid Build Coastguard Worker *
1123*2d1272b8SAndroid Build Coastguard Worker * Since: 0.9.2
1124*2d1272b8SAndroid Build Coastguard Worker **/
1125*2d1272b8SAndroid Build Coastguard Worker hb_position_t
hb_font_get_glyph_h_advance(hb_font_t * font,hb_codepoint_t glyph)1126*2d1272b8SAndroid Build Coastguard Worker hb_font_get_glyph_h_advance (hb_font_t *font,
1127*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t glyph)
1128*2d1272b8SAndroid Build Coastguard Worker {
1129*2d1272b8SAndroid Build Coastguard Worker return font->get_glyph_h_advance (glyph);
1130*2d1272b8SAndroid Build Coastguard Worker }
1131*2d1272b8SAndroid Build Coastguard Worker
1132*2d1272b8SAndroid Build Coastguard Worker /**
1133*2d1272b8SAndroid Build Coastguard Worker * hb_font_get_glyph_v_advance:
1134*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
1135*2d1272b8SAndroid Build Coastguard Worker * @glyph: The glyph ID to query
1136*2d1272b8SAndroid Build Coastguard Worker *
1137*2d1272b8SAndroid Build Coastguard Worker * Fetches the advance for a glyph ID in the specified font,
1138*2d1272b8SAndroid Build Coastguard Worker * for vertical text segments.
1139*2d1272b8SAndroid Build Coastguard Worker *
1140*2d1272b8SAndroid Build Coastguard Worker * Return value: The advance of @glyph within @font
1141*2d1272b8SAndroid Build Coastguard Worker *
1142*2d1272b8SAndroid Build Coastguard Worker * Since: 0.9.2
1143*2d1272b8SAndroid Build Coastguard Worker **/
1144*2d1272b8SAndroid Build Coastguard Worker hb_position_t
hb_font_get_glyph_v_advance(hb_font_t * font,hb_codepoint_t glyph)1145*2d1272b8SAndroid Build Coastguard Worker hb_font_get_glyph_v_advance (hb_font_t *font,
1146*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t glyph)
1147*2d1272b8SAndroid Build Coastguard Worker {
1148*2d1272b8SAndroid Build Coastguard Worker return font->get_glyph_v_advance (glyph);
1149*2d1272b8SAndroid Build Coastguard Worker }
1150*2d1272b8SAndroid Build Coastguard Worker
1151*2d1272b8SAndroid Build Coastguard Worker /**
1152*2d1272b8SAndroid Build Coastguard Worker * hb_font_get_glyph_h_advances:
1153*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
1154*2d1272b8SAndroid Build Coastguard Worker * @count: The number of glyph IDs in the sequence queried
1155*2d1272b8SAndroid Build Coastguard Worker * @first_glyph: The first glyph ID to query
1156*2d1272b8SAndroid Build Coastguard Worker * @glyph_stride: The stride between successive glyph IDs
1157*2d1272b8SAndroid Build Coastguard Worker * @first_advance: (out): The first advance retrieved
1158*2d1272b8SAndroid Build Coastguard Worker * @advance_stride: The stride between successive advances
1159*2d1272b8SAndroid Build Coastguard Worker *
1160*2d1272b8SAndroid Build Coastguard Worker * Fetches the advances for a sequence of glyph IDs in the specified
1161*2d1272b8SAndroid Build Coastguard Worker * font, for horizontal text segments.
1162*2d1272b8SAndroid Build Coastguard Worker *
1163*2d1272b8SAndroid Build Coastguard Worker * Since: 1.8.6
1164*2d1272b8SAndroid Build Coastguard Worker **/
1165*2d1272b8SAndroid Build Coastguard Worker void
hb_font_get_glyph_h_advances(hb_font_t * font,unsigned int count,const hb_codepoint_t * first_glyph,unsigned glyph_stride,hb_position_t * first_advance,unsigned advance_stride)1166*2d1272b8SAndroid Build Coastguard Worker hb_font_get_glyph_h_advances (hb_font_t* font,
1167*2d1272b8SAndroid Build Coastguard Worker unsigned int count,
1168*2d1272b8SAndroid Build Coastguard Worker const hb_codepoint_t *first_glyph,
1169*2d1272b8SAndroid Build Coastguard Worker unsigned glyph_stride,
1170*2d1272b8SAndroid Build Coastguard Worker hb_position_t *first_advance,
1171*2d1272b8SAndroid Build Coastguard Worker unsigned advance_stride)
1172*2d1272b8SAndroid Build Coastguard Worker {
1173*2d1272b8SAndroid Build Coastguard Worker font->get_glyph_h_advances (count, first_glyph, glyph_stride, first_advance, advance_stride);
1174*2d1272b8SAndroid Build Coastguard Worker }
1175*2d1272b8SAndroid Build Coastguard Worker /**
1176*2d1272b8SAndroid Build Coastguard Worker * hb_font_get_glyph_v_advances:
1177*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
1178*2d1272b8SAndroid Build Coastguard Worker * @count: The number of glyph IDs in the sequence queried
1179*2d1272b8SAndroid Build Coastguard Worker * @first_glyph: The first glyph ID to query
1180*2d1272b8SAndroid Build Coastguard Worker * @glyph_stride: The stride between successive glyph IDs
1181*2d1272b8SAndroid Build Coastguard Worker * @first_advance: (out): The first advance retrieved
1182*2d1272b8SAndroid Build Coastguard Worker * @advance_stride: (out): The stride between successive advances
1183*2d1272b8SAndroid Build Coastguard Worker *
1184*2d1272b8SAndroid Build Coastguard Worker * Fetches the advances for a sequence of glyph IDs in the specified
1185*2d1272b8SAndroid Build Coastguard Worker * font, for vertical text segments.
1186*2d1272b8SAndroid Build Coastguard Worker *
1187*2d1272b8SAndroid Build Coastguard Worker * Since: 1.8.6
1188*2d1272b8SAndroid Build Coastguard Worker **/
1189*2d1272b8SAndroid Build Coastguard Worker void
hb_font_get_glyph_v_advances(hb_font_t * font,unsigned int count,const hb_codepoint_t * first_glyph,unsigned glyph_stride,hb_position_t * first_advance,unsigned advance_stride)1190*2d1272b8SAndroid Build Coastguard Worker hb_font_get_glyph_v_advances (hb_font_t* font,
1191*2d1272b8SAndroid Build Coastguard Worker unsigned int count,
1192*2d1272b8SAndroid Build Coastguard Worker const hb_codepoint_t *first_glyph,
1193*2d1272b8SAndroid Build Coastguard Worker unsigned glyph_stride,
1194*2d1272b8SAndroid Build Coastguard Worker hb_position_t *first_advance,
1195*2d1272b8SAndroid Build Coastguard Worker unsigned advance_stride)
1196*2d1272b8SAndroid Build Coastguard Worker {
1197*2d1272b8SAndroid Build Coastguard Worker font->get_glyph_v_advances (count, first_glyph, glyph_stride, first_advance, advance_stride);
1198*2d1272b8SAndroid Build Coastguard Worker }
1199*2d1272b8SAndroid Build Coastguard Worker
1200*2d1272b8SAndroid Build Coastguard Worker /**
1201*2d1272b8SAndroid Build Coastguard Worker * hb_font_get_glyph_h_origin:
1202*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
1203*2d1272b8SAndroid Build Coastguard Worker * @glyph: The glyph ID to query
1204*2d1272b8SAndroid Build Coastguard Worker * @x: (out): The X coordinate of the origin
1205*2d1272b8SAndroid Build Coastguard Worker * @y: (out): The Y coordinate of the origin
1206*2d1272b8SAndroid Build Coastguard Worker *
1207*2d1272b8SAndroid Build Coastguard Worker * Fetches the (X,Y) coordinates of the origin for a glyph ID
1208*2d1272b8SAndroid Build Coastguard Worker * in the specified font, for horizontal text segments.
1209*2d1272b8SAndroid Build Coastguard Worker *
1210*2d1272b8SAndroid Build Coastguard Worker * Return value: `true` if data found, `false` otherwise
1211*2d1272b8SAndroid Build Coastguard Worker *
1212*2d1272b8SAndroid Build Coastguard Worker * Since: 0.9.2
1213*2d1272b8SAndroid Build Coastguard Worker **/
1214*2d1272b8SAndroid Build Coastguard Worker hb_bool_t
hb_font_get_glyph_h_origin(hb_font_t * font,hb_codepoint_t glyph,hb_position_t * x,hb_position_t * y)1215*2d1272b8SAndroid Build Coastguard Worker hb_font_get_glyph_h_origin (hb_font_t *font,
1216*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t glyph,
1217*2d1272b8SAndroid Build Coastguard Worker hb_position_t *x,
1218*2d1272b8SAndroid Build Coastguard Worker hb_position_t *y)
1219*2d1272b8SAndroid Build Coastguard Worker {
1220*2d1272b8SAndroid Build Coastguard Worker return font->get_glyph_h_origin (glyph, x, y);
1221*2d1272b8SAndroid Build Coastguard Worker }
1222*2d1272b8SAndroid Build Coastguard Worker
1223*2d1272b8SAndroid Build Coastguard Worker /**
1224*2d1272b8SAndroid Build Coastguard Worker * hb_font_get_glyph_v_origin:
1225*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
1226*2d1272b8SAndroid Build Coastguard Worker * @glyph: The glyph ID to query
1227*2d1272b8SAndroid Build Coastguard Worker * @x: (out): The X coordinate of the origin
1228*2d1272b8SAndroid Build Coastguard Worker * @y: (out): The Y coordinate of the origin
1229*2d1272b8SAndroid Build Coastguard Worker *
1230*2d1272b8SAndroid Build Coastguard Worker * Fetches the (X,Y) coordinates of the origin for a glyph ID
1231*2d1272b8SAndroid Build Coastguard Worker * in the specified font, for vertical text segments.
1232*2d1272b8SAndroid Build Coastguard Worker *
1233*2d1272b8SAndroid Build Coastguard Worker * Return value: `true` if data found, `false` otherwise
1234*2d1272b8SAndroid Build Coastguard Worker *
1235*2d1272b8SAndroid Build Coastguard Worker * Since: 0.9.2
1236*2d1272b8SAndroid Build Coastguard Worker **/
1237*2d1272b8SAndroid Build Coastguard Worker hb_bool_t
hb_font_get_glyph_v_origin(hb_font_t * font,hb_codepoint_t glyph,hb_position_t * x,hb_position_t * y)1238*2d1272b8SAndroid Build Coastguard Worker hb_font_get_glyph_v_origin (hb_font_t *font,
1239*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t glyph,
1240*2d1272b8SAndroid Build Coastguard Worker hb_position_t *x,
1241*2d1272b8SAndroid Build Coastguard Worker hb_position_t *y)
1242*2d1272b8SAndroid Build Coastguard Worker {
1243*2d1272b8SAndroid Build Coastguard Worker return font->get_glyph_v_origin (glyph, x, y);
1244*2d1272b8SAndroid Build Coastguard Worker }
1245*2d1272b8SAndroid Build Coastguard Worker
1246*2d1272b8SAndroid Build Coastguard Worker /**
1247*2d1272b8SAndroid Build Coastguard Worker * hb_font_get_glyph_h_kerning:
1248*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
1249*2d1272b8SAndroid Build Coastguard Worker * @left_glyph: The glyph ID of the left glyph in the glyph pair
1250*2d1272b8SAndroid Build Coastguard Worker * @right_glyph: The glyph ID of the right glyph in the glyph pair
1251*2d1272b8SAndroid Build Coastguard Worker *
1252*2d1272b8SAndroid Build Coastguard Worker * Fetches the kerning-adjustment value for a glyph-pair in
1253*2d1272b8SAndroid Build Coastguard Worker * the specified font, for horizontal text segments.
1254*2d1272b8SAndroid Build Coastguard Worker *
1255*2d1272b8SAndroid Build Coastguard Worker * <note>It handles legacy kerning only (as returned by the corresponding
1256*2d1272b8SAndroid Build Coastguard Worker * #hb_font_funcs_t function).</note>
1257*2d1272b8SAndroid Build Coastguard Worker *
1258*2d1272b8SAndroid Build Coastguard Worker * Return value: The kerning adjustment value
1259*2d1272b8SAndroid Build Coastguard Worker *
1260*2d1272b8SAndroid Build Coastguard Worker * Since: 0.9.2
1261*2d1272b8SAndroid Build Coastguard Worker **/
1262*2d1272b8SAndroid Build Coastguard Worker hb_position_t
hb_font_get_glyph_h_kerning(hb_font_t * font,hb_codepoint_t left_glyph,hb_codepoint_t right_glyph)1263*2d1272b8SAndroid Build Coastguard Worker hb_font_get_glyph_h_kerning (hb_font_t *font,
1264*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t left_glyph,
1265*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t right_glyph)
1266*2d1272b8SAndroid Build Coastguard Worker {
1267*2d1272b8SAndroid Build Coastguard Worker return font->get_glyph_h_kerning (left_glyph, right_glyph);
1268*2d1272b8SAndroid Build Coastguard Worker }
1269*2d1272b8SAndroid Build Coastguard Worker
1270*2d1272b8SAndroid Build Coastguard Worker #ifndef HB_DISABLE_DEPRECATED
1271*2d1272b8SAndroid Build Coastguard Worker /**
1272*2d1272b8SAndroid Build Coastguard Worker * hb_font_get_glyph_v_kerning:
1273*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
1274*2d1272b8SAndroid Build Coastguard Worker * @top_glyph: The glyph ID of the top glyph in the glyph pair
1275*2d1272b8SAndroid Build Coastguard Worker * @bottom_glyph: The glyph ID of the bottom glyph in the glyph pair
1276*2d1272b8SAndroid Build Coastguard Worker *
1277*2d1272b8SAndroid Build Coastguard Worker * Fetches the kerning-adjustment value for a glyph-pair in
1278*2d1272b8SAndroid Build Coastguard Worker * the specified font, for vertical text segments.
1279*2d1272b8SAndroid Build Coastguard Worker *
1280*2d1272b8SAndroid Build Coastguard Worker * <note>It handles legacy kerning only (as returned by the corresponding
1281*2d1272b8SAndroid Build Coastguard Worker * #hb_font_funcs_t function).</note>
1282*2d1272b8SAndroid Build Coastguard Worker *
1283*2d1272b8SAndroid Build Coastguard Worker * Return value: The kerning adjustment value
1284*2d1272b8SAndroid Build Coastguard Worker *
1285*2d1272b8SAndroid Build Coastguard Worker * Since: 0.9.2
1286*2d1272b8SAndroid Build Coastguard Worker * Deprecated: 2.0.0
1287*2d1272b8SAndroid Build Coastguard Worker **/
1288*2d1272b8SAndroid Build Coastguard Worker hb_position_t
hb_font_get_glyph_v_kerning(hb_font_t * font,hb_codepoint_t top_glyph,hb_codepoint_t bottom_glyph)1289*2d1272b8SAndroid Build Coastguard Worker hb_font_get_glyph_v_kerning (hb_font_t *font,
1290*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t top_glyph,
1291*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t bottom_glyph)
1292*2d1272b8SAndroid Build Coastguard Worker {
1293*2d1272b8SAndroid Build Coastguard Worker return font->get_glyph_v_kerning (top_glyph, bottom_glyph);
1294*2d1272b8SAndroid Build Coastguard Worker }
1295*2d1272b8SAndroid Build Coastguard Worker #endif
1296*2d1272b8SAndroid Build Coastguard Worker
1297*2d1272b8SAndroid Build Coastguard Worker /**
1298*2d1272b8SAndroid Build Coastguard Worker * hb_font_get_glyph_extents:
1299*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
1300*2d1272b8SAndroid Build Coastguard Worker * @glyph: The glyph ID to query
1301*2d1272b8SAndroid Build Coastguard Worker * @extents: (out): The #hb_glyph_extents_t retrieved
1302*2d1272b8SAndroid Build Coastguard Worker *
1303*2d1272b8SAndroid Build Coastguard Worker * Fetches the #hb_glyph_extents_t data for a glyph ID
1304*2d1272b8SAndroid Build Coastguard Worker * in the specified font.
1305*2d1272b8SAndroid Build Coastguard Worker *
1306*2d1272b8SAndroid Build Coastguard Worker * Return value: `true` if data found, `false` otherwise
1307*2d1272b8SAndroid Build Coastguard Worker *
1308*2d1272b8SAndroid Build Coastguard Worker * Since: 0.9.2
1309*2d1272b8SAndroid Build Coastguard Worker **/
1310*2d1272b8SAndroid Build Coastguard Worker hb_bool_t
hb_font_get_glyph_extents(hb_font_t * font,hb_codepoint_t glyph,hb_glyph_extents_t * extents)1311*2d1272b8SAndroid Build Coastguard Worker hb_font_get_glyph_extents (hb_font_t *font,
1312*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t glyph,
1313*2d1272b8SAndroid Build Coastguard Worker hb_glyph_extents_t *extents)
1314*2d1272b8SAndroid Build Coastguard Worker {
1315*2d1272b8SAndroid Build Coastguard Worker return font->get_glyph_extents (glyph, extents);
1316*2d1272b8SAndroid Build Coastguard Worker }
1317*2d1272b8SAndroid Build Coastguard Worker
1318*2d1272b8SAndroid Build Coastguard Worker /**
1319*2d1272b8SAndroid Build Coastguard Worker * hb_font_get_glyph_contour_point:
1320*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
1321*2d1272b8SAndroid Build Coastguard Worker * @glyph: The glyph ID to query
1322*2d1272b8SAndroid Build Coastguard Worker * @point_index: The contour-point index to query
1323*2d1272b8SAndroid Build Coastguard Worker * @x: (out): The X value retrieved for the contour point
1324*2d1272b8SAndroid Build Coastguard Worker * @y: (out): The Y value retrieved for the contour point
1325*2d1272b8SAndroid Build Coastguard Worker *
1326*2d1272b8SAndroid Build Coastguard Worker * Fetches the (x,y) coordinates of a specified contour-point index
1327*2d1272b8SAndroid Build Coastguard Worker * in the specified glyph, within the specified font.
1328*2d1272b8SAndroid Build Coastguard Worker *
1329*2d1272b8SAndroid Build Coastguard Worker * Return value: `true` if data found, `false` otherwise
1330*2d1272b8SAndroid Build Coastguard Worker *
1331*2d1272b8SAndroid Build Coastguard Worker * Since: 0.9.2
1332*2d1272b8SAndroid Build Coastguard Worker **/
1333*2d1272b8SAndroid Build Coastguard Worker hb_bool_t
hb_font_get_glyph_contour_point(hb_font_t * font,hb_codepoint_t glyph,unsigned int point_index,hb_position_t * x,hb_position_t * y)1334*2d1272b8SAndroid Build Coastguard Worker hb_font_get_glyph_contour_point (hb_font_t *font,
1335*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t glyph,
1336*2d1272b8SAndroid Build Coastguard Worker unsigned int point_index,
1337*2d1272b8SAndroid Build Coastguard Worker hb_position_t *x,
1338*2d1272b8SAndroid Build Coastguard Worker hb_position_t *y)
1339*2d1272b8SAndroid Build Coastguard Worker {
1340*2d1272b8SAndroid Build Coastguard Worker return font->get_glyph_contour_point (glyph, point_index, x, y);
1341*2d1272b8SAndroid Build Coastguard Worker }
1342*2d1272b8SAndroid Build Coastguard Worker
1343*2d1272b8SAndroid Build Coastguard Worker /**
1344*2d1272b8SAndroid Build Coastguard Worker * hb_font_get_glyph_name:
1345*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
1346*2d1272b8SAndroid Build Coastguard Worker * @glyph: The glyph ID to query
1347*2d1272b8SAndroid Build Coastguard Worker * @name: (out) (array length=size): Name string retrieved for the glyph ID
1348*2d1272b8SAndroid Build Coastguard Worker * @size: Length of the glyph-name string retrieved
1349*2d1272b8SAndroid Build Coastguard Worker *
1350*2d1272b8SAndroid Build Coastguard Worker * Fetches the glyph-name string for a glyph ID in the specified @font.
1351*2d1272b8SAndroid Build Coastguard Worker *
1352*2d1272b8SAndroid Build Coastguard Worker * According to the OpenType specification, glyph names are limited to 63
1353*2d1272b8SAndroid Build Coastguard Worker * characters and can only contain (a subset of) ASCII.
1354*2d1272b8SAndroid Build Coastguard Worker *
1355*2d1272b8SAndroid Build Coastguard Worker * Return value: `true` if data found, `false` otherwise
1356*2d1272b8SAndroid Build Coastguard Worker *
1357*2d1272b8SAndroid Build Coastguard Worker * Since: 0.9.2
1358*2d1272b8SAndroid Build Coastguard Worker **/
1359*2d1272b8SAndroid Build Coastguard Worker hb_bool_t
hb_font_get_glyph_name(hb_font_t * font,hb_codepoint_t glyph,char * name,unsigned int size)1360*2d1272b8SAndroid Build Coastguard Worker hb_font_get_glyph_name (hb_font_t *font,
1361*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t glyph,
1362*2d1272b8SAndroid Build Coastguard Worker char *name,
1363*2d1272b8SAndroid Build Coastguard Worker unsigned int size)
1364*2d1272b8SAndroid Build Coastguard Worker {
1365*2d1272b8SAndroid Build Coastguard Worker return font->get_glyph_name (glyph, name, size);
1366*2d1272b8SAndroid Build Coastguard Worker }
1367*2d1272b8SAndroid Build Coastguard Worker
1368*2d1272b8SAndroid Build Coastguard Worker /**
1369*2d1272b8SAndroid Build Coastguard Worker * hb_font_get_glyph_from_name:
1370*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
1371*2d1272b8SAndroid Build Coastguard Worker * @name: (array length=len): The name string to query
1372*2d1272b8SAndroid Build Coastguard Worker * @len: The length of the name queried
1373*2d1272b8SAndroid Build Coastguard Worker * @glyph: (out): The glyph ID retrieved
1374*2d1272b8SAndroid Build Coastguard Worker *
1375*2d1272b8SAndroid Build Coastguard Worker * Fetches the glyph ID that corresponds to a name string in the specified @font.
1376*2d1272b8SAndroid Build Coastguard Worker *
1377*2d1272b8SAndroid Build Coastguard Worker * <note>Note: @len == -1 means the name string is null-terminated.</note>
1378*2d1272b8SAndroid Build Coastguard Worker *
1379*2d1272b8SAndroid Build Coastguard Worker * Return value: `true` if data found, `false` otherwise
1380*2d1272b8SAndroid Build Coastguard Worker *
1381*2d1272b8SAndroid Build Coastguard Worker * Since: 0.9.2
1382*2d1272b8SAndroid Build Coastguard Worker **/
1383*2d1272b8SAndroid Build Coastguard Worker hb_bool_t
hb_font_get_glyph_from_name(hb_font_t * font,const char * name,int len,hb_codepoint_t * glyph)1384*2d1272b8SAndroid Build Coastguard Worker hb_font_get_glyph_from_name (hb_font_t *font,
1385*2d1272b8SAndroid Build Coastguard Worker const char *name,
1386*2d1272b8SAndroid Build Coastguard Worker int len, /* -1 means nul-terminated */
1387*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t *glyph)
1388*2d1272b8SAndroid Build Coastguard Worker {
1389*2d1272b8SAndroid Build Coastguard Worker return font->get_glyph_from_name (name, len, glyph);
1390*2d1272b8SAndroid Build Coastguard Worker }
1391*2d1272b8SAndroid Build Coastguard Worker
1392*2d1272b8SAndroid Build Coastguard Worker #ifndef HB_DISABLE_DEPRECATED
1393*2d1272b8SAndroid Build Coastguard Worker /**
1394*2d1272b8SAndroid Build Coastguard Worker * hb_font_get_glyph_shape:
1395*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
1396*2d1272b8SAndroid Build Coastguard Worker * @glyph: The glyph ID
1397*2d1272b8SAndroid Build Coastguard Worker * @dfuncs: #hb_draw_funcs_t to draw to
1398*2d1272b8SAndroid Build Coastguard Worker * @draw_data: User data to pass to draw callbacks
1399*2d1272b8SAndroid Build Coastguard Worker *
1400*2d1272b8SAndroid Build Coastguard Worker * Fetches the glyph shape that corresponds to a glyph in the specified @font.
1401*2d1272b8SAndroid Build Coastguard Worker * The shape is returned by way of calls to the callbacks of the @dfuncs
1402*2d1272b8SAndroid Build Coastguard Worker * objects, with @draw_data passed to them.
1403*2d1272b8SAndroid Build Coastguard Worker *
1404*2d1272b8SAndroid Build Coastguard Worker * Since: 4.0.0
1405*2d1272b8SAndroid Build Coastguard Worker * Deprecated: 7.0.0: Use hb_font_draw_glyph() instead
1406*2d1272b8SAndroid Build Coastguard Worker */
1407*2d1272b8SAndroid Build Coastguard Worker void
hb_font_get_glyph_shape(hb_font_t * font,hb_codepoint_t glyph,hb_draw_funcs_t * dfuncs,void * draw_data)1408*2d1272b8SAndroid Build Coastguard Worker hb_font_get_glyph_shape (hb_font_t *font,
1409*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t glyph,
1410*2d1272b8SAndroid Build Coastguard Worker hb_draw_funcs_t *dfuncs, void *draw_data)
1411*2d1272b8SAndroid Build Coastguard Worker {
1412*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph (font, glyph, dfuncs, draw_data);
1413*2d1272b8SAndroid Build Coastguard Worker }
1414*2d1272b8SAndroid Build Coastguard Worker #endif
1415*2d1272b8SAndroid Build Coastguard Worker
1416*2d1272b8SAndroid Build Coastguard Worker /**
1417*2d1272b8SAndroid Build Coastguard Worker * hb_font_draw_glyph:
1418*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
1419*2d1272b8SAndroid Build Coastguard Worker * @glyph: The glyph ID
1420*2d1272b8SAndroid Build Coastguard Worker * @dfuncs: #hb_draw_funcs_t to draw to
1421*2d1272b8SAndroid Build Coastguard Worker * @draw_data: User data to pass to draw callbacks
1422*2d1272b8SAndroid Build Coastguard Worker *
1423*2d1272b8SAndroid Build Coastguard Worker * Draws the outline that corresponds to a glyph in the specified @font.
1424*2d1272b8SAndroid Build Coastguard Worker *
1425*2d1272b8SAndroid Build Coastguard Worker * The outline is returned by way of calls to the callbacks of the @dfuncs
1426*2d1272b8SAndroid Build Coastguard Worker * objects, with @draw_data passed to them.
1427*2d1272b8SAndroid Build Coastguard Worker *
1428*2d1272b8SAndroid Build Coastguard Worker * Since: 7.0.0
1429*2d1272b8SAndroid Build Coastguard Worker **/
1430*2d1272b8SAndroid Build Coastguard Worker void
hb_font_draw_glyph(hb_font_t * font,hb_codepoint_t glyph,hb_draw_funcs_t * dfuncs,void * draw_data)1431*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph (hb_font_t *font,
1432*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t glyph,
1433*2d1272b8SAndroid Build Coastguard Worker hb_draw_funcs_t *dfuncs, void *draw_data)
1434*2d1272b8SAndroid Build Coastguard Worker {
1435*2d1272b8SAndroid Build Coastguard Worker font->draw_glyph (glyph, dfuncs, draw_data);
1436*2d1272b8SAndroid Build Coastguard Worker }
1437*2d1272b8SAndroid Build Coastguard Worker
1438*2d1272b8SAndroid Build Coastguard Worker /**
1439*2d1272b8SAndroid Build Coastguard Worker * hb_font_paint_glyph:
1440*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
1441*2d1272b8SAndroid Build Coastguard Worker * @glyph: The glyph ID
1442*2d1272b8SAndroid Build Coastguard Worker * @pfuncs: #hb_paint_funcs_t to paint with
1443*2d1272b8SAndroid Build Coastguard Worker * @paint_data: User data to pass to paint callbacks
1444*2d1272b8SAndroid Build Coastguard Worker * @palette_index: The index of the font's color palette to use
1445*2d1272b8SAndroid Build Coastguard Worker * @foreground: The foreground color, unpremultipled
1446*2d1272b8SAndroid Build Coastguard Worker *
1447*2d1272b8SAndroid Build Coastguard Worker * Paints the glyph.
1448*2d1272b8SAndroid Build Coastguard Worker *
1449*2d1272b8SAndroid Build Coastguard Worker * The painting instructions are returned by way of calls to
1450*2d1272b8SAndroid Build Coastguard Worker * the callbacks of the @funcs object, with @paint_data passed
1451*2d1272b8SAndroid Build Coastguard Worker * to them.
1452*2d1272b8SAndroid Build Coastguard Worker *
1453*2d1272b8SAndroid Build Coastguard Worker * If the font has color palettes (see hb_ot_color_has_palettes()),
1454*2d1272b8SAndroid Build Coastguard Worker * then @palette_index selects the palette to use. If the font only
1455*2d1272b8SAndroid Build Coastguard Worker * has one palette, this will be 0.
1456*2d1272b8SAndroid Build Coastguard Worker *
1457*2d1272b8SAndroid Build Coastguard Worker * Since: 7.0.0
1458*2d1272b8SAndroid Build Coastguard Worker */
1459*2d1272b8SAndroid Build Coastguard Worker void
hb_font_paint_glyph(hb_font_t * font,hb_codepoint_t glyph,hb_paint_funcs_t * pfuncs,void * paint_data,unsigned int palette_index,hb_color_t foreground)1460*2d1272b8SAndroid Build Coastguard Worker hb_font_paint_glyph (hb_font_t *font,
1461*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t glyph,
1462*2d1272b8SAndroid Build Coastguard Worker hb_paint_funcs_t *pfuncs, void *paint_data,
1463*2d1272b8SAndroid Build Coastguard Worker unsigned int palette_index,
1464*2d1272b8SAndroid Build Coastguard Worker hb_color_t foreground)
1465*2d1272b8SAndroid Build Coastguard Worker {
1466*2d1272b8SAndroid Build Coastguard Worker font->paint_glyph (glyph, pfuncs, paint_data, palette_index, foreground);
1467*2d1272b8SAndroid Build Coastguard Worker }
1468*2d1272b8SAndroid Build Coastguard Worker
1469*2d1272b8SAndroid Build Coastguard Worker /* A bit higher-level, and with fallback */
1470*2d1272b8SAndroid Build Coastguard Worker
1471*2d1272b8SAndroid Build Coastguard Worker /**
1472*2d1272b8SAndroid Build Coastguard Worker * hb_font_get_extents_for_direction:
1473*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
1474*2d1272b8SAndroid Build Coastguard Worker * @direction: The direction of the text segment
1475*2d1272b8SAndroid Build Coastguard Worker * @extents: (out): The #hb_font_extents_t retrieved
1476*2d1272b8SAndroid Build Coastguard Worker *
1477*2d1272b8SAndroid Build Coastguard Worker * Fetches the extents for a font in a text segment of the
1478*2d1272b8SAndroid Build Coastguard Worker * specified direction.
1479*2d1272b8SAndroid Build Coastguard Worker *
1480*2d1272b8SAndroid Build Coastguard Worker * Calls the appropriate direction-specific variant (horizontal
1481*2d1272b8SAndroid Build Coastguard Worker * or vertical) depending on the value of @direction.
1482*2d1272b8SAndroid Build Coastguard Worker *
1483*2d1272b8SAndroid Build Coastguard Worker * Since: 1.1.3
1484*2d1272b8SAndroid Build Coastguard Worker **/
1485*2d1272b8SAndroid Build Coastguard Worker void
hb_font_get_extents_for_direction(hb_font_t * font,hb_direction_t direction,hb_font_extents_t * extents)1486*2d1272b8SAndroid Build Coastguard Worker hb_font_get_extents_for_direction (hb_font_t *font,
1487*2d1272b8SAndroid Build Coastguard Worker hb_direction_t direction,
1488*2d1272b8SAndroid Build Coastguard Worker hb_font_extents_t *extents)
1489*2d1272b8SAndroid Build Coastguard Worker {
1490*2d1272b8SAndroid Build Coastguard Worker font->get_extents_for_direction (direction, extents);
1491*2d1272b8SAndroid Build Coastguard Worker }
1492*2d1272b8SAndroid Build Coastguard Worker /**
1493*2d1272b8SAndroid Build Coastguard Worker * hb_font_get_glyph_advance_for_direction:
1494*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
1495*2d1272b8SAndroid Build Coastguard Worker * @glyph: The glyph ID to query
1496*2d1272b8SAndroid Build Coastguard Worker * @direction: The direction of the text segment
1497*2d1272b8SAndroid Build Coastguard Worker * @x: (out): The horizontal advance retrieved
1498*2d1272b8SAndroid Build Coastguard Worker * @y: (out): The vertical advance retrieved
1499*2d1272b8SAndroid Build Coastguard Worker *
1500*2d1272b8SAndroid Build Coastguard Worker * Fetches the advance for a glyph ID from the specified font,
1501*2d1272b8SAndroid Build Coastguard Worker * in a text segment of the specified direction.
1502*2d1272b8SAndroid Build Coastguard Worker *
1503*2d1272b8SAndroid Build Coastguard Worker * Calls the appropriate direction-specific variant (horizontal
1504*2d1272b8SAndroid Build Coastguard Worker * or vertical) depending on the value of @direction.
1505*2d1272b8SAndroid Build Coastguard Worker *
1506*2d1272b8SAndroid Build Coastguard Worker * Since: 0.9.2
1507*2d1272b8SAndroid Build Coastguard Worker **/
1508*2d1272b8SAndroid Build Coastguard Worker void
hb_font_get_glyph_advance_for_direction(hb_font_t * font,hb_codepoint_t glyph,hb_direction_t direction,hb_position_t * x,hb_position_t * y)1509*2d1272b8SAndroid Build Coastguard Worker hb_font_get_glyph_advance_for_direction (hb_font_t *font,
1510*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t glyph,
1511*2d1272b8SAndroid Build Coastguard Worker hb_direction_t direction,
1512*2d1272b8SAndroid Build Coastguard Worker hb_position_t *x,
1513*2d1272b8SAndroid Build Coastguard Worker hb_position_t *y)
1514*2d1272b8SAndroid Build Coastguard Worker {
1515*2d1272b8SAndroid Build Coastguard Worker font->get_glyph_advance_for_direction (glyph, direction, x, y);
1516*2d1272b8SAndroid Build Coastguard Worker }
1517*2d1272b8SAndroid Build Coastguard Worker /**
1518*2d1272b8SAndroid Build Coastguard Worker * hb_font_get_glyph_advances_for_direction:
1519*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
1520*2d1272b8SAndroid Build Coastguard Worker * @direction: The direction of the text segment
1521*2d1272b8SAndroid Build Coastguard Worker * @count: The number of glyph IDs in the sequence queried
1522*2d1272b8SAndroid Build Coastguard Worker * @first_glyph: The first glyph ID to query
1523*2d1272b8SAndroid Build Coastguard Worker * @glyph_stride: The stride between successive glyph IDs
1524*2d1272b8SAndroid Build Coastguard Worker * @first_advance: (out): The first advance retrieved
1525*2d1272b8SAndroid Build Coastguard Worker * @advance_stride: (out): The stride between successive advances
1526*2d1272b8SAndroid Build Coastguard Worker *
1527*2d1272b8SAndroid Build Coastguard Worker * Fetches the advances for a sequence of glyph IDs in the specified
1528*2d1272b8SAndroid Build Coastguard Worker * font, in a text segment of the specified direction.
1529*2d1272b8SAndroid Build Coastguard Worker *
1530*2d1272b8SAndroid Build Coastguard Worker * Calls the appropriate direction-specific variant (horizontal
1531*2d1272b8SAndroid Build Coastguard Worker * or vertical) depending on the value of @direction.
1532*2d1272b8SAndroid Build Coastguard Worker *
1533*2d1272b8SAndroid Build Coastguard Worker * Since: 1.8.6
1534*2d1272b8SAndroid Build Coastguard Worker **/
1535*2d1272b8SAndroid Build Coastguard Worker HB_EXTERN void
hb_font_get_glyph_advances_for_direction(hb_font_t * font,hb_direction_t direction,unsigned int count,const hb_codepoint_t * first_glyph,unsigned glyph_stride,hb_position_t * first_advance,unsigned advance_stride)1536*2d1272b8SAndroid Build Coastguard Worker hb_font_get_glyph_advances_for_direction (hb_font_t* font,
1537*2d1272b8SAndroid Build Coastguard Worker hb_direction_t direction,
1538*2d1272b8SAndroid Build Coastguard Worker unsigned int count,
1539*2d1272b8SAndroid Build Coastguard Worker const hb_codepoint_t *first_glyph,
1540*2d1272b8SAndroid Build Coastguard Worker unsigned glyph_stride,
1541*2d1272b8SAndroid Build Coastguard Worker hb_position_t *first_advance,
1542*2d1272b8SAndroid Build Coastguard Worker unsigned advance_stride)
1543*2d1272b8SAndroid Build Coastguard Worker {
1544*2d1272b8SAndroid Build Coastguard Worker font->get_glyph_advances_for_direction (direction, count, first_glyph, glyph_stride, first_advance, advance_stride);
1545*2d1272b8SAndroid Build Coastguard Worker }
1546*2d1272b8SAndroid Build Coastguard Worker
1547*2d1272b8SAndroid Build Coastguard Worker /**
1548*2d1272b8SAndroid Build Coastguard Worker * hb_font_get_glyph_origin_for_direction:
1549*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
1550*2d1272b8SAndroid Build Coastguard Worker * @glyph: The glyph ID to query
1551*2d1272b8SAndroid Build Coastguard Worker * @direction: The direction of the text segment
1552*2d1272b8SAndroid Build Coastguard Worker * @x: (out): The X coordinate retrieved for the origin
1553*2d1272b8SAndroid Build Coastguard Worker * @y: (out): The Y coordinate retrieved for the origin
1554*2d1272b8SAndroid Build Coastguard Worker *
1555*2d1272b8SAndroid Build Coastguard Worker * Fetches the (X,Y) coordinates of the origin for a glyph in
1556*2d1272b8SAndroid Build Coastguard Worker * the specified font.
1557*2d1272b8SAndroid Build Coastguard Worker *
1558*2d1272b8SAndroid Build Coastguard Worker * Calls the appropriate direction-specific variant (horizontal
1559*2d1272b8SAndroid Build Coastguard Worker * or vertical) depending on the value of @direction.
1560*2d1272b8SAndroid Build Coastguard Worker *
1561*2d1272b8SAndroid Build Coastguard Worker * Since: 0.9.2
1562*2d1272b8SAndroid Build Coastguard Worker **/
1563*2d1272b8SAndroid Build Coastguard Worker void
hb_font_get_glyph_origin_for_direction(hb_font_t * font,hb_codepoint_t glyph,hb_direction_t direction,hb_position_t * x,hb_position_t * y)1564*2d1272b8SAndroid Build Coastguard Worker hb_font_get_glyph_origin_for_direction (hb_font_t *font,
1565*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t glyph,
1566*2d1272b8SAndroid Build Coastguard Worker hb_direction_t direction,
1567*2d1272b8SAndroid Build Coastguard Worker hb_position_t *x,
1568*2d1272b8SAndroid Build Coastguard Worker hb_position_t *y)
1569*2d1272b8SAndroid Build Coastguard Worker {
1570*2d1272b8SAndroid Build Coastguard Worker return font->get_glyph_origin_for_direction (glyph, direction, x, y);
1571*2d1272b8SAndroid Build Coastguard Worker }
1572*2d1272b8SAndroid Build Coastguard Worker
1573*2d1272b8SAndroid Build Coastguard Worker /**
1574*2d1272b8SAndroid Build Coastguard Worker * hb_font_add_glyph_origin_for_direction:
1575*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
1576*2d1272b8SAndroid Build Coastguard Worker * @glyph: The glyph ID to query
1577*2d1272b8SAndroid Build Coastguard Worker * @direction: The direction of the text segment
1578*2d1272b8SAndroid Build Coastguard Worker * @x: (inout): Input = The original X coordinate
1579*2d1272b8SAndroid Build Coastguard Worker * Output = The X coordinate plus the X-coordinate of the origin
1580*2d1272b8SAndroid Build Coastguard Worker * @y: (inout): Input = The original Y coordinate
1581*2d1272b8SAndroid Build Coastguard Worker * Output = The Y coordinate plus the Y-coordinate of the origin
1582*2d1272b8SAndroid Build Coastguard Worker *
1583*2d1272b8SAndroid Build Coastguard Worker * Adds the origin coordinates to an (X,Y) point coordinate, in
1584*2d1272b8SAndroid Build Coastguard Worker * the specified glyph ID in the specified font.
1585*2d1272b8SAndroid Build Coastguard Worker *
1586*2d1272b8SAndroid Build Coastguard Worker * Calls the appropriate direction-specific variant (horizontal
1587*2d1272b8SAndroid Build Coastguard Worker * or vertical) depending on the value of @direction.
1588*2d1272b8SAndroid Build Coastguard Worker *
1589*2d1272b8SAndroid Build Coastguard Worker * Since: 0.9.2
1590*2d1272b8SAndroid Build Coastguard Worker **/
1591*2d1272b8SAndroid Build Coastguard Worker void
hb_font_add_glyph_origin_for_direction(hb_font_t * font,hb_codepoint_t glyph,hb_direction_t direction,hb_position_t * x,hb_position_t * y)1592*2d1272b8SAndroid Build Coastguard Worker hb_font_add_glyph_origin_for_direction (hb_font_t *font,
1593*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t glyph,
1594*2d1272b8SAndroid Build Coastguard Worker hb_direction_t direction,
1595*2d1272b8SAndroid Build Coastguard Worker hb_position_t *x,
1596*2d1272b8SAndroid Build Coastguard Worker hb_position_t *y)
1597*2d1272b8SAndroid Build Coastguard Worker {
1598*2d1272b8SAndroid Build Coastguard Worker return font->add_glyph_origin_for_direction (glyph, direction, x, y);
1599*2d1272b8SAndroid Build Coastguard Worker }
1600*2d1272b8SAndroid Build Coastguard Worker
1601*2d1272b8SAndroid Build Coastguard Worker /**
1602*2d1272b8SAndroid Build Coastguard Worker * hb_font_subtract_glyph_origin_for_direction:
1603*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
1604*2d1272b8SAndroid Build Coastguard Worker * @glyph: The glyph ID to query
1605*2d1272b8SAndroid Build Coastguard Worker * @direction: The direction of the text segment
1606*2d1272b8SAndroid Build Coastguard Worker * @x: (inout): Input = The original X coordinate
1607*2d1272b8SAndroid Build Coastguard Worker * Output = The X coordinate minus the X-coordinate of the origin
1608*2d1272b8SAndroid Build Coastguard Worker * @y: (inout): Input = The original Y coordinate
1609*2d1272b8SAndroid Build Coastguard Worker * Output = The Y coordinate minus the Y-coordinate of the origin
1610*2d1272b8SAndroid Build Coastguard Worker *
1611*2d1272b8SAndroid Build Coastguard Worker * Subtracts the origin coordinates from an (X,Y) point coordinate,
1612*2d1272b8SAndroid Build Coastguard Worker * in the specified glyph ID in the specified font.
1613*2d1272b8SAndroid Build Coastguard Worker *
1614*2d1272b8SAndroid Build Coastguard Worker * Calls the appropriate direction-specific variant (horizontal
1615*2d1272b8SAndroid Build Coastguard Worker * or vertical) depending on the value of @direction.
1616*2d1272b8SAndroid Build Coastguard Worker *
1617*2d1272b8SAndroid Build Coastguard Worker * Since: 0.9.2
1618*2d1272b8SAndroid Build Coastguard Worker **/
1619*2d1272b8SAndroid Build Coastguard Worker void
hb_font_subtract_glyph_origin_for_direction(hb_font_t * font,hb_codepoint_t glyph,hb_direction_t direction,hb_position_t * x,hb_position_t * y)1620*2d1272b8SAndroid Build Coastguard Worker hb_font_subtract_glyph_origin_for_direction (hb_font_t *font,
1621*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t glyph,
1622*2d1272b8SAndroid Build Coastguard Worker hb_direction_t direction,
1623*2d1272b8SAndroid Build Coastguard Worker hb_position_t *x,
1624*2d1272b8SAndroid Build Coastguard Worker hb_position_t *y)
1625*2d1272b8SAndroid Build Coastguard Worker {
1626*2d1272b8SAndroid Build Coastguard Worker return font->subtract_glyph_origin_for_direction (glyph, direction, x, y);
1627*2d1272b8SAndroid Build Coastguard Worker }
1628*2d1272b8SAndroid Build Coastguard Worker
1629*2d1272b8SAndroid Build Coastguard Worker /**
1630*2d1272b8SAndroid Build Coastguard Worker * hb_font_get_glyph_kerning_for_direction:
1631*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
1632*2d1272b8SAndroid Build Coastguard Worker * @first_glyph: The glyph ID of the first glyph in the glyph pair to query
1633*2d1272b8SAndroid Build Coastguard Worker * @second_glyph: The glyph ID of the second glyph in the glyph pair to query
1634*2d1272b8SAndroid Build Coastguard Worker * @direction: The direction of the text segment
1635*2d1272b8SAndroid Build Coastguard Worker * @x: (out): The horizontal kerning-adjustment value retrieved
1636*2d1272b8SAndroid Build Coastguard Worker * @y: (out): The vertical kerning-adjustment value retrieved
1637*2d1272b8SAndroid Build Coastguard Worker *
1638*2d1272b8SAndroid Build Coastguard Worker * Fetches the kerning-adjustment value for a glyph-pair in the specified font.
1639*2d1272b8SAndroid Build Coastguard Worker *
1640*2d1272b8SAndroid Build Coastguard Worker * Calls the appropriate direction-specific variant (horizontal
1641*2d1272b8SAndroid Build Coastguard Worker * or vertical) depending on the value of @direction.
1642*2d1272b8SAndroid Build Coastguard Worker *
1643*2d1272b8SAndroid Build Coastguard Worker * Since: 0.9.2
1644*2d1272b8SAndroid Build Coastguard Worker **/
1645*2d1272b8SAndroid Build Coastguard Worker void
hb_font_get_glyph_kerning_for_direction(hb_font_t * font,hb_codepoint_t first_glyph,hb_codepoint_t second_glyph,hb_direction_t direction,hb_position_t * x,hb_position_t * y)1646*2d1272b8SAndroid Build Coastguard Worker hb_font_get_glyph_kerning_for_direction (hb_font_t *font,
1647*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t first_glyph,
1648*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t second_glyph,
1649*2d1272b8SAndroid Build Coastguard Worker hb_direction_t direction,
1650*2d1272b8SAndroid Build Coastguard Worker hb_position_t *x,
1651*2d1272b8SAndroid Build Coastguard Worker hb_position_t *y)
1652*2d1272b8SAndroid Build Coastguard Worker {
1653*2d1272b8SAndroid Build Coastguard Worker return font->get_glyph_kerning_for_direction (first_glyph, second_glyph, direction, x, y);
1654*2d1272b8SAndroid Build Coastguard Worker }
1655*2d1272b8SAndroid Build Coastguard Worker
1656*2d1272b8SAndroid Build Coastguard Worker /**
1657*2d1272b8SAndroid Build Coastguard Worker * hb_font_get_glyph_extents_for_origin:
1658*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
1659*2d1272b8SAndroid Build Coastguard Worker * @glyph: The glyph ID to query
1660*2d1272b8SAndroid Build Coastguard Worker * @direction: The direction of the text segment
1661*2d1272b8SAndroid Build Coastguard Worker * @extents: (out): The #hb_glyph_extents_t retrieved
1662*2d1272b8SAndroid Build Coastguard Worker *
1663*2d1272b8SAndroid Build Coastguard Worker * Fetches the #hb_glyph_extents_t data for a glyph ID
1664*2d1272b8SAndroid Build Coastguard Worker * in the specified font, with respect to the origin in
1665*2d1272b8SAndroid Build Coastguard Worker * a text segment in the specified direction.
1666*2d1272b8SAndroid Build Coastguard Worker *
1667*2d1272b8SAndroid Build Coastguard Worker * Calls the appropriate direction-specific variant (horizontal
1668*2d1272b8SAndroid Build Coastguard Worker * or vertical) depending on the value of @direction.
1669*2d1272b8SAndroid Build Coastguard Worker *
1670*2d1272b8SAndroid Build Coastguard Worker * Return value: `true` if data found, `false` otherwise
1671*2d1272b8SAndroid Build Coastguard Worker *
1672*2d1272b8SAndroid Build Coastguard Worker * Since: 0.9.2
1673*2d1272b8SAndroid Build Coastguard Worker **/
1674*2d1272b8SAndroid Build Coastguard Worker hb_bool_t
hb_font_get_glyph_extents_for_origin(hb_font_t * font,hb_codepoint_t glyph,hb_direction_t direction,hb_glyph_extents_t * extents)1675*2d1272b8SAndroid Build Coastguard Worker hb_font_get_glyph_extents_for_origin (hb_font_t *font,
1676*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t glyph,
1677*2d1272b8SAndroid Build Coastguard Worker hb_direction_t direction,
1678*2d1272b8SAndroid Build Coastguard Worker hb_glyph_extents_t *extents)
1679*2d1272b8SAndroid Build Coastguard Worker {
1680*2d1272b8SAndroid Build Coastguard Worker return font->get_glyph_extents_for_origin (glyph, direction, extents);
1681*2d1272b8SAndroid Build Coastguard Worker }
1682*2d1272b8SAndroid Build Coastguard Worker
1683*2d1272b8SAndroid Build Coastguard Worker /**
1684*2d1272b8SAndroid Build Coastguard Worker * hb_font_get_glyph_contour_point_for_origin:
1685*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
1686*2d1272b8SAndroid Build Coastguard Worker * @glyph: The glyph ID to query
1687*2d1272b8SAndroid Build Coastguard Worker * @point_index: The contour-point index to query
1688*2d1272b8SAndroid Build Coastguard Worker * @direction: The direction of the text segment
1689*2d1272b8SAndroid Build Coastguard Worker * @x: (out): The X value retrieved for the contour point
1690*2d1272b8SAndroid Build Coastguard Worker * @y: (out): The Y value retrieved for the contour point
1691*2d1272b8SAndroid Build Coastguard Worker *
1692*2d1272b8SAndroid Build Coastguard Worker * Fetches the (X,Y) coordinates of a specified contour-point index
1693*2d1272b8SAndroid Build Coastguard Worker * in the specified glyph ID in the specified font, with respect
1694*2d1272b8SAndroid Build Coastguard Worker * to the origin in a text segment in the specified direction.
1695*2d1272b8SAndroid Build Coastguard Worker *
1696*2d1272b8SAndroid Build Coastguard Worker * Calls the appropriate direction-specific variant (horizontal
1697*2d1272b8SAndroid Build Coastguard Worker * or vertical) depending on the value of @direction.
1698*2d1272b8SAndroid Build Coastguard Worker *
1699*2d1272b8SAndroid Build Coastguard Worker * Return value: `true` if data found, `false` otherwise
1700*2d1272b8SAndroid Build Coastguard Worker *
1701*2d1272b8SAndroid Build Coastguard Worker * Since: 0.9.2
1702*2d1272b8SAndroid Build Coastguard Worker **/
1703*2d1272b8SAndroid Build Coastguard Worker hb_bool_t
hb_font_get_glyph_contour_point_for_origin(hb_font_t * font,hb_codepoint_t glyph,unsigned int point_index,hb_direction_t direction,hb_position_t * x,hb_position_t * y)1704*2d1272b8SAndroid Build Coastguard Worker hb_font_get_glyph_contour_point_for_origin (hb_font_t *font,
1705*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t glyph,
1706*2d1272b8SAndroid Build Coastguard Worker unsigned int point_index,
1707*2d1272b8SAndroid Build Coastguard Worker hb_direction_t direction,
1708*2d1272b8SAndroid Build Coastguard Worker hb_position_t *x,
1709*2d1272b8SAndroid Build Coastguard Worker hb_position_t *y)
1710*2d1272b8SAndroid Build Coastguard Worker {
1711*2d1272b8SAndroid Build Coastguard Worker return font->get_glyph_contour_point_for_origin (glyph, point_index, direction, x, y);
1712*2d1272b8SAndroid Build Coastguard Worker }
1713*2d1272b8SAndroid Build Coastguard Worker
1714*2d1272b8SAndroid Build Coastguard Worker /**
1715*2d1272b8SAndroid Build Coastguard Worker * hb_font_glyph_to_string:
1716*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
1717*2d1272b8SAndroid Build Coastguard Worker * @glyph: The glyph ID to query
1718*2d1272b8SAndroid Build Coastguard Worker * @s: (out) (array length=size): The string containing the glyph name
1719*2d1272b8SAndroid Build Coastguard Worker * @size: Length of string @s
1720*2d1272b8SAndroid Build Coastguard Worker *
1721*2d1272b8SAndroid Build Coastguard Worker * Fetches the name of the specified glyph ID in @font and returns
1722*2d1272b8SAndroid Build Coastguard Worker * it in string @s.
1723*2d1272b8SAndroid Build Coastguard Worker *
1724*2d1272b8SAndroid Build Coastguard Worker * If the glyph ID has no name in @font, a string of the form `gidDDD` is
1725*2d1272b8SAndroid Build Coastguard Worker * generated, with `DDD` being the glyph ID.
1726*2d1272b8SAndroid Build Coastguard Worker *
1727*2d1272b8SAndroid Build Coastguard Worker * According to the OpenType specification, glyph names are limited to 63
1728*2d1272b8SAndroid Build Coastguard Worker * characters and can only contain (a subset of) ASCII.
1729*2d1272b8SAndroid Build Coastguard Worker *
1730*2d1272b8SAndroid Build Coastguard Worker * Since: 0.9.2
1731*2d1272b8SAndroid Build Coastguard Worker **/
1732*2d1272b8SAndroid Build Coastguard Worker void
hb_font_glyph_to_string(hb_font_t * font,hb_codepoint_t glyph,char * s,unsigned int size)1733*2d1272b8SAndroid Build Coastguard Worker hb_font_glyph_to_string (hb_font_t *font,
1734*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t glyph,
1735*2d1272b8SAndroid Build Coastguard Worker char *s,
1736*2d1272b8SAndroid Build Coastguard Worker unsigned int size)
1737*2d1272b8SAndroid Build Coastguard Worker {
1738*2d1272b8SAndroid Build Coastguard Worker font->glyph_to_string (glyph, s, size);
1739*2d1272b8SAndroid Build Coastguard Worker }
1740*2d1272b8SAndroid Build Coastguard Worker
1741*2d1272b8SAndroid Build Coastguard Worker /**
1742*2d1272b8SAndroid Build Coastguard Worker * hb_font_glyph_from_string:
1743*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
1744*2d1272b8SAndroid Build Coastguard Worker * @s: (array length=len) (element-type uint8_t): string to query
1745*2d1272b8SAndroid Build Coastguard Worker * @len: The length of the string @s
1746*2d1272b8SAndroid Build Coastguard Worker * @glyph: (out): The glyph ID corresponding to the string requested
1747*2d1272b8SAndroid Build Coastguard Worker *
1748*2d1272b8SAndroid Build Coastguard Worker * Fetches the glyph ID from @font that matches the specified string.
1749*2d1272b8SAndroid Build Coastguard Worker * Strings of the format `gidDDD` or `uniUUUU` are parsed automatically.
1750*2d1272b8SAndroid Build Coastguard Worker *
1751*2d1272b8SAndroid Build Coastguard Worker * <note>Note: @len == -1 means the string is null-terminated.</note>
1752*2d1272b8SAndroid Build Coastguard Worker *
1753*2d1272b8SAndroid Build Coastguard Worker * Return value: `true` if data found, `false` otherwise
1754*2d1272b8SAndroid Build Coastguard Worker *
1755*2d1272b8SAndroid Build Coastguard Worker * Since: 0.9.2
1756*2d1272b8SAndroid Build Coastguard Worker **/
1757*2d1272b8SAndroid Build Coastguard Worker hb_bool_t
hb_font_glyph_from_string(hb_font_t * font,const char * s,int len,hb_codepoint_t * glyph)1758*2d1272b8SAndroid Build Coastguard Worker hb_font_glyph_from_string (hb_font_t *font,
1759*2d1272b8SAndroid Build Coastguard Worker const char *s,
1760*2d1272b8SAndroid Build Coastguard Worker int len,
1761*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t *glyph)
1762*2d1272b8SAndroid Build Coastguard Worker {
1763*2d1272b8SAndroid Build Coastguard Worker return font->glyph_from_string (s, len, glyph);
1764*2d1272b8SAndroid Build Coastguard Worker }
1765*2d1272b8SAndroid Build Coastguard Worker
1766*2d1272b8SAndroid Build Coastguard Worker
1767*2d1272b8SAndroid Build Coastguard Worker /*
1768*2d1272b8SAndroid Build Coastguard Worker * hb_font_t
1769*2d1272b8SAndroid Build Coastguard Worker */
1770*2d1272b8SAndroid Build Coastguard Worker
1771*2d1272b8SAndroid Build Coastguard Worker DEFINE_NULL_INSTANCE (hb_font_t) =
1772*2d1272b8SAndroid Build Coastguard Worker {
1773*2d1272b8SAndroid Build Coastguard Worker HB_OBJECT_HEADER_STATIC,
1774*2d1272b8SAndroid Build Coastguard Worker
1775*2d1272b8SAndroid Build Coastguard Worker 0, /* serial */
1776*2d1272b8SAndroid Build Coastguard Worker 0, /* serial_coords */
1777*2d1272b8SAndroid Build Coastguard Worker
1778*2d1272b8SAndroid Build Coastguard Worker nullptr, /* parent */
1779*2d1272b8SAndroid Build Coastguard Worker const_cast<hb_face_t *> (&_hb_Null_hb_face_t),
1780*2d1272b8SAndroid Build Coastguard Worker
1781*2d1272b8SAndroid Build Coastguard Worker 1000, /* x_scale */
1782*2d1272b8SAndroid Build Coastguard Worker 1000, /* y_scale */
1783*2d1272b8SAndroid Build Coastguard Worker 0.f, /* x_embolden */
1784*2d1272b8SAndroid Build Coastguard Worker 0.f, /* y_embolden */
1785*2d1272b8SAndroid Build Coastguard Worker true, /* embolden_in_place */
1786*2d1272b8SAndroid Build Coastguard Worker 0, /* x_strength */
1787*2d1272b8SAndroid Build Coastguard Worker 0, /* y_strength */
1788*2d1272b8SAndroid Build Coastguard Worker 0.f, /* slant */
1789*2d1272b8SAndroid Build Coastguard Worker 0.f, /* slant_xy; */
1790*2d1272b8SAndroid Build Coastguard Worker 1.f, /* x_multf */
1791*2d1272b8SAndroid Build Coastguard Worker 1.f, /* y_multf */
1792*2d1272b8SAndroid Build Coastguard Worker 1<<16, /* x_mult */
1793*2d1272b8SAndroid Build Coastguard Worker 1<<16, /* y_mult */
1794*2d1272b8SAndroid Build Coastguard Worker
1795*2d1272b8SAndroid Build Coastguard Worker 0, /* x_ppem */
1796*2d1272b8SAndroid Build Coastguard Worker 0, /* y_ppem */
1797*2d1272b8SAndroid Build Coastguard Worker 0, /* ptem */
1798*2d1272b8SAndroid Build Coastguard Worker
1799*2d1272b8SAndroid Build Coastguard Worker HB_FONT_NO_VAR_NAMED_INSTANCE, /* instance_index */
1800*2d1272b8SAndroid Build Coastguard Worker 0, /* num_coords */
1801*2d1272b8SAndroid Build Coastguard Worker nullptr, /* coords */
1802*2d1272b8SAndroid Build Coastguard Worker nullptr, /* design_coords */
1803*2d1272b8SAndroid Build Coastguard Worker
1804*2d1272b8SAndroid Build Coastguard Worker const_cast<hb_font_funcs_t *> (&_hb_Null_hb_font_funcs_t),
1805*2d1272b8SAndroid Build Coastguard Worker
1806*2d1272b8SAndroid Build Coastguard Worker /* Zero for the rest is fine. */
1807*2d1272b8SAndroid Build Coastguard Worker };
1808*2d1272b8SAndroid Build Coastguard Worker
1809*2d1272b8SAndroid Build Coastguard Worker
1810*2d1272b8SAndroid Build Coastguard Worker static hb_font_t *
_hb_font_create(hb_face_t * face)1811*2d1272b8SAndroid Build Coastguard Worker _hb_font_create (hb_face_t *face)
1812*2d1272b8SAndroid Build Coastguard Worker {
1813*2d1272b8SAndroid Build Coastguard Worker hb_font_t *font;
1814*2d1272b8SAndroid Build Coastguard Worker
1815*2d1272b8SAndroid Build Coastguard Worker if (unlikely (!face))
1816*2d1272b8SAndroid Build Coastguard Worker face = hb_face_get_empty ();
1817*2d1272b8SAndroid Build Coastguard Worker
1818*2d1272b8SAndroid Build Coastguard Worker if (!(font = hb_object_create<hb_font_t> ()))
1819*2d1272b8SAndroid Build Coastguard Worker return hb_font_get_empty ();
1820*2d1272b8SAndroid Build Coastguard Worker
1821*2d1272b8SAndroid Build Coastguard Worker hb_face_make_immutable (face);
1822*2d1272b8SAndroid Build Coastguard Worker font->parent = hb_font_get_empty ();
1823*2d1272b8SAndroid Build Coastguard Worker font->face = hb_face_reference (face);
1824*2d1272b8SAndroid Build Coastguard Worker font->klass = hb_font_funcs_get_empty ();
1825*2d1272b8SAndroid Build Coastguard Worker font->data.init0 (font);
1826*2d1272b8SAndroid Build Coastguard Worker font->x_scale = font->y_scale = face->get_upem ();
1827*2d1272b8SAndroid Build Coastguard Worker font->embolden_in_place = true;
1828*2d1272b8SAndroid Build Coastguard Worker font->x_multf = font->y_multf = 1.f;
1829*2d1272b8SAndroid Build Coastguard Worker font->x_mult = font->y_mult = 1 << 16;
1830*2d1272b8SAndroid Build Coastguard Worker font->instance_index = HB_FONT_NO_VAR_NAMED_INSTANCE;
1831*2d1272b8SAndroid Build Coastguard Worker
1832*2d1272b8SAndroid Build Coastguard Worker return font;
1833*2d1272b8SAndroid Build Coastguard Worker }
1834*2d1272b8SAndroid Build Coastguard Worker
1835*2d1272b8SAndroid Build Coastguard Worker /**
1836*2d1272b8SAndroid Build Coastguard Worker * hb_font_create:
1837*2d1272b8SAndroid Build Coastguard Worker * @face: a face.
1838*2d1272b8SAndroid Build Coastguard Worker *
1839*2d1272b8SAndroid Build Coastguard Worker * Constructs a new font object from the specified face.
1840*2d1272b8SAndroid Build Coastguard Worker *
1841*2d1272b8SAndroid Build Coastguard Worker * <note>Note: If @face's index value (as passed to hb_face_create()
1842*2d1272b8SAndroid Build Coastguard Worker * has non-zero top 16-bits, those bits minus one are passed to
1843*2d1272b8SAndroid Build Coastguard Worker * hb_font_set_var_named_instance(), effectively loading a named-instance
1844*2d1272b8SAndroid Build Coastguard Worker * of a variable font, instead of the default-instance. This allows
1845*2d1272b8SAndroid Build Coastguard Worker * specifying which named-instance to load by default when creating the
1846*2d1272b8SAndroid Build Coastguard Worker * face.</note>
1847*2d1272b8SAndroid Build Coastguard Worker *
1848*2d1272b8SAndroid Build Coastguard Worker * Return value: (transfer full): The new font object
1849*2d1272b8SAndroid Build Coastguard Worker *
1850*2d1272b8SAndroid Build Coastguard Worker * Since: 0.9.2
1851*2d1272b8SAndroid Build Coastguard Worker **/
1852*2d1272b8SAndroid Build Coastguard Worker hb_font_t *
hb_font_create(hb_face_t * face)1853*2d1272b8SAndroid Build Coastguard Worker hb_font_create (hb_face_t *face)
1854*2d1272b8SAndroid Build Coastguard Worker {
1855*2d1272b8SAndroid Build Coastguard Worker hb_font_t *font = _hb_font_create (face);
1856*2d1272b8SAndroid Build Coastguard Worker
1857*2d1272b8SAndroid Build Coastguard Worker #ifndef HB_NO_OT_FONT
1858*2d1272b8SAndroid Build Coastguard Worker /* Install our in-house, very lightweight, funcs. */
1859*2d1272b8SAndroid Build Coastguard Worker hb_ot_font_set_funcs (font);
1860*2d1272b8SAndroid Build Coastguard Worker #endif
1861*2d1272b8SAndroid Build Coastguard Worker
1862*2d1272b8SAndroid Build Coastguard Worker #ifndef HB_NO_VAR
1863*2d1272b8SAndroid Build Coastguard Worker if (face && face->index >> 16)
1864*2d1272b8SAndroid Build Coastguard Worker hb_font_set_var_named_instance (font, (face->index >> 16) - 1);
1865*2d1272b8SAndroid Build Coastguard Worker #endif
1866*2d1272b8SAndroid Build Coastguard Worker
1867*2d1272b8SAndroid Build Coastguard Worker return font;
1868*2d1272b8SAndroid Build Coastguard Worker }
1869*2d1272b8SAndroid Build Coastguard Worker
1870*2d1272b8SAndroid Build Coastguard Worker static void
_hb_font_adopt_var_coords(hb_font_t * font,int * coords,float * design_coords,unsigned int coords_length)1871*2d1272b8SAndroid Build Coastguard Worker _hb_font_adopt_var_coords (hb_font_t *font,
1872*2d1272b8SAndroid Build Coastguard Worker int *coords, /* 2.14 normalized */
1873*2d1272b8SAndroid Build Coastguard Worker float *design_coords,
1874*2d1272b8SAndroid Build Coastguard Worker unsigned int coords_length)
1875*2d1272b8SAndroid Build Coastguard Worker {
1876*2d1272b8SAndroid Build Coastguard Worker hb_free (font->coords);
1877*2d1272b8SAndroid Build Coastguard Worker hb_free (font->design_coords);
1878*2d1272b8SAndroid Build Coastguard Worker
1879*2d1272b8SAndroid Build Coastguard Worker font->coords = coords;
1880*2d1272b8SAndroid Build Coastguard Worker font->design_coords = design_coords;
1881*2d1272b8SAndroid Build Coastguard Worker font->num_coords = coords_length;
1882*2d1272b8SAndroid Build Coastguard Worker
1883*2d1272b8SAndroid Build Coastguard Worker font->mults_changed (); // Easiest to call this to drop cached data
1884*2d1272b8SAndroid Build Coastguard Worker }
1885*2d1272b8SAndroid Build Coastguard Worker
1886*2d1272b8SAndroid Build Coastguard Worker /**
1887*2d1272b8SAndroid Build Coastguard Worker * hb_font_create_sub_font:
1888*2d1272b8SAndroid Build Coastguard Worker * @parent: The parent font object
1889*2d1272b8SAndroid Build Coastguard Worker *
1890*2d1272b8SAndroid Build Coastguard Worker * Constructs a sub-font font object from the specified @parent font,
1891*2d1272b8SAndroid Build Coastguard Worker * replicating the parent's properties.
1892*2d1272b8SAndroid Build Coastguard Worker *
1893*2d1272b8SAndroid Build Coastguard Worker * Return value: (transfer full): The new sub-font font object
1894*2d1272b8SAndroid Build Coastguard Worker *
1895*2d1272b8SAndroid Build Coastguard Worker * Since: 0.9.2
1896*2d1272b8SAndroid Build Coastguard Worker **/
1897*2d1272b8SAndroid Build Coastguard Worker hb_font_t *
hb_font_create_sub_font(hb_font_t * parent)1898*2d1272b8SAndroid Build Coastguard Worker hb_font_create_sub_font (hb_font_t *parent)
1899*2d1272b8SAndroid Build Coastguard Worker {
1900*2d1272b8SAndroid Build Coastguard Worker if (unlikely (!parent))
1901*2d1272b8SAndroid Build Coastguard Worker parent = hb_font_get_empty ();
1902*2d1272b8SAndroid Build Coastguard Worker
1903*2d1272b8SAndroid Build Coastguard Worker hb_font_t *font = _hb_font_create (parent->face);
1904*2d1272b8SAndroid Build Coastguard Worker
1905*2d1272b8SAndroid Build Coastguard Worker if (unlikely (hb_object_is_immutable (font)))
1906*2d1272b8SAndroid Build Coastguard Worker return font;
1907*2d1272b8SAndroid Build Coastguard Worker
1908*2d1272b8SAndroid Build Coastguard Worker font->parent = hb_font_reference (parent);
1909*2d1272b8SAndroid Build Coastguard Worker
1910*2d1272b8SAndroid Build Coastguard Worker font->x_scale = parent->x_scale;
1911*2d1272b8SAndroid Build Coastguard Worker font->y_scale = parent->y_scale;
1912*2d1272b8SAndroid Build Coastguard Worker font->x_embolden = parent->x_embolden;
1913*2d1272b8SAndroid Build Coastguard Worker font->y_embolden = parent->y_embolden;
1914*2d1272b8SAndroid Build Coastguard Worker font->embolden_in_place = parent->embolden_in_place;
1915*2d1272b8SAndroid Build Coastguard Worker font->slant = parent->slant;
1916*2d1272b8SAndroid Build Coastguard Worker font->x_ppem = parent->x_ppem;
1917*2d1272b8SAndroid Build Coastguard Worker font->y_ppem = parent->y_ppem;
1918*2d1272b8SAndroid Build Coastguard Worker font->ptem = parent->ptem;
1919*2d1272b8SAndroid Build Coastguard Worker
1920*2d1272b8SAndroid Build Coastguard Worker unsigned int num_coords = parent->num_coords;
1921*2d1272b8SAndroid Build Coastguard Worker if (num_coords)
1922*2d1272b8SAndroid Build Coastguard Worker {
1923*2d1272b8SAndroid Build Coastguard Worker int *coords = (int *) hb_calloc (num_coords, sizeof (parent->coords[0]));
1924*2d1272b8SAndroid Build Coastguard Worker float *design_coords = (float *) hb_calloc (num_coords, sizeof (parent->design_coords[0]));
1925*2d1272b8SAndroid Build Coastguard Worker if (likely (coords && design_coords))
1926*2d1272b8SAndroid Build Coastguard Worker {
1927*2d1272b8SAndroid Build Coastguard Worker hb_memcpy (coords, parent->coords, num_coords * sizeof (parent->coords[0]));
1928*2d1272b8SAndroid Build Coastguard Worker hb_memcpy (design_coords, parent->design_coords, num_coords * sizeof (parent->design_coords[0]));
1929*2d1272b8SAndroid Build Coastguard Worker _hb_font_adopt_var_coords (font, coords, design_coords, num_coords);
1930*2d1272b8SAndroid Build Coastguard Worker }
1931*2d1272b8SAndroid Build Coastguard Worker else
1932*2d1272b8SAndroid Build Coastguard Worker {
1933*2d1272b8SAndroid Build Coastguard Worker hb_free (coords);
1934*2d1272b8SAndroid Build Coastguard Worker hb_free (design_coords);
1935*2d1272b8SAndroid Build Coastguard Worker }
1936*2d1272b8SAndroid Build Coastguard Worker }
1937*2d1272b8SAndroid Build Coastguard Worker
1938*2d1272b8SAndroid Build Coastguard Worker font->mults_changed ();
1939*2d1272b8SAndroid Build Coastguard Worker
1940*2d1272b8SAndroid Build Coastguard Worker return font;
1941*2d1272b8SAndroid Build Coastguard Worker }
1942*2d1272b8SAndroid Build Coastguard Worker
1943*2d1272b8SAndroid Build Coastguard Worker /**
1944*2d1272b8SAndroid Build Coastguard Worker * hb_font_get_empty:
1945*2d1272b8SAndroid Build Coastguard Worker *
1946*2d1272b8SAndroid Build Coastguard Worker * Fetches the empty font object.
1947*2d1272b8SAndroid Build Coastguard Worker *
1948*2d1272b8SAndroid Build Coastguard Worker * Return value: (transfer full): The empty font object
1949*2d1272b8SAndroid Build Coastguard Worker *
1950*2d1272b8SAndroid Build Coastguard Worker * Since: 0.9.2
1951*2d1272b8SAndroid Build Coastguard Worker **/
1952*2d1272b8SAndroid Build Coastguard Worker hb_font_t *
hb_font_get_empty()1953*2d1272b8SAndroid Build Coastguard Worker hb_font_get_empty ()
1954*2d1272b8SAndroid Build Coastguard Worker {
1955*2d1272b8SAndroid Build Coastguard Worker return const_cast<hb_font_t *> (&Null (hb_font_t));
1956*2d1272b8SAndroid Build Coastguard Worker }
1957*2d1272b8SAndroid Build Coastguard Worker
1958*2d1272b8SAndroid Build Coastguard Worker /**
1959*2d1272b8SAndroid Build Coastguard Worker * hb_font_reference: (skip)
1960*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
1961*2d1272b8SAndroid Build Coastguard Worker *
1962*2d1272b8SAndroid Build Coastguard Worker * Increases the reference count on the given font object.
1963*2d1272b8SAndroid Build Coastguard Worker *
1964*2d1272b8SAndroid Build Coastguard Worker * Return value: (transfer full): The @font object
1965*2d1272b8SAndroid Build Coastguard Worker *
1966*2d1272b8SAndroid Build Coastguard Worker * Since: 0.9.2
1967*2d1272b8SAndroid Build Coastguard Worker **/
1968*2d1272b8SAndroid Build Coastguard Worker hb_font_t *
hb_font_reference(hb_font_t * font)1969*2d1272b8SAndroid Build Coastguard Worker hb_font_reference (hb_font_t *font)
1970*2d1272b8SAndroid Build Coastguard Worker {
1971*2d1272b8SAndroid Build Coastguard Worker return hb_object_reference (font);
1972*2d1272b8SAndroid Build Coastguard Worker }
1973*2d1272b8SAndroid Build Coastguard Worker
1974*2d1272b8SAndroid Build Coastguard Worker /**
1975*2d1272b8SAndroid Build Coastguard Worker * hb_font_destroy: (skip)
1976*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
1977*2d1272b8SAndroid Build Coastguard Worker *
1978*2d1272b8SAndroid Build Coastguard Worker * Decreases the reference count on the given font object. When the
1979*2d1272b8SAndroid Build Coastguard Worker * reference count reaches zero, the font is destroyed,
1980*2d1272b8SAndroid Build Coastguard Worker * freeing all memory.
1981*2d1272b8SAndroid Build Coastguard Worker *
1982*2d1272b8SAndroid Build Coastguard Worker * Since: 0.9.2
1983*2d1272b8SAndroid Build Coastguard Worker **/
1984*2d1272b8SAndroid Build Coastguard Worker void
hb_font_destroy(hb_font_t * font)1985*2d1272b8SAndroid Build Coastguard Worker hb_font_destroy (hb_font_t *font)
1986*2d1272b8SAndroid Build Coastguard Worker {
1987*2d1272b8SAndroid Build Coastguard Worker if (!hb_object_destroy (font)) return;
1988*2d1272b8SAndroid Build Coastguard Worker
1989*2d1272b8SAndroid Build Coastguard Worker font->data.fini ();
1990*2d1272b8SAndroid Build Coastguard Worker
1991*2d1272b8SAndroid Build Coastguard Worker if (font->destroy)
1992*2d1272b8SAndroid Build Coastguard Worker font->destroy (font->user_data);
1993*2d1272b8SAndroid Build Coastguard Worker
1994*2d1272b8SAndroid Build Coastguard Worker hb_font_destroy (font->parent);
1995*2d1272b8SAndroid Build Coastguard Worker hb_face_destroy (font->face);
1996*2d1272b8SAndroid Build Coastguard Worker hb_font_funcs_destroy (font->klass);
1997*2d1272b8SAndroid Build Coastguard Worker
1998*2d1272b8SAndroid Build Coastguard Worker hb_free (font->coords);
1999*2d1272b8SAndroid Build Coastguard Worker hb_free (font->design_coords);
2000*2d1272b8SAndroid Build Coastguard Worker
2001*2d1272b8SAndroid Build Coastguard Worker hb_free (font);
2002*2d1272b8SAndroid Build Coastguard Worker }
2003*2d1272b8SAndroid Build Coastguard Worker
2004*2d1272b8SAndroid Build Coastguard Worker /**
2005*2d1272b8SAndroid Build Coastguard Worker * hb_font_set_user_data: (skip)
2006*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
2007*2d1272b8SAndroid Build Coastguard Worker * @key: The user-data key
2008*2d1272b8SAndroid Build Coastguard Worker * @data: A pointer to the user data
2009*2d1272b8SAndroid Build Coastguard Worker * @destroy: (nullable): A callback to call when @data is not needed anymore
2010*2d1272b8SAndroid Build Coastguard Worker * @replace: Whether to replace an existing data with the same key
2011*2d1272b8SAndroid Build Coastguard Worker *
2012*2d1272b8SAndroid Build Coastguard Worker * Attaches a user-data key/data pair to the specified font object.
2013*2d1272b8SAndroid Build Coastguard Worker *
2014*2d1272b8SAndroid Build Coastguard Worker * Return value: `true` if success, `false` otherwise
2015*2d1272b8SAndroid Build Coastguard Worker *
2016*2d1272b8SAndroid Build Coastguard Worker * Since: 0.9.2
2017*2d1272b8SAndroid Build Coastguard Worker **/
2018*2d1272b8SAndroid Build Coastguard Worker hb_bool_t
hb_font_set_user_data(hb_font_t * font,hb_user_data_key_t * key,void * data,hb_destroy_func_t destroy,hb_bool_t replace)2019*2d1272b8SAndroid Build Coastguard Worker hb_font_set_user_data (hb_font_t *font,
2020*2d1272b8SAndroid Build Coastguard Worker hb_user_data_key_t *key,
2021*2d1272b8SAndroid Build Coastguard Worker void * data,
2022*2d1272b8SAndroid Build Coastguard Worker hb_destroy_func_t destroy /* May be NULL. */,
2023*2d1272b8SAndroid Build Coastguard Worker hb_bool_t replace)
2024*2d1272b8SAndroid Build Coastguard Worker {
2025*2d1272b8SAndroid Build Coastguard Worker if (!hb_object_is_immutable (font))
2026*2d1272b8SAndroid Build Coastguard Worker font->serial++;
2027*2d1272b8SAndroid Build Coastguard Worker
2028*2d1272b8SAndroid Build Coastguard Worker return hb_object_set_user_data (font, key, data, destroy, replace);
2029*2d1272b8SAndroid Build Coastguard Worker }
2030*2d1272b8SAndroid Build Coastguard Worker
2031*2d1272b8SAndroid Build Coastguard Worker /**
2032*2d1272b8SAndroid Build Coastguard Worker * hb_font_get_user_data: (skip)
2033*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
2034*2d1272b8SAndroid Build Coastguard Worker * @key: The user-data key to query
2035*2d1272b8SAndroid Build Coastguard Worker *
2036*2d1272b8SAndroid Build Coastguard Worker * Fetches the user-data object associated with the specified key,
2037*2d1272b8SAndroid Build Coastguard Worker * attached to the specified font object.
2038*2d1272b8SAndroid Build Coastguard Worker *
2039*2d1272b8SAndroid Build Coastguard Worker * Return value: (transfer none): Pointer to the user data
2040*2d1272b8SAndroid Build Coastguard Worker *
2041*2d1272b8SAndroid Build Coastguard Worker * Since: 0.9.2
2042*2d1272b8SAndroid Build Coastguard Worker **/
2043*2d1272b8SAndroid Build Coastguard Worker void *
hb_font_get_user_data(const hb_font_t * font,hb_user_data_key_t * key)2044*2d1272b8SAndroid Build Coastguard Worker hb_font_get_user_data (const hb_font_t *font,
2045*2d1272b8SAndroid Build Coastguard Worker hb_user_data_key_t *key)
2046*2d1272b8SAndroid Build Coastguard Worker {
2047*2d1272b8SAndroid Build Coastguard Worker return hb_object_get_user_data (font, key);
2048*2d1272b8SAndroid Build Coastguard Worker }
2049*2d1272b8SAndroid Build Coastguard Worker
2050*2d1272b8SAndroid Build Coastguard Worker /**
2051*2d1272b8SAndroid Build Coastguard Worker * hb_font_make_immutable:
2052*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
2053*2d1272b8SAndroid Build Coastguard Worker *
2054*2d1272b8SAndroid Build Coastguard Worker * Makes @font immutable.
2055*2d1272b8SAndroid Build Coastguard Worker *
2056*2d1272b8SAndroid Build Coastguard Worker * Since: 0.9.2
2057*2d1272b8SAndroid Build Coastguard Worker **/
2058*2d1272b8SAndroid Build Coastguard Worker void
hb_font_make_immutable(hb_font_t * font)2059*2d1272b8SAndroid Build Coastguard Worker hb_font_make_immutable (hb_font_t *font)
2060*2d1272b8SAndroid Build Coastguard Worker {
2061*2d1272b8SAndroid Build Coastguard Worker if (hb_object_is_immutable (font))
2062*2d1272b8SAndroid Build Coastguard Worker return;
2063*2d1272b8SAndroid Build Coastguard Worker
2064*2d1272b8SAndroid Build Coastguard Worker if (font->parent)
2065*2d1272b8SAndroid Build Coastguard Worker hb_font_make_immutable (font->parent);
2066*2d1272b8SAndroid Build Coastguard Worker
2067*2d1272b8SAndroid Build Coastguard Worker hb_object_make_immutable (font);
2068*2d1272b8SAndroid Build Coastguard Worker }
2069*2d1272b8SAndroid Build Coastguard Worker
2070*2d1272b8SAndroid Build Coastguard Worker /**
2071*2d1272b8SAndroid Build Coastguard Worker * hb_font_is_immutable:
2072*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
2073*2d1272b8SAndroid Build Coastguard Worker *
2074*2d1272b8SAndroid Build Coastguard Worker * Tests whether a font object is immutable.
2075*2d1272b8SAndroid Build Coastguard Worker *
2076*2d1272b8SAndroid Build Coastguard Worker * Return value: `true` if @font is immutable, `false` otherwise
2077*2d1272b8SAndroid Build Coastguard Worker *
2078*2d1272b8SAndroid Build Coastguard Worker * Since: 0.9.2
2079*2d1272b8SAndroid Build Coastguard Worker **/
2080*2d1272b8SAndroid Build Coastguard Worker hb_bool_t
hb_font_is_immutable(hb_font_t * font)2081*2d1272b8SAndroid Build Coastguard Worker hb_font_is_immutable (hb_font_t *font)
2082*2d1272b8SAndroid Build Coastguard Worker {
2083*2d1272b8SAndroid Build Coastguard Worker return hb_object_is_immutable (font);
2084*2d1272b8SAndroid Build Coastguard Worker }
2085*2d1272b8SAndroid Build Coastguard Worker
2086*2d1272b8SAndroid Build Coastguard Worker /**
2087*2d1272b8SAndroid Build Coastguard Worker * hb_font_get_serial:
2088*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
2089*2d1272b8SAndroid Build Coastguard Worker *
2090*2d1272b8SAndroid Build Coastguard Worker * Returns the internal serial number of the font. The serial
2091*2d1272b8SAndroid Build Coastguard Worker * number is increased every time a setting on the font is
2092*2d1272b8SAndroid Build Coastguard Worker * changed, using a setter function.
2093*2d1272b8SAndroid Build Coastguard Worker *
2094*2d1272b8SAndroid Build Coastguard Worker * Return value: serial number
2095*2d1272b8SAndroid Build Coastguard Worker *
2096*2d1272b8SAndroid Build Coastguard Worker * Since: 4.4.0
2097*2d1272b8SAndroid Build Coastguard Worker **/
2098*2d1272b8SAndroid Build Coastguard Worker unsigned int
hb_font_get_serial(hb_font_t * font)2099*2d1272b8SAndroid Build Coastguard Worker hb_font_get_serial (hb_font_t *font)
2100*2d1272b8SAndroid Build Coastguard Worker {
2101*2d1272b8SAndroid Build Coastguard Worker return font->serial;
2102*2d1272b8SAndroid Build Coastguard Worker }
2103*2d1272b8SAndroid Build Coastguard Worker
2104*2d1272b8SAndroid Build Coastguard Worker /**
2105*2d1272b8SAndroid Build Coastguard Worker * hb_font_changed:
2106*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
2107*2d1272b8SAndroid Build Coastguard Worker *
2108*2d1272b8SAndroid Build Coastguard Worker * Notifies the @font that underlying font data has changed.
2109*2d1272b8SAndroid Build Coastguard Worker * This has the effect of increasing the serial as returned
2110*2d1272b8SAndroid Build Coastguard Worker * by hb_font_get_serial(), which invalidates internal caches.
2111*2d1272b8SAndroid Build Coastguard Worker *
2112*2d1272b8SAndroid Build Coastguard Worker * Since: 4.4.0
2113*2d1272b8SAndroid Build Coastguard Worker **/
2114*2d1272b8SAndroid Build Coastguard Worker void
hb_font_changed(hb_font_t * font)2115*2d1272b8SAndroid Build Coastguard Worker hb_font_changed (hb_font_t *font)
2116*2d1272b8SAndroid Build Coastguard Worker {
2117*2d1272b8SAndroid Build Coastguard Worker if (hb_object_is_immutable (font))
2118*2d1272b8SAndroid Build Coastguard Worker return;
2119*2d1272b8SAndroid Build Coastguard Worker
2120*2d1272b8SAndroid Build Coastguard Worker font->serial++;
2121*2d1272b8SAndroid Build Coastguard Worker
2122*2d1272b8SAndroid Build Coastguard Worker font->mults_changed ();
2123*2d1272b8SAndroid Build Coastguard Worker }
2124*2d1272b8SAndroid Build Coastguard Worker
2125*2d1272b8SAndroid Build Coastguard Worker /**
2126*2d1272b8SAndroid Build Coastguard Worker * hb_font_set_parent:
2127*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
2128*2d1272b8SAndroid Build Coastguard Worker * @parent: The parent font object to assign
2129*2d1272b8SAndroid Build Coastguard Worker *
2130*2d1272b8SAndroid Build Coastguard Worker * Sets the parent font of @font.
2131*2d1272b8SAndroid Build Coastguard Worker *
2132*2d1272b8SAndroid Build Coastguard Worker * Since: 1.0.5
2133*2d1272b8SAndroid Build Coastguard Worker **/
2134*2d1272b8SAndroid Build Coastguard Worker void
hb_font_set_parent(hb_font_t * font,hb_font_t * parent)2135*2d1272b8SAndroid Build Coastguard Worker hb_font_set_parent (hb_font_t *font,
2136*2d1272b8SAndroid Build Coastguard Worker hb_font_t *parent)
2137*2d1272b8SAndroid Build Coastguard Worker {
2138*2d1272b8SAndroid Build Coastguard Worker if (hb_object_is_immutable (font))
2139*2d1272b8SAndroid Build Coastguard Worker return;
2140*2d1272b8SAndroid Build Coastguard Worker
2141*2d1272b8SAndroid Build Coastguard Worker if (parent == font->parent)
2142*2d1272b8SAndroid Build Coastguard Worker return;
2143*2d1272b8SAndroid Build Coastguard Worker
2144*2d1272b8SAndroid Build Coastguard Worker font->serial++;
2145*2d1272b8SAndroid Build Coastguard Worker
2146*2d1272b8SAndroid Build Coastguard Worker if (!parent)
2147*2d1272b8SAndroid Build Coastguard Worker parent = hb_font_get_empty ();
2148*2d1272b8SAndroid Build Coastguard Worker
2149*2d1272b8SAndroid Build Coastguard Worker hb_font_t *old = font->parent;
2150*2d1272b8SAndroid Build Coastguard Worker
2151*2d1272b8SAndroid Build Coastguard Worker font->parent = hb_font_reference (parent);
2152*2d1272b8SAndroid Build Coastguard Worker
2153*2d1272b8SAndroid Build Coastguard Worker hb_font_destroy (old);
2154*2d1272b8SAndroid Build Coastguard Worker }
2155*2d1272b8SAndroid Build Coastguard Worker
2156*2d1272b8SAndroid Build Coastguard Worker /**
2157*2d1272b8SAndroid Build Coastguard Worker * hb_font_get_parent:
2158*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
2159*2d1272b8SAndroid Build Coastguard Worker *
2160*2d1272b8SAndroid Build Coastguard Worker * Fetches the parent font of @font.
2161*2d1272b8SAndroid Build Coastguard Worker *
2162*2d1272b8SAndroid Build Coastguard Worker * Return value: (transfer none): The parent font object
2163*2d1272b8SAndroid Build Coastguard Worker *
2164*2d1272b8SAndroid Build Coastguard Worker * Since: 0.9.2
2165*2d1272b8SAndroid Build Coastguard Worker **/
2166*2d1272b8SAndroid Build Coastguard Worker hb_font_t *
hb_font_get_parent(hb_font_t * font)2167*2d1272b8SAndroid Build Coastguard Worker hb_font_get_parent (hb_font_t *font)
2168*2d1272b8SAndroid Build Coastguard Worker {
2169*2d1272b8SAndroid Build Coastguard Worker return font->parent;
2170*2d1272b8SAndroid Build Coastguard Worker }
2171*2d1272b8SAndroid Build Coastguard Worker
2172*2d1272b8SAndroid Build Coastguard Worker /**
2173*2d1272b8SAndroid Build Coastguard Worker * hb_font_set_face:
2174*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
2175*2d1272b8SAndroid Build Coastguard Worker * @face: The #hb_face_t to assign
2176*2d1272b8SAndroid Build Coastguard Worker *
2177*2d1272b8SAndroid Build Coastguard Worker * Sets @face as the font-face value of @font.
2178*2d1272b8SAndroid Build Coastguard Worker *
2179*2d1272b8SAndroid Build Coastguard Worker * Since: 1.4.3
2180*2d1272b8SAndroid Build Coastguard Worker **/
2181*2d1272b8SAndroid Build Coastguard Worker void
hb_font_set_face(hb_font_t * font,hb_face_t * face)2182*2d1272b8SAndroid Build Coastguard Worker hb_font_set_face (hb_font_t *font,
2183*2d1272b8SAndroid Build Coastguard Worker hb_face_t *face)
2184*2d1272b8SAndroid Build Coastguard Worker {
2185*2d1272b8SAndroid Build Coastguard Worker if (hb_object_is_immutable (font))
2186*2d1272b8SAndroid Build Coastguard Worker return;
2187*2d1272b8SAndroid Build Coastguard Worker
2188*2d1272b8SAndroid Build Coastguard Worker if (face == font->face)
2189*2d1272b8SAndroid Build Coastguard Worker return;
2190*2d1272b8SAndroid Build Coastguard Worker
2191*2d1272b8SAndroid Build Coastguard Worker font->serial++;
2192*2d1272b8SAndroid Build Coastguard Worker
2193*2d1272b8SAndroid Build Coastguard Worker if (unlikely (!face))
2194*2d1272b8SAndroid Build Coastguard Worker face = hb_face_get_empty ();
2195*2d1272b8SAndroid Build Coastguard Worker
2196*2d1272b8SAndroid Build Coastguard Worker hb_face_t *old = font->face;
2197*2d1272b8SAndroid Build Coastguard Worker
2198*2d1272b8SAndroid Build Coastguard Worker hb_face_make_immutable (face);
2199*2d1272b8SAndroid Build Coastguard Worker font->face = hb_face_reference (face);
2200*2d1272b8SAndroid Build Coastguard Worker font->mults_changed ();
2201*2d1272b8SAndroid Build Coastguard Worker
2202*2d1272b8SAndroid Build Coastguard Worker hb_face_destroy (old);
2203*2d1272b8SAndroid Build Coastguard Worker }
2204*2d1272b8SAndroid Build Coastguard Worker
2205*2d1272b8SAndroid Build Coastguard Worker /**
2206*2d1272b8SAndroid Build Coastguard Worker * hb_font_get_face:
2207*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
2208*2d1272b8SAndroid Build Coastguard Worker *
2209*2d1272b8SAndroid Build Coastguard Worker * Fetches the face associated with the specified font object.
2210*2d1272b8SAndroid Build Coastguard Worker *
2211*2d1272b8SAndroid Build Coastguard Worker * Return value: (transfer none): The #hb_face_t value
2212*2d1272b8SAndroid Build Coastguard Worker *
2213*2d1272b8SAndroid Build Coastguard Worker * Since: 0.9.2
2214*2d1272b8SAndroid Build Coastguard Worker **/
2215*2d1272b8SAndroid Build Coastguard Worker hb_face_t *
hb_font_get_face(hb_font_t * font)2216*2d1272b8SAndroid Build Coastguard Worker hb_font_get_face (hb_font_t *font)
2217*2d1272b8SAndroid Build Coastguard Worker {
2218*2d1272b8SAndroid Build Coastguard Worker return font->face;
2219*2d1272b8SAndroid Build Coastguard Worker }
2220*2d1272b8SAndroid Build Coastguard Worker
2221*2d1272b8SAndroid Build Coastguard Worker
2222*2d1272b8SAndroid Build Coastguard Worker /**
2223*2d1272b8SAndroid Build Coastguard Worker * hb_font_set_funcs:
2224*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
2225*2d1272b8SAndroid Build Coastguard Worker * @klass: (closure font_data) (destroy destroy) (scope notified): The font-functions structure.
2226*2d1272b8SAndroid Build Coastguard Worker * @font_data: Data to attach to @font
2227*2d1272b8SAndroid Build Coastguard Worker * @destroy: (nullable): The function to call when @font_data is not needed anymore
2228*2d1272b8SAndroid Build Coastguard Worker *
2229*2d1272b8SAndroid Build Coastguard Worker * Replaces the font-functions structure attached to a font, updating
2230*2d1272b8SAndroid Build Coastguard Worker * the font's user-data with @font-data and the @destroy callback.
2231*2d1272b8SAndroid Build Coastguard Worker *
2232*2d1272b8SAndroid Build Coastguard Worker * Since: 0.9.2
2233*2d1272b8SAndroid Build Coastguard Worker **/
2234*2d1272b8SAndroid Build Coastguard Worker void
hb_font_set_funcs(hb_font_t * font,hb_font_funcs_t * klass,void * font_data,hb_destroy_func_t destroy)2235*2d1272b8SAndroid Build Coastguard Worker hb_font_set_funcs (hb_font_t *font,
2236*2d1272b8SAndroid Build Coastguard Worker hb_font_funcs_t *klass,
2237*2d1272b8SAndroid Build Coastguard Worker void *font_data,
2238*2d1272b8SAndroid Build Coastguard Worker hb_destroy_func_t destroy /* May be NULL. */)
2239*2d1272b8SAndroid Build Coastguard Worker {
2240*2d1272b8SAndroid Build Coastguard Worker if (hb_object_is_immutable (font))
2241*2d1272b8SAndroid Build Coastguard Worker {
2242*2d1272b8SAndroid Build Coastguard Worker if (destroy)
2243*2d1272b8SAndroid Build Coastguard Worker destroy (font_data);
2244*2d1272b8SAndroid Build Coastguard Worker return;
2245*2d1272b8SAndroid Build Coastguard Worker }
2246*2d1272b8SAndroid Build Coastguard Worker
2247*2d1272b8SAndroid Build Coastguard Worker font->serial++;
2248*2d1272b8SAndroid Build Coastguard Worker
2249*2d1272b8SAndroid Build Coastguard Worker if (font->destroy)
2250*2d1272b8SAndroid Build Coastguard Worker font->destroy (font->user_data);
2251*2d1272b8SAndroid Build Coastguard Worker
2252*2d1272b8SAndroid Build Coastguard Worker if (!klass)
2253*2d1272b8SAndroid Build Coastguard Worker klass = hb_font_funcs_get_empty ();
2254*2d1272b8SAndroid Build Coastguard Worker
2255*2d1272b8SAndroid Build Coastguard Worker hb_font_funcs_reference (klass);
2256*2d1272b8SAndroid Build Coastguard Worker hb_font_funcs_destroy (font->klass);
2257*2d1272b8SAndroid Build Coastguard Worker font->klass = klass;
2258*2d1272b8SAndroid Build Coastguard Worker font->user_data = font_data;
2259*2d1272b8SAndroid Build Coastguard Worker font->destroy = destroy;
2260*2d1272b8SAndroid Build Coastguard Worker }
2261*2d1272b8SAndroid Build Coastguard Worker
2262*2d1272b8SAndroid Build Coastguard Worker /**
2263*2d1272b8SAndroid Build Coastguard Worker * hb_font_set_funcs_data:
2264*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
2265*2d1272b8SAndroid Build Coastguard Worker * @font_data: (destroy destroy) (scope notified): Data to attach to @font
2266*2d1272b8SAndroid Build Coastguard Worker * @destroy: (nullable): The function to call when @font_data is not needed anymore
2267*2d1272b8SAndroid Build Coastguard Worker *
2268*2d1272b8SAndroid Build Coastguard Worker * Replaces the user data attached to a font, updating the font's
2269*2d1272b8SAndroid Build Coastguard Worker * @destroy callback.
2270*2d1272b8SAndroid Build Coastguard Worker *
2271*2d1272b8SAndroid Build Coastguard Worker * Since: 0.9.2
2272*2d1272b8SAndroid Build Coastguard Worker **/
2273*2d1272b8SAndroid Build Coastguard Worker void
hb_font_set_funcs_data(hb_font_t * font,void * font_data,hb_destroy_func_t destroy)2274*2d1272b8SAndroid Build Coastguard Worker hb_font_set_funcs_data (hb_font_t *font,
2275*2d1272b8SAndroid Build Coastguard Worker void *font_data,
2276*2d1272b8SAndroid Build Coastguard Worker hb_destroy_func_t destroy /* May be NULL. */)
2277*2d1272b8SAndroid Build Coastguard Worker {
2278*2d1272b8SAndroid Build Coastguard Worker /* Destroy user_data? */
2279*2d1272b8SAndroid Build Coastguard Worker if (hb_object_is_immutable (font))
2280*2d1272b8SAndroid Build Coastguard Worker {
2281*2d1272b8SAndroid Build Coastguard Worker if (destroy)
2282*2d1272b8SAndroid Build Coastguard Worker destroy (font_data);
2283*2d1272b8SAndroid Build Coastguard Worker return;
2284*2d1272b8SAndroid Build Coastguard Worker }
2285*2d1272b8SAndroid Build Coastguard Worker
2286*2d1272b8SAndroid Build Coastguard Worker font->serial++;
2287*2d1272b8SAndroid Build Coastguard Worker
2288*2d1272b8SAndroid Build Coastguard Worker if (font->destroy)
2289*2d1272b8SAndroid Build Coastguard Worker font->destroy (font->user_data);
2290*2d1272b8SAndroid Build Coastguard Worker
2291*2d1272b8SAndroid Build Coastguard Worker font->user_data = font_data;
2292*2d1272b8SAndroid Build Coastguard Worker font->destroy = destroy;
2293*2d1272b8SAndroid Build Coastguard Worker }
2294*2d1272b8SAndroid Build Coastguard Worker
2295*2d1272b8SAndroid Build Coastguard Worker
2296*2d1272b8SAndroid Build Coastguard Worker /**
2297*2d1272b8SAndroid Build Coastguard Worker * hb_font_set_scale:
2298*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
2299*2d1272b8SAndroid Build Coastguard Worker * @x_scale: Horizontal scale value to assign
2300*2d1272b8SAndroid Build Coastguard Worker * @y_scale: Vertical scale value to assign
2301*2d1272b8SAndroid Build Coastguard Worker *
2302*2d1272b8SAndroid Build Coastguard Worker * Sets the horizontal and vertical scale of a font.
2303*2d1272b8SAndroid Build Coastguard Worker *
2304*2d1272b8SAndroid Build Coastguard Worker * The font scale is a number related to, but not the same as,
2305*2d1272b8SAndroid Build Coastguard Worker * font size. Typically the client establishes a scale factor
2306*2d1272b8SAndroid Build Coastguard Worker * to be used between the two. For example, 64, or 256, which
2307*2d1272b8SAndroid Build Coastguard Worker * would be the fractional-precision part of the font scale.
2308*2d1272b8SAndroid Build Coastguard Worker * This is necessary because #hb_position_t values are integer
2309*2d1272b8SAndroid Build Coastguard Worker * types and you need to leave room for fractional values
2310*2d1272b8SAndroid Build Coastguard Worker * in there.
2311*2d1272b8SAndroid Build Coastguard Worker *
2312*2d1272b8SAndroid Build Coastguard Worker * For example, to set the font size to 20, with 64
2313*2d1272b8SAndroid Build Coastguard Worker * levels of fractional precision you would call
2314*2d1272b8SAndroid Build Coastguard Worker * `hb_font_set_scale(font, 20 * 64, 20 * 64)`.
2315*2d1272b8SAndroid Build Coastguard Worker *
2316*2d1272b8SAndroid Build Coastguard Worker * In the example above, even what font size 20 means is up to
2317*2d1272b8SAndroid Build Coastguard Worker * you. It might be 20 pixels, or 20 points, or 20 millimeters.
2318*2d1272b8SAndroid Build Coastguard Worker * HarfBuzz does not care about that. You can set the point
2319*2d1272b8SAndroid Build Coastguard Worker * size of the font using hb_font_set_ptem(), and the pixel
2320*2d1272b8SAndroid Build Coastguard Worker * size using hb_font_set_ppem().
2321*2d1272b8SAndroid Build Coastguard Worker *
2322*2d1272b8SAndroid Build Coastguard Worker * The choice of scale is yours but needs to be consistent between
2323*2d1272b8SAndroid Build Coastguard Worker * what you set here, and what you expect out of #hb_position_t
2324*2d1272b8SAndroid Build Coastguard Worker * as well has draw / paint API output values.
2325*2d1272b8SAndroid Build Coastguard Worker *
2326*2d1272b8SAndroid Build Coastguard Worker * Fonts default to a scale equal to the UPEM value of their face.
2327*2d1272b8SAndroid Build Coastguard Worker * A font with this setting is sometimes called an "unscaled" font.
2328*2d1272b8SAndroid Build Coastguard Worker *
2329*2d1272b8SAndroid Build Coastguard Worker * Since: 0.9.2
2330*2d1272b8SAndroid Build Coastguard Worker **/
2331*2d1272b8SAndroid Build Coastguard Worker void
hb_font_set_scale(hb_font_t * font,int x_scale,int y_scale)2332*2d1272b8SAndroid Build Coastguard Worker hb_font_set_scale (hb_font_t *font,
2333*2d1272b8SAndroid Build Coastguard Worker int x_scale,
2334*2d1272b8SAndroid Build Coastguard Worker int y_scale)
2335*2d1272b8SAndroid Build Coastguard Worker {
2336*2d1272b8SAndroid Build Coastguard Worker if (hb_object_is_immutable (font))
2337*2d1272b8SAndroid Build Coastguard Worker return;
2338*2d1272b8SAndroid Build Coastguard Worker
2339*2d1272b8SAndroid Build Coastguard Worker if (font->x_scale == x_scale && font->y_scale == y_scale)
2340*2d1272b8SAndroid Build Coastguard Worker return;
2341*2d1272b8SAndroid Build Coastguard Worker
2342*2d1272b8SAndroid Build Coastguard Worker font->serial++;
2343*2d1272b8SAndroid Build Coastguard Worker
2344*2d1272b8SAndroid Build Coastguard Worker font->x_scale = x_scale;
2345*2d1272b8SAndroid Build Coastguard Worker font->y_scale = y_scale;
2346*2d1272b8SAndroid Build Coastguard Worker font->mults_changed ();
2347*2d1272b8SAndroid Build Coastguard Worker }
2348*2d1272b8SAndroid Build Coastguard Worker
2349*2d1272b8SAndroid Build Coastguard Worker /**
2350*2d1272b8SAndroid Build Coastguard Worker * hb_font_get_scale:
2351*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
2352*2d1272b8SAndroid Build Coastguard Worker * @x_scale: (out): Horizontal scale value
2353*2d1272b8SAndroid Build Coastguard Worker * @y_scale: (out): Vertical scale value
2354*2d1272b8SAndroid Build Coastguard Worker *
2355*2d1272b8SAndroid Build Coastguard Worker * Fetches the horizontal and vertical scale of a font.
2356*2d1272b8SAndroid Build Coastguard Worker *
2357*2d1272b8SAndroid Build Coastguard Worker * Since: 0.9.2
2358*2d1272b8SAndroid Build Coastguard Worker **/
2359*2d1272b8SAndroid Build Coastguard Worker void
hb_font_get_scale(hb_font_t * font,int * x_scale,int * y_scale)2360*2d1272b8SAndroid Build Coastguard Worker hb_font_get_scale (hb_font_t *font,
2361*2d1272b8SAndroid Build Coastguard Worker int *x_scale,
2362*2d1272b8SAndroid Build Coastguard Worker int *y_scale)
2363*2d1272b8SAndroid Build Coastguard Worker {
2364*2d1272b8SAndroid Build Coastguard Worker if (x_scale) *x_scale = font->x_scale;
2365*2d1272b8SAndroid Build Coastguard Worker if (y_scale) *y_scale = font->y_scale;
2366*2d1272b8SAndroid Build Coastguard Worker }
2367*2d1272b8SAndroid Build Coastguard Worker
2368*2d1272b8SAndroid Build Coastguard Worker /**
2369*2d1272b8SAndroid Build Coastguard Worker * hb_font_set_ppem:
2370*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
2371*2d1272b8SAndroid Build Coastguard Worker * @x_ppem: Horizontal ppem value to assign
2372*2d1272b8SAndroid Build Coastguard Worker * @y_ppem: Vertical ppem value to assign
2373*2d1272b8SAndroid Build Coastguard Worker *
2374*2d1272b8SAndroid Build Coastguard Worker * Sets the horizontal and vertical pixels-per-em (PPEM) of a font.
2375*2d1272b8SAndroid Build Coastguard Worker *
2376*2d1272b8SAndroid Build Coastguard Worker * These values are used for pixel-size-specific adjustment to
2377*2d1272b8SAndroid Build Coastguard Worker * shaping and draw results, though for the most part they are
2378*2d1272b8SAndroid Build Coastguard Worker * unused and can be left unset.
2379*2d1272b8SAndroid Build Coastguard Worker *
2380*2d1272b8SAndroid Build Coastguard Worker * Since: 0.9.2
2381*2d1272b8SAndroid Build Coastguard Worker **/
2382*2d1272b8SAndroid Build Coastguard Worker void
hb_font_set_ppem(hb_font_t * font,unsigned int x_ppem,unsigned int y_ppem)2383*2d1272b8SAndroid Build Coastguard Worker hb_font_set_ppem (hb_font_t *font,
2384*2d1272b8SAndroid Build Coastguard Worker unsigned int x_ppem,
2385*2d1272b8SAndroid Build Coastguard Worker unsigned int y_ppem)
2386*2d1272b8SAndroid Build Coastguard Worker {
2387*2d1272b8SAndroid Build Coastguard Worker if (hb_object_is_immutable (font))
2388*2d1272b8SAndroid Build Coastguard Worker return;
2389*2d1272b8SAndroid Build Coastguard Worker
2390*2d1272b8SAndroid Build Coastguard Worker if (font->x_ppem == x_ppem && font->y_ppem == y_ppem)
2391*2d1272b8SAndroid Build Coastguard Worker return;
2392*2d1272b8SAndroid Build Coastguard Worker
2393*2d1272b8SAndroid Build Coastguard Worker font->serial++;
2394*2d1272b8SAndroid Build Coastguard Worker
2395*2d1272b8SAndroid Build Coastguard Worker font->x_ppem = x_ppem;
2396*2d1272b8SAndroid Build Coastguard Worker font->y_ppem = y_ppem;
2397*2d1272b8SAndroid Build Coastguard Worker }
2398*2d1272b8SAndroid Build Coastguard Worker
2399*2d1272b8SAndroid Build Coastguard Worker /**
2400*2d1272b8SAndroid Build Coastguard Worker * hb_font_get_ppem:
2401*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
2402*2d1272b8SAndroid Build Coastguard Worker * @x_ppem: (out): Horizontal ppem value
2403*2d1272b8SAndroid Build Coastguard Worker * @y_ppem: (out): Vertical ppem value
2404*2d1272b8SAndroid Build Coastguard Worker *
2405*2d1272b8SAndroid Build Coastguard Worker * Fetches the horizontal and vertical points-per-em (ppem) of a font.
2406*2d1272b8SAndroid Build Coastguard Worker *
2407*2d1272b8SAndroid Build Coastguard Worker * Since: 0.9.2
2408*2d1272b8SAndroid Build Coastguard Worker **/
2409*2d1272b8SAndroid Build Coastguard Worker void
hb_font_get_ppem(hb_font_t * font,unsigned int * x_ppem,unsigned int * y_ppem)2410*2d1272b8SAndroid Build Coastguard Worker hb_font_get_ppem (hb_font_t *font,
2411*2d1272b8SAndroid Build Coastguard Worker unsigned int *x_ppem,
2412*2d1272b8SAndroid Build Coastguard Worker unsigned int *y_ppem)
2413*2d1272b8SAndroid Build Coastguard Worker {
2414*2d1272b8SAndroid Build Coastguard Worker if (x_ppem) *x_ppem = font->x_ppem;
2415*2d1272b8SAndroid Build Coastguard Worker if (y_ppem) *y_ppem = font->y_ppem;
2416*2d1272b8SAndroid Build Coastguard Worker }
2417*2d1272b8SAndroid Build Coastguard Worker
2418*2d1272b8SAndroid Build Coastguard Worker /**
2419*2d1272b8SAndroid Build Coastguard Worker * hb_font_set_ptem:
2420*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
2421*2d1272b8SAndroid Build Coastguard Worker * @ptem: font size in points.
2422*2d1272b8SAndroid Build Coastguard Worker *
2423*2d1272b8SAndroid Build Coastguard Worker * Sets the "point size" of a font. Set to zero to unset.
2424*2d1272b8SAndroid Build Coastguard Worker * Used in CoreText to implement optical sizing.
2425*2d1272b8SAndroid Build Coastguard Worker *
2426*2d1272b8SAndroid Build Coastguard Worker * <note>Note: There are 72 points in an inch.</note>
2427*2d1272b8SAndroid Build Coastguard Worker *
2428*2d1272b8SAndroid Build Coastguard Worker * Since: 1.6.0
2429*2d1272b8SAndroid Build Coastguard Worker **/
2430*2d1272b8SAndroid Build Coastguard Worker void
hb_font_set_ptem(hb_font_t * font,float ptem)2431*2d1272b8SAndroid Build Coastguard Worker hb_font_set_ptem (hb_font_t *font,
2432*2d1272b8SAndroid Build Coastguard Worker float ptem)
2433*2d1272b8SAndroid Build Coastguard Worker {
2434*2d1272b8SAndroid Build Coastguard Worker if (hb_object_is_immutable (font))
2435*2d1272b8SAndroid Build Coastguard Worker return;
2436*2d1272b8SAndroid Build Coastguard Worker
2437*2d1272b8SAndroid Build Coastguard Worker if (font->ptem == ptem)
2438*2d1272b8SAndroid Build Coastguard Worker return;
2439*2d1272b8SAndroid Build Coastguard Worker
2440*2d1272b8SAndroid Build Coastguard Worker font->serial++;
2441*2d1272b8SAndroid Build Coastguard Worker
2442*2d1272b8SAndroid Build Coastguard Worker font->ptem = ptem;
2443*2d1272b8SAndroid Build Coastguard Worker }
2444*2d1272b8SAndroid Build Coastguard Worker
2445*2d1272b8SAndroid Build Coastguard Worker /**
2446*2d1272b8SAndroid Build Coastguard Worker * hb_font_get_ptem:
2447*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
2448*2d1272b8SAndroid Build Coastguard Worker *
2449*2d1272b8SAndroid Build Coastguard Worker * Fetches the "point size" of a font. Used in CoreText to
2450*2d1272b8SAndroid Build Coastguard Worker * implement optical sizing.
2451*2d1272b8SAndroid Build Coastguard Worker *
2452*2d1272b8SAndroid Build Coastguard Worker * Return value: Point size. A value of zero means "not set."
2453*2d1272b8SAndroid Build Coastguard Worker *
2454*2d1272b8SAndroid Build Coastguard Worker * Since: 1.6.0
2455*2d1272b8SAndroid Build Coastguard Worker **/
2456*2d1272b8SAndroid Build Coastguard Worker float
hb_font_get_ptem(hb_font_t * font)2457*2d1272b8SAndroid Build Coastguard Worker hb_font_get_ptem (hb_font_t *font)
2458*2d1272b8SAndroid Build Coastguard Worker {
2459*2d1272b8SAndroid Build Coastguard Worker return font->ptem;
2460*2d1272b8SAndroid Build Coastguard Worker }
2461*2d1272b8SAndroid Build Coastguard Worker
2462*2d1272b8SAndroid Build Coastguard Worker /**
2463*2d1272b8SAndroid Build Coastguard Worker * hb_font_set_synthetic_bold:
2464*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
2465*2d1272b8SAndroid Build Coastguard Worker * @x_embolden: the amount to embolden horizontally
2466*2d1272b8SAndroid Build Coastguard Worker * @y_embolden: the amount to embolden vertically
2467*2d1272b8SAndroid Build Coastguard Worker * @in_place: whether to embolden glyphs in-place
2468*2d1272b8SAndroid Build Coastguard Worker *
2469*2d1272b8SAndroid Build Coastguard Worker * Sets the "synthetic boldness" of a font.
2470*2d1272b8SAndroid Build Coastguard Worker *
2471*2d1272b8SAndroid Build Coastguard Worker * Positive values for @x_embolden / @y_embolden make a font
2472*2d1272b8SAndroid Build Coastguard Worker * bolder, negative values thinner. Typical values are in the
2473*2d1272b8SAndroid Build Coastguard Worker * 0.01 to 0.05 range. The default value is zero.
2474*2d1272b8SAndroid Build Coastguard Worker *
2475*2d1272b8SAndroid Build Coastguard Worker * Synthetic boldness is applied by offsetting the contour
2476*2d1272b8SAndroid Build Coastguard Worker * points of the glyph shape.
2477*2d1272b8SAndroid Build Coastguard Worker *
2478*2d1272b8SAndroid Build Coastguard Worker * Synthetic boldness is applied when rendering a glyph via
2479*2d1272b8SAndroid Build Coastguard Worker * hb_font_draw_glyph().
2480*2d1272b8SAndroid Build Coastguard Worker *
2481*2d1272b8SAndroid Build Coastguard Worker * If @in_place is `false`, then glyph advance-widths are also
2482*2d1272b8SAndroid Build Coastguard Worker * adjusted, otherwise they are not. The in-place mode is
2483*2d1272b8SAndroid Build Coastguard Worker * useful for simulating [font grading](https://fonts.google.com/knowledge/glossary/grade).
2484*2d1272b8SAndroid Build Coastguard Worker *
2485*2d1272b8SAndroid Build Coastguard Worker *
2486*2d1272b8SAndroid Build Coastguard Worker * Since: 7.0.0
2487*2d1272b8SAndroid Build Coastguard Worker **/
2488*2d1272b8SAndroid Build Coastguard Worker void
hb_font_set_synthetic_bold(hb_font_t * font,float x_embolden,float y_embolden,hb_bool_t in_place)2489*2d1272b8SAndroid Build Coastguard Worker hb_font_set_synthetic_bold (hb_font_t *font,
2490*2d1272b8SAndroid Build Coastguard Worker float x_embolden,
2491*2d1272b8SAndroid Build Coastguard Worker float y_embolden,
2492*2d1272b8SAndroid Build Coastguard Worker hb_bool_t in_place)
2493*2d1272b8SAndroid Build Coastguard Worker {
2494*2d1272b8SAndroid Build Coastguard Worker if (hb_object_is_immutable (font))
2495*2d1272b8SAndroid Build Coastguard Worker return;
2496*2d1272b8SAndroid Build Coastguard Worker
2497*2d1272b8SAndroid Build Coastguard Worker if (font->x_embolden == x_embolden &&
2498*2d1272b8SAndroid Build Coastguard Worker font->y_embolden == y_embolden &&
2499*2d1272b8SAndroid Build Coastguard Worker font->embolden_in_place == (bool) in_place)
2500*2d1272b8SAndroid Build Coastguard Worker return;
2501*2d1272b8SAndroid Build Coastguard Worker
2502*2d1272b8SAndroid Build Coastguard Worker font->serial++;
2503*2d1272b8SAndroid Build Coastguard Worker
2504*2d1272b8SAndroid Build Coastguard Worker font->x_embolden = x_embolden;
2505*2d1272b8SAndroid Build Coastguard Worker font->y_embolden = y_embolden;
2506*2d1272b8SAndroid Build Coastguard Worker font->embolden_in_place = in_place;
2507*2d1272b8SAndroid Build Coastguard Worker font->mults_changed ();
2508*2d1272b8SAndroid Build Coastguard Worker }
2509*2d1272b8SAndroid Build Coastguard Worker
2510*2d1272b8SAndroid Build Coastguard Worker /**
2511*2d1272b8SAndroid Build Coastguard Worker * hb_font_get_synthetic_bold:
2512*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
2513*2d1272b8SAndroid Build Coastguard Worker * @x_embolden: (out): return location for horizontal value
2514*2d1272b8SAndroid Build Coastguard Worker * @y_embolden: (out): return location for vertical value
2515*2d1272b8SAndroid Build Coastguard Worker * @in_place: (out): return location for in-place value
2516*2d1272b8SAndroid Build Coastguard Worker *
2517*2d1272b8SAndroid Build Coastguard Worker * Fetches the "synthetic boldness" parameters of a font.
2518*2d1272b8SAndroid Build Coastguard Worker *
2519*2d1272b8SAndroid Build Coastguard Worker * Since: 7.0.0
2520*2d1272b8SAndroid Build Coastguard Worker **/
2521*2d1272b8SAndroid Build Coastguard Worker void
hb_font_get_synthetic_bold(hb_font_t * font,float * x_embolden,float * y_embolden,hb_bool_t * in_place)2522*2d1272b8SAndroid Build Coastguard Worker hb_font_get_synthetic_bold (hb_font_t *font,
2523*2d1272b8SAndroid Build Coastguard Worker float *x_embolden,
2524*2d1272b8SAndroid Build Coastguard Worker float *y_embolden,
2525*2d1272b8SAndroid Build Coastguard Worker hb_bool_t *in_place)
2526*2d1272b8SAndroid Build Coastguard Worker {
2527*2d1272b8SAndroid Build Coastguard Worker if (x_embolden) *x_embolden = font->x_embolden;
2528*2d1272b8SAndroid Build Coastguard Worker if (y_embolden) *y_embolden = font->y_embolden;
2529*2d1272b8SAndroid Build Coastguard Worker if (in_place) *in_place = font->embolden_in_place;
2530*2d1272b8SAndroid Build Coastguard Worker }
2531*2d1272b8SAndroid Build Coastguard Worker
2532*2d1272b8SAndroid Build Coastguard Worker /**
2533*2d1272b8SAndroid Build Coastguard Worker * hb_font_set_synthetic_slant:
2534*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
2535*2d1272b8SAndroid Build Coastguard Worker * @slant: synthetic slant value.
2536*2d1272b8SAndroid Build Coastguard Worker *
2537*2d1272b8SAndroid Build Coastguard Worker * Sets the "synthetic slant" of a font. By default is zero.
2538*2d1272b8SAndroid Build Coastguard Worker * Synthetic slant is the graphical skew applied to the font
2539*2d1272b8SAndroid Build Coastguard Worker * at rendering time.
2540*2d1272b8SAndroid Build Coastguard Worker *
2541*2d1272b8SAndroid Build Coastguard Worker * HarfBuzz needs to know this value to adjust shaping results,
2542*2d1272b8SAndroid Build Coastguard Worker * metrics, and style values to match the slanted rendering.
2543*2d1272b8SAndroid Build Coastguard Worker *
2544*2d1272b8SAndroid Build Coastguard Worker * <note>Note: The glyph shape fetched via the hb_font_draw_glyph()
2545*2d1272b8SAndroid Build Coastguard Worker * function is slanted to reflect this value as well.</note>
2546*2d1272b8SAndroid Build Coastguard Worker *
2547*2d1272b8SAndroid Build Coastguard Worker * <note>Note: The slant value is a ratio. For example, a
2548*2d1272b8SAndroid Build Coastguard Worker * 20% slant would be represented as a 0.2 value.</note>
2549*2d1272b8SAndroid Build Coastguard Worker *
2550*2d1272b8SAndroid Build Coastguard Worker * Since: 3.3.0
2551*2d1272b8SAndroid Build Coastguard Worker **/
2552*2d1272b8SAndroid Build Coastguard Worker HB_EXTERN void
hb_font_set_synthetic_slant(hb_font_t * font,float slant)2553*2d1272b8SAndroid Build Coastguard Worker hb_font_set_synthetic_slant (hb_font_t *font, float slant)
2554*2d1272b8SAndroid Build Coastguard Worker {
2555*2d1272b8SAndroid Build Coastguard Worker if (hb_object_is_immutable (font))
2556*2d1272b8SAndroid Build Coastguard Worker return;
2557*2d1272b8SAndroid Build Coastguard Worker
2558*2d1272b8SAndroid Build Coastguard Worker if (font->slant == slant)
2559*2d1272b8SAndroid Build Coastguard Worker return;
2560*2d1272b8SAndroid Build Coastguard Worker
2561*2d1272b8SAndroid Build Coastguard Worker font->serial++;
2562*2d1272b8SAndroid Build Coastguard Worker
2563*2d1272b8SAndroid Build Coastguard Worker font->slant = slant;
2564*2d1272b8SAndroid Build Coastguard Worker font->mults_changed ();
2565*2d1272b8SAndroid Build Coastguard Worker }
2566*2d1272b8SAndroid Build Coastguard Worker
2567*2d1272b8SAndroid Build Coastguard Worker /**
2568*2d1272b8SAndroid Build Coastguard Worker * hb_font_get_synthetic_slant:
2569*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
2570*2d1272b8SAndroid Build Coastguard Worker *
2571*2d1272b8SAndroid Build Coastguard Worker * Fetches the "synthetic slant" of a font.
2572*2d1272b8SAndroid Build Coastguard Worker *
2573*2d1272b8SAndroid Build Coastguard Worker * Return value: Synthetic slant. By default is zero.
2574*2d1272b8SAndroid Build Coastguard Worker *
2575*2d1272b8SAndroid Build Coastguard Worker * Since: 3.3.0
2576*2d1272b8SAndroid Build Coastguard Worker **/
2577*2d1272b8SAndroid Build Coastguard Worker HB_EXTERN float
hb_font_get_synthetic_slant(hb_font_t * font)2578*2d1272b8SAndroid Build Coastguard Worker hb_font_get_synthetic_slant (hb_font_t *font)
2579*2d1272b8SAndroid Build Coastguard Worker {
2580*2d1272b8SAndroid Build Coastguard Worker return font->slant;
2581*2d1272b8SAndroid Build Coastguard Worker }
2582*2d1272b8SAndroid Build Coastguard Worker
2583*2d1272b8SAndroid Build Coastguard Worker #ifndef HB_NO_VAR
2584*2d1272b8SAndroid Build Coastguard Worker /*
2585*2d1272b8SAndroid Build Coastguard Worker * Variations
2586*2d1272b8SAndroid Build Coastguard Worker */
2587*2d1272b8SAndroid Build Coastguard Worker
2588*2d1272b8SAndroid Build Coastguard Worker /**
2589*2d1272b8SAndroid Build Coastguard Worker * hb_font_set_variations:
2590*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
2591*2d1272b8SAndroid Build Coastguard Worker * @variations: (array length=variations_length): Array of variation settings to apply
2592*2d1272b8SAndroid Build Coastguard Worker * @variations_length: Number of variations to apply
2593*2d1272b8SAndroid Build Coastguard Worker *
2594*2d1272b8SAndroid Build Coastguard Worker * Applies a list of font-variation settings to a font.
2595*2d1272b8SAndroid Build Coastguard Worker *
2596*2d1272b8SAndroid Build Coastguard Worker * Note that this overrides all existing variations set on @font.
2597*2d1272b8SAndroid Build Coastguard Worker * Axes not included in @variations will be effectively set to their
2598*2d1272b8SAndroid Build Coastguard Worker * default values.
2599*2d1272b8SAndroid Build Coastguard Worker *
2600*2d1272b8SAndroid Build Coastguard Worker * Since: 1.4.2
2601*2d1272b8SAndroid Build Coastguard Worker */
2602*2d1272b8SAndroid Build Coastguard Worker void
hb_font_set_variations(hb_font_t * font,const hb_variation_t * variations,unsigned int variations_length)2603*2d1272b8SAndroid Build Coastguard Worker hb_font_set_variations (hb_font_t *font,
2604*2d1272b8SAndroid Build Coastguard Worker const hb_variation_t *variations,
2605*2d1272b8SAndroid Build Coastguard Worker unsigned int variations_length)
2606*2d1272b8SAndroid Build Coastguard Worker {
2607*2d1272b8SAndroid Build Coastguard Worker if (hb_object_is_immutable (font))
2608*2d1272b8SAndroid Build Coastguard Worker return;
2609*2d1272b8SAndroid Build Coastguard Worker
2610*2d1272b8SAndroid Build Coastguard Worker font->serial_coords = ++font->serial;
2611*2d1272b8SAndroid Build Coastguard Worker
2612*2d1272b8SAndroid Build Coastguard Worker if (!variations_length && font->instance_index == HB_FONT_NO_VAR_NAMED_INSTANCE)
2613*2d1272b8SAndroid Build Coastguard Worker {
2614*2d1272b8SAndroid Build Coastguard Worker hb_font_set_var_coords_normalized (font, nullptr, 0);
2615*2d1272b8SAndroid Build Coastguard Worker return;
2616*2d1272b8SAndroid Build Coastguard Worker }
2617*2d1272b8SAndroid Build Coastguard Worker
2618*2d1272b8SAndroid Build Coastguard Worker const OT::fvar &fvar = *font->face->table.fvar;
2619*2d1272b8SAndroid Build Coastguard Worker auto axes = fvar.get_axes ();
2620*2d1272b8SAndroid Build Coastguard Worker const unsigned coords_length = axes.length;
2621*2d1272b8SAndroid Build Coastguard Worker
2622*2d1272b8SAndroid Build Coastguard Worker int *normalized = coords_length ? (int *) hb_calloc (coords_length, sizeof (int)) : nullptr;
2623*2d1272b8SAndroid Build Coastguard Worker float *design_coords = coords_length ? (float *) hb_calloc (coords_length, sizeof (float)) : nullptr;
2624*2d1272b8SAndroid Build Coastguard Worker
2625*2d1272b8SAndroid Build Coastguard Worker if (unlikely (coords_length && !(normalized && design_coords)))
2626*2d1272b8SAndroid Build Coastguard Worker {
2627*2d1272b8SAndroid Build Coastguard Worker hb_free (normalized);
2628*2d1272b8SAndroid Build Coastguard Worker hb_free (design_coords);
2629*2d1272b8SAndroid Build Coastguard Worker return;
2630*2d1272b8SAndroid Build Coastguard Worker }
2631*2d1272b8SAndroid Build Coastguard Worker
2632*2d1272b8SAndroid Build Coastguard Worker /* Initialize design coords. */
2633*2d1272b8SAndroid Build Coastguard Worker for (unsigned int i = 0; i < coords_length; i++)
2634*2d1272b8SAndroid Build Coastguard Worker design_coords[i] = axes[i].get_default ();
2635*2d1272b8SAndroid Build Coastguard Worker if (font->instance_index != HB_FONT_NO_VAR_NAMED_INSTANCE)
2636*2d1272b8SAndroid Build Coastguard Worker {
2637*2d1272b8SAndroid Build Coastguard Worker unsigned count = coords_length;
2638*2d1272b8SAndroid Build Coastguard Worker /* This may fail if index is out-of-range;
2639*2d1272b8SAndroid Build Coastguard Worker * That's why we initialize design_coords from fvar above
2640*2d1272b8SAndroid Build Coastguard Worker * unconditionally. */
2641*2d1272b8SAndroid Build Coastguard Worker hb_ot_var_named_instance_get_design_coords (font->face, font->instance_index,
2642*2d1272b8SAndroid Build Coastguard Worker &count, design_coords);
2643*2d1272b8SAndroid Build Coastguard Worker }
2644*2d1272b8SAndroid Build Coastguard Worker
2645*2d1272b8SAndroid Build Coastguard Worker for (unsigned int i = 0; i < variations_length; i++)
2646*2d1272b8SAndroid Build Coastguard Worker {
2647*2d1272b8SAndroid Build Coastguard Worker const auto tag = variations[i].tag;
2648*2d1272b8SAndroid Build Coastguard Worker const auto v = variations[i].value;
2649*2d1272b8SAndroid Build Coastguard Worker for (unsigned axis_index = 0; axis_index < coords_length; axis_index++)
2650*2d1272b8SAndroid Build Coastguard Worker if (axes[axis_index].axisTag == tag)
2651*2d1272b8SAndroid Build Coastguard Worker design_coords[axis_index] = v;
2652*2d1272b8SAndroid Build Coastguard Worker }
2653*2d1272b8SAndroid Build Coastguard Worker
2654*2d1272b8SAndroid Build Coastguard Worker hb_ot_var_normalize_coords (font->face, coords_length, design_coords, normalized);
2655*2d1272b8SAndroid Build Coastguard Worker _hb_font_adopt_var_coords (font, normalized, design_coords, coords_length);
2656*2d1272b8SAndroid Build Coastguard Worker }
2657*2d1272b8SAndroid Build Coastguard Worker
2658*2d1272b8SAndroid Build Coastguard Worker /**
2659*2d1272b8SAndroid Build Coastguard Worker * hb_font_set_variation:
2660*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
2661*2d1272b8SAndroid Build Coastguard Worker * @tag: The #hb_tag_t tag of the variation-axis name
2662*2d1272b8SAndroid Build Coastguard Worker * @value: The value of the variation axis
2663*2d1272b8SAndroid Build Coastguard Worker *
2664*2d1272b8SAndroid Build Coastguard Worker * Change the value of one variation axis on the font.
2665*2d1272b8SAndroid Build Coastguard Worker *
2666*2d1272b8SAndroid Build Coastguard Worker * Note: This function is expensive to be called repeatedly.
2667*2d1272b8SAndroid Build Coastguard Worker * If you want to set multiple variation axes at the same time,
2668*2d1272b8SAndroid Build Coastguard Worker * use hb_font_set_variations() instead.
2669*2d1272b8SAndroid Build Coastguard Worker *
2670*2d1272b8SAndroid Build Coastguard Worker * Since: 7.1.0
2671*2d1272b8SAndroid Build Coastguard Worker */
2672*2d1272b8SAndroid Build Coastguard Worker void
hb_font_set_variation(hb_font_t * font,hb_tag_t tag,float value)2673*2d1272b8SAndroid Build Coastguard Worker hb_font_set_variation (hb_font_t *font,
2674*2d1272b8SAndroid Build Coastguard Worker hb_tag_t tag,
2675*2d1272b8SAndroid Build Coastguard Worker float value)
2676*2d1272b8SAndroid Build Coastguard Worker {
2677*2d1272b8SAndroid Build Coastguard Worker if (hb_object_is_immutable (font))
2678*2d1272b8SAndroid Build Coastguard Worker return;
2679*2d1272b8SAndroid Build Coastguard Worker
2680*2d1272b8SAndroid Build Coastguard Worker font->serial_coords = ++font->serial;
2681*2d1272b8SAndroid Build Coastguard Worker
2682*2d1272b8SAndroid Build Coastguard Worker // TODO Share some of this code with set_variations()
2683*2d1272b8SAndroid Build Coastguard Worker
2684*2d1272b8SAndroid Build Coastguard Worker const OT::fvar &fvar = *font->face->table.fvar;
2685*2d1272b8SAndroid Build Coastguard Worker auto axes = fvar.get_axes ();
2686*2d1272b8SAndroid Build Coastguard Worker const unsigned coords_length = axes.length;
2687*2d1272b8SAndroid Build Coastguard Worker
2688*2d1272b8SAndroid Build Coastguard Worker int *normalized = coords_length ? (int *) hb_calloc (coords_length, sizeof (int)) : nullptr;
2689*2d1272b8SAndroid Build Coastguard Worker float *design_coords = coords_length ? (float *) hb_calloc (coords_length, sizeof (float)) : nullptr;
2690*2d1272b8SAndroid Build Coastguard Worker
2691*2d1272b8SAndroid Build Coastguard Worker if (unlikely (coords_length && !(normalized && design_coords)))
2692*2d1272b8SAndroid Build Coastguard Worker {
2693*2d1272b8SAndroid Build Coastguard Worker hb_free (normalized);
2694*2d1272b8SAndroid Build Coastguard Worker hb_free (design_coords);
2695*2d1272b8SAndroid Build Coastguard Worker return;
2696*2d1272b8SAndroid Build Coastguard Worker }
2697*2d1272b8SAndroid Build Coastguard Worker
2698*2d1272b8SAndroid Build Coastguard Worker /* Initialize design coords. */
2699*2d1272b8SAndroid Build Coastguard Worker if (font->design_coords)
2700*2d1272b8SAndroid Build Coastguard Worker {
2701*2d1272b8SAndroid Build Coastguard Worker assert (coords_length == font->num_coords);
2702*2d1272b8SAndroid Build Coastguard Worker for (unsigned int i = 0; i < coords_length; i++)
2703*2d1272b8SAndroid Build Coastguard Worker design_coords[i] = font->design_coords[i];
2704*2d1272b8SAndroid Build Coastguard Worker }
2705*2d1272b8SAndroid Build Coastguard Worker else
2706*2d1272b8SAndroid Build Coastguard Worker {
2707*2d1272b8SAndroid Build Coastguard Worker for (unsigned int i = 0; i < coords_length; i++)
2708*2d1272b8SAndroid Build Coastguard Worker design_coords[i] = axes[i].get_default ();
2709*2d1272b8SAndroid Build Coastguard Worker if (font->instance_index != HB_FONT_NO_VAR_NAMED_INSTANCE)
2710*2d1272b8SAndroid Build Coastguard Worker {
2711*2d1272b8SAndroid Build Coastguard Worker unsigned count = coords_length;
2712*2d1272b8SAndroid Build Coastguard Worker /* This may fail if index is out-of-range;
2713*2d1272b8SAndroid Build Coastguard Worker * That's why we initialize design_coords from fvar above
2714*2d1272b8SAndroid Build Coastguard Worker * unconditionally. */
2715*2d1272b8SAndroid Build Coastguard Worker hb_ot_var_named_instance_get_design_coords (font->face, font->instance_index,
2716*2d1272b8SAndroid Build Coastguard Worker &count, design_coords);
2717*2d1272b8SAndroid Build Coastguard Worker }
2718*2d1272b8SAndroid Build Coastguard Worker }
2719*2d1272b8SAndroid Build Coastguard Worker
2720*2d1272b8SAndroid Build Coastguard Worker for (unsigned axis_index = 0; axis_index < coords_length; axis_index++)
2721*2d1272b8SAndroid Build Coastguard Worker if (axes[axis_index].axisTag == tag)
2722*2d1272b8SAndroid Build Coastguard Worker design_coords[axis_index] = value;
2723*2d1272b8SAndroid Build Coastguard Worker
2724*2d1272b8SAndroid Build Coastguard Worker hb_ot_var_normalize_coords (font->face, coords_length, design_coords, normalized);
2725*2d1272b8SAndroid Build Coastguard Worker _hb_font_adopt_var_coords (font, normalized, design_coords, coords_length);
2726*2d1272b8SAndroid Build Coastguard Worker
2727*2d1272b8SAndroid Build Coastguard Worker }
2728*2d1272b8SAndroid Build Coastguard Worker
2729*2d1272b8SAndroid Build Coastguard Worker /**
2730*2d1272b8SAndroid Build Coastguard Worker * hb_font_set_var_coords_design:
2731*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
2732*2d1272b8SAndroid Build Coastguard Worker * @coords: (array length=coords_length): Array of variation coordinates to apply
2733*2d1272b8SAndroid Build Coastguard Worker * @coords_length: Number of coordinates to apply
2734*2d1272b8SAndroid Build Coastguard Worker *
2735*2d1272b8SAndroid Build Coastguard Worker * Applies a list of variation coordinates (in design-space units)
2736*2d1272b8SAndroid Build Coastguard Worker * to a font.
2737*2d1272b8SAndroid Build Coastguard Worker *
2738*2d1272b8SAndroid Build Coastguard Worker * Note that this overrides all existing variations set on @font.
2739*2d1272b8SAndroid Build Coastguard Worker * Axes not included in @coords will be effectively set to their
2740*2d1272b8SAndroid Build Coastguard Worker * default values.
2741*2d1272b8SAndroid Build Coastguard Worker *
2742*2d1272b8SAndroid Build Coastguard Worker * Since: 1.4.2
2743*2d1272b8SAndroid Build Coastguard Worker */
2744*2d1272b8SAndroid Build Coastguard Worker void
hb_font_set_var_coords_design(hb_font_t * font,const float * coords,unsigned int coords_length)2745*2d1272b8SAndroid Build Coastguard Worker hb_font_set_var_coords_design (hb_font_t *font,
2746*2d1272b8SAndroid Build Coastguard Worker const float *coords,
2747*2d1272b8SAndroid Build Coastguard Worker unsigned int coords_length)
2748*2d1272b8SAndroid Build Coastguard Worker {
2749*2d1272b8SAndroid Build Coastguard Worker if (hb_object_is_immutable (font))
2750*2d1272b8SAndroid Build Coastguard Worker return;
2751*2d1272b8SAndroid Build Coastguard Worker
2752*2d1272b8SAndroid Build Coastguard Worker font->serial_coords = ++font->serial;
2753*2d1272b8SAndroid Build Coastguard Worker
2754*2d1272b8SAndroid Build Coastguard Worker int *normalized = coords_length ? (int *) hb_calloc (coords_length, sizeof (int)) : nullptr;
2755*2d1272b8SAndroid Build Coastguard Worker float *design_coords = coords_length ? (float *) hb_calloc (coords_length, sizeof (float)) : nullptr;
2756*2d1272b8SAndroid Build Coastguard Worker
2757*2d1272b8SAndroid Build Coastguard Worker if (unlikely (coords_length && !(normalized && design_coords)))
2758*2d1272b8SAndroid Build Coastguard Worker {
2759*2d1272b8SAndroid Build Coastguard Worker hb_free (normalized);
2760*2d1272b8SAndroid Build Coastguard Worker hb_free (design_coords);
2761*2d1272b8SAndroid Build Coastguard Worker return;
2762*2d1272b8SAndroid Build Coastguard Worker }
2763*2d1272b8SAndroid Build Coastguard Worker
2764*2d1272b8SAndroid Build Coastguard Worker if (coords_length)
2765*2d1272b8SAndroid Build Coastguard Worker hb_memcpy (design_coords, coords, coords_length * sizeof (font->design_coords[0]));
2766*2d1272b8SAndroid Build Coastguard Worker
2767*2d1272b8SAndroid Build Coastguard Worker hb_ot_var_normalize_coords (font->face, coords_length, coords, normalized);
2768*2d1272b8SAndroid Build Coastguard Worker _hb_font_adopt_var_coords (font, normalized, design_coords, coords_length);
2769*2d1272b8SAndroid Build Coastguard Worker }
2770*2d1272b8SAndroid Build Coastguard Worker
2771*2d1272b8SAndroid Build Coastguard Worker /**
2772*2d1272b8SAndroid Build Coastguard Worker * hb_font_set_var_named_instance:
2773*2d1272b8SAndroid Build Coastguard Worker * @font: a font.
2774*2d1272b8SAndroid Build Coastguard Worker * @instance_index: named instance index.
2775*2d1272b8SAndroid Build Coastguard Worker *
2776*2d1272b8SAndroid Build Coastguard Worker * Sets design coords of a font from a named-instance index.
2777*2d1272b8SAndroid Build Coastguard Worker *
2778*2d1272b8SAndroid Build Coastguard Worker * Since: 2.6.0
2779*2d1272b8SAndroid Build Coastguard Worker */
2780*2d1272b8SAndroid Build Coastguard Worker void
hb_font_set_var_named_instance(hb_font_t * font,unsigned int instance_index)2781*2d1272b8SAndroid Build Coastguard Worker hb_font_set_var_named_instance (hb_font_t *font,
2782*2d1272b8SAndroid Build Coastguard Worker unsigned int instance_index)
2783*2d1272b8SAndroid Build Coastguard Worker {
2784*2d1272b8SAndroid Build Coastguard Worker if (hb_object_is_immutable (font))
2785*2d1272b8SAndroid Build Coastguard Worker return;
2786*2d1272b8SAndroid Build Coastguard Worker
2787*2d1272b8SAndroid Build Coastguard Worker if (font->instance_index == instance_index)
2788*2d1272b8SAndroid Build Coastguard Worker return;
2789*2d1272b8SAndroid Build Coastguard Worker
2790*2d1272b8SAndroid Build Coastguard Worker font->serial_coords = ++font->serial;
2791*2d1272b8SAndroid Build Coastguard Worker
2792*2d1272b8SAndroid Build Coastguard Worker font->instance_index = instance_index;
2793*2d1272b8SAndroid Build Coastguard Worker hb_font_set_variations (font, nullptr, 0);
2794*2d1272b8SAndroid Build Coastguard Worker }
2795*2d1272b8SAndroid Build Coastguard Worker
2796*2d1272b8SAndroid Build Coastguard Worker /**
2797*2d1272b8SAndroid Build Coastguard Worker * hb_font_get_var_named_instance:
2798*2d1272b8SAndroid Build Coastguard Worker * @font: a font.
2799*2d1272b8SAndroid Build Coastguard Worker *
2800*2d1272b8SAndroid Build Coastguard Worker * Returns the currently-set named-instance index of the font.
2801*2d1272b8SAndroid Build Coastguard Worker *
2802*2d1272b8SAndroid Build Coastguard Worker * Return value: Named-instance index or %HB_FONT_NO_VAR_NAMED_INSTANCE.
2803*2d1272b8SAndroid Build Coastguard Worker *
2804*2d1272b8SAndroid Build Coastguard Worker * Since: 7.0.0
2805*2d1272b8SAndroid Build Coastguard Worker **/
2806*2d1272b8SAndroid Build Coastguard Worker unsigned int
hb_font_get_var_named_instance(hb_font_t * font)2807*2d1272b8SAndroid Build Coastguard Worker hb_font_get_var_named_instance (hb_font_t *font)
2808*2d1272b8SAndroid Build Coastguard Worker {
2809*2d1272b8SAndroid Build Coastguard Worker return font->instance_index;
2810*2d1272b8SAndroid Build Coastguard Worker }
2811*2d1272b8SAndroid Build Coastguard Worker
2812*2d1272b8SAndroid Build Coastguard Worker /**
2813*2d1272b8SAndroid Build Coastguard Worker * hb_font_set_var_coords_normalized:
2814*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
2815*2d1272b8SAndroid Build Coastguard Worker * @coords: (array length=coords_length): Array of variation coordinates to apply
2816*2d1272b8SAndroid Build Coastguard Worker * @coords_length: Number of coordinates to apply
2817*2d1272b8SAndroid Build Coastguard Worker *
2818*2d1272b8SAndroid Build Coastguard Worker * Applies a list of variation coordinates (in normalized units)
2819*2d1272b8SAndroid Build Coastguard Worker * to a font.
2820*2d1272b8SAndroid Build Coastguard Worker *
2821*2d1272b8SAndroid Build Coastguard Worker * Note that this overrides all existing variations set on @font.
2822*2d1272b8SAndroid Build Coastguard Worker * Axes not included in @coords will be effectively set to their
2823*2d1272b8SAndroid Build Coastguard Worker * default values.
2824*2d1272b8SAndroid Build Coastguard Worker *
2825*2d1272b8SAndroid Build Coastguard Worker * <note>Note: Coordinates should be normalized to 2.14.</note>
2826*2d1272b8SAndroid Build Coastguard Worker *
2827*2d1272b8SAndroid Build Coastguard Worker * Since: 1.4.2
2828*2d1272b8SAndroid Build Coastguard Worker */
2829*2d1272b8SAndroid Build Coastguard Worker void
hb_font_set_var_coords_normalized(hb_font_t * font,const int * coords,unsigned int coords_length)2830*2d1272b8SAndroid Build Coastguard Worker hb_font_set_var_coords_normalized (hb_font_t *font,
2831*2d1272b8SAndroid Build Coastguard Worker const int *coords, /* 2.14 normalized */
2832*2d1272b8SAndroid Build Coastguard Worker unsigned int coords_length)
2833*2d1272b8SAndroid Build Coastguard Worker {
2834*2d1272b8SAndroid Build Coastguard Worker if (hb_object_is_immutable (font))
2835*2d1272b8SAndroid Build Coastguard Worker return;
2836*2d1272b8SAndroid Build Coastguard Worker
2837*2d1272b8SAndroid Build Coastguard Worker font->serial_coords = ++font->serial;
2838*2d1272b8SAndroid Build Coastguard Worker
2839*2d1272b8SAndroid Build Coastguard Worker int *copy = coords_length ? (int *) hb_calloc (coords_length, sizeof (coords[0])) : nullptr;
2840*2d1272b8SAndroid Build Coastguard Worker int *unmapped = coords_length ? (int *) hb_calloc (coords_length, sizeof (coords[0])) : nullptr;
2841*2d1272b8SAndroid Build Coastguard Worker float *design_coords = coords_length ? (float *) hb_calloc (coords_length, sizeof (design_coords[0])) : nullptr;
2842*2d1272b8SAndroid Build Coastguard Worker
2843*2d1272b8SAndroid Build Coastguard Worker if (unlikely (coords_length && !(copy && unmapped && design_coords)))
2844*2d1272b8SAndroid Build Coastguard Worker {
2845*2d1272b8SAndroid Build Coastguard Worker hb_free (copy);
2846*2d1272b8SAndroid Build Coastguard Worker hb_free (unmapped);
2847*2d1272b8SAndroid Build Coastguard Worker hb_free (design_coords);
2848*2d1272b8SAndroid Build Coastguard Worker return;
2849*2d1272b8SAndroid Build Coastguard Worker }
2850*2d1272b8SAndroid Build Coastguard Worker
2851*2d1272b8SAndroid Build Coastguard Worker if (coords_length)
2852*2d1272b8SAndroid Build Coastguard Worker {
2853*2d1272b8SAndroid Build Coastguard Worker hb_memcpy (copy, coords, coords_length * sizeof (coords[0]));
2854*2d1272b8SAndroid Build Coastguard Worker hb_memcpy (unmapped, coords, coords_length * sizeof (coords[0]));
2855*2d1272b8SAndroid Build Coastguard Worker }
2856*2d1272b8SAndroid Build Coastguard Worker
2857*2d1272b8SAndroid Build Coastguard Worker /* Best effort design coords simulation */
2858*2d1272b8SAndroid Build Coastguard Worker font->face->table.avar->unmap_coords (unmapped, coords_length);
2859*2d1272b8SAndroid Build Coastguard Worker for (unsigned int i = 0; i < coords_length; ++i)
2860*2d1272b8SAndroid Build Coastguard Worker design_coords[i] = font->face->table.fvar->unnormalize_axis_value (i, unmapped[i]);
2861*2d1272b8SAndroid Build Coastguard Worker hb_free (unmapped);
2862*2d1272b8SAndroid Build Coastguard Worker
2863*2d1272b8SAndroid Build Coastguard Worker _hb_font_adopt_var_coords (font, copy, design_coords, coords_length);
2864*2d1272b8SAndroid Build Coastguard Worker }
2865*2d1272b8SAndroid Build Coastguard Worker
2866*2d1272b8SAndroid Build Coastguard Worker /**
2867*2d1272b8SAndroid Build Coastguard Worker * hb_font_get_var_coords_normalized:
2868*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
2869*2d1272b8SAndroid Build Coastguard Worker * @length: (out): Number of coordinates retrieved
2870*2d1272b8SAndroid Build Coastguard Worker *
2871*2d1272b8SAndroid Build Coastguard Worker * Fetches the list of normalized variation coordinates currently
2872*2d1272b8SAndroid Build Coastguard Worker * set on a font.
2873*2d1272b8SAndroid Build Coastguard Worker *
2874*2d1272b8SAndroid Build Coastguard Worker * Note that this returned array may only contain values for some
2875*2d1272b8SAndroid Build Coastguard Worker * (or none) of the axes; omitted axes effectively have zero values.
2876*2d1272b8SAndroid Build Coastguard Worker *
2877*2d1272b8SAndroid Build Coastguard Worker * Return value is valid as long as variation coordinates of the font
2878*2d1272b8SAndroid Build Coastguard Worker * are not modified.
2879*2d1272b8SAndroid Build Coastguard Worker *
2880*2d1272b8SAndroid Build Coastguard Worker * Return value: coordinates array
2881*2d1272b8SAndroid Build Coastguard Worker *
2882*2d1272b8SAndroid Build Coastguard Worker * Since: 1.4.2
2883*2d1272b8SAndroid Build Coastguard Worker */
2884*2d1272b8SAndroid Build Coastguard Worker const int *
hb_font_get_var_coords_normalized(hb_font_t * font,unsigned int * length)2885*2d1272b8SAndroid Build Coastguard Worker hb_font_get_var_coords_normalized (hb_font_t *font,
2886*2d1272b8SAndroid Build Coastguard Worker unsigned int *length)
2887*2d1272b8SAndroid Build Coastguard Worker {
2888*2d1272b8SAndroid Build Coastguard Worker if (length)
2889*2d1272b8SAndroid Build Coastguard Worker *length = font->num_coords;
2890*2d1272b8SAndroid Build Coastguard Worker
2891*2d1272b8SAndroid Build Coastguard Worker return font->coords;
2892*2d1272b8SAndroid Build Coastguard Worker }
2893*2d1272b8SAndroid Build Coastguard Worker
2894*2d1272b8SAndroid Build Coastguard Worker /**
2895*2d1272b8SAndroid Build Coastguard Worker * hb_font_get_var_coords_design:
2896*2d1272b8SAndroid Build Coastguard Worker * @font: #hb_font_t to work upon
2897*2d1272b8SAndroid Build Coastguard Worker * @length: (out): Number of coordinates retrieved
2898*2d1272b8SAndroid Build Coastguard Worker *
2899*2d1272b8SAndroid Build Coastguard Worker * Fetches the list of variation coordinates (in design-space units) currently
2900*2d1272b8SAndroid Build Coastguard Worker * set on a font.
2901*2d1272b8SAndroid Build Coastguard Worker *
2902*2d1272b8SAndroid Build Coastguard Worker * Note that this returned array may only contain values for some
2903*2d1272b8SAndroid Build Coastguard Worker * (or none) of the axes; omitted axes effectively have their default
2904*2d1272b8SAndroid Build Coastguard Worker * values.
2905*2d1272b8SAndroid Build Coastguard Worker *
2906*2d1272b8SAndroid Build Coastguard Worker * Return value is valid as long as variation coordinates of the font
2907*2d1272b8SAndroid Build Coastguard Worker * are not modified.
2908*2d1272b8SAndroid Build Coastguard Worker *
2909*2d1272b8SAndroid Build Coastguard Worker * Return value: coordinates array
2910*2d1272b8SAndroid Build Coastguard Worker *
2911*2d1272b8SAndroid Build Coastguard Worker * Since: 3.3.0
2912*2d1272b8SAndroid Build Coastguard Worker */
2913*2d1272b8SAndroid Build Coastguard Worker const float *
hb_font_get_var_coords_design(hb_font_t * font,unsigned int * length)2914*2d1272b8SAndroid Build Coastguard Worker hb_font_get_var_coords_design (hb_font_t *font,
2915*2d1272b8SAndroid Build Coastguard Worker unsigned int *length)
2916*2d1272b8SAndroid Build Coastguard Worker {
2917*2d1272b8SAndroid Build Coastguard Worker if (length)
2918*2d1272b8SAndroid Build Coastguard Worker *length = font->num_coords;
2919*2d1272b8SAndroid Build Coastguard Worker
2920*2d1272b8SAndroid Build Coastguard Worker return font->design_coords;
2921*2d1272b8SAndroid Build Coastguard Worker }
2922*2d1272b8SAndroid Build Coastguard Worker #endif
2923*2d1272b8SAndroid Build Coastguard Worker
2924*2d1272b8SAndroid Build Coastguard Worker #ifndef HB_DISABLE_DEPRECATED
2925*2d1272b8SAndroid Build Coastguard Worker /*
2926*2d1272b8SAndroid Build Coastguard Worker * Deprecated get_glyph_func():
2927*2d1272b8SAndroid Build Coastguard Worker */
2928*2d1272b8SAndroid Build Coastguard Worker
2929*2d1272b8SAndroid Build Coastguard Worker struct hb_trampoline_closure_t
2930*2d1272b8SAndroid Build Coastguard Worker {
2931*2d1272b8SAndroid Build Coastguard Worker void *user_data;
2932*2d1272b8SAndroid Build Coastguard Worker hb_destroy_func_t destroy;
2933*2d1272b8SAndroid Build Coastguard Worker unsigned int ref_count;
2934*2d1272b8SAndroid Build Coastguard Worker };
2935*2d1272b8SAndroid Build Coastguard Worker
2936*2d1272b8SAndroid Build Coastguard Worker template <typename FuncType>
2937*2d1272b8SAndroid Build Coastguard Worker struct hb_trampoline_t
2938*2d1272b8SAndroid Build Coastguard Worker {
2939*2d1272b8SAndroid Build Coastguard Worker hb_trampoline_closure_t closure; /* Must be first. */
2940*2d1272b8SAndroid Build Coastguard Worker FuncType func;
2941*2d1272b8SAndroid Build Coastguard Worker };
2942*2d1272b8SAndroid Build Coastguard Worker
2943*2d1272b8SAndroid Build Coastguard Worker template <typename FuncType>
2944*2d1272b8SAndroid Build Coastguard Worker static hb_trampoline_t<FuncType> *
trampoline_create(FuncType func,void * user_data,hb_destroy_func_t destroy)2945*2d1272b8SAndroid Build Coastguard Worker trampoline_create (FuncType func,
2946*2d1272b8SAndroid Build Coastguard Worker void *user_data,
2947*2d1272b8SAndroid Build Coastguard Worker hb_destroy_func_t destroy)
2948*2d1272b8SAndroid Build Coastguard Worker {
2949*2d1272b8SAndroid Build Coastguard Worker typedef hb_trampoline_t<FuncType> trampoline_t;
2950*2d1272b8SAndroid Build Coastguard Worker
2951*2d1272b8SAndroid Build Coastguard Worker trampoline_t *trampoline = (trampoline_t *) hb_calloc (1, sizeof (trampoline_t));
2952*2d1272b8SAndroid Build Coastguard Worker
2953*2d1272b8SAndroid Build Coastguard Worker if (unlikely (!trampoline))
2954*2d1272b8SAndroid Build Coastguard Worker return nullptr;
2955*2d1272b8SAndroid Build Coastguard Worker
2956*2d1272b8SAndroid Build Coastguard Worker trampoline->closure.user_data = user_data;
2957*2d1272b8SAndroid Build Coastguard Worker trampoline->closure.destroy = destroy;
2958*2d1272b8SAndroid Build Coastguard Worker trampoline->closure.ref_count = 1;
2959*2d1272b8SAndroid Build Coastguard Worker trampoline->func = func;
2960*2d1272b8SAndroid Build Coastguard Worker
2961*2d1272b8SAndroid Build Coastguard Worker return trampoline;
2962*2d1272b8SAndroid Build Coastguard Worker }
2963*2d1272b8SAndroid Build Coastguard Worker
2964*2d1272b8SAndroid Build Coastguard Worker static void
trampoline_reference(hb_trampoline_closure_t * closure)2965*2d1272b8SAndroid Build Coastguard Worker trampoline_reference (hb_trampoline_closure_t *closure)
2966*2d1272b8SAndroid Build Coastguard Worker {
2967*2d1272b8SAndroid Build Coastguard Worker closure->ref_count++;
2968*2d1272b8SAndroid Build Coastguard Worker }
2969*2d1272b8SAndroid Build Coastguard Worker
2970*2d1272b8SAndroid Build Coastguard Worker static void
trampoline_destroy(void * user_data)2971*2d1272b8SAndroid Build Coastguard Worker trampoline_destroy (void *user_data)
2972*2d1272b8SAndroid Build Coastguard Worker {
2973*2d1272b8SAndroid Build Coastguard Worker hb_trampoline_closure_t *closure = (hb_trampoline_closure_t *) user_data;
2974*2d1272b8SAndroid Build Coastguard Worker
2975*2d1272b8SAndroid Build Coastguard Worker if (--closure->ref_count)
2976*2d1272b8SAndroid Build Coastguard Worker return;
2977*2d1272b8SAndroid Build Coastguard Worker
2978*2d1272b8SAndroid Build Coastguard Worker if (closure->destroy)
2979*2d1272b8SAndroid Build Coastguard Worker closure->destroy (closure->user_data);
2980*2d1272b8SAndroid Build Coastguard Worker hb_free (closure);
2981*2d1272b8SAndroid Build Coastguard Worker }
2982*2d1272b8SAndroid Build Coastguard Worker
2983*2d1272b8SAndroid Build Coastguard Worker typedef hb_trampoline_t<hb_font_get_glyph_func_t> hb_font_get_glyph_trampoline_t;
2984*2d1272b8SAndroid Build Coastguard Worker
2985*2d1272b8SAndroid Build Coastguard Worker static hb_bool_t
hb_font_get_nominal_glyph_trampoline(hb_font_t * font,void * font_data,hb_codepoint_t unicode,hb_codepoint_t * glyph,void * user_data)2986*2d1272b8SAndroid Build Coastguard Worker hb_font_get_nominal_glyph_trampoline (hb_font_t *font,
2987*2d1272b8SAndroid Build Coastguard Worker void *font_data,
2988*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t unicode,
2989*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t *glyph,
2990*2d1272b8SAndroid Build Coastguard Worker void *user_data)
2991*2d1272b8SAndroid Build Coastguard Worker {
2992*2d1272b8SAndroid Build Coastguard Worker hb_font_get_glyph_trampoline_t *trampoline = (hb_font_get_glyph_trampoline_t *) user_data;
2993*2d1272b8SAndroid Build Coastguard Worker return trampoline->func (font, font_data, unicode, 0, glyph, trampoline->closure.user_data);
2994*2d1272b8SAndroid Build Coastguard Worker }
2995*2d1272b8SAndroid Build Coastguard Worker
2996*2d1272b8SAndroid Build Coastguard Worker static hb_bool_t
hb_font_get_variation_glyph_trampoline(hb_font_t * font,void * font_data,hb_codepoint_t unicode,hb_codepoint_t variation_selector,hb_codepoint_t * glyph,void * user_data)2997*2d1272b8SAndroid Build Coastguard Worker hb_font_get_variation_glyph_trampoline (hb_font_t *font,
2998*2d1272b8SAndroid Build Coastguard Worker void *font_data,
2999*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t unicode,
3000*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t variation_selector,
3001*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t *glyph,
3002*2d1272b8SAndroid Build Coastguard Worker void *user_data)
3003*2d1272b8SAndroid Build Coastguard Worker {
3004*2d1272b8SAndroid Build Coastguard Worker hb_font_get_glyph_trampoline_t *trampoline = (hb_font_get_glyph_trampoline_t *) user_data;
3005*2d1272b8SAndroid Build Coastguard Worker return trampoline->func (font, font_data, unicode, variation_selector, glyph, trampoline->closure.user_data);
3006*2d1272b8SAndroid Build Coastguard Worker }
3007*2d1272b8SAndroid Build Coastguard Worker
3008*2d1272b8SAndroid Build Coastguard Worker /**
3009*2d1272b8SAndroid Build Coastguard Worker * hb_font_funcs_set_glyph_func:
3010*2d1272b8SAndroid Build Coastguard Worker * @ffuncs: The font-functions structure
3011*2d1272b8SAndroid Build Coastguard Worker * @func: (closure user_data) (destroy destroy) (scope notified): callback function
3012*2d1272b8SAndroid Build Coastguard Worker * @user_data: data to pass to @func
3013*2d1272b8SAndroid Build Coastguard Worker * @destroy: (nullable): function to call when @user_data is not needed anymore
3014*2d1272b8SAndroid Build Coastguard Worker *
3015*2d1272b8SAndroid Build Coastguard Worker * Deprecated. Use hb_font_funcs_set_nominal_glyph_func() and
3016*2d1272b8SAndroid Build Coastguard Worker * hb_font_funcs_set_variation_glyph_func() instead.
3017*2d1272b8SAndroid Build Coastguard Worker *
3018*2d1272b8SAndroid Build Coastguard Worker * Since: 0.9.2
3019*2d1272b8SAndroid Build Coastguard Worker * Deprecated: 1.2.3
3020*2d1272b8SAndroid Build Coastguard Worker **/
3021*2d1272b8SAndroid Build Coastguard Worker void
hb_font_funcs_set_glyph_func(hb_font_funcs_t * ffuncs,hb_font_get_glyph_func_t func,void * user_data,hb_destroy_func_t destroy)3022*2d1272b8SAndroid Build Coastguard Worker hb_font_funcs_set_glyph_func (hb_font_funcs_t *ffuncs,
3023*2d1272b8SAndroid Build Coastguard Worker hb_font_get_glyph_func_t func,
3024*2d1272b8SAndroid Build Coastguard Worker void *user_data,
3025*2d1272b8SAndroid Build Coastguard Worker hb_destroy_func_t destroy /* May be NULL. */)
3026*2d1272b8SAndroid Build Coastguard Worker {
3027*2d1272b8SAndroid Build Coastguard Worker if (hb_object_is_immutable (ffuncs))
3028*2d1272b8SAndroid Build Coastguard Worker {
3029*2d1272b8SAndroid Build Coastguard Worker if (destroy)
3030*2d1272b8SAndroid Build Coastguard Worker destroy (user_data);
3031*2d1272b8SAndroid Build Coastguard Worker return;
3032*2d1272b8SAndroid Build Coastguard Worker }
3033*2d1272b8SAndroid Build Coastguard Worker
3034*2d1272b8SAndroid Build Coastguard Worker hb_font_get_glyph_trampoline_t *trampoline;
3035*2d1272b8SAndroid Build Coastguard Worker
3036*2d1272b8SAndroid Build Coastguard Worker trampoline = trampoline_create (func, user_data, destroy);
3037*2d1272b8SAndroid Build Coastguard Worker if (unlikely (!trampoline))
3038*2d1272b8SAndroid Build Coastguard Worker {
3039*2d1272b8SAndroid Build Coastguard Worker if (destroy)
3040*2d1272b8SAndroid Build Coastguard Worker destroy (user_data);
3041*2d1272b8SAndroid Build Coastguard Worker return;
3042*2d1272b8SAndroid Build Coastguard Worker }
3043*2d1272b8SAndroid Build Coastguard Worker
3044*2d1272b8SAndroid Build Coastguard Worker /* Since we pass it to two destroying functions. */
3045*2d1272b8SAndroid Build Coastguard Worker trampoline_reference (&trampoline->closure);
3046*2d1272b8SAndroid Build Coastguard Worker
3047*2d1272b8SAndroid Build Coastguard Worker hb_font_funcs_set_nominal_glyph_func (ffuncs,
3048*2d1272b8SAndroid Build Coastguard Worker hb_font_get_nominal_glyph_trampoline,
3049*2d1272b8SAndroid Build Coastguard Worker trampoline,
3050*2d1272b8SAndroid Build Coastguard Worker trampoline_destroy);
3051*2d1272b8SAndroid Build Coastguard Worker
3052*2d1272b8SAndroid Build Coastguard Worker hb_font_funcs_set_variation_glyph_func (ffuncs,
3053*2d1272b8SAndroid Build Coastguard Worker hb_font_get_variation_glyph_trampoline,
3054*2d1272b8SAndroid Build Coastguard Worker trampoline,
3055*2d1272b8SAndroid Build Coastguard Worker trampoline_destroy);
3056*2d1272b8SAndroid Build Coastguard Worker }
3057*2d1272b8SAndroid Build Coastguard Worker #endif
3058*2d1272b8SAndroid Build Coastguard Worker
3059*2d1272b8SAndroid Build Coastguard Worker
3060*2d1272b8SAndroid Build Coastguard Worker #ifndef HB_DISABLE_DEPRECATED
3061*2d1272b8SAndroid Build Coastguard Worker void
hb_font_funcs_set_glyph_shape_func(hb_font_funcs_t * ffuncs,hb_font_get_glyph_shape_func_t func,void * user_data,hb_destroy_func_t destroy)3062*2d1272b8SAndroid Build Coastguard Worker hb_font_funcs_set_glyph_shape_func (hb_font_funcs_t *ffuncs,
3063*2d1272b8SAndroid Build Coastguard Worker hb_font_get_glyph_shape_func_t func,
3064*2d1272b8SAndroid Build Coastguard Worker void *user_data,
3065*2d1272b8SAndroid Build Coastguard Worker hb_destroy_func_t destroy /* May be NULL. */)
3066*2d1272b8SAndroid Build Coastguard Worker {
3067*2d1272b8SAndroid Build Coastguard Worker hb_font_funcs_set_draw_glyph_func (ffuncs, func, user_data, destroy);
3068*2d1272b8SAndroid Build Coastguard Worker }
3069*2d1272b8SAndroid Build Coastguard Worker #endif
3070