OLD | NEW |
1 /* | 1 /* |
2 * Copyright © 2011,2012 Google, Inc. | 2 * Copyright © 2011,2012 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 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
125 skip_char (hb_buffer_t *buffer) | 125 skip_char (hb_buffer_t *buffer) |
126 { | 126 { |
127 buffer->skip_glyph (); | 127 buffer->skip_glyph (); |
128 } | 128 } |
129 | 129 |
130 /* Returns 0 if didn't decompose, number of resulting characters otherwise. */ | 130 /* Returns 0 if didn't decompose, number of resulting characters otherwise. */ |
131 static inline unsigned int | 131 static inline unsigned int |
132 decompose (const hb_ot_shape_normalize_context_t *c, bool shortest, hb_codepoint
_t ab) | 132 decompose (const hb_ot_shape_normalize_context_t *c, bool shortest, hb_codepoint
_t ab) |
133 { | 133 { |
134 hb_codepoint_t a, b, a_glyph, b_glyph; | 134 hb_codepoint_t a, b, a_glyph, b_glyph; |
| 135 hb_buffer_t * const buffer = c->buffer; |
| 136 hb_font_t * const font = c->font; |
135 | 137 |
136 if (!c->decompose (c, ab, &a, &b) || | 138 if (!c->decompose (c, ab, &a, &b) || |
137 (b && !c->font->get_glyph (b, 0, &b_glyph))) | 139 (b && !font->get_glyph (b, 0, &b_glyph))) |
138 return 0; | 140 return 0; |
139 | 141 |
140 bool has_a = c->font->get_glyph (a, 0, &a_glyph); | 142 bool has_a = font->get_glyph (a, 0, &a_glyph); |
141 if (shortest && has_a) { | 143 if (shortest && has_a) { |
142 /* Output a and b */ | 144 /* Output a and b */ |
143 output_char (c->buffer, a, a_glyph); | 145 output_char (buffer, a, a_glyph); |
144 if (likely (b)) { | 146 if (likely (b)) { |
145 output_char (c->buffer, b, b_glyph); | 147 output_char (buffer, b, b_glyph); |
146 return 2; | 148 return 2; |
147 } | 149 } |
148 return 1; | 150 return 1; |
149 } | 151 } |
150 | 152 |
151 unsigned int ret; | 153 unsigned int ret; |
152 if ((ret = decompose (c, shortest, a))) { | 154 if ((ret = decompose (c, shortest, a))) { |
153 if (b) { | 155 if (b) { |
154 output_char (c->buffer, b, b_glyph); | 156 output_char (buffer, b, b_glyph); |
155 return ret + 1; | 157 return ret + 1; |
156 } | 158 } |
157 return ret; | 159 return ret; |
158 } | 160 } |
159 | 161 |
160 if (has_a) { | 162 if (has_a) { |
161 output_char (c->buffer, a, a_glyph); | 163 output_char (buffer, a, a_glyph); |
162 if (likely (b)) { | 164 if (likely (b)) { |
163 output_char (c->buffer, b, b_glyph); | 165 output_char (buffer, b, b_glyph); |
164 return 2; | 166 return 2; |
165 } | 167 } |
166 return 1; | 168 return 1; |
167 } | 169 } |
168 | 170 |
169 return 0; | 171 return 0; |
170 } | 172 } |
171 | 173 |
172 /* Returns 0 if didn't decompose, number of resulting characters otherwise. */ | 174 /* Returns 0 if didn't decompose, number of resulting characters otherwise. */ |
173 static inline unsigned int | 175 static inline unsigned int |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
207 else if (decompose_compatibility (c, buffer->cur().codepoint)) | 209 else if (decompose_compatibility (c, buffer->cur().codepoint)) |
208 skip_char (buffer); | 210 skip_char (buffer); |
209 else | 211 else |
210 next_char (buffer, glyph); /* glyph is initialized in earlier branches. */ | 212 next_char (buffer, glyph); /* glyph is initialized in earlier branches. */ |
211 } | 213 } |
212 | 214 |
213 static inline void | 215 static inline void |
214 handle_variation_selector_cluster (const hb_ot_shape_normalize_context_t *c, uns
igned int end) | 216 handle_variation_selector_cluster (const hb_ot_shape_normalize_context_t *c, uns
igned int end) |
215 { | 217 { |
216 hb_buffer_t * const buffer = c->buffer; | 218 hb_buffer_t * const buffer = c->buffer; |
| 219 hb_font_t * const font = c->font; |
217 for (; buffer->idx < end - 1;) { | 220 for (; buffer->idx < end - 1;) { |
218 if (unlikely (buffer->unicode->is_variation_selector (buffer->cur(+1).codepo
int))) { | 221 if (unlikely (buffer->unicode->is_variation_selector (buffer->cur(+1).codepo
int))) { |
219 /* The next two lines are some ugly lines... But work. */ | 222 /* The next two lines are some ugly lines... But work. */ |
220 c->font->get_glyph (buffer->cur().codepoint, buffer->cur(+1).codepoint, &b
uffer->cur().glyph_index()); | 223 if (font->get_glyph (buffer->cur().codepoint, buffer->cur(+1).codepoint, &
buffer->cur().glyph_index())) |
221 buffer->replace_glyphs (2, 1, &buffer->cur().codepoint); | 224 { |
| 225 » buffer->replace_glyphs (2, 1, &buffer->cur().codepoint); |
| 226 } |
| 227 else |
| 228 { |
| 229 /* Just pass on the two characters separately, let GSUB do its magic. */ |
| 230 » set_glyph (buffer->cur(), font); |
| 231 » buffer->next_glyph (); |
| 232 » set_glyph (buffer->cur(), font); |
| 233 » buffer->next_glyph (); |
| 234 } |
| 235 /* Skip any further variation selectors. */ |
| 236 while (buffer->idx < end && unlikely (buffer->unicode->is_variation_select
or (buffer->cur().codepoint))) |
| 237 { |
| 238 » set_glyph (buffer->cur(), font); |
| 239 » buffer->next_glyph (); |
| 240 } |
222 } else { | 241 } else { |
223 set_glyph (buffer->cur(), c->font); | 242 set_glyph (buffer->cur(), font); |
224 buffer->next_glyph (); | 243 buffer->next_glyph (); |
225 } | 244 } |
226 } | 245 } |
227 if (likely (buffer->idx < end)) { | 246 if (likely (buffer->idx < end)) { |
228 set_glyph (buffer->cur(), c->font); | 247 set_glyph (buffer->cur(), font); |
229 buffer->next_glyph (); | 248 buffer->next_glyph (); |
230 } | 249 } |
231 } | 250 } |
232 | 251 |
233 static inline void | 252 static inline void |
234 decompose_multi_char_cluster (const hb_ot_shape_normalize_context_t *c, unsigned
int end) | 253 decompose_multi_char_cluster (const hb_ot_shape_normalize_context_t *c, unsigned
int end) |
235 { | 254 { |
236 hb_buffer_t * const buffer = c->buffer; | 255 hb_buffer_t * const buffer = c->buffer; |
237 /* TODO Currently if there's a variation-selector we give-up, it's just too ha
rd. */ | 256 /* TODO Currently if there's a variation-selector we give-up, it's just too ha
rd. */ |
238 for (unsigned int i = buffer->idx; i < end; i++) | 257 for (unsigned int i = buffer->idx; i < end; i++) |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
383 | 402 |
384 /* Blocked, or doesn't compose. */ | 403 /* Blocked, or doesn't compose. */ |
385 buffer->next_glyph (); | 404 buffer->next_glyph (); |
386 | 405 |
387 if (_hb_glyph_info_get_modified_combining_class (&buffer->prev()) == 0) | 406 if (_hb_glyph_info_get_modified_combining_class (&buffer->prev()) == 0) |
388 starter = buffer->out_len - 1; | 407 starter = buffer->out_len - 1; |
389 } | 408 } |
390 buffer->swap_buffers (); | 409 buffer->swap_buffers (); |
391 | 410 |
392 } | 411 } |
OLD | NEW |