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