15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright © 2009 Red Hat, Inc. 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright © 2011 Google, Inc. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This is part of HarfBuzz, a text shaping library. 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Permission is hereby granted, without written agreement and without 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * license or royalty fees, to use, copy, modify, and distribute this 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * software and its documentation for any purpose, provided that the 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * above copyright notice and the following two paragraphs appear in 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * all copies of this software. 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * DAMAGE. 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Red Hat Author(s): Behdad Esfahbod 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Google Author(s): Behdad Esfahbod 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef HB_FONT_PRIVATE_HH 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define HB_FONT_PRIVATE_HH 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "hb-private.hh" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "hb-font.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "hb-object-private.hh" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "hb-shaper-private.hh" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "hb-shape-plan-private.hh" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * hb_font_funcs_t 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define HB_FONT_FUNCS_IMPLEMENT_CALLBACKS \ 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HB_FONT_FUNC_IMPLEMENT (glyph) \ 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HB_FONT_FUNC_IMPLEMENT (glyph_h_advance) \ 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HB_FONT_FUNC_IMPLEMENT (glyph_v_advance) \ 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HB_FONT_FUNC_IMPLEMENT (glyph_h_origin) \ 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HB_FONT_FUNC_IMPLEMENT (glyph_v_origin) \ 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HB_FONT_FUNC_IMPLEMENT (glyph_h_kerning) \ 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HB_FONT_FUNC_IMPLEMENT (glyph_v_kerning) \ 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HB_FONT_FUNC_IMPLEMENT (glyph_extents) \ 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HB_FONT_FUNC_IMPLEMENT (glyph_contour_point) \ 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HB_FONT_FUNC_IMPLEMENT (glyph_name) \ 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HB_FONT_FUNC_IMPLEMENT (glyph_from_name) \ 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* ^--- Add new callbacks here */ 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct hb_font_funcs_t { 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_object_header_t header; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_POD (); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_bool_t immutable; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Don't access these directly. Call hb_font_get_*() instead. */ 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct { 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define HB_FONT_FUNC_IMPLEMENT(name) hb_font_get_##name##_func_t name; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HB_FONT_FUNCS_IMPLEMENT_CALLBACKS 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef HB_FONT_FUNC_IMPLEMENT 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } get; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct { 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define HB_FONT_FUNC_IMPLEMENT(name) void *name; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HB_FONT_FUNCS_IMPLEMENT_CALLBACKS 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef HB_FONT_FUNC_IMPLEMENT 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } user_data; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct { 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define HB_FONT_FUNC_IMPLEMENT(name) hb_destroy_func_t name; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HB_FONT_FUNCS_IMPLEMENT_CALLBACKS 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef HB_FONT_FUNC_IMPLEMENT 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } destroy; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * hb_face_t 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct hb_face_t { 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_object_header_t header; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_POD (); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_bool_t immutable; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_reference_table_func_t reference_table_func; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *user_data; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_destroy_func_t destroy; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int index; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mutable unsigned int upem; 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mutable unsigned int num_glyphs; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct hb_shaper_data_t shaper_data; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct plan_node_t { 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_shape_plan_t *shape_plan; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plan_node_t *next; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } *shape_plans; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline hb_blob_t *reference_table (hb_tag_t tag) const 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_blob_t *blob; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unlikely (!this || !reference_table_func)) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hb_blob_get_empty (); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) blob = reference_table_func (/*XXX*/const_cast<hb_face_t *> (this), tag, user_data); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unlikely (!blob)) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hb_blob_get_empty (); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return blob; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline unsigned int get_upem (void) const 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unlikely (!upem)) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) load_upem (); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return upem; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) inline unsigned int get_num_glyphs (void) const 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (unlikely (num_glyphs == (unsigned int) -1)) 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) load_num_glyphs (); 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return num_glyphs; 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HB_INTERNAL void load_upem (void) const; 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HB_INTERNAL void load_num_glyphs (void) const; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define HB_SHAPER_DATA_CREATE_FUNC_EXTRA_ARGS 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_PROTOTYPE(shaper, face); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "hb-shaper-list.hh" 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef HB_SHAPER_IMPLEMENT 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef HB_SHAPER_DATA_CREATE_FUNC_EXTRA_ARGS 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * hb_font_t 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct hb_font_t { 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_object_header_t header; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_POD (); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_bool_t immutable; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_font_t *parent; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_face_t *face; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int x_scale; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int y_scale; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int x_ppem; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int y_ppem; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_font_funcs_t *klass; 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *user_data; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_destroy_func_t destroy; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct hb_shaper_data_t shaper_data; 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Convert from font-space to user-space */ 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline hb_position_t em_scale_x (int16_t v) { return em_scale (v, this->x_scale); } 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline hb_position_t em_scale_y (int16_t v) { return em_scale (v, this->y_scale); } 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Convert from parent-font user-space to our user-space */ 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline hb_position_t parent_scale_x_distance (hb_position_t v) { 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unlikely (parent && parent->x_scale != x_scale)) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return v * (int64_t) this->x_scale / this->parent->x_scale; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return v; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline hb_position_t parent_scale_y_distance (hb_position_t v) { 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unlikely (parent && parent->y_scale != y_scale)) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return v * (int64_t) this->y_scale / this->parent->y_scale; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return v; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline hb_position_t parent_scale_x_position (hb_position_t v) { 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return parent_scale_x_distance (v); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline hb_position_t parent_scale_y_position (hb_position_t v) { 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return parent_scale_y_distance (v); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline void parent_scale_distance (hb_position_t *x, hb_position_t *y) { 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *x = parent_scale_x_distance (*x); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *y = parent_scale_y_distance (*y); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline void parent_scale_position (hb_position_t *x, hb_position_t *y) { 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *x = parent_scale_x_position (*x); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *y = parent_scale_y_position (*y); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Public getters */ 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline hb_bool_t get_glyph (hb_codepoint_t unicode, hb_codepoint_t variation_selector, 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_codepoint_t *glyph) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *glyph = 0; 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return klass->get.glyph (this, user_data, 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unicode, variation_selector, glyph, 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) klass->user_data.glyph); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline hb_position_t get_glyph_h_advance (hb_codepoint_t glyph) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return klass->get.glyph_h_advance (this, user_data, 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glyph, 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) klass->user_data.glyph_h_advance); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline hb_position_t get_glyph_v_advance (hb_codepoint_t glyph) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return klass->get.glyph_v_advance (this, user_data, 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glyph, 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) klass->user_data.glyph_v_advance); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline hb_bool_t get_glyph_h_origin (hb_codepoint_t glyph, 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_position_t *x, hb_position_t *y) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *x = *y = 0; 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return klass->get.glyph_h_origin (this, user_data, 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glyph, x, y, 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) klass->user_data.glyph_h_origin); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline hb_bool_t get_glyph_v_origin (hb_codepoint_t glyph, 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_position_t *x, hb_position_t *y) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *x = *y = 0; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return klass->get.glyph_v_origin (this, user_data, 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glyph, x, y, 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) klass->user_data.glyph_v_origin); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline hb_position_t get_glyph_h_kerning (hb_codepoint_t left_glyph, hb_codepoint_t right_glyph) 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return klass->get.glyph_h_kerning (this, user_data, 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) left_glyph, right_glyph, 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) klass->user_data.glyph_h_kerning); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline hb_position_t get_glyph_v_kerning (hb_codepoint_t left_glyph, hb_codepoint_t right_glyph) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return klass->get.glyph_v_kerning (this, user_data, 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) left_glyph, right_glyph, 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) klass->user_data.glyph_v_kerning); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline hb_bool_t get_glyph_extents (hb_codepoint_t glyph, 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_glyph_extents_t *extents) 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset (extents, 0, sizeof (*extents)); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return klass->get.glyph_extents (this, user_data, 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glyph, 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extents, 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) klass->user_data.glyph_extents); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline hb_bool_t get_glyph_contour_point (hb_codepoint_t glyph, unsigned int point_index, 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_position_t *x, hb_position_t *y) 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *x = *y = 0; 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return klass->get.glyph_contour_point (this, user_data, 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glyph, point_index, 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) x, y, 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) klass->user_data.glyph_contour_point); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline hb_bool_t get_glyph_name (hb_codepoint_t glyph, 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *name, unsigned int size) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (size) *name = '\0'; 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return klass->get.glyph_name (this, user_data, 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glyph, 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name, size, 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) klass->user_data.glyph_name); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline hb_bool_t get_glyph_from_name (const char *name, int len, /* -1 means nul-terminated */ 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_codepoint_t *glyph) 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *glyph = 0; 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (len == -1) len = strlen (name); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return klass->get.glyph_from_name (this, user_data, 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name, len, 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glyph, 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) klass->user_data.glyph_from_name); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* A bit higher-level, and with fallback */ 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline void get_glyph_advance_for_direction (hb_codepoint_t glyph, 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_direction_t direction, 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_position_t *x, hb_position_t *y) 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (likely (HB_DIRECTION_IS_HORIZONTAL (direction))) { 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *x = get_glyph_h_advance (glyph); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *y = 0; 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *x = 0; 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *y = get_glyph_v_advance (glyph); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Internal only */ 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline void guess_v_origin_minus_h_origin (hb_codepoint_t glyph, 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_position_t *x, hb_position_t *y) 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *x = get_glyph_h_advance (glyph) / 2; 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* TODO use font_metics.ascent */ 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *y = y_scale; 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline void get_glyph_origin_for_direction (hb_codepoint_t glyph, 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_direction_t direction, 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_position_t *x, hb_position_t *y) 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (likely (HB_DIRECTION_IS_HORIZONTAL (direction))) { 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_bool_t ret = get_glyph_h_origin (glyph, x, y); 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ret && (ret = get_glyph_v_origin (glyph, x, y))) { 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_position_t dx, dy; 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guess_v_origin_minus_h_origin (glyph, &dx, &dy); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *x -= dx; *y -= dy; 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_bool_t ret = get_glyph_v_origin (glyph, x, y); 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ret && (ret = get_glyph_h_origin (glyph, x, y))) { 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_position_t dx, dy; 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guess_v_origin_minus_h_origin (glyph, &dx, &dy); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *x += dx; *y += dy; 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline void add_glyph_origin_for_direction (hb_codepoint_t glyph, 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_direction_t direction, 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_position_t *x, hb_position_t *y) 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_position_t origin_x, origin_y; 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) get_glyph_origin_for_direction (glyph, direction, &origin_x, &origin_y); 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *x += origin_x; 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *y += origin_y; 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline void subtract_glyph_origin_for_direction (hb_codepoint_t glyph, 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_direction_t direction, 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_position_t *x, hb_position_t *y) 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_position_t origin_x, origin_y; 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) get_glyph_origin_for_direction (glyph, direction, &origin_x, &origin_y); 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *x -= origin_x; 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *y -= origin_y; 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline void get_glyph_kerning_for_direction (hb_codepoint_t first_glyph, hb_codepoint_t second_glyph, 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_direction_t direction, 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_position_t *x, hb_position_t *y) 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (likely (HB_DIRECTION_IS_HORIZONTAL (direction))) { 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *x = get_glyph_h_kerning (first_glyph, second_glyph); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *y = 0; 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *x = 0; 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *y = get_glyph_v_kerning (first_glyph, second_glyph); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline hb_bool_t get_glyph_extents_for_origin (hb_codepoint_t glyph, 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_direction_t direction, 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_glyph_extents_t *extents) 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_bool_t ret = get_glyph_extents (glyph, extents); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret) 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) subtract_glyph_origin_for_direction (glyph, direction, &extents->x_bearing, &extents->y_bearing); 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ret; 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline hb_bool_t get_glyph_contour_point_for_origin (hb_codepoint_t glyph, unsigned int point_index, 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_direction_t direction, 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_position_t *x, hb_position_t *y) 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_bool_t ret = get_glyph_contour_point (glyph, point_index, x, y); 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret) 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) subtract_glyph_origin_for_direction (glyph, direction, x, y); 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ret; 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Generates gidDDD if glyph has no name. */ 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline void 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glyph_to_string (hb_codepoint_t glyph, 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *s, unsigned int size) 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (get_glyph_name (glyph, s, size)) return; 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) snprintf (s, size, "gid%u", glyph); 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Parses gidDDD and uniUUUU strings automatically. */ 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline hb_bool_t 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) glyph_from_string (const char *s, int len, /* -1 means nul-terminated */ 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_codepoint_t *glyph) 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (get_glyph_from_name (s, len, glyph)) return true; 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (len == -1) len = strlen (s); 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Straight glyph index. */ 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (hb_codepoint_parse (s, len, 10, glyph)) 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (len > 3) 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* gidDDD syntax for glyph indices. */ 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (0 == strncmp (s, "gid", 3) && 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_codepoint_parse (s + 3, len - 3, 10, glyph)) 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* uniUUUU and other Unicode character indices. */ 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_codepoint_t unichar; 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (0 == strncmp (s, "uni", 3) && 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_codepoint_parse (s + 3, len - 3, 16, &unichar) && 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) get_glyph (unichar, 0, glyph)) 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline hb_position_t em_scale (int16_t v, int scale) { return v * (int64_t) scale / hb_face_get_upem (this->face); } 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define HB_SHAPER_DATA_CREATE_FUNC_EXTRA_ARGS 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_PROTOTYPE(shaper, font); 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "hb-shaper-list.hh" 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef HB_SHAPER_IMPLEMENT 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef HB_SHAPER_DATA_CREATE_FUNC_EXTRA_ARGS 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* HB_FONT_PRIVATE_HH */ 470