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