OLD | NEW |
1 /* | 1 /* |
2 * Copyright © 2011 Google, Inc. | 2 * Copyright © 2011 Google, Inc. |
3 * | 3 * |
4 * This is part of HarfBuzz, a text shaping library. | 4 * This is part of HarfBuzz, a text shaping library. |
5 * | 5 * |
6 * Permission is hereby granted, without written agreement and without | 6 * Permission is hereby granted, without written agreement and without |
7 * license or royalty fees, to use, copy, modify, and distribute this | 7 * license or royalty fees, to use, copy, modify, and distribute this |
8 * software and its documentation for any purpose, provided that the | 8 * software and its documentation for any purpose, provided that the |
9 * above copyright notice and the following two paragraphs appear in | 9 * above copyright notice and the following two paragraphs appear in |
10 * all copies of this software. | 10 * all copies of this software. |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
44 hb_blob_t *hhea_blob; | 44 hb_blob_t *hhea_blob; |
45 }; | 45 }; |
46 | 46 |
47 | 47 |
48 static hb_tt_font_t * | 48 static hb_tt_font_t * |
49 _hb_tt_font_create (hb_font_t *font) | 49 _hb_tt_font_create (hb_font_t *font) |
50 { | 50 { |
51 /* TODO Remove this object altogether */ | 51 /* TODO Remove this object altogether */ |
52 hb_tt_font_t *tt = (hb_tt_font_t *) calloc (1, sizeof (hb_tt_font_t)); | 52 hb_tt_font_t *tt = (hb_tt_font_t *) calloc (1, sizeof (hb_tt_font_t)); |
53 | 53 |
54 tt->hhea_blob = Sanitizer<hhea>::sanitize (hb_face_reference_table (font->face
, HB_OT_TAG_hhea)); | 54 tt->hhea_blob = Sanitizer<hhea>::sanitize (font->face->reference_table (HB_OT_
TAG_hhea)); |
55 tt->hhea = Sanitizer<hhea>::lock_instance (tt->hhea_blob); | 55 tt->hhea = Sanitizer<hhea>::lock_instance (tt->hhea_blob); |
56 | 56 |
57 return tt; | 57 return tt; |
58 } | 58 } |
59 | 59 |
60 static void | 60 static void |
61 _hb_tt_font_destroy (hb_tt_font_t *tt) | 61 _hb_tt_font_destroy (hb_tt_font_t *tt) |
62 { | 62 { |
63 hb_blob_destroy (tt->hhea_blob); | 63 hb_blob_destroy (tt->hhea_blob); |
64 | 64 |
65 free (tt); | 65 free (tt); |
66 } | 66 } |
67 | 67 |
68 static inline const hhea& | 68 static inline const hhea& |
69 _get_hhea (hb_face_t *face) | 69 _get_hhea (hb_face_t *face) |
70 { | 70 { |
71 // return likely (face->tt && face->tt->hhea) ? *face->tt->hhea : Null(hhea); | 71 // return likely (face->tt && face->tt->hhea) ? *face->tt->hhea : Null(hhea); |
72 } | 72 } |
73 | 73 |
74 | 74 |
75 /* | 75 /* |
76 * hb_tt_font_funcs_t | 76 * hb_tt_font_funcs_t |
77 */ | 77 */ |
78 | 78 |
79 static hb_bool_t | |
80 hb_font_get_glyph_nil (hb_font_t *font HB_UNUSED, | |
81 void *font_data HB_UNUSED, | |
82 hb_codepoint_t unicode, | |
83 hb_codepoint_t variation_selector, | |
84 hb_codepoint_t *glyph, | |
85 void *user_data HB_UNUSED) | |
86 { | |
87 if (font->parent) | |
88 return hb_font_get_glyph (font->parent, unicode, variation_selector, glyph); | |
89 | |
90 *glyph = 0; | |
91 return false; | |
92 } | |
93 | |
94 static hb_position_t | |
95 hb_font_get_glyph_h_advance_nil (hb_font_t *font HB_UNUSED, | |
96 void *font_data HB_UNUSED, | |
97 hb_codepoint_t glyph, | |
98 void *user_data HB_UNUSED) | |
99 { | |
100 if (font->parent) | |
101 return font->parent_scale_x_distance (hb_font_get_glyph_h_advance (font->par
ent, glyph)); | |
102 | |
103 return font->x_scale; | |
104 } | |
105 | |
106 static hb_position_t | |
107 hb_font_get_glyph_v_advance_nil (hb_font_t *font HB_UNUSED, | |
108 void *font_data HB_UNUSED, | |
109 hb_codepoint_t glyph, | |
110 void *user_data HB_UNUSED) | |
111 { | |
112 if (font->parent) | |
113 return font->parent_scale_y_distance (hb_font_get_glyph_v_advance (font->par
ent, glyph)); | |
114 | |
115 return font->y_scale; | |
116 } | |
117 | |
118 static hb_bool_t | |
119 hb_font_get_glyph_h_origin_nil (hb_font_t *font HB_UNUSED, | |
120 void *font_data HB_UNUSED, | |
121 hb_codepoint_t glyph, | |
122 hb_position_t *x, | |
123 hb_position_t *y, | |
124 void *user_data HB_UNUSED) | |
125 { | |
126 if (font->parent) { | |
127 hb_bool_t ret = hb_font_get_glyph_h_origin (font->parent, | |
128 glyph, | |
129 x, y); | |
130 if (ret) | |
131 font->parent_scale_position (x, y); | |
132 return ret; | |
133 } | |
134 | |
135 *x = *y = 0; | |
136 return false; | |
137 } | |
138 | |
139 static hb_bool_t | |
140 hb_font_get_glyph_v_origin_nil (hb_font_t *font HB_UNUSED, | |
141 void *font_data HB_UNUSED, | |
142 hb_codepoint_t glyph, | |
143 hb_position_t *x, | |
144 hb_position_t *y, | |
145 void *user_data HB_UNUSED) | |
146 { | |
147 if (font->parent) { | |
148 hb_bool_t ret = hb_font_get_glyph_v_origin (font->parent, | |
149 glyph, | |
150 x, y); | |
151 if (ret) | |
152 font->parent_scale_position (x, y); | |
153 return ret; | |
154 } | |
155 | |
156 *x = *y = 0; | |
157 return false; | |
158 } | |
159 | |
160 static hb_position_t | |
161 hb_font_get_glyph_h_kerning_nil (hb_font_t *font HB_UNUSED, | |
162 void *font_data HB_UNUSED, | |
163 hb_codepoint_t left_glyph, | |
164 hb_codepoint_t right_glyph, | |
165 void *user_data HB_UNUSED) | |
166 { | |
167 if (font->parent) | |
168 return font->parent_scale_x_distance (hb_font_get_glyph_h_kerning (font->par
ent, left_glyph, right_glyph)); | |
169 | |
170 return 0; | |
171 } | |
172 | |
173 static hb_position_t | |
174 hb_font_get_glyph_v_kerning_nil (hb_font_t *font HB_UNUSED, | |
175 void *font_data HB_UNUSED, | |
176 hb_codepoint_t top_glyph, | |
177 hb_codepoint_t bottom_glyph, | |
178 void *user_data HB_UNUSED) | |
179 { | |
180 if (font->parent) | |
181 return font->parent_scale_y_distance (hb_font_get_glyph_v_kerning (font->par
ent, top_glyph, bottom_glyph)); | |
182 | |
183 return 0; | |
184 } | |
185 | |
186 static hb_bool_t | |
187 hb_font_get_glyph_extents_nil (hb_font_t *font HB_UNUSED, | |
188 void *font_data HB_UNUSED, | |
189 hb_codepoint_t glyph, | |
190 hb_glyph_extents_t *extents, | |
191 void *user_data HB_UNUSED) | |
192 { | |
193 if (font->parent) { | |
194 hb_bool_t ret = hb_font_get_glyph_extents (font->parent, | |
195 glyph, | |
196 extents); | |
197 if (ret) { | |
198 font->parent_scale_position (&extents->x_bearing, &extents->y_bearing); | |
199 font->parent_scale_distance (&extents->width, &extents->height); | |
200 } | |
201 return ret; | |
202 } | |
203 | |
204 memset (extents, 0, sizeof (*extents)); | |
205 return false; | |
206 } | |
207 | |
208 static hb_bool_t | |
209 hb_font_get_glyph_contour_point_nil (hb_font_t *font HB_UNUSED, | |
210 void *font_data HB_UNUSED, | |
211 hb_codepoint_t glyph, | |
212 unsigned int point_index, | |
213 hb_position_t *x, | |
214 hb_position_t *y, | |
215 void *user_data HB_UNUSED) | |
216 { | |
217 if (font->parent) { | |
218 hb_bool_t ret = hb_font_get_glyph_contour_point (font->parent, | |
219 glyph, point_index, | |
220 x, y); | |
221 if (ret) | |
222 font->parent_scale_position (x, y); | |
223 return ret; | |
224 } | |
225 | |
226 *x = *y = 0; | |
227 return false; | |
228 } | |
229 | |
230 | |
231 static hb_font_funcs_t _hb_font_funcs_nil = { | |
232 HB_OBJECT_HEADER_STATIC, | |
233 | |
234 true, /* immutable */ | |
235 | |
236 { | |
237 #define HB_FONT_FUNC_IMPLEMENT(name) hb_font_get_##name##_nil, | |
238 HB_FONT_FUNCS_IMPLEMENT_CALLBACKS | |
239 #undef HB_FONT_FUNC_IMPLEMENT | |
240 } | |
241 }; | |
242 #endif | 79 #endif |
243 | |
OLD | NEW |