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