hb-font-private.hh revision 7fc5a30cb4fbe9a4633ab842b0a8cbbcc6f6bd1b
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" 36c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod 37c62b503770325819f249885dfc9d4683a69c9efdBehdad EsfahbodHB_BEGIN_DECLS 38c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod 39acdba3f90b232fc12fcb200dca2584481b339118Behdad Esfahbod 40c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod/* 415c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod * hb_font_funcs_t 42c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod */ 43c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod 445c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbodstruct _hb_font_funcs_t { 45fca368c4682624346a0aaee690e1ad6ed4c0b337Behdad Esfahbod hb_object_header_t header; 46c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod 478d70312c7b899131c3aafa7a43527ef3ced33bfeBehdad Esfahbod hb_bool_t immutable; 488d70312c7b899131c3aafa7a43527ef3ced33bfeBehdad Esfahbod 49b9d975b931d6310f25fab5ac280f523cdc27bf94Behdad Esfahbod /* Don't access these directly. Call hb_font_get_*() instead. */ 50b9d975b931d6310f25fab5ac280f523cdc27bf94Behdad Esfahbod 51b9d975b931d6310f25fab5ac280f523cdc27bf94Behdad Esfahbod struct { 52b9d975b931d6310f25fab5ac280f523cdc27bf94Behdad Esfahbod hb_font_get_contour_point_func_t contour_point; 53b9d975b931d6310f25fab5ac280f523cdc27bf94Behdad Esfahbod hb_font_get_glyph_advance_func_t glyph_advance; 54b9d975b931d6310f25fab5ac280f523cdc27bf94Behdad Esfahbod hb_font_get_glyph_extents_func_t glyph_extents; 55b9d975b931d6310f25fab5ac280f523cdc27bf94Behdad Esfahbod hb_font_get_glyph_func_t glyph; 56b9d975b931d6310f25fab5ac280f523cdc27bf94Behdad Esfahbod hb_font_get_kerning_func_t kerning; 57b9d975b931d6310f25fab5ac280f523cdc27bf94Behdad Esfahbod } get; 58b9d975b931d6310f25fab5ac280f523cdc27bf94Behdad Esfahbod 59b9d975b931d6310f25fab5ac280f523cdc27bf94Behdad Esfahbod struct { 60b9d975b931d6310f25fab5ac280f523cdc27bf94Behdad Esfahbod void *contour_point; 61b9d975b931d6310f25fab5ac280f523cdc27bf94Behdad Esfahbod void *glyph_advance; 62b9d975b931d6310f25fab5ac280f523cdc27bf94Behdad Esfahbod void *glyph_extents; 63b9d975b931d6310f25fab5ac280f523cdc27bf94Behdad Esfahbod void *glyph; 64b9d975b931d6310f25fab5ac280f523cdc27bf94Behdad Esfahbod void *kerning; 65b9d975b931d6310f25fab5ac280f523cdc27bf94Behdad Esfahbod } user_data; 66b9d975b931d6310f25fab5ac280f523cdc27bf94Behdad Esfahbod 67bf36a1074ab23abeab0a7a6c47db26770dc1ab0aBehdad Esfahbod struct { 68b9d975b931d6310f25fab5ac280f523cdc27bf94Behdad Esfahbod hb_destroy_func_t contour_point; 69b9d975b931d6310f25fab5ac280f523cdc27bf94Behdad Esfahbod hb_destroy_func_t glyph_advance; 70b9d975b931d6310f25fab5ac280f523cdc27bf94Behdad Esfahbod hb_destroy_func_t glyph_extents; 71b9d975b931d6310f25fab5ac280f523cdc27bf94Behdad Esfahbod hb_destroy_func_t glyph; 72b9d975b931d6310f25fab5ac280f523cdc27bf94Behdad Esfahbod hb_destroy_func_t kerning; 73b9d975b931d6310f25fab5ac280f523cdc27bf94Behdad Esfahbod } destroy; 74c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod}; 75c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod 76c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod 77c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod/* 78c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod * hb_face_t 79c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod */ 80c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod 81c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbodstruct _hb_face_t { 82fca368c4682624346a0aaee690e1ad6ed4c0b337Behdad Esfahbod hb_object_header_t header; 83c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod 847fc5a30cb4fbe9a4633ab842b0a8cbbcc6f6bd1bBehdad Esfahbod hb_bool_t immutable; 857fc5a30cb4fbe9a4633ab842b0a8cbbcc6f6bd1bBehdad Esfahbod 86c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod hb_get_table_func_t get_table; 87c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod void *user_data; 885668189c12c264e8d2caf0d12dac918363ef6f80Behdad Esfahbod hb_destroy_func_t destroy; 89c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod 900a4399ca228d244e646abdb3487da0f13b228889Behdad Esfahbod struct hb_ot_layout_t *ot_layout; 91abcfe9b59b4475eb02dd679aac4bc59616713b28Behdad Esfahbod 92abcfe9b59b4475eb02dd679aac4bc59616713b28Behdad Esfahbod unsigned int upem; 93c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod}; 94c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod 95c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod 96c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod/* 97c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod * hb_font_t 98c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod */ 99c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod 100c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbodstruct _hb_font_t { 101fca368c4682624346a0aaee690e1ad6ed4c0b337Behdad Esfahbod hb_object_header_t header; 102c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod 10374f1d896f2479500d65649cf3ec86dd201f0663aBehdad Esfahbod hb_bool_t immutable; 10474f1d896f2479500d65649cf3ec86dd201f0663aBehdad Esfahbod 105defc45be6d75aba4a67fa7814b91b73bad953fe6Behdad Esfahbod hb_font_t *parent; 10672657e4ce757dcb055a8db7291b68f96f0d34bfbBehdad Esfahbod hb_face_t *face; 10772657e4ce757dcb055a8db7291b68f96f0d34bfbBehdad Esfahbod 10811bb8fe7b3925bc9b019ad0c0218a231e581f152Behdad Esfahbod int x_scale; 10911bb8fe7b3925bc9b019ad0c0218a231e581f152Behdad Esfahbod int y_scale; 110c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod 111c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod unsigned int x_ppem; 112c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod unsigned int y_ppem; 1135c44188455ca1b696aa24b20c3a83877dfae2fb2Behdad Esfahbod 1148fb3d1aa4e613cdf965a83bd650c668884c58ad8Behdad Esfahbod hb_font_funcs_t *klass; 1158fb3d1aa4e613cdf965a83bd650c668884c58ad8Behdad Esfahbod void *user_data; 1165668189c12c264e8d2caf0d12dac918363ef6f80Behdad Esfahbod hb_destroy_func_t destroy; 117abcfe9b59b4475eb02dd679aac4bc59616713b28Behdad Esfahbod 118abcfe9b59b4475eb02dd679aac4bc59616713b28Behdad Esfahbod 119abcfe9b59b4475eb02dd679aac4bc59616713b28Behdad Esfahbod /* Convert from font-space to user-space */ 120b6f902a1a9c8b72b5d6a241a14a7bacfaea3a56aBehdad Esfahbod inline hb_position_t em_scale_x (int16_t v) { return em_scale (v, this->x_scale); } 121b6f902a1a9c8b72b5d6a241a14a7bacfaea3a56aBehdad Esfahbod inline hb_position_t em_scale_y (int16_t v) { return em_scale (v, this->y_scale); } 122abcfe9b59b4475eb02dd679aac4bc59616713b28Behdad Esfahbod 12363d646fb2933c2765ce526d321a498d0f7fae2f5Behdad Esfahbod /* Convert from parent-font user-space to our user-space */ 12463d646fb2933c2765ce526d321a498d0f7fae2f5Behdad Esfahbod inline hb_position_t parent_scale_x_distance (hb_position_t v) { 12563d646fb2933c2765ce526d321a498d0f7fae2f5Behdad Esfahbod if (unlikely (parent && parent->x_scale != x_scale)) 12663d646fb2933c2765ce526d321a498d0f7fae2f5Behdad Esfahbod return v * (int64_t) this->x_scale / this->parent->x_scale; 12763d646fb2933c2765ce526d321a498d0f7fae2f5Behdad Esfahbod return v; 12863d646fb2933c2765ce526d321a498d0f7fae2f5Behdad Esfahbod } 12963d646fb2933c2765ce526d321a498d0f7fae2f5Behdad Esfahbod inline hb_position_t parent_scale_y_distance (hb_position_t v) { 13063d646fb2933c2765ce526d321a498d0f7fae2f5Behdad Esfahbod if (unlikely (parent && parent->y_scale != y_scale)) 13163d646fb2933c2765ce526d321a498d0f7fae2f5Behdad Esfahbod return v * (int64_t) this->y_scale / this->parent->y_scale; 13263d646fb2933c2765ce526d321a498d0f7fae2f5Behdad Esfahbod return v; 13363d646fb2933c2765ce526d321a498d0f7fae2f5Behdad Esfahbod } 13463d646fb2933c2765ce526d321a498d0f7fae2f5Behdad Esfahbod inline hb_position_t parent_scale_x_position (hb_position_t v) { 13563d646fb2933c2765ce526d321a498d0f7fae2f5Behdad Esfahbod return parent_scale_x_distance (v); /* We don't have translation right now */ 13663d646fb2933c2765ce526d321a498d0f7fae2f5Behdad Esfahbod } 13763d646fb2933c2765ce526d321a498d0f7fae2f5Behdad Esfahbod inline hb_position_t parent_scale_y_position (hb_position_t v) { 13863d646fb2933c2765ce526d321a498d0f7fae2f5Behdad Esfahbod return parent_scale_y_distance (v); /* We don't have translation right now */ 13963d646fb2933c2765ce526d321a498d0f7fae2f5Behdad Esfahbod } 14063d646fb2933c2765ce526d321a498d0f7fae2f5Behdad Esfahbod 14163d646fb2933c2765ce526d321a498d0f7fae2f5Behdad Esfahbod inline void parent_scale_distance (hb_position_t *x, hb_position_t *y) { 14263d646fb2933c2765ce526d321a498d0f7fae2f5Behdad Esfahbod *x = parent_scale_x_distance (*x); 14363d646fb2933c2765ce526d321a498d0f7fae2f5Behdad Esfahbod *y = parent_scale_y_distance (*y); 14463d646fb2933c2765ce526d321a498d0f7fae2f5Behdad Esfahbod } 14563d646fb2933c2765ce526d321a498d0f7fae2f5Behdad Esfahbod inline void parent_scale_position (hb_position_t *x, hb_position_t *y) { 14663d646fb2933c2765ce526d321a498d0f7fae2f5Behdad Esfahbod *x = parent_scale_x_position (*x); 14763d646fb2933c2765ce526d321a498d0f7fae2f5Behdad Esfahbod *y = parent_scale_y_position (*y); 14863d646fb2933c2765ce526d321a498d0f7fae2f5Behdad Esfahbod } 14963d646fb2933c2765ce526d321a498d0f7fae2f5Behdad Esfahbod 15063d646fb2933c2765ce526d321a498d0f7fae2f5Behdad Esfahbod 151abcfe9b59b4475eb02dd679aac4bc59616713b28Behdad Esfahbod private: 152b6f902a1a9c8b72b5d6a241a14a7bacfaea3a56aBehdad Esfahbod inline hb_position_t em_scale (int16_t v, int scale) { return v * (int64_t) scale / this->face->upem; } 153c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod}; 154c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod 155c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod 156c62b503770325819f249885dfc9d4683a69c9efdBehdad EsfahbodHB_END_DECLS 157c62b503770325819f249885dfc9d4683a69c9efdBehdad Esfahbod 158c57d454accff66e5f2c58006e8fb40bc020b6182Behdad Esfahbod#endif /* HB_FONT_PRIVATE_HH */ 159