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