hb-font-private.hh revision 6f3a300138f659020c21c3e08b7981c78df5f332
1c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod/*
22409d5f8d7dd8b535ce5ea29e933f7db27d33793Behdad Esfahbod * Copyright © 2009  Red Hat, Inc.
32409d5f8d7dd8b535ce5ea29e933f7db27d33793Behdad Esfahbod * Copyright © 2011  Google, Inc.
4c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod *
5c755cb3e3ac55156d0d2ec05adea7a650b97cc41Behdad Esfahbod *  This is part of HarfBuzz, a text shaping library.
6c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod *
7c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod * Permission is hereby granted, without written agreement and without
8c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod * license or royalty fees, to use, copy, modify, and distribute this
9c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod * software and its documentation for any purpose, provided that the
10c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod * above copyright notice and the following two paragraphs appear in
11c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod * all copies of this software.
12c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod *
13c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
14c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
15c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
16c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
17c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod * DAMAGE.
18c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod *
19c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
20c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
21c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
22c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
23c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
24c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod *
25c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod * Red Hat Author(s): Behdad Esfahbod
262409d5f8d7dd8b535ce5ea29e933f7db27d33793Behdad Esfahbod * Google Author(s): Behdad Esfahbod
27c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod */
28c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod
29c57d454accff66e5f2c58006e8fb40bc020b6182Behdad Esfahbod#ifndef HB_FONT_PRIVATE_HH
30c57d454accff66e5f2c58006e8fb40bc020b6182Behdad Esfahbod#define HB_FONT_PRIVATE_HH
31c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod
32c57d454accff66e5f2c58006e8fb40bc020b6182Behdad Esfahbod#include "hb-private.hh"
33c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod
34c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod#include "hb-font.h"
35fca368c4682624346a0aaee690e1ad6ed4c0b337Behdad Esfahbod#include "hb-object-private.hh"
36027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod#include "hb-shaper-private.hh"
372f87cebe1062c7007021ebd05c1664e60da80825Behdad Esfahbod#include "hb-shape-plan-private.hh"
38c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod
39c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod
40acdba3f90b232fc12fcb200dca2584481b339118Behdad Esfahbod
41c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod/*
425c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod * hb_font_funcs_t
43c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod */
44c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod
45744970af4d884cc87ffa645804578fec8df674a9Behdad Esfahbod#define HB_FONT_FUNCS_IMPLEMENT_CALLBACKS \
46744970af4d884cc87ffa645804578fec8df674a9Behdad Esfahbod  HB_FONT_FUNC_IMPLEMENT (glyph) \
47744970af4d884cc87ffa645804578fec8df674a9Behdad Esfahbod  HB_FONT_FUNC_IMPLEMENT (glyph_h_advance) \
48744970af4d884cc87ffa645804578fec8df674a9Behdad Esfahbod  HB_FONT_FUNC_IMPLEMENT (glyph_v_advance) \
497e2c85de305be59e1a6afa7d2061e4b7dd00acf7Behdad Esfahbod  HB_FONT_FUNC_IMPLEMENT (glyph_h_origin) \
50744970af4d884cc87ffa645804578fec8df674a9Behdad Esfahbod  HB_FONT_FUNC_IMPLEMENT (glyph_v_origin) \
517e2c85de305be59e1a6afa7d2061e4b7dd00acf7Behdad Esfahbod  HB_FONT_FUNC_IMPLEMENT (glyph_h_kerning) \
527e2c85de305be59e1a6afa7d2061e4b7dd00acf7Behdad Esfahbod  HB_FONT_FUNC_IMPLEMENT (glyph_v_kerning) \
53744970af4d884cc87ffa645804578fec8df674a9Behdad Esfahbod  HB_FONT_FUNC_IMPLEMENT (glyph_extents) \
544b6317c4f426cfaf21e509dbf6ee6d4e0422cdacBehdad Esfahbod  HB_FONT_FUNC_IMPLEMENT (glyph_contour_point) \
55bce095524b3e69a47f8e88a2fb02d6ab537f9b0aBehdad Esfahbod  HB_FONT_FUNC_IMPLEMENT (glyph_name) \
56bce095524b3e69a47f8e88a2fb02d6ab537f9b0aBehdad Esfahbod  HB_FONT_FUNC_IMPLEMENT (glyph_from_name) \
574b6317c4f426cfaf21e509dbf6ee6d4e0422cdacBehdad Esfahbod  /* ^--- Add new callbacks here */
58744970af4d884cc87ffa645804578fec8df674a9Behdad Esfahbod
591bc1cb3603167f5da309336f7018c8b0608ac104Behdad Esfahbodstruct hb_font_funcs_t {
604b6317c4f426cfaf21e509dbf6ee6d4e0422cdacBehdad Esfahbod  hb_object_header_t header;
616220e5fc0dad728e67a92e838d3ac275d032f2c7Behdad Esfahbod  ASSERT_POD ();
624b6317c4f426cfaf21e509dbf6ee6d4e0422cdacBehdad Esfahbod
634b6317c4f426cfaf21e509dbf6ee6d4e0422cdacBehdad Esfahbod  hb_bool_t immutable;
644b6317c4f426cfaf21e509dbf6ee6d4e0422cdacBehdad Esfahbod
654b6317c4f426cfaf21e509dbf6ee6d4e0422cdacBehdad Esfahbod  /* Don't access these directly.  Call hb_font_get_*() instead. */
66744970af4d884cc87ffa645804578fec8df674a9Behdad Esfahbod
67b9d975b931d6310f25fab5ac280f523cdc27bf94Behdad Esfahbod  struct {
68744970af4d884cc87ffa645804578fec8df674a9Behdad Esfahbod#define HB_FONT_FUNC_IMPLEMENT(name) hb_font_get_##name##_func_t name;
69744970af4d884cc87ffa645804578fec8df674a9Behdad Esfahbod    HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
70744970af4d884cc87ffa645804578fec8df674a9Behdad Esfahbod#undef HB_FONT_FUNC_IMPLEMENT
71b9d975b931d6310f25fab5ac280f523cdc27bf94Behdad Esfahbod  } get;
72b9d975b931d6310f25fab5ac280f523cdc27bf94Behdad Esfahbod
73b9d975b931d6310f25fab5ac280f523cdc27bf94Behdad Esfahbod  struct {
74744970af4d884cc87ffa645804578fec8df674a9Behdad Esfahbod#define HB_FONT_FUNC_IMPLEMENT(name) void *name;
75744970af4d884cc87ffa645804578fec8df674a9Behdad Esfahbod    HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
76744970af4d884cc87ffa645804578fec8df674a9Behdad Esfahbod#undef HB_FONT_FUNC_IMPLEMENT
77b9d975b931d6310f25fab5ac280f523cdc27bf94Behdad Esfahbod  } user_data;
78b9d975b931d6310f25fab5ac280f523cdc27bf94Behdad Esfahbod
79bf36a1074ab23abeab0a7a6c47db26770dc1ab0aBehdad Esfahbod  struct {
80744970af4d884cc87ffa645804578fec8df674a9Behdad Esfahbod#define HB_FONT_FUNC_IMPLEMENT(name) hb_destroy_func_t name;
81744970af4d884cc87ffa645804578fec8df674a9Behdad Esfahbod    HB_FONT_FUNCS_IMPLEMENT_CALLBACKS
82744970af4d884cc87ffa645804578fec8df674a9Behdad Esfahbod#undef HB_FONT_FUNC_IMPLEMENT
83b9d975b931d6310f25fab5ac280f523cdc27bf94Behdad Esfahbod  } destroy;
84c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod};
85c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod
86c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod
87c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod/*
88c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod * hb_face_t
89c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod */
90c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod
911bc1cb3603167f5da309336f7018c8b0608ac104Behdad Esfahbodstruct hb_face_t {
92fca368c4682624346a0aaee690e1ad6ed4c0b337Behdad Esfahbod  hb_object_header_t header;
936220e5fc0dad728e67a92e838d3ac275d032f2c7Behdad Esfahbod  ASSERT_POD ();
94c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod
957fc5a30cb4fbe9a4633ab842b0a8cbbcc6f6bd1bBehdad Esfahbod  hb_bool_t immutable;
967fc5a30cb4fbe9a4633ab842b0a8cbbcc6f6bd1bBehdad Esfahbod
97e715784be35f0846c0e084b7c53c7556ce933a45Behdad Esfahbod  hb_reference_table_func_t  reference_table;
98e715784be35f0846c0e084b7c53c7556ce933a45Behdad Esfahbod  void                      *user_data;
99e715784be35f0846c0e084b7c53c7556ce933a45Behdad Esfahbod  hb_destroy_func_t          destroy;
100c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod
1013897335c7620c37e9a0224b0c42ade0dfdce4053Behdad Esfahbod  unsigned int index;
102abcfe9b59b4475eb02dd679aac4bc59616713b28Behdad Esfahbod  unsigned int upem;
103027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod
104027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod  struct hb_shaper_data_t shaper_data;
1052f87cebe1062c7007021ebd05c1664e60da80825Behdad Esfahbod
1062f87cebe1062c7007021ebd05c1664e60da80825Behdad Esfahbod  struct plan_node_t {
1072f87cebe1062c7007021ebd05c1664e60da80825Behdad Esfahbod    hb_shape_plan_t *shape_plan;
1082f87cebe1062c7007021ebd05c1664e60da80825Behdad Esfahbod    plan_node_t *next;
1092f87cebe1062c7007021ebd05c1664e60da80825Behdad Esfahbod  } *shape_plans;
110c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod};
111c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod
1125b95c148cc485f79fd7018bc4520b4cb5f728a18Behdad Esfahbod#define HB_SHAPER_DATA_CREATE_FUNC_EXTRA_ARGS
113027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod#define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_PROTOTYPE(shaper, face);
114027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod#include "hb-shaper-list.hh"
115027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod#undef HB_SHAPER_IMPLEMENT
1165b95c148cc485f79fd7018bc4520b4cb5f728a18Behdad Esfahbod#undef HB_SHAPER_DATA_CREATE_FUNC_EXTRA_ARGS
117027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod
118c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod
119c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod/*
120c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod * hb_font_t
121c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod */
122c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod
1231bc1cb3603167f5da309336f7018c8b0608ac104Behdad Esfahbodstruct hb_font_t {
124fca368c4682624346a0aaee690e1ad6ed4c0b337Behdad Esfahbod  hb_object_header_t header;
1256220e5fc0dad728e67a92e838d3ac275d032f2c7Behdad Esfahbod  ASSERT_POD ();
126c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod
12774f1d896f2479500d65649cf3ec86dd201f0663aBehdad Esfahbod  hb_bool_t immutable;
12874f1d896f2479500d65649cf3ec86dd201f0663aBehdad Esfahbod
129defc45be6d75aba4a67fa7814b91b73bad953fe6Behdad Esfahbod  hb_font_t *parent;
13072657e4ce757dcb055a8db7291b68f96f0d34bfbBehdad Esfahbod  hb_face_t *face;
13172657e4ce757dcb055a8db7291b68f96f0d34bfbBehdad Esfahbod
13211bb8fe7b3925bc9b019ad0c0218a231e581f152Behdad Esfahbod  int x_scale;
13311bb8fe7b3925bc9b019ad0c0218a231e581f152Behdad Esfahbod  int y_scale;
134c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod
135c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod  unsigned int x_ppem;
136c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod  unsigned int y_ppem;
1375c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod
1388fb3d1aa4e613cdf965a83bd650c668884c58ad8Behdad Esfahbod  hb_font_funcs_t   *klass;
1398fb3d1aa4e613cdf965a83bd650c668884c58ad8Behdad Esfahbod  void              *user_data;
1405668189c12c264e8d2caf0d12dac918363ef6f80Behdad Esfahbod  hb_destroy_func_t  destroy;
141abcfe9b59b4475eb02dd679aac4bc59616713b28Behdad Esfahbod
142027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod  struct hb_shaper_data_t shaper_data;
143027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod
144abcfe9b59b4475eb02dd679aac4bc59616713b28Behdad Esfahbod
145abcfe9b59b4475eb02dd679aac4bc59616713b28Behdad Esfahbod  /* Convert from font-space to user-space */
146b6f902a1a9c8b72b5d6a241a14a7bacfaea3a56aBehdad Esfahbod  inline hb_position_t em_scale_x (int16_t v) { return em_scale (v, this->x_scale); }
147b6f902a1a9c8b72b5d6a241a14a7bacfaea3a56aBehdad Esfahbod  inline hb_position_t em_scale_y (int16_t v) { return em_scale (v, this->y_scale); }
148abcfe9b59b4475eb02dd679aac4bc59616713b28Behdad Esfahbod
14963d646fb2933c2765ce526d321a498d0f7fae2f5Behdad Esfahbod  /* Convert from parent-font user-space to our user-space */
15063d646fb2933c2765ce526d321a498d0f7fae2f5Behdad Esfahbod  inline hb_position_t parent_scale_x_distance (hb_position_t v) {
15163d646fb2933c2765ce526d321a498d0f7fae2f5Behdad Esfahbod    if (unlikely (parent && parent->x_scale != x_scale))
15263d646fb2933c2765ce526d321a498d0f7fae2f5Behdad Esfahbod      return v * (int64_t) this->x_scale / this->parent->x_scale;
15363d646fb2933c2765ce526d321a498d0f7fae2f5Behdad Esfahbod    return v;
15463d646fb2933c2765ce526d321a498d0f7fae2f5Behdad Esfahbod  }
15563d646fb2933c2765ce526d321a498d0f7fae2f5Behdad Esfahbod  inline hb_position_t parent_scale_y_distance (hb_position_t v) {
15663d646fb2933c2765ce526d321a498d0f7fae2f5Behdad Esfahbod    if (unlikely (parent && parent->y_scale != y_scale))
15763d646fb2933c2765ce526d321a498d0f7fae2f5Behdad Esfahbod      return v * (int64_t) this->y_scale / this->parent->y_scale;
15863d646fb2933c2765ce526d321a498d0f7fae2f5Behdad Esfahbod    return v;
15963d646fb2933c2765ce526d321a498d0f7fae2f5Behdad Esfahbod  }
16063d646fb2933c2765ce526d321a498d0f7fae2f5Behdad Esfahbod  inline hb_position_t parent_scale_x_position (hb_position_t v) {
16160fbb36096e344e9af79409ce8cfe3f1f7b0d321Behdad Esfahbod    return parent_scale_x_distance (v);
16263d646fb2933c2765ce526d321a498d0f7fae2f5Behdad Esfahbod  }
16363d646fb2933c2765ce526d321a498d0f7fae2f5Behdad Esfahbod  inline hb_position_t parent_scale_y_position (hb_position_t v) {
16460fbb36096e344e9af79409ce8cfe3f1f7b0d321Behdad Esfahbod    return parent_scale_y_distance (v);
16563d646fb2933c2765ce526d321a498d0f7fae2f5Behdad Esfahbod  }
16663d646fb2933c2765ce526d321a498d0f7fae2f5Behdad Esfahbod
16763d646fb2933c2765ce526d321a498d0f7fae2f5Behdad Esfahbod  inline void parent_scale_distance (hb_position_t *x, hb_position_t *y) {
16863d646fb2933c2765ce526d321a498d0f7fae2f5Behdad Esfahbod    *x = parent_scale_x_distance (*x);
16963d646fb2933c2765ce526d321a498d0f7fae2f5Behdad Esfahbod    *y = parent_scale_y_distance (*y);
17063d646fb2933c2765ce526d321a498d0f7fae2f5Behdad Esfahbod  }
17163d646fb2933c2765ce526d321a498d0f7fae2f5Behdad Esfahbod  inline void parent_scale_position (hb_position_t *x, hb_position_t *y) {
17263d646fb2933c2765ce526d321a498d0f7fae2f5Behdad Esfahbod    *x = parent_scale_x_position (*x);
17363d646fb2933c2765ce526d321a498d0f7fae2f5Behdad Esfahbod    *y = parent_scale_y_position (*y);
17463d646fb2933c2765ce526d321a498d0f7fae2f5Behdad Esfahbod  }
17563d646fb2933c2765ce526d321a498d0f7fae2f5Behdad Esfahbod
17663d646fb2933c2765ce526d321a498d0f7fae2f5Behdad Esfahbod
1778fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  /* Public getters */
1788fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod
1798fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  inline hb_bool_t get_glyph (hb_codepoint_t unicode, hb_codepoint_t variation_selector,
1808fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod			      hb_codepoint_t *glyph)
1818fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  {
1828fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod    *glyph = 0;
1838fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod    return klass->get.glyph (this, user_data,
1848fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod			     unicode, variation_selector, glyph,
1858fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod			     klass->user_data.glyph);
1868fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  }
1878fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod
1888fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  inline hb_position_t get_glyph_h_advance (hb_codepoint_t glyph)
1898fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  {
1908fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod    return klass->get.glyph_h_advance (this, user_data,
1918fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod				       glyph,
1928fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod				       klass->user_data.glyph_h_advance);
1938fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  }
1948fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod
1958fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  inline hb_position_t get_glyph_v_advance (hb_codepoint_t glyph)
1968fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  {
1978fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod    return klass->get.glyph_v_advance (this, user_data,
1988fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod				       glyph,
1998fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod				       klass->user_data.glyph_v_advance);
2008fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  }
2018fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod
2028fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  inline hb_bool_t get_glyph_h_origin (hb_codepoint_t glyph,
2038fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod				       hb_position_t *x, hb_position_t *y)
2048fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  {
2058fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod    *x = *y = 0;
2068fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod    return klass->get.glyph_h_origin (this, user_data,
2078fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod				      glyph, x, y,
2088fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod				      klass->user_data.glyph_h_origin);
2098fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  }
2108fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod
2118fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  inline hb_bool_t get_glyph_v_origin (hb_codepoint_t glyph,
2128fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod				       hb_position_t *x, hb_position_t *y)
2138fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  {
2148fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod    *x = *y = 0;
2158fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod    return klass->get.glyph_v_origin (this, user_data,
2168fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod				      glyph, x, y,
2178fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod				      klass->user_data.glyph_v_origin);
2188fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  }
2198fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod
2208fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  inline hb_position_t get_glyph_h_kerning (hb_codepoint_t left_glyph, hb_codepoint_t right_glyph)
2218fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  {
2228fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod    return klass->get.glyph_h_kerning (this, user_data,
2238fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod				       left_glyph, right_glyph,
2248fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod				       klass->user_data.glyph_h_kerning);
2258fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  }
2268fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod
2278fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  inline hb_position_t get_glyph_v_kerning (hb_codepoint_t left_glyph, hb_codepoint_t right_glyph)
2288fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  {
2298fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod    return klass->get.glyph_v_kerning (this, user_data,
2308fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod				       left_glyph, right_glyph,
2318fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod				       klass->user_data.glyph_v_kerning);
2328fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  }
2338fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod
2348fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  inline hb_bool_t get_glyph_extents (hb_codepoint_t glyph,
2358fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod				      hb_glyph_extents_t *extents)
2368fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  {
2378fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod    memset (extents, 0, sizeof (*extents));
2388fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod    return klass->get.glyph_extents (this, user_data,
2398fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod				     glyph,
2408fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod				     extents,
2418fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod				     klass->user_data.glyph_extents);
2428fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  }
2438fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod
2448fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  inline hb_bool_t get_glyph_contour_point (hb_codepoint_t glyph, unsigned int point_index,
2458fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod					    hb_position_t *x, hb_position_t *y)
2468fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  {
2478fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod    *x = *y = 0;
2488fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod    return klass->get.glyph_contour_point (this, user_data,
2498fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod					   glyph, point_index,
2508fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod					   x, y,
2518fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod					   klass->user_data.glyph_contour_point);
2528fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  }
2538fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod
2548fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  inline hb_bool_t get_glyph_name (hb_codepoint_t glyph,
2558fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod				   char *name, unsigned int size)
2568fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  {
2576f3a300138f659020c21c3e08b7981c78df5f332Behdad Esfahbod    if (size) *name = '\0';
2588fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod    return klass->get.glyph_name (this, user_data,
2598fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod				  glyph,
2608fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod				  name, size,
2618fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod				  klass->user_data.glyph_name);
2628fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  }
2638fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod
2648fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  inline hb_bool_t get_glyph_from_name (const char *name, int len, /* -1 means nul-terminated */
2658fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod					hb_codepoint_t *glyph)
2668fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  {
2676f3a300138f659020c21c3e08b7981c78df5f332Behdad Esfahbod    *glyph = 0;
2686f3a300138f659020c21c3e08b7981c78df5f332Behdad Esfahbod    if (len == -1) len = strlen (name);
2698fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod    return klass->get.glyph_from_name (this, user_data,
2708fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod				       name, len,
2718fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod				       glyph,
2728fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod				       klass->user_data.glyph_from_name);
2738fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  }
2748fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod
2758fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod
2768fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  /* A bit higher-level, and with fallback */
2778fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod
2788fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  inline void get_glyph_advance_for_direction (hb_codepoint_t glyph,
2798fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod					       hb_direction_t direction,
2808fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod					       hb_position_t *x, hb_position_t *y)
2818fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  {
2828fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod    if (likely (HB_DIRECTION_IS_HORIZONTAL (direction))) {
2838fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod      *x = get_glyph_h_advance (glyph);
2848fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod      *y = 0;
2858fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod    } else {
2868fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod      *x = 0;
2878fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod      *y = get_glyph_v_advance (glyph);
2888fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod    }
2898fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  }
2908fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod
2918fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  /* Internal only */
2928fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  inline void guess_v_origin_minus_h_origin (hb_codepoint_t glyph,
2938fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod					     hb_position_t *x, hb_position_t *y)
2948fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  {
2958fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod    *x = get_glyph_h_advance (glyph) / 2;
2968fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod
2978fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod    /* TODO use font_metics.ascent */
2988fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod    *y = y_scale;
2998fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  }
3008fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod
3018fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  inline void get_glyph_origin_for_direction (hb_codepoint_t glyph,
3028fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod					      hb_direction_t direction,
3038fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod					      hb_position_t *x, hb_position_t *y)
3048fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  {
3058fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod    if (likely (HB_DIRECTION_IS_HORIZONTAL (direction))) {
3068fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod      hb_bool_t ret = get_glyph_h_origin (glyph, x, y);
3078fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod      if (!ret && (ret = get_glyph_v_origin (glyph, x, y))) {
3088fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod	hb_position_t dx, dy;
3098fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod	guess_v_origin_minus_h_origin (glyph, &dx, &dy);
3108fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod	*x -= dx; *y -= dy;
3118fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod      }
3128fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod    } else {
3138fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod      hb_bool_t ret = get_glyph_v_origin (glyph, x, y);
3148fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod      if (!ret && (ret = get_glyph_h_origin (glyph, x, y))) {
3158fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod	hb_position_t dx, dy;
3168fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod	guess_v_origin_minus_h_origin (glyph, &dx, &dy);
3178fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod	*x += dx; *y += dy;
3188fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod      }
3198fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod    }
3208fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  }
3218fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod
3228fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  inline void add_glyph_origin_for_direction (hb_codepoint_t glyph,
3238fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod					      hb_direction_t direction,
3248fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod					      hb_position_t *x, hb_position_t *y)
3258fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  {
3268fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod    hb_position_t origin_x, origin_y;
3278fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod
3288fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod    get_glyph_origin_for_direction (glyph, direction, &origin_x, &origin_y);
3298fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod
3308fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod    *x += origin_x;
3318fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod    *y += origin_y;
3328fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  }
3338fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod
3348fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  inline void subtract_glyph_origin_for_direction (hb_codepoint_t glyph,
3358fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod						   hb_direction_t direction,
3368fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod						   hb_position_t *x, hb_position_t *y)
3378fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  {
3388fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod    hb_position_t origin_x, origin_y;
3398fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod
3408fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod    get_glyph_origin_for_direction (glyph, direction, &origin_x, &origin_y);
3418fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod
3428fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod    *x -= origin_x;
3438fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod    *y -= origin_y;
3448fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  }
3458fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod
3468fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  inline void get_glyph_kerning_for_direction (hb_codepoint_t first_glyph, hb_codepoint_t second_glyph,
3478fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod					       hb_direction_t direction,
3488fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod					       hb_position_t *x, hb_position_t *y)
3498fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  {
3508fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod    if (likely (HB_DIRECTION_IS_HORIZONTAL (direction))) {
3518fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod      *x = get_glyph_h_kerning (first_glyph, second_glyph);
3528fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod      *y = 0;
3538fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod    } else {
3548fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod      *x = 0;
3558fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod      *y = get_glyph_v_kerning (first_glyph, second_glyph);
3568fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod    }
3578fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  }
3588fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod
3598fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  inline hb_bool_t get_glyph_extents_for_origin (hb_codepoint_t glyph,
3608fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod						 hb_direction_t direction,
3618fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod						 hb_glyph_extents_t *extents)
3628fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  {
3638fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod    hb_bool_t ret = get_glyph_extents (glyph, extents);
3648fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod
3658fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod    if (ret)
3668fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod      subtract_glyph_origin_for_direction (glyph, direction, &extents->x_bearing, &extents->y_bearing);
3678fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod
3688fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod    return ret;
3698fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  }
3708fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod
3718fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  inline hb_bool_t get_glyph_contour_point_for_origin (hb_codepoint_t glyph, unsigned int point_index,
3728fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod						       hb_direction_t direction,
3738fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod						       hb_position_t *x, hb_position_t *y)
3748fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  {
3758fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod    hb_bool_t ret = get_glyph_contour_point (glyph, point_index, x, y);
3768fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod
3778fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod    if (ret)
3788fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod      subtract_glyph_origin_for_direction (glyph, direction, x, y);
3798fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod
3808fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod    return ret;
3818fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod  }
3828fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod
3836f3a300138f659020c21c3e08b7981c78df5f332Behdad Esfahbod  /* Generates gidDDD if glyph has no name. */
3846f3a300138f659020c21c3e08b7981c78df5f332Behdad Esfahbod  inline void
3856f3a300138f659020c21c3e08b7981c78df5f332Behdad Esfahbod  glyph_to_string (hb_codepoint_t glyph,
3866f3a300138f659020c21c3e08b7981c78df5f332Behdad Esfahbod		   char *s, unsigned int size)
3876f3a300138f659020c21c3e08b7981c78df5f332Behdad Esfahbod  {
3886f3a300138f659020c21c3e08b7981c78df5f332Behdad Esfahbod    if (get_glyph_name (glyph, s, size)) return;
3896f3a300138f659020c21c3e08b7981c78df5f332Behdad Esfahbod
3906f3a300138f659020c21c3e08b7981c78df5f332Behdad Esfahbod    snprintf (s, size, "gid%u", glyph);
3916f3a300138f659020c21c3e08b7981c78df5f332Behdad Esfahbod  }
3926f3a300138f659020c21c3e08b7981c78df5f332Behdad Esfahbod
3936f3a300138f659020c21c3e08b7981c78df5f332Behdad Esfahbod  /* Parses gidDDD and uniUUUU strings automatically. */
3946f3a300138f659020c21c3e08b7981c78df5f332Behdad Esfahbod  inline hb_bool_t
3956f3a300138f659020c21c3e08b7981c78df5f332Behdad Esfahbod  glyph_from_string (const char *s, int len, /* -1 means nul-terminated */
3966f3a300138f659020c21c3e08b7981c78df5f332Behdad Esfahbod		     hb_codepoint_t *glyph)
3976f3a300138f659020c21c3e08b7981c78df5f332Behdad Esfahbod  {
3986f3a300138f659020c21c3e08b7981c78df5f332Behdad Esfahbod    if (get_glyph_from_name (s, len, glyph)) return true;
3996f3a300138f659020c21c3e08b7981c78df5f332Behdad Esfahbod
4006f3a300138f659020c21c3e08b7981c78df5f332Behdad Esfahbod    if (len == -1) len = strlen (s);
4016f3a300138f659020c21c3e08b7981c78df5f332Behdad Esfahbod
4026f3a300138f659020c21c3e08b7981c78df5f332Behdad Esfahbod    /* Straight glyph index. */
4036f3a300138f659020c21c3e08b7981c78df5f332Behdad Esfahbod    if (hb_codepoint_parse (s, len, 10, glyph))
4046f3a300138f659020c21c3e08b7981c78df5f332Behdad Esfahbod      return true;
4056f3a300138f659020c21c3e08b7981c78df5f332Behdad Esfahbod
4066f3a300138f659020c21c3e08b7981c78df5f332Behdad Esfahbod    if (len > 3)
4076f3a300138f659020c21c3e08b7981c78df5f332Behdad Esfahbod    {
4086f3a300138f659020c21c3e08b7981c78df5f332Behdad Esfahbod      /* gidDDD syntax for glyph indices. */
4096f3a300138f659020c21c3e08b7981c78df5f332Behdad Esfahbod      if (0 == strncmp (s, "gid", 3) &&
4106f3a300138f659020c21c3e08b7981c78df5f332Behdad Esfahbod	  hb_codepoint_parse (s + 3, len - 3, 10, glyph))
4116f3a300138f659020c21c3e08b7981c78df5f332Behdad Esfahbod	return true;
4126f3a300138f659020c21c3e08b7981c78df5f332Behdad Esfahbod
4136f3a300138f659020c21c3e08b7981c78df5f332Behdad Esfahbod      /* uniUUUU and other Unicode character indices. */
4146f3a300138f659020c21c3e08b7981c78df5f332Behdad Esfahbod      hb_codepoint_t unichar;
4156f3a300138f659020c21c3e08b7981c78df5f332Behdad Esfahbod      if (0 == strncmp (s, "uni", 3) &&
4166f3a300138f659020c21c3e08b7981c78df5f332Behdad Esfahbod	  hb_codepoint_parse (s + 3, len - 3, 16, &unichar) &&
4176f3a300138f659020c21c3e08b7981c78df5f332Behdad Esfahbod	  get_glyph (unichar, 0, glyph))
4186f3a300138f659020c21c3e08b7981c78df5f332Behdad Esfahbod	return true;
4196f3a300138f659020c21c3e08b7981c78df5f332Behdad Esfahbod    }
4206f3a300138f659020c21c3e08b7981c78df5f332Behdad Esfahbod
4216f3a300138f659020c21c3e08b7981c78df5f332Behdad Esfahbod    return false;
4226f3a300138f659020c21c3e08b7981c78df5f332Behdad Esfahbod  }
4238fbfda920e0b3bb4ab7afb732826026964b79be9Behdad Esfahbod
424abcfe9b59b4475eb02dd679aac4bc59616713b28Behdad Esfahbod  private:
4253897335c7620c37e9a0224b0c42ade0dfdce4053Behdad Esfahbod  inline hb_position_t em_scale (int16_t v, int scale) { return v * (int64_t) scale / hb_face_get_upem (this->face); }
426c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod};
427c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod
4285b95c148cc485f79fd7018bc4520b4cb5f728a18Behdad Esfahbod#define HB_SHAPER_DATA_CREATE_FUNC_EXTRA_ARGS
429027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod#define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_PROTOTYPE(shaper, font);
430027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod#include "hb-shaper-list.hh"
431027857d0412477fb4427dcb8a8c45287c272e143Behdad Esfahbod#undef HB_SHAPER_IMPLEMENT
4325b95c148cc485f79fd7018bc4520b4cb5f728a18Behdad Esfahbod#undef HB_SHAPER_DATA_CREATE_FUNC_EXTRA_ARGS
433c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod
434c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod
435c57d454accff66e5f2c58006e8fb40bc020b6182Behdad Esfahbod#endif /* HB_FONT_PRIVATE_HH */
436