Behdad Esfahbod | c62b503 | 2009-08-01 19:54:49 -0400 | [diff] [blame] | 1 | /* |
Behdad Esfahbod | 2409d5f | 2011-04-21 17:14:28 -0400 | [diff] [blame] | 2 | * Copyright © 2009 Red Hat, Inc. |
Behdad Esfahbod | 027857d | 2012-07-26 17:34:25 -0400 | [diff] [blame] | 3 | * Copyright © 2012 Google, Inc. |
Behdad Esfahbod | c62b503 | 2009-08-01 19:54:49 -0400 | [diff] [blame] | 4 | * |
Behdad Esfahbod | c755cb3 | 2010-04-22 00:11:43 -0400 | [diff] [blame] | 5 | * This is part of HarfBuzz, a text shaping library. |
Behdad Esfahbod | c62b503 | 2009-08-01 19:54:49 -0400 | [diff] [blame] | 6 | * |
| 7 | * Permission is hereby granted, without written agreement and without |
| 8 | * license or royalty fees, to use, copy, modify, and distribute this |
| 9 | * software and its documentation for any purpose, provided that the |
| 10 | * above copyright notice and the following two paragraphs appear in |
| 11 | * all copies of this software. |
| 12 | * |
| 13 | * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR |
| 14 | * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES |
| 15 | * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN |
| 16 | * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH |
| 17 | * DAMAGE. |
| 18 | * |
| 19 | * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, |
| 20 | * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND |
| 21 | * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS |
| 22 | * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO |
| 23 | * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. |
| 24 | * |
| 25 | * Red Hat Author(s): Behdad Esfahbod |
Behdad Esfahbod | 027857d | 2012-07-26 17:34:25 -0400 | [diff] [blame] | 26 | * Google Author(s): Behdad Esfahbod |
Behdad Esfahbod | c62b503 | 2009-08-01 19:54:49 -0400 | [diff] [blame] | 27 | */ |
| 28 | |
Behdad Esfahbod | c57d454 | 2011-04-20 18:50:27 -0400 | [diff] [blame] | 29 | #include "hb-private.hh" |
Behdad Esfahbod | c62b503 | 2009-08-01 19:54:49 -0400 | [diff] [blame] | 30 | |
Behdad Esfahbod | 266b344 | 2011-05-03 00:35:53 -0400 | [diff] [blame] | 31 | #include "hb-ot-layout-private.hh" |
| 32 | |
Behdad Esfahbod | c57d454 | 2011-04-20 18:50:27 -0400 | [diff] [blame] | 33 | #include "hb-font-private.hh" |
Behdad Esfahbod | 56eb5ad | 2011-05-04 19:27:37 -0400 | [diff] [blame] | 34 | #include "hb-blob.h" |
Behdad Esfahbod | 23c86aa | 2009-08-03 21:40:20 -0400 | [diff] [blame] | 35 | #include "hb-open-file-private.hh" |
Behdad Esfahbod | 7a750ac | 2011-08-17 14:19:59 +0200 | [diff] [blame] | 36 | #include "hb-ot-head-table.hh" |
Behdad Esfahbod | e05a999 | 2012-11-15 16:23:21 -0800 | [diff] [blame] | 37 | #include "hb-ot-maxp-table.hh" |
Behdad Esfahbod | c62b503 | 2009-08-01 19:54:49 -0400 | [diff] [blame] | 38 | |
Behdad Esfahbod | 20fdb0f | 2012-05-17 22:04:45 -0400 | [diff] [blame] | 39 | #include "hb-cache-private.hh" |
| 40 | |
Behdad Esfahbod | 7951279 | 2009-11-03 20:27:05 -0500 | [diff] [blame] | 41 | #include <string.h> |
| 42 | |
Behdad Esfahbod | acdba3f | 2010-07-23 15:11:18 -0400 | [diff] [blame] | 43 | |
Behdad Esfahbod | c62b503 | 2009-08-01 19:54:49 -0400 | [diff] [blame] | 44 | /* |
Behdad Esfahbod | 5c44188 | 2009-08-10 20:05:16 -0400 | [diff] [blame] | 45 | * hb_font_funcs_t |
Behdad Esfahbod | c62b503 | 2009-08-01 19:54:49 -0400 | [diff] [blame] | 46 | */ |
| 47 | |
Behdad Esfahbod | b9d975b | 2011-05-10 20:41:13 -0400 | [diff] [blame] | 48 | static hb_bool_t |
Behdad Esfahbod | bce0955 | 2012-05-27 11:29:21 -0400 | [diff] [blame] | 49 | hb_font_get_glyph_nil (hb_font_t *font, |
Behdad Esfahbod | b467827 | 2011-05-11 23:25:28 -0400 | [diff] [blame] | 50 | void *font_data HB_UNUSED, |
Behdad Esfahbod | a513dbc | 2011-05-11 00:24:34 -0400 | [diff] [blame] | 51 | hb_codepoint_t unicode, |
| 52 | hb_codepoint_t variation_selector, |
Behdad Esfahbod | 0fd8c2f | 2011-05-12 15:14:13 -0400 | [diff] [blame] | 53 | hb_codepoint_t *glyph, |
Behdad Esfahbod | b467827 | 2011-05-11 23:25:28 -0400 | [diff] [blame] | 54 | void *user_data HB_UNUSED) |
Behdad Esfahbod | 1ded6d8 | 2011-05-10 20:49:02 -0400 | [diff] [blame] | 55 | { |
| 56 | if (font->parent) |
Behdad Esfahbod | 4c8ac4f | 2012-08-08 17:44:19 -0400 | [diff] [blame] | 57 | return font->parent->get_glyph (unicode, variation_selector, glyph); |
Behdad Esfahbod | 1ded6d8 | 2011-05-10 20:49:02 -0400 | [diff] [blame] | 58 | |
Behdad Esfahbod | 0fd8c2f | 2011-05-12 15:14:13 -0400 | [diff] [blame] | 59 | *glyph = 0; |
Behdad Esfahbod | 0594a24 | 2012-06-05 20:35:40 -0400 | [diff] [blame] | 60 | return false; |
Behdad Esfahbod | 1ded6d8 | 2011-05-10 20:49:02 -0400 | [diff] [blame] | 61 | } |
Behdad Esfahbod | 7951279 | 2009-11-03 20:27:05 -0500 | [diff] [blame] | 62 | |
Behdad Esfahbod | 2d8ebcb | 2011-05-25 11:27:33 -0400 | [diff] [blame] | 63 | static hb_position_t |
Behdad Esfahbod | bce0955 | 2012-05-27 11:29:21 -0400 | [diff] [blame] | 64 | hb_font_get_glyph_h_advance_nil (hb_font_t *font, |
Behdad Esfahbod | 744970a | 2011-05-16 18:15:37 -0400 | [diff] [blame] | 65 | void *font_data HB_UNUSED, |
| 66 | hb_codepoint_t glyph, |
Behdad Esfahbod | 744970a | 2011-05-16 18:15:37 -0400 | [diff] [blame] | 67 | void *user_data HB_UNUSED) |
Behdad Esfahbod | 1ded6d8 | 2011-05-10 20:49:02 -0400 | [diff] [blame] | 68 | { |
Behdad Esfahbod | 2d8ebcb | 2011-05-25 11:27:33 -0400 | [diff] [blame] | 69 | if (font->parent) |
Behdad Esfahbod | 4c8ac4f | 2012-08-08 17:44:19 -0400 | [diff] [blame] | 70 | return font->parent_scale_x_distance (font->parent->get_glyph_h_advance (glyph)); |
Behdad Esfahbod | 744970a | 2011-05-16 18:15:37 -0400 | [diff] [blame] | 71 | |
Behdad Esfahbod | 2d8ebcb | 2011-05-25 11:27:33 -0400 | [diff] [blame] | 72 | return font->x_scale; |
Behdad Esfahbod | 744970a | 2011-05-16 18:15:37 -0400 | [diff] [blame] | 73 | } |
| 74 | |
Behdad Esfahbod | 2d8ebcb | 2011-05-25 11:27:33 -0400 | [diff] [blame] | 75 | static hb_position_t |
Behdad Esfahbod | bce0955 | 2012-05-27 11:29:21 -0400 | [diff] [blame] | 76 | hb_font_get_glyph_v_advance_nil (hb_font_t *font, |
Behdad Esfahbod | 744970a | 2011-05-16 18:15:37 -0400 | [diff] [blame] | 77 | void *font_data HB_UNUSED, |
| 78 | hb_codepoint_t glyph, |
Behdad Esfahbod | 744970a | 2011-05-16 18:15:37 -0400 | [diff] [blame] | 79 | void *user_data HB_UNUSED) |
| 80 | { |
Behdad Esfahbod | 2d8ebcb | 2011-05-25 11:27:33 -0400 | [diff] [blame] | 81 | if (font->parent) |
Behdad Esfahbod | 4c8ac4f | 2012-08-08 17:44:19 -0400 | [diff] [blame] | 82 | return font->parent_scale_y_distance (font->parent->get_glyph_v_advance (glyph)); |
Behdad Esfahbod | 744970a | 2011-05-16 18:15:37 -0400 | [diff] [blame] | 83 | |
Behdad Esfahbod | 2d8ebcb | 2011-05-25 11:27:33 -0400 | [diff] [blame] | 84 | return font->y_scale; |
Behdad Esfahbod | 744970a | 2011-05-16 18:15:37 -0400 | [diff] [blame] | 85 | } |
| 86 | |
| 87 | static hb_bool_t |
Behdad Esfahbod | bce0955 | 2012-05-27 11:29:21 -0400 | [diff] [blame] | 88 | hb_font_get_glyph_h_origin_nil (hb_font_t *font, |
Behdad Esfahbod | 7e2c85d | 2011-05-17 17:55:03 -0400 | [diff] [blame] | 89 | void *font_data HB_UNUSED, |
| 90 | hb_codepoint_t glyph, |
Behdad Esfahbod | 1909818 | 2011-05-17 23:27:22 -0400 | [diff] [blame] | 91 | hb_position_t *x, |
| 92 | hb_position_t *y, |
Behdad Esfahbod | 7e2c85d | 2011-05-17 17:55:03 -0400 | [diff] [blame] | 93 | void *user_data HB_UNUSED) |
| 94 | { |
| 95 | if (font->parent) { |
Behdad Esfahbod | 4c8ac4f | 2012-08-08 17:44:19 -0400 | [diff] [blame] | 96 | hb_bool_t ret = font->parent->get_glyph_h_origin (glyph, x, y); |
Behdad Esfahbod | 60fbb36 | 2011-05-19 18:46:15 -0400 | [diff] [blame] | 97 | if (ret) |
| 98 | font->parent_scale_position (x, y); |
Behdad Esfahbod | 7e2c85d | 2011-05-17 17:55:03 -0400 | [diff] [blame] | 99 | return ret; |
| 100 | } |
| 101 | |
Behdad Esfahbod | 1909818 | 2011-05-17 23:27:22 -0400 | [diff] [blame] | 102 | *x = *y = 0; |
Behdad Esfahbod | 0594a24 | 2012-06-05 20:35:40 -0400 | [diff] [blame] | 103 | return false; |
Behdad Esfahbod | 7e2c85d | 2011-05-17 17:55:03 -0400 | [diff] [blame] | 104 | } |
| 105 | |
| 106 | static hb_bool_t |
Behdad Esfahbod | bce0955 | 2012-05-27 11:29:21 -0400 | [diff] [blame] | 107 | hb_font_get_glyph_v_origin_nil (hb_font_t *font, |
Behdad Esfahbod | 744970a | 2011-05-16 18:15:37 -0400 | [diff] [blame] | 108 | void *font_data HB_UNUSED, |
| 109 | hb_codepoint_t glyph, |
Behdad Esfahbod | 1909818 | 2011-05-17 23:27:22 -0400 | [diff] [blame] | 110 | hb_position_t *x, |
| 111 | hb_position_t *y, |
Behdad Esfahbod | 744970a | 2011-05-16 18:15:37 -0400 | [diff] [blame] | 112 | void *user_data HB_UNUSED) |
| 113 | { |
| 114 | if (font->parent) { |
Behdad Esfahbod | 4c8ac4f | 2012-08-08 17:44:19 -0400 | [diff] [blame] | 115 | hb_bool_t ret = font->parent->get_glyph_v_origin (glyph, x, y); |
Behdad Esfahbod | 60fbb36 | 2011-05-19 18:46:15 -0400 | [diff] [blame] | 116 | if (ret) |
| 117 | font->parent_scale_position (x, y); |
Behdad Esfahbod | 744970a | 2011-05-16 18:15:37 -0400 | [diff] [blame] | 118 | return ret; |
| 119 | } |
| 120 | |
Behdad Esfahbod | 1909818 | 2011-05-17 23:27:22 -0400 | [diff] [blame] | 121 | *x = *y = 0; |
Behdad Esfahbod | 0594a24 | 2012-06-05 20:35:40 -0400 | [diff] [blame] | 122 | return false; |
Behdad Esfahbod | 744970a | 2011-05-16 18:15:37 -0400 | [diff] [blame] | 123 | } |
| 124 | |
Behdad Esfahbod | 2d8ebcb | 2011-05-25 11:27:33 -0400 | [diff] [blame] | 125 | static hb_position_t |
Behdad Esfahbod | bce0955 | 2012-05-27 11:29:21 -0400 | [diff] [blame] | 126 | hb_font_get_glyph_h_kerning_nil (hb_font_t *font, |
Behdad Esfahbod | 7e2c85d | 2011-05-17 17:55:03 -0400 | [diff] [blame] | 127 | void *font_data HB_UNUSED, |
| 128 | hb_codepoint_t left_glyph, |
| 129 | hb_codepoint_t right_glyph, |
Behdad Esfahbod | 7e2c85d | 2011-05-17 17:55:03 -0400 | [diff] [blame] | 130 | void *user_data HB_UNUSED) |
Behdad Esfahbod | 744970a | 2011-05-16 18:15:37 -0400 | [diff] [blame] | 131 | { |
Behdad Esfahbod | 2d8ebcb | 2011-05-25 11:27:33 -0400 | [diff] [blame] | 132 | if (font->parent) |
Behdad Esfahbod | 4c8ac4f | 2012-08-08 17:44:19 -0400 | [diff] [blame] | 133 | return font->parent_scale_x_distance (font->parent->get_glyph_h_kerning (left_glyph, right_glyph)); |
Behdad Esfahbod | 1ded6d8 | 2011-05-10 20:49:02 -0400 | [diff] [blame] | 134 | |
Behdad Esfahbod | 2d8ebcb | 2011-05-25 11:27:33 -0400 | [diff] [blame] | 135 | return 0; |
Behdad Esfahbod | 744970a | 2011-05-16 18:15:37 -0400 | [diff] [blame] | 136 | } |
| 137 | |
Behdad Esfahbod | 2d8ebcb | 2011-05-25 11:27:33 -0400 | [diff] [blame] | 138 | static hb_position_t |
Behdad Esfahbod | bce0955 | 2012-05-27 11:29:21 -0400 | [diff] [blame] | 139 | hb_font_get_glyph_v_kerning_nil (hb_font_t *font, |
Behdad Esfahbod | 7e2c85d | 2011-05-17 17:55:03 -0400 | [diff] [blame] | 140 | void *font_data HB_UNUSED, |
| 141 | hb_codepoint_t top_glyph, |
| 142 | hb_codepoint_t bottom_glyph, |
Behdad Esfahbod | 7e2c85d | 2011-05-17 17:55:03 -0400 | [diff] [blame] | 143 | void *user_data HB_UNUSED) |
Behdad Esfahbod | 744970a | 2011-05-16 18:15:37 -0400 | [diff] [blame] | 144 | { |
Behdad Esfahbod | 2d8ebcb | 2011-05-25 11:27:33 -0400 | [diff] [blame] | 145 | if (font->parent) |
Behdad Esfahbod | 4c8ac4f | 2012-08-08 17:44:19 -0400 | [diff] [blame] | 146 | return font->parent_scale_y_distance (font->parent->get_glyph_v_kerning (top_glyph, bottom_glyph)); |
Behdad Esfahbod | 744970a | 2011-05-16 18:15:37 -0400 | [diff] [blame] | 147 | |
Behdad Esfahbod | 2d8ebcb | 2011-05-25 11:27:33 -0400 | [diff] [blame] | 148 | return 0; |
Behdad Esfahbod | 744970a | 2011-05-16 18:15:37 -0400 | [diff] [blame] | 149 | } |
| 150 | |
| 151 | static hb_bool_t |
Behdad Esfahbod | bce0955 | 2012-05-27 11:29:21 -0400 | [diff] [blame] | 152 | hb_font_get_glyph_extents_nil (hb_font_t *font, |
Behdad Esfahbod | 744970a | 2011-05-16 18:15:37 -0400 | [diff] [blame] | 153 | void *font_data HB_UNUSED, |
| 154 | hb_codepoint_t glyph, |
Behdad Esfahbod | 744970a | 2011-05-16 18:15:37 -0400 | [diff] [blame] | 155 | hb_glyph_extents_t *extents, |
| 156 | void *user_data HB_UNUSED) |
| 157 | { |
| 158 | if (font->parent) { |
Behdad Esfahbod | 4c8ac4f | 2012-08-08 17:44:19 -0400 | [diff] [blame] | 159 | hb_bool_t ret = font->parent->get_glyph_extents (glyph, extents); |
Behdad Esfahbod | 60fbb36 | 2011-05-19 18:46:15 -0400 | [diff] [blame] | 160 | if (ret) { |
| 161 | font->parent_scale_position (&extents->x_bearing, &extents->y_bearing); |
| 162 | font->parent_scale_distance (&extents->width, &extents->height); |
| 163 | } |
Behdad Esfahbod | 744970a | 2011-05-16 18:15:37 -0400 | [diff] [blame] | 164 | return ret; |
| 165 | } |
| 166 | |
Behdad Esfahbod | 60fbb36 | 2011-05-19 18:46:15 -0400 | [diff] [blame] | 167 | memset (extents, 0, sizeof (*extents)); |
Behdad Esfahbod | 0594a24 | 2012-06-05 20:35:40 -0400 | [diff] [blame] | 168 | return false; |
Behdad Esfahbod | 744970a | 2011-05-16 18:15:37 -0400 | [diff] [blame] | 169 | } |
| 170 | |
| 171 | static hb_bool_t |
Behdad Esfahbod | bce0955 | 2012-05-27 11:29:21 -0400 | [diff] [blame] | 172 | hb_font_get_glyph_contour_point_nil (hb_font_t *font, |
Behdad Esfahbod | 7e2c85d | 2011-05-17 17:55:03 -0400 | [diff] [blame] | 173 | void *font_data HB_UNUSED, |
| 174 | hb_codepoint_t glyph, |
| 175 | unsigned int point_index, |
| 176 | hb_position_t *x, |
| 177 | hb_position_t *y, |
| 178 | void *user_data HB_UNUSED) |
Behdad Esfahbod | 744970a | 2011-05-16 18:15:37 -0400 | [diff] [blame] | 179 | { |
| 180 | if (font->parent) { |
Behdad Esfahbod | 4c8ac4f | 2012-08-08 17:44:19 -0400 | [diff] [blame] | 181 | hb_bool_t ret = font->parent->get_glyph_contour_point (glyph, point_index, x, y); |
Behdad Esfahbod | 60fbb36 | 2011-05-19 18:46:15 -0400 | [diff] [blame] | 182 | if (ret) |
| 183 | font->parent_scale_position (x, y); |
Behdad Esfahbod | 744970a | 2011-05-16 18:15:37 -0400 | [diff] [blame] | 184 | return ret; |
| 185 | } |
| 186 | |
| 187 | *x = *y = 0; |
Behdad Esfahbod | 0594a24 | 2012-06-05 20:35:40 -0400 | [diff] [blame] | 188 | return false; |
Behdad Esfahbod | 1ded6d8 | 2011-05-10 20:49:02 -0400 | [diff] [blame] | 189 | } |
Behdad Esfahbod | 7951279 | 2009-11-03 20:27:05 -0500 | [diff] [blame] | 190 | |
Behdad Esfahbod | bce0955 | 2012-05-27 11:29:21 -0400 | [diff] [blame] | 191 | static hb_bool_t |
| 192 | hb_font_get_glyph_name_nil (hb_font_t *font, |
| 193 | void *font_data HB_UNUSED, |
| 194 | hb_codepoint_t glyph, |
| 195 | char *name, unsigned int size, |
| 196 | void *user_data HB_UNUSED) |
| 197 | { |
| 198 | if (font->parent) |
Behdad Esfahbod | 4c8ac4f | 2012-08-08 17:44:19 -0400 | [diff] [blame] | 199 | return font->parent->get_glyph_name (glyph, name, size); |
Behdad Esfahbod | bce0955 | 2012-05-27 11:29:21 -0400 | [diff] [blame] | 200 | |
Behdad Esfahbod | 6f3a300 | 2012-08-07 22:13:25 -0400 | [diff] [blame] | 201 | if (size) *name = '\0'; |
Behdad Esfahbod | 0594a24 | 2012-06-05 20:35:40 -0400 | [diff] [blame] | 202 | return false; |
Behdad Esfahbod | bce0955 | 2012-05-27 11:29:21 -0400 | [diff] [blame] | 203 | } |
| 204 | |
| 205 | static hb_bool_t |
| 206 | hb_font_get_glyph_from_name_nil (hb_font_t *font, |
| 207 | void *font_data HB_UNUSED, |
| 208 | const char *name, int len, /* -1 means nul-terminated */ |
| 209 | hb_codepoint_t *glyph, |
| 210 | void *user_data HB_UNUSED) |
| 211 | { |
| 212 | if (font->parent) |
Behdad Esfahbod | 4c8ac4f | 2012-08-08 17:44:19 -0400 | [diff] [blame] | 213 | return font->parent->get_glyph_from_name (name, len, glyph); |
Behdad Esfahbod | bce0955 | 2012-05-27 11:29:21 -0400 | [diff] [blame] | 214 | |
| 215 | *glyph = 0; |
Behdad Esfahbod | 0594a24 | 2012-06-05 20:35:40 -0400 | [diff] [blame] | 216 | return false; |
Behdad Esfahbod | bce0955 | 2012-05-27 11:29:21 -0400 | [diff] [blame] | 217 | } |
| 218 | |
Behdad Esfahbod | 56eb5ad | 2011-05-04 19:27:37 -0400 | [diff] [blame] | 219 | |
Behdad Esfahbod | f06ab8a | 2012-06-05 12:31:51 -0400 | [diff] [blame] | 220 | static const hb_font_funcs_t _hb_font_funcs_nil = { |
Behdad Esfahbod | fca368c | 2011-04-21 18:24:02 -0400 | [diff] [blame] | 221 | HB_OBJECT_HEADER_STATIC, |
| 222 | |
Behdad Esfahbod | 0594a24 | 2012-06-05 20:35:40 -0400 | [diff] [blame] | 223 | true, /* immutable */ |
Behdad Esfahbod | b9d975b | 2011-05-10 20:41:13 -0400 | [diff] [blame] | 224 | |
Behdad Esfahbod | bf36a10 | 2010-05-24 17:46:21 +0100 | [diff] [blame] | 225 | { |
Behdad Esfahbod | 744970a | 2011-05-16 18:15:37 -0400 | [diff] [blame] | 226 | #define HB_FONT_FUNC_IMPLEMENT(name) hb_font_get_##name##_nil, |
| 227 | HB_FONT_FUNCS_IMPLEMENT_CALLBACKS |
| 228 | #undef HB_FONT_FUNC_IMPLEMENT |
Behdad Esfahbod | bf36a10 | 2010-05-24 17:46:21 +0100 | [diff] [blame] | 229 | } |
Behdad Esfahbod | c62b503 | 2009-08-01 19:54:49 -0400 | [diff] [blame] | 230 | }; |
| 231 | |
Behdad Esfahbod | 56eb5ad | 2011-05-04 19:27:37 -0400 | [diff] [blame] | 232 | |
Behdad Esfahbod | 5c44188 | 2009-08-10 20:05:16 -0400 | [diff] [blame] | 233 | hb_font_funcs_t * |
| 234 | hb_font_funcs_create (void) |
Behdad Esfahbod | c62b503 | 2009-08-01 19:54:49 -0400 | [diff] [blame] | 235 | { |
Behdad Esfahbod | 5c44188 | 2009-08-10 20:05:16 -0400 | [diff] [blame] | 236 | hb_font_funcs_t *ffuncs; |
Behdad Esfahbod | c62b503 | 2009-08-01 19:54:49 -0400 | [diff] [blame] | 237 | |
Behdad Esfahbod | 47e71d9 | 2011-04-27 16:38:03 -0400 | [diff] [blame] | 238 | if (!(ffuncs = hb_object_create<hb_font_funcs_t> ())) |
Behdad Esfahbod | f06ab8a | 2012-06-05 12:31:51 -0400 | [diff] [blame] | 239 | return hb_font_funcs_get_empty (); |
Behdad Esfahbod | c62b503 | 2009-08-01 19:54:49 -0400 | [diff] [blame] | 240 | |
Behdad Esfahbod | b9d975b | 2011-05-10 20:41:13 -0400 | [diff] [blame] | 241 | ffuncs->get = _hb_font_funcs_nil.get; |
Behdad Esfahbod | f97bf4f | 2010-05-24 17:50:19 +0100 | [diff] [blame] | 242 | |
Behdad Esfahbod | 5c44188 | 2009-08-10 20:05:16 -0400 | [diff] [blame] | 243 | return ffuncs; |
Behdad Esfahbod | c62b503 | 2009-08-01 19:54:49 -0400 | [diff] [blame] | 244 | } |
| 245 | |
Behdad Esfahbod | 5c44188 | 2009-08-10 20:05:16 -0400 | [diff] [blame] | 246 | hb_font_funcs_t * |
Behdad Esfahbod | 80a6833 | 2011-05-11 18:14:44 -0400 | [diff] [blame] | 247 | hb_font_funcs_get_empty (void) |
| 248 | { |
Behdad Esfahbod | f06ab8a | 2012-06-05 12:31:51 -0400 | [diff] [blame] | 249 | return const_cast<hb_font_funcs_t *> (&_hb_font_funcs_nil); |
Behdad Esfahbod | 80a6833 | 2011-05-11 18:14:44 -0400 | [diff] [blame] | 250 | } |
| 251 | |
| 252 | hb_font_funcs_t * |
Behdad Esfahbod | 5c44188 | 2009-08-10 20:05:16 -0400 | [diff] [blame] | 253 | hb_font_funcs_reference (hb_font_funcs_t *ffuncs) |
Behdad Esfahbod | c62b503 | 2009-08-01 19:54:49 -0400 | [diff] [blame] | 254 | { |
Behdad Esfahbod | 47e71d9 | 2011-04-27 16:38:03 -0400 | [diff] [blame] | 255 | return hb_object_reference (ffuncs); |
Behdad Esfahbod | c62b503 | 2009-08-01 19:54:49 -0400 | [diff] [blame] | 256 | } |
| 257 | |
| 258 | void |
Behdad Esfahbod | 5c44188 | 2009-08-10 20:05:16 -0400 | [diff] [blame] | 259 | hb_font_funcs_destroy (hb_font_funcs_t *ffuncs) |
Behdad Esfahbod | c62b503 | 2009-08-01 19:54:49 -0400 | [diff] [blame] | 260 | { |
Behdad Esfahbod | 47e71d9 | 2011-04-27 16:38:03 -0400 | [diff] [blame] | 261 | if (!hb_object_destroy (ffuncs)) return; |
Behdad Esfahbod | c62b503 | 2009-08-01 19:54:49 -0400 | [diff] [blame] | 262 | |
Behdad Esfahbod | 4b6317c | 2011-07-07 23:14:42 -0400 | [diff] [blame] | 263 | #define HB_FONT_FUNC_IMPLEMENT(name) if (ffuncs->destroy.name) \ |
| 264 | ffuncs->destroy.name (ffuncs->user_data.name); |
Behdad Esfahbod | 744970a | 2011-05-16 18:15:37 -0400 | [diff] [blame] | 265 | HB_FONT_FUNCS_IMPLEMENT_CALLBACKS |
| 266 | #undef HB_FONT_FUNC_IMPLEMENT |
Behdad Esfahbod | b9d975b | 2011-05-10 20:41:13 -0400 | [diff] [blame] | 267 | |
Behdad Esfahbod | 5c44188 | 2009-08-10 20:05:16 -0400 | [diff] [blame] | 268 | free (ffuncs); |
Behdad Esfahbod | c62b503 | 2009-08-01 19:54:49 -0400 | [diff] [blame] | 269 | } |
| 270 | |
Behdad Esfahbod | 5fa849b | 2011-04-27 21:46:01 -0400 | [diff] [blame] | 271 | hb_bool_t |
| 272 | hb_font_funcs_set_user_data (hb_font_funcs_t *ffuncs, |
| 273 | hb_user_data_key_t *key, |
| 274 | void * data, |
Behdad Esfahbod | 33ccc77 | 2011-08-09 00:43:24 +0200 | [diff] [blame] | 275 | hb_destroy_func_t destroy, |
| 276 | hb_bool_t replace) |
Behdad Esfahbod | 5fa849b | 2011-04-27 21:46:01 -0400 | [diff] [blame] | 277 | { |
Behdad Esfahbod | 33ccc77 | 2011-08-09 00:43:24 +0200 | [diff] [blame] | 278 | return hb_object_set_user_data (ffuncs, key, data, destroy, replace); |
Behdad Esfahbod | 5fa849b | 2011-04-27 21:46:01 -0400 | [diff] [blame] | 279 | } |
| 280 | |
| 281 | void * |
| 282 | hb_font_funcs_get_user_data (hb_font_funcs_t *ffuncs, |
| 283 | hb_user_data_key_t *key) |
| 284 | { |
| 285 | return hb_object_get_user_data (ffuncs, key); |
| 286 | } |
| 287 | |
| 288 | |
Behdad Esfahbod | 8d70312 | 2009-08-10 23:50:51 -0400 | [diff] [blame] | 289 | void |
| 290 | hb_font_funcs_make_immutable (hb_font_funcs_t *ffuncs) |
| 291 | { |
Behdad Esfahbod | 47e71d9 | 2011-04-27 16:38:03 -0400 | [diff] [blame] | 292 | if (hb_object_is_inert (ffuncs)) |
Behdad Esfahbod | 8d70312 | 2009-08-10 23:50:51 -0400 | [diff] [blame] | 293 | return; |
| 294 | |
Behdad Esfahbod | 0594a24 | 2012-06-05 20:35:40 -0400 | [diff] [blame] | 295 | ffuncs->immutable = true; |
Behdad Esfahbod | 8d70312 | 2009-08-10 23:50:51 -0400 | [diff] [blame] | 296 | } |
| 297 | |
Behdad Esfahbod | 645f6f2 | 2010-10-04 17:01:01 -0400 | [diff] [blame] | 298 | hb_bool_t |
| 299 | hb_font_funcs_is_immutable (hb_font_funcs_t *ffuncs) |
| 300 | { |
Behdad Esfahbod | 3111b8a | 2010-10-13 10:41:53 -0400 | [diff] [blame] | 301 | return ffuncs->immutable; |
Behdad Esfahbod | 645f6f2 | 2010-10-04 17:01:01 -0400 | [diff] [blame] | 302 | } |
| 303 | |
Behdad Esfahbod | c62b503 | 2009-08-01 19:54:49 -0400 | [diff] [blame] | 304 | |
Behdad Esfahbod | 744970a | 2011-05-16 18:15:37 -0400 | [diff] [blame] | 305 | #define HB_FONT_FUNC_IMPLEMENT(name) \ |
Behdad Esfahbod | b9d975b | 2011-05-10 20:41:13 -0400 | [diff] [blame] | 306 | \ |
| 307 | void \ |
| 308 | hb_font_funcs_set_##name##_func (hb_font_funcs_t *ffuncs, \ |
| 309 | hb_font_get_##name##_func_t func, \ |
| 310 | void *user_data, \ |
| 311 | hb_destroy_func_t destroy) \ |
| 312 | { \ |
Behdad Esfahbod | 0cd3359 | 2011-09-21 16:49:33 -0400 | [diff] [blame] | 313 | if (ffuncs->immutable) { \ |
| 314 | if (destroy) \ |
| 315 | destroy (user_data); \ |
Behdad Esfahbod | b9d975b | 2011-05-10 20:41:13 -0400 | [diff] [blame] | 316 | return; \ |
Behdad Esfahbod | 0cd3359 | 2011-09-21 16:49:33 -0400 | [diff] [blame] | 317 | } \ |
Behdad Esfahbod | b9d975b | 2011-05-10 20:41:13 -0400 | [diff] [blame] | 318 | \ |
| 319 | if (ffuncs->destroy.name) \ |
| 320 | ffuncs->destroy.name (ffuncs->user_data.name); \ |
| 321 | \ |
| 322 | if (func) { \ |
| 323 | ffuncs->get.name = func; \ |
| 324 | ffuncs->user_data.name = user_data; \ |
| 325 | ffuncs->destroy.name = destroy; \ |
| 326 | } else { \ |
| 327 | ffuncs->get.name = hb_font_get_##name##_nil; \ |
| 328 | ffuncs->user_data.name = NULL; \ |
| 329 | ffuncs->destroy.name = NULL; \ |
| 330 | } \ |
Behdad Esfahbod | 7951279 | 2009-11-03 20:27:05 -0500 | [diff] [blame] | 331 | } |
| 332 | |
Behdad Esfahbod | 744970a | 2011-05-16 18:15:37 -0400 | [diff] [blame] | 333 | HB_FONT_FUNCS_IMPLEMENT_CALLBACKS |
| 334 | #undef HB_FONT_FUNC_IMPLEMENT |
Behdad Esfahbod | b9d975b | 2011-05-10 20:41:13 -0400 | [diff] [blame] | 335 | |
Behdad Esfahbod | 502f4cb | 2010-10-27 01:13:56 -0400 | [diff] [blame] | 336 | |
Behdad Esfahbod | 8fbfda9 | 2012-08-01 19:03:46 -0400 | [diff] [blame] | 337 | /* Public getters */ |
| 338 | |
Behdad Esfahbod | 0fd8c2f | 2011-05-12 15:14:13 -0400 | [diff] [blame] | 339 | hb_bool_t |
Behdad Esfahbod | b9d975b | 2011-05-10 20:41:13 -0400 | [diff] [blame] | 340 | hb_font_get_glyph (hb_font_t *font, |
Behdad Esfahbod | 0fd8c2f | 2011-05-12 15:14:13 -0400 | [diff] [blame] | 341 | hb_codepoint_t unicode, hb_codepoint_t variation_selector, |
| 342 | hb_codepoint_t *glyph) |
Behdad Esfahbod | 2e33669 | 2009-11-05 13:55:41 -0500 | [diff] [blame] | 343 | { |
Behdad Esfahbod | 8fbfda9 | 2012-08-01 19:03:46 -0400 | [diff] [blame] | 344 | return font->get_glyph (unicode, variation_selector, glyph); |
Behdad Esfahbod | 2e33669 | 2009-11-05 13:55:41 -0500 | [diff] [blame] | 345 | } |
| 346 | |
Behdad Esfahbod | 2d8ebcb | 2011-05-25 11:27:33 -0400 | [diff] [blame] | 347 | hb_position_t |
Behdad Esfahbod | 744970a | 2011-05-16 18:15:37 -0400 | [diff] [blame] | 348 | hb_font_get_glyph_h_advance (hb_font_t *font, |
Behdad Esfahbod | 2d8ebcb | 2011-05-25 11:27:33 -0400 | [diff] [blame] | 349 | hb_codepoint_t glyph) |
Behdad Esfahbod | 744970a | 2011-05-16 18:15:37 -0400 | [diff] [blame] | 350 | { |
Behdad Esfahbod | 8fbfda9 | 2012-08-01 19:03:46 -0400 | [diff] [blame] | 351 | return font->get_glyph_h_advance (glyph); |
Behdad Esfahbod | 744970a | 2011-05-16 18:15:37 -0400 | [diff] [blame] | 352 | } |
| 353 | |
Behdad Esfahbod | 2d8ebcb | 2011-05-25 11:27:33 -0400 | [diff] [blame] | 354 | hb_position_t |
Behdad Esfahbod | 744970a | 2011-05-16 18:15:37 -0400 | [diff] [blame] | 355 | hb_font_get_glyph_v_advance (hb_font_t *font, |
Behdad Esfahbod | 2d8ebcb | 2011-05-25 11:27:33 -0400 | [diff] [blame] | 356 | hb_codepoint_t glyph) |
Behdad Esfahbod | 744970a | 2011-05-16 18:15:37 -0400 | [diff] [blame] | 357 | { |
Behdad Esfahbod | 8fbfda9 | 2012-08-01 19:03:46 -0400 | [diff] [blame] | 358 | return font->get_glyph_v_advance (glyph); |
Behdad Esfahbod | 744970a | 2011-05-16 18:15:37 -0400 | [diff] [blame] | 359 | } |
| 360 | |
| 361 | hb_bool_t |
Behdad Esfahbod | 7e2c85d | 2011-05-17 17:55:03 -0400 | [diff] [blame] | 362 | hb_font_get_glyph_h_origin (hb_font_t *font, |
| 363 | hb_codepoint_t glyph, |
Behdad Esfahbod | 1909818 | 2011-05-17 23:27:22 -0400 | [diff] [blame] | 364 | hb_position_t *x, hb_position_t *y) |
Behdad Esfahbod | 7e2c85d | 2011-05-17 17:55:03 -0400 | [diff] [blame] | 365 | { |
Behdad Esfahbod | 8fbfda9 | 2012-08-01 19:03:46 -0400 | [diff] [blame] | 366 | return font->get_glyph_h_origin (glyph, x, y); |
Behdad Esfahbod | 7e2c85d | 2011-05-17 17:55:03 -0400 | [diff] [blame] | 367 | } |
| 368 | |
| 369 | hb_bool_t |
Behdad Esfahbod | 744970a | 2011-05-16 18:15:37 -0400 | [diff] [blame] | 370 | hb_font_get_glyph_v_origin (hb_font_t *font, |
| 371 | hb_codepoint_t glyph, |
Behdad Esfahbod | 1909818 | 2011-05-17 23:27:22 -0400 | [diff] [blame] | 372 | hb_position_t *x, hb_position_t *y) |
Behdad Esfahbod | 744970a | 2011-05-16 18:15:37 -0400 | [diff] [blame] | 373 | { |
Behdad Esfahbod | 8fbfda9 | 2012-08-01 19:03:46 -0400 | [diff] [blame] | 374 | return font->get_glyph_v_origin (glyph, x, y); |
Behdad Esfahbod | 744970a | 2011-05-16 18:15:37 -0400 | [diff] [blame] | 375 | } |
| 376 | |
Behdad Esfahbod | 2d8ebcb | 2011-05-25 11:27:33 -0400 | [diff] [blame] | 377 | hb_position_t |
Behdad Esfahbod | 7e2c85d | 2011-05-17 17:55:03 -0400 | [diff] [blame] | 378 | hb_font_get_glyph_h_kerning (hb_font_t *font, |
Behdad Esfahbod | 2d8ebcb | 2011-05-25 11:27:33 -0400 | [diff] [blame] | 379 | hb_codepoint_t left_glyph, hb_codepoint_t right_glyph) |
Behdad Esfahbod | 2e33669 | 2009-11-05 13:55:41 -0500 | [diff] [blame] | 380 | { |
Behdad Esfahbod | 8fbfda9 | 2012-08-01 19:03:46 -0400 | [diff] [blame] | 381 | return font->get_glyph_h_kerning (left_glyph, right_glyph); |
Behdad Esfahbod | 744970a | 2011-05-16 18:15:37 -0400 | [diff] [blame] | 382 | } |
| 383 | |
Behdad Esfahbod | 2d8ebcb | 2011-05-25 11:27:33 -0400 | [diff] [blame] | 384 | hb_position_t |
Behdad Esfahbod | 7e2c85d | 2011-05-17 17:55:03 -0400 | [diff] [blame] | 385 | hb_font_get_glyph_v_kerning (hb_font_t *font, |
Behdad Esfahbod | 2d8ebcb | 2011-05-25 11:27:33 -0400 | [diff] [blame] | 386 | hb_codepoint_t left_glyph, hb_codepoint_t right_glyph) |
Behdad Esfahbod | 744970a | 2011-05-16 18:15:37 -0400 | [diff] [blame] | 387 | { |
Behdad Esfahbod | 8fbfda9 | 2012-08-01 19:03:46 -0400 | [diff] [blame] | 388 | return font->get_glyph_v_kerning (left_glyph, right_glyph); |
Behdad Esfahbod | 744970a | 2011-05-16 18:15:37 -0400 | [diff] [blame] | 389 | } |
| 390 | |
| 391 | hb_bool_t |
| 392 | hb_font_get_glyph_extents (hb_font_t *font, |
| 393 | hb_codepoint_t glyph, |
Behdad Esfahbod | 744970a | 2011-05-16 18:15:37 -0400 | [diff] [blame] | 394 | hb_glyph_extents_t *extents) |
| 395 | { |
Behdad Esfahbod | 8fbfda9 | 2012-08-01 19:03:46 -0400 | [diff] [blame] | 396 | return font->get_glyph_extents (glyph, extents); |
Behdad Esfahbod | 744970a | 2011-05-16 18:15:37 -0400 | [diff] [blame] | 397 | } |
| 398 | |
| 399 | hb_bool_t |
Behdad Esfahbod | 7e2c85d | 2011-05-17 17:55:03 -0400 | [diff] [blame] | 400 | hb_font_get_glyph_contour_point (hb_font_t *font, |
| 401 | hb_codepoint_t glyph, unsigned int point_index, |
| 402 | hb_position_t *x, hb_position_t *y) |
Behdad Esfahbod | 744970a | 2011-05-16 18:15:37 -0400 | [diff] [blame] | 403 | { |
Behdad Esfahbod | 8fbfda9 | 2012-08-01 19:03:46 -0400 | [diff] [blame] | 404 | return font->get_glyph_contour_point (glyph, point_index, x, y); |
Behdad Esfahbod | 744970a | 2011-05-16 18:15:37 -0400 | [diff] [blame] | 405 | } |
| 406 | |
Behdad Esfahbod | bce0955 | 2012-05-27 11:29:21 -0400 | [diff] [blame] | 407 | hb_bool_t |
| 408 | hb_font_get_glyph_name (hb_font_t *font, |
| 409 | hb_codepoint_t glyph, |
| 410 | char *name, unsigned int size) |
| 411 | { |
Behdad Esfahbod | 6f3a300 | 2012-08-07 22:13:25 -0400 | [diff] [blame] | 412 | return font->get_glyph_name (glyph, name, size); |
Behdad Esfahbod | bce0955 | 2012-05-27 11:29:21 -0400 | [diff] [blame] | 413 | } |
| 414 | |
| 415 | hb_bool_t |
| 416 | hb_font_get_glyph_from_name (hb_font_t *font, |
| 417 | const char *name, int len, /* -1 means nul-terminated */ |
| 418 | hb_codepoint_t *glyph) |
| 419 | { |
Behdad Esfahbod | 8fbfda9 | 2012-08-01 19:03:46 -0400 | [diff] [blame] | 420 | return font->get_glyph_from_name (name, len, glyph); |
Behdad Esfahbod | bce0955 | 2012-05-27 11:29:21 -0400 | [diff] [blame] | 421 | } |
| 422 | |
Behdad Esfahbod | 744970a | 2011-05-16 18:15:37 -0400 | [diff] [blame] | 423 | |
| 424 | /* A bit higher-level, and with fallback */ |
| 425 | |
| 426 | void |
| 427 | hb_font_get_glyph_advance_for_direction (hb_font_t *font, |
| 428 | hb_codepoint_t glyph, |
| 429 | hb_direction_t direction, |
Behdad Esfahbod | 1909818 | 2011-05-17 23:27:22 -0400 | [diff] [blame] | 430 | hb_position_t *x, hb_position_t *y) |
Behdad Esfahbod | 744970a | 2011-05-16 18:15:37 -0400 | [diff] [blame] | 431 | { |
Behdad Esfahbod | 8fbfda9 | 2012-08-01 19:03:46 -0400 | [diff] [blame] | 432 | return font->get_glyph_advance_for_direction (glyph, direction, x, y); |
Behdad Esfahbod | 744970a | 2011-05-16 18:15:37 -0400 | [diff] [blame] | 433 | } |
| 434 | |
| 435 | void |
Behdad Esfahbod | 7e2c85d | 2011-05-17 17:55:03 -0400 | [diff] [blame] | 436 | hb_font_get_glyph_origin_for_direction (hb_font_t *font, |
| 437 | hb_codepoint_t glyph, |
| 438 | hb_direction_t direction, |
Behdad Esfahbod | 1909818 | 2011-05-17 23:27:22 -0400 | [diff] [blame] | 439 | hb_position_t *x, hb_position_t *y) |
Behdad Esfahbod | 7e2c85d | 2011-05-17 17:55:03 -0400 | [diff] [blame] | 440 | { |
Behdad Esfahbod | 8fbfda9 | 2012-08-01 19:03:46 -0400 | [diff] [blame] | 441 | return font->get_glyph_origin_for_direction (glyph, direction, x, y); |
Behdad Esfahbod | 7e2c85d | 2011-05-17 17:55:03 -0400 | [diff] [blame] | 442 | } |
| 443 | |
| 444 | void |
Behdad Esfahbod | 8b38fae | 2011-05-19 13:08:00 -0400 | [diff] [blame] | 445 | hb_font_add_glyph_origin_for_direction (hb_font_t *font, |
| 446 | hb_codepoint_t glyph, |
| 447 | hb_direction_t direction, |
| 448 | hb_position_t *x, hb_position_t *y) |
| 449 | { |
Behdad Esfahbod | 8fbfda9 | 2012-08-01 19:03:46 -0400 | [diff] [blame] | 450 | return font->add_glyph_origin_for_direction (glyph, direction, x, y); |
Behdad Esfahbod | 8b38fae | 2011-05-19 13:08:00 -0400 | [diff] [blame] | 451 | } |
| 452 | |
| 453 | void |
| 454 | hb_font_subtract_glyph_origin_for_direction (hb_font_t *font, |
| 455 | hb_codepoint_t glyph, |
| 456 | hb_direction_t direction, |
| 457 | hb_position_t *x, hb_position_t *y) |
| 458 | { |
Behdad Esfahbod | 8fbfda9 | 2012-08-01 19:03:46 -0400 | [diff] [blame] | 459 | return font->subtract_glyph_origin_for_direction (glyph, direction, x, y); |
Behdad Esfahbod | 8b38fae | 2011-05-19 13:08:00 -0400 | [diff] [blame] | 460 | } |
| 461 | |
| 462 | void |
Behdad Esfahbod | 7e2c85d | 2011-05-17 17:55:03 -0400 | [diff] [blame] | 463 | hb_font_get_glyph_kerning_for_direction (hb_font_t *font, |
| 464 | hb_codepoint_t first_glyph, hb_codepoint_t second_glyph, |
| 465 | hb_direction_t direction, |
Behdad Esfahbod | 1909818 | 2011-05-17 23:27:22 -0400 | [diff] [blame] | 466 | hb_position_t *x, hb_position_t *y) |
Behdad Esfahbod | 744970a | 2011-05-16 18:15:37 -0400 | [diff] [blame] | 467 | { |
Behdad Esfahbod | 8fbfda9 | 2012-08-01 19:03:46 -0400 | [diff] [blame] | 468 | return font->get_glyph_kerning_for_direction (first_glyph, second_glyph, direction, x, y); |
Behdad Esfahbod | 744970a | 2011-05-16 18:15:37 -0400 | [diff] [blame] | 469 | } |
| 470 | |
Behdad Esfahbod | 60fbb36 | 2011-05-19 18:46:15 -0400 | [diff] [blame] | 471 | hb_bool_t |
| 472 | hb_font_get_glyph_extents_for_origin (hb_font_t *font, |
| 473 | hb_codepoint_t glyph, |
| 474 | hb_direction_t direction, |
| 475 | hb_glyph_extents_t *extents) |
Behdad Esfahbod | 744970a | 2011-05-16 18:15:37 -0400 | [diff] [blame] | 476 | { |
Behdad Esfahbod | 8fbfda9 | 2012-08-01 19:03:46 -0400 | [diff] [blame] | 477 | return font->get_glyph_extents_for_origin (glyph, direction, extents); |
Behdad Esfahbod | 744970a | 2011-05-16 18:15:37 -0400 | [diff] [blame] | 478 | } |
| 479 | |
| 480 | hb_bool_t |
Behdad Esfahbod | 60fbb36 | 2011-05-19 18:46:15 -0400 | [diff] [blame] | 481 | hb_font_get_glyph_contour_point_for_origin (hb_font_t *font, |
| 482 | hb_codepoint_t glyph, unsigned int point_index, |
| 483 | hb_direction_t direction, |
| 484 | hb_position_t *x, hb_position_t *y) |
Behdad Esfahbod | 744970a | 2011-05-16 18:15:37 -0400 | [diff] [blame] | 485 | { |
Behdad Esfahbod | 8fbfda9 | 2012-08-01 19:03:46 -0400 | [diff] [blame] | 486 | return font->get_glyph_contour_point_for_origin (glyph, point_index, direction, x, y); |
Behdad Esfahbod | 2e33669 | 2009-11-05 13:55:41 -0500 | [diff] [blame] | 487 | } |
| 488 | |
Behdad Esfahbod | 6f3a300 | 2012-08-07 22:13:25 -0400 | [diff] [blame] | 489 | /* Generates gidDDD if glyph has no name. */ |
| 490 | void |
| 491 | hb_font_glyph_to_string (hb_font_t *font, |
| 492 | hb_codepoint_t glyph, |
| 493 | char *s, unsigned int size) |
| 494 | { |
| 495 | font->glyph_to_string (glyph, s, size); |
| 496 | } |
| 497 | |
| 498 | /* Parses gidDDD and uniUUUU strings automatically. */ |
| 499 | hb_bool_t |
| 500 | hb_font_glyph_from_string (hb_font_t *font, |
| 501 | const char *s, int len, /* -1 means nul-terminated */ |
| 502 | hb_codepoint_t *glyph) |
| 503 | { |
| 504 | return font->glyph_from_string (s, len, glyph); |
| 505 | } |
| 506 | |
Behdad Esfahbod | 1cebfbb | 2010-04-23 20:49:18 -0400 | [diff] [blame] | 507 | |
Behdad Esfahbod | c62b503 | 2009-08-01 19:54:49 -0400 | [diff] [blame] | 508 | /* |
Behdad Esfahbod | c62b503 | 2009-08-01 19:54:49 -0400 | [diff] [blame] | 509 | * hb_font_t |
| 510 | */ |
| 511 | |
Behdad Esfahbod | c62b503 | 2009-08-01 19:54:49 -0400 | [diff] [blame] | 512 | hb_font_t * |
Behdad Esfahbod | 72657e4 | 2011-05-02 20:46:32 -0400 | [diff] [blame] | 513 | hb_font_create (hb_face_t *face) |
Behdad Esfahbod | c62b503 | 2009-08-01 19:54:49 -0400 | [diff] [blame] | 514 | { |
| 515 | hb_font_t *font; |
| 516 | |
Behdad Esfahbod | 72657e4 | 2011-05-02 20:46:32 -0400 | [diff] [blame] | 517 | if (unlikely (!face)) |
Behdad Esfahbod | f06ab8a | 2012-06-05 12:31:51 -0400 | [diff] [blame] | 518 | face = hb_face_get_empty (); |
Behdad Esfahbod | 72657e4 | 2011-05-02 20:46:32 -0400 | [diff] [blame] | 519 | if (unlikely (hb_object_is_inert (face))) |
Behdad Esfahbod | f06ab8a | 2012-06-05 12:31:51 -0400 | [diff] [blame] | 520 | return hb_font_get_empty (); |
Behdad Esfahbod | 47e71d9 | 2011-04-27 16:38:03 -0400 | [diff] [blame] | 521 | if (!(font = hb_object_create<hb_font_t> ())) |
Behdad Esfahbod | f06ab8a | 2012-06-05 12:31:51 -0400 | [diff] [blame] | 522 | return hb_font_get_empty (); |
Behdad Esfahbod | c62b503 | 2009-08-01 19:54:49 -0400 | [diff] [blame] | 523 | |
Behdad Esfahbod | 7fc5a30 | 2011-05-12 17:48:20 -0400 | [diff] [blame] | 524 | hb_face_make_immutable (face); |
Behdad Esfahbod | 72657e4 | 2011-05-02 20:46:32 -0400 | [diff] [blame] | 525 | font->face = hb_face_reference (face); |
Behdad Esfahbod | f06ab8a | 2012-06-05 12:31:51 -0400 | [diff] [blame] | 526 | font->klass = hb_font_funcs_get_empty (); |
Behdad Esfahbod | 85555a9 | 2009-11-05 18:25:56 -0500 | [diff] [blame] | 527 | |
Behdad Esfahbod | c62b503 | 2009-08-01 19:54:49 -0400 | [diff] [blame] | 528 | return font; |
| 529 | } |
| 530 | |
| 531 | hb_font_t * |
Behdad Esfahbod | defc45b | 2011-05-10 20:02:49 -0400 | [diff] [blame] | 532 | hb_font_create_sub_font (hb_font_t *parent) |
| 533 | { |
| 534 | if (unlikely (!parent)) |
Behdad Esfahbod | f06ab8a | 2012-06-05 12:31:51 -0400 | [diff] [blame] | 535 | return hb_font_get_empty (); |
Behdad Esfahbod | defc45b | 2011-05-10 20:02:49 -0400 | [diff] [blame] | 536 | |
| 537 | hb_font_t *font = hb_font_create (parent->face); |
| 538 | |
| 539 | if (unlikely (hb_object_is_inert (font))) |
| 540 | return font; |
| 541 | |
| 542 | hb_font_make_immutable (parent); |
| 543 | font->parent = hb_font_reference (parent); |
| 544 | |
| 545 | font->x_scale = parent->x_scale; |
| 546 | font->y_scale = parent->y_scale; |
| 547 | font->x_ppem = parent->x_ppem; |
| 548 | font->y_ppem = parent->y_ppem; |
| 549 | |
Behdad Esfahbod | defc45b | 2011-05-10 20:02:49 -0400 | [diff] [blame] | 550 | return font; |
| 551 | } |
| 552 | |
| 553 | hb_font_t * |
Behdad Esfahbod | 80a6833 | 2011-05-11 18:14:44 -0400 | [diff] [blame] | 554 | hb_font_get_empty (void) |
| 555 | { |
Behdad Esfahbod | f06ab8a | 2012-06-05 12:31:51 -0400 | [diff] [blame] | 556 | static const hb_font_t _hb_font_nil = { |
| 557 | HB_OBJECT_HEADER_STATIC, |
| 558 | |
Behdad Esfahbod | 0594a24 | 2012-06-05 20:35:40 -0400 | [diff] [blame] | 559 | true, /* immutable */ |
Behdad Esfahbod | f06ab8a | 2012-06-05 12:31:51 -0400 | [diff] [blame] | 560 | |
| 561 | NULL, /* parent */ |
| 562 | const_cast<hb_face_t *> (&_hb_face_nil), |
| 563 | |
| 564 | 0, /* x_scale */ |
| 565 | 0, /* y_scale */ |
| 566 | |
| 567 | 0, /* x_ppem */ |
| 568 | 0, /* y_ppem */ |
| 569 | |
| 570 | const_cast<hb_font_funcs_t *> (&_hb_font_funcs_nil), /* klass */ |
| 571 | NULL, /* user_data */ |
Behdad Esfahbod | ea278d3 | 2012-07-27 02:12:28 -0400 | [diff] [blame] | 572 | NULL, /* destroy */ |
| 573 | |
| 574 | { |
| 575 | #define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_INVALID, |
| 576 | #include "hb-shaper-list.hh" |
| 577 | #undef HB_SHAPER_IMPLEMENT |
| 578 | } |
Behdad Esfahbod | f06ab8a | 2012-06-05 12:31:51 -0400 | [diff] [blame] | 579 | }; |
| 580 | |
| 581 | return const_cast<hb_font_t *> (&_hb_font_nil); |
Behdad Esfahbod | 80a6833 | 2011-05-11 18:14:44 -0400 | [diff] [blame] | 582 | } |
| 583 | |
| 584 | hb_font_t * |
Behdad Esfahbod | c62b503 | 2009-08-01 19:54:49 -0400 | [diff] [blame] | 585 | hb_font_reference (hb_font_t *font) |
| 586 | { |
Behdad Esfahbod | 47e71d9 | 2011-04-27 16:38:03 -0400 | [diff] [blame] | 587 | return hb_object_reference (font); |
Behdad Esfahbod | c62b503 | 2009-08-01 19:54:49 -0400 | [diff] [blame] | 588 | } |
| 589 | |
Behdad Esfahbod | c62b503 | 2009-08-01 19:54:49 -0400 | [diff] [blame] | 590 | void |
| 591 | hb_font_destroy (hb_font_t *font) |
| 592 | { |
Behdad Esfahbod | 47e71d9 | 2011-04-27 16:38:03 -0400 | [diff] [blame] | 593 | if (!hb_object_destroy (font)) return; |
Behdad Esfahbod | c62b503 | 2009-08-01 19:54:49 -0400 | [diff] [blame] | 594 | |
Behdad Esfahbod | 027857d | 2012-07-26 17:34:25 -0400 | [diff] [blame] | 595 | #define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_DESTROY(shaper, font); |
| 596 | #include "hb-shaper-list.hh" |
| 597 | #undef HB_SHAPER_IMPLEMENT |
| 598 | |
| 599 | if (font->destroy) |
| 600 | font->destroy (font->user_data); |
| 601 | |
Behdad Esfahbod | defc45b | 2011-05-10 20:02:49 -0400 | [diff] [blame] | 602 | hb_font_destroy (font->parent); |
Behdad Esfahbod | 72657e4 | 2011-05-02 20:46:32 -0400 | [diff] [blame] | 603 | hb_face_destroy (font->face); |
Behdad Esfahbod | 5c44188 | 2009-08-10 20:05:16 -0400 | [diff] [blame] | 604 | hb_font_funcs_destroy (font->klass); |
Behdad Esfahbod | c62b503 | 2009-08-01 19:54:49 -0400 | [diff] [blame] | 605 | |
| 606 | free (font); |
| 607 | } |
| 608 | |
Behdad Esfahbod | 5fa849b | 2011-04-27 21:46:01 -0400 | [diff] [blame] | 609 | hb_bool_t |
| 610 | hb_font_set_user_data (hb_font_t *font, |
| 611 | hb_user_data_key_t *key, |
| 612 | void * data, |
Behdad Esfahbod | 33ccc77 | 2011-08-09 00:43:24 +0200 | [diff] [blame] | 613 | hb_destroy_func_t destroy, |
| 614 | hb_bool_t replace) |
Behdad Esfahbod | 5fa849b | 2011-04-27 21:46:01 -0400 | [diff] [blame] | 615 | { |
Behdad Esfahbod | 33ccc77 | 2011-08-09 00:43:24 +0200 | [diff] [blame] | 616 | return hb_object_set_user_data (font, key, data, destroy, replace); |
Behdad Esfahbod | 5fa849b | 2011-04-27 21:46:01 -0400 | [diff] [blame] | 617 | } |
| 618 | |
| 619 | void * |
| 620 | hb_font_get_user_data (hb_font_t *font, |
| 621 | hb_user_data_key_t *key) |
| 622 | { |
| 623 | return hb_object_get_user_data (font, key); |
| 624 | } |
| 625 | |
Behdad Esfahbod | 74f1d89 | 2011-05-10 19:39:32 -0400 | [diff] [blame] | 626 | void |
| 627 | hb_font_make_immutable (hb_font_t *font) |
| 628 | { |
| 629 | if (hb_object_is_inert (font)) |
| 630 | return; |
| 631 | |
| 632 | font->immutable = true; |
| 633 | } |
| 634 | |
| 635 | hb_bool_t |
| 636 | hb_font_is_immutable (hb_font_t *font) |
| 637 | { |
| 638 | return font->immutable; |
| 639 | } |
| 640 | |
Behdad Esfahbod | defc45b | 2011-05-10 20:02:49 -0400 | [diff] [blame] | 641 | hb_font_t * |
| 642 | hb_font_get_parent (hb_font_t *font) |
| 643 | { |
| 644 | return font->parent; |
| 645 | } |
Behdad Esfahbod | 5fa849b | 2011-04-27 21:46:01 -0400 | [diff] [blame] | 646 | |
Behdad Esfahbod | 72657e4 | 2011-05-02 20:46:32 -0400 | [diff] [blame] | 647 | hb_face_t * |
| 648 | hb_font_get_face (hb_font_t *font) |
| 649 | { |
| 650 | return font->face; |
| 651 | } |
| 652 | |
| 653 | |
Behdad Esfahbod | 5c44188 | 2009-08-10 20:05:16 -0400 | [diff] [blame] | 654 | void |
Behdad Esfahbod | 8fb3d1a | 2009-11-03 18:34:20 -0500 | [diff] [blame] | 655 | hb_font_set_funcs (hb_font_t *font, |
| 656 | hb_font_funcs_t *klass, |
Behdad Esfahbod | 5668189 | 2011-04-20 03:03:32 -0400 | [diff] [blame] | 657 | void *user_data, |
| 658 | hb_destroy_func_t destroy) |
Behdad Esfahbod | 0ead481 | 2009-08-02 17:41:36 -0400 | [diff] [blame] | 659 | { |
Behdad Esfahbod | 0cd3359 | 2011-09-21 16:49:33 -0400 | [diff] [blame] | 660 | if (font->immutable) { |
| 661 | if (destroy) |
| 662 | destroy (user_data); |
Behdad Esfahbod | 5c44188 | 2009-08-10 20:05:16 -0400 | [diff] [blame] | 663 | return; |
Behdad Esfahbod | 0cd3359 | 2011-09-21 16:49:33 -0400 | [diff] [blame] | 664 | } |
Behdad Esfahbod | 0ead481 | 2009-08-02 17:41:36 -0400 | [diff] [blame] | 665 | |
Behdad Esfahbod | 8fb3d1a | 2009-11-03 18:34:20 -0500 | [diff] [blame] | 666 | if (font->destroy) |
| 667 | font->destroy (font->user_data); |
| 668 | |
Behdad Esfahbod | 0465e69 | 2009-12-20 16:25:18 +0100 | [diff] [blame] | 669 | if (!klass) |
Behdad Esfahbod | f06ab8a | 2012-06-05 12:31:51 -0400 | [diff] [blame] | 670 | klass = hb_font_funcs_get_empty (); |
Behdad Esfahbod | 0465e69 | 2009-12-20 16:25:18 +0100 | [diff] [blame] | 671 | |
Behdad Esfahbod | 5c44188 | 2009-08-10 20:05:16 -0400 | [diff] [blame] | 672 | hb_font_funcs_reference (klass); |
| 673 | hb_font_funcs_destroy (font->klass); |
| 674 | font->klass = klass; |
Behdad Esfahbod | 8fb3d1a | 2009-11-03 18:34:20 -0500 | [diff] [blame] | 675 | font->user_data = user_data; |
Behdad Esfahbod | 5668189 | 2011-04-20 03:03:32 -0400 | [diff] [blame] | 676 | font->destroy = destroy; |
Behdad Esfahbod | 0ead481 | 2009-08-02 17:41:36 -0400 | [diff] [blame] | 677 | } |
| 678 | |
Behdad Esfahbod | b9415e7 | 2011-08-17 19:21:44 +0200 | [diff] [blame] | 679 | void |
| 680 | hb_font_set_funcs_data (hb_font_t *font, |
| 681 | void *user_data, |
| 682 | hb_destroy_func_t destroy) |
| 683 | { |
Behdad Esfahbod | 0cd3359 | 2011-09-21 16:49:33 -0400 | [diff] [blame] | 684 | /* Destroy user_data? */ |
| 685 | if (font->immutable) { |
| 686 | if (destroy) |
| 687 | destroy (user_data); |
Behdad Esfahbod | b9415e7 | 2011-08-17 19:21:44 +0200 | [diff] [blame] | 688 | return; |
Behdad Esfahbod | 0cd3359 | 2011-09-21 16:49:33 -0400 | [diff] [blame] | 689 | } |
Behdad Esfahbod | b9415e7 | 2011-08-17 19:21:44 +0200 | [diff] [blame] | 690 | |
| 691 | if (font->destroy) |
| 692 | font->destroy (font->user_data); |
| 693 | |
| 694 | font->user_data = user_data; |
| 695 | font->destroy = destroy; |
| 696 | } |
| 697 | |
Behdad Esfahbod | 19c0eab | 2010-10-04 16:45:21 -0400 | [diff] [blame] | 698 | |
| 699 | void |
Behdad Esfahbod | c62b503 | 2009-08-01 19:54:49 -0400 | [diff] [blame] | 700 | hb_font_set_scale (hb_font_t *font, |
Behdad Esfahbod | da97541 | 2011-04-21 15:08:01 -0400 | [diff] [blame] | 701 | int x_scale, |
| 702 | int y_scale) |
Behdad Esfahbod | c62b503 | 2009-08-01 19:54:49 -0400 | [diff] [blame] | 703 | { |
Behdad Esfahbod | 74f1d89 | 2011-05-10 19:39:32 -0400 | [diff] [blame] | 704 | if (font->immutable) |
Behdad Esfahbod | c62b503 | 2009-08-01 19:54:49 -0400 | [diff] [blame] | 705 | return; |
| 706 | |
| 707 | font->x_scale = x_scale; |
| 708 | font->y_scale = y_scale; |
| 709 | } |
| 710 | |
| 711 | void |
Behdad Esfahbod | 19c0eab | 2010-10-04 16:45:21 -0400 | [diff] [blame] | 712 | hb_font_get_scale (hb_font_t *font, |
Behdad Esfahbod | da97541 | 2011-04-21 15:08:01 -0400 | [diff] [blame] | 713 | int *x_scale, |
| 714 | int *y_scale) |
Behdad Esfahbod | 19c0eab | 2010-10-04 16:45:21 -0400 | [diff] [blame] | 715 | { |
| 716 | if (x_scale) *x_scale = font->x_scale; |
| 717 | if (y_scale) *y_scale = font->y_scale; |
| 718 | } |
| 719 | |
| 720 | void |
Behdad Esfahbod | c62b503 | 2009-08-01 19:54:49 -0400 | [diff] [blame] | 721 | hb_font_set_ppem (hb_font_t *font, |
| 722 | unsigned int x_ppem, |
| 723 | unsigned int y_ppem) |
| 724 | { |
Behdad Esfahbod | 74f1d89 | 2011-05-10 19:39:32 -0400 | [diff] [blame] | 725 | if (font->immutable) |
Behdad Esfahbod | c62b503 | 2009-08-01 19:54:49 -0400 | [diff] [blame] | 726 | return; |
| 727 | |
| 728 | font->x_ppem = x_ppem; |
| 729 | font->y_ppem = y_ppem; |
| 730 | } |
| 731 | |
Behdad Esfahbod | 19c0eab | 2010-10-04 16:45:21 -0400 | [diff] [blame] | 732 | void |
| 733 | hb_font_get_ppem (hb_font_t *font, |
| 734 | unsigned int *x_ppem, |
| 735 | unsigned int *y_ppem) |
| 736 | { |
| 737 | if (x_ppem) *x_ppem = font->x_ppem; |
| 738 | if (y_ppem) *y_ppem = font->y_ppem; |
| 739 | } |