43 #endif |
43 #endif |
44 #ifndef HB_BUFFER_MAX_LEN_DEFAULT |
44 #ifndef HB_BUFFER_MAX_LEN_DEFAULT |
45 #define HB_BUFFER_MAX_LEN_DEFAULT 0x3FFFFFFF /* Shaping more than a billion chars? Let us know! */ |
45 #define HB_BUFFER_MAX_LEN_DEFAULT 0x3FFFFFFF /* Shaping more than a billion chars? Let us know! */ |
46 #endif |
46 #endif |
47 |
47 |
48 ASSERT_STATIC (sizeof (hb_glyph_info_t) == 20); |
48 static_assert ((sizeof (hb_glyph_info_t) == 20), ""); |
49 ASSERT_STATIC (sizeof (hb_glyph_info_t) == sizeof (hb_glyph_position_t)); |
49 static_assert ((sizeof (hb_glyph_info_t) == sizeof (hb_glyph_position_t)), ""); |
50 |
50 |
51 HB_MARK_AS_FLAG_T (hb_buffer_flags_t); |
51 HB_MARK_AS_FLAG_T (hb_buffer_flags_t); |
52 HB_MARK_AS_FLAG_T (hb_buffer_serialize_flags_t); |
52 HB_MARK_AS_FLAG_T (hb_buffer_serialize_flags_t); |
|
53 HB_MARK_AS_FLAG_T (hb_buffer_diff_flags_t); |
53 |
54 |
54 enum hb_buffer_scratch_flags_t { |
55 enum hb_buffer_scratch_flags_t { |
55 HB_BUFFER_SCRATCH_FLAG_DEFAULT = 0x00000000u, |
56 HB_BUFFER_SCRATCH_FLAG_DEFAULT = 0x00000000u, |
56 HB_BUFFER_SCRATCH_FLAG_HAS_NON_ASCII = 0x00000001u, |
57 HB_BUFFER_SCRATCH_FLAG_HAS_NON_ASCII = 0x00000001u, |
57 HB_BUFFER_SCRATCH_FLAG_HAS_DEFAULT_IGNORABLES = 0x00000002u, |
58 HB_BUFFER_SCRATCH_FLAG_HAS_DEFAULT_IGNORABLES = 0x00000002u, |
58 HB_BUFFER_SCRATCH_FLAG_HAS_SPACE_FALLBACK = 0x00000004u, |
59 HB_BUFFER_SCRATCH_FLAG_HAS_SPACE_FALLBACK = 0x00000004u, |
59 HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT = 0x00000008u, |
60 HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT = 0x00000008u, |
|
61 HB_BUFFER_SCRATCH_FLAG_HAS_UNSAFE_TO_BREAK = 0x00000010u, |
|
62 |
60 /* Reserved for complex shapers' internal use. */ |
63 /* Reserved for complex shapers' internal use. */ |
61 HB_BUFFER_SCRATCH_FLAG_COMPLEX0 = 0x01000000u, |
64 HB_BUFFER_SCRATCH_FLAG_COMPLEX0 = 0x01000000u, |
62 HB_BUFFER_SCRATCH_FLAG_COMPLEX1 = 0x02000000u, |
65 HB_BUFFER_SCRATCH_FLAG_COMPLEX1 = 0x02000000u, |
63 HB_BUFFER_SCRATCH_FLAG_COMPLEX2 = 0x04000000u, |
66 HB_BUFFER_SCRATCH_FLAG_COMPLEX2 = 0x04000000u, |
64 HB_BUFFER_SCRATCH_FLAG_COMPLEX3 = 0x08000000u, |
67 HB_BUFFER_SCRATCH_FLAG_COMPLEX3 = 0x08000000u, |
230 inline void add_masks (hb_mask_t mask) |
233 inline void add_masks (hb_mask_t mask) |
231 { |
234 { |
232 for (unsigned int j = 0; j < len; j++) |
235 for (unsigned int j = 0; j < len; j++) |
233 info[j].mask |= mask; |
236 info[j].mask |= mask; |
234 } |
237 } |
235 HB_INTERNAL void set_masks (hb_mask_t value, |
238 HB_INTERNAL void set_masks (hb_mask_t value, hb_mask_t mask, |
236 hb_mask_t mask, |
239 unsigned int cluster_start, unsigned int cluster_end); |
237 unsigned int cluster_start, |
240 |
238 unsigned int cluster_end); |
241 inline void merge_clusters (unsigned int start, unsigned int end) |
239 |
|
240 HB_INTERNAL void merge_clusters (unsigned int start, |
|
241 unsigned int end) |
|
242 { |
242 { |
243 if (end - start < 2) |
243 if (end - start < 2) |
244 return; |
244 return; |
245 merge_clusters_impl (start, end); |
245 merge_clusters_impl (start, end); |
246 } |
246 } |
247 HB_INTERNAL void merge_clusters_impl (unsigned int start, |
247 HB_INTERNAL void merge_clusters_impl (unsigned int start, unsigned int end); |
248 unsigned int end); |
248 HB_INTERNAL void merge_out_clusters (unsigned int start, unsigned int end); |
249 HB_INTERNAL void merge_out_clusters (unsigned int start, |
|
250 unsigned int end); |
|
251 /* Merge clusters for deleting current glyph, and skip it. */ |
249 /* Merge clusters for deleting current glyph, and skip it. */ |
252 HB_INTERNAL void delete_glyph (void); |
250 HB_INTERNAL void delete_glyph (void); |
|
251 |
|
252 inline void unsafe_to_break (unsigned int start, |
|
253 unsigned int end) |
|
254 { |
|
255 if (end - start < 2) |
|
256 return; |
|
257 unsafe_to_break_impl (start, end); |
|
258 } |
|
259 HB_INTERNAL void unsafe_to_break_impl (unsigned int start, unsigned int end); |
|
260 HB_INTERNAL void unsafe_to_break_from_outbuffer (unsigned int start, unsigned int end); |
|
261 |
253 |
262 |
254 /* Internal methods */ |
263 /* Internal methods */ |
255 HB_INTERNAL bool enlarge (unsigned int size); |
264 HB_INTERNAL bool enlarge (unsigned int size); |
256 |
265 |
257 inline bool ensure (unsigned int size) |
266 inline bool ensure (unsigned int size) |
280 bool ret = message_impl (font, fmt, ap); |
289 bool ret = message_impl (font, fmt, ap); |
281 va_end (ap); |
290 va_end (ap); |
282 return ret; |
291 return ret; |
283 } |
292 } |
284 HB_INTERNAL bool message_impl (hb_font_t *font, const char *fmt, va_list ap) HB_PRINTF_FUNC(3, 0); |
293 HB_INTERNAL bool message_impl (hb_font_t *font, const char *fmt, va_list ap) HB_PRINTF_FUNC(3, 0); |
|
294 |
|
295 static inline void |
|
296 set_cluster (hb_glyph_info_t &info, unsigned int cluster, unsigned int mask = 0) |
|
297 { |
|
298 if (info.cluster != cluster) |
|
299 { |
|
300 if (mask & HB_GLYPH_FLAG_UNSAFE_TO_BREAK) |
|
301 info.mask |= HB_GLYPH_FLAG_UNSAFE_TO_BREAK; |
|
302 else |
|
303 info.mask &= ~HB_GLYPH_FLAG_UNSAFE_TO_BREAK; |
|
304 } |
|
305 info.cluster = cluster; |
|
306 } |
|
307 |
|
308 inline int |
|
309 _unsafe_to_break_find_min_cluster (const hb_glyph_info_t *info, |
|
310 unsigned int start, unsigned int end, |
|
311 unsigned int cluster) const |
|
312 { |
|
313 for (unsigned int i = start; i < end; i++) |
|
314 cluster = MIN<unsigned int> (cluster, info[i].cluster); |
|
315 return cluster; |
|
316 } |
|
317 inline void |
|
318 _unsafe_to_break_set_mask (hb_glyph_info_t *info, |
|
319 unsigned int start, unsigned int end, |
|
320 unsigned int cluster) |
|
321 { |
|
322 for (unsigned int i = start; i < end; i++) |
|
323 if (cluster != info[i].cluster) |
|
324 { |
|
325 scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_UNSAFE_TO_BREAK; |
|
326 info[i].mask |= HB_GLYPH_FLAG_UNSAFE_TO_BREAK; |
|
327 } |
|
328 } |
|
329 |
|
330 inline void |
|
331 unsafe_to_break_all (void) |
|
332 { |
|
333 for (unsigned int i = 0; i < len; i++) |
|
334 info[i].mask |= HB_GLYPH_FLAG_UNSAFE_TO_BREAK; |
|
335 } |
|
336 inline void |
|
337 safe_to_break_all (void) |
|
338 { |
|
339 for (unsigned int i = 0; i < len; i++) |
|
340 info[i].mask &= ~HB_GLYPH_FLAG_UNSAFE_TO_BREAK; |
|
341 } |
285 }; |
342 }; |
|
343 |
|
344 |
|
345 /* Loop over clusters. Duplicated in foreach_syllable(). */ |
|
346 #define foreach_cluster(buffer, start, end) \ |
|
347 for (unsigned int \ |
|
348 _count = buffer->len, \ |
|
349 start = 0, end = _count ? _next_cluster (buffer, 0) : 0; \ |
|
350 start < _count; \ |
|
351 start = end, end = _next_cluster (buffer, start)) |
|
352 |
|
353 static inline unsigned int |
|
354 _next_cluster (hb_buffer_t *buffer, unsigned int start) |
|
355 { |
|
356 hb_glyph_info_t *info = buffer->info; |
|
357 unsigned int count = buffer->len; |
|
358 |
|
359 unsigned int cluster = info[start].cluster; |
|
360 while (++start < count && cluster == info[start].cluster) |
|
361 ; |
|
362 |
|
363 return start; |
|
364 } |
286 |
365 |
287 |
366 |
288 #define HB_BUFFER_XALLOCATE_VAR(b, func, var) \ |
367 #define HB_BUFFER_XALLOCATE_VAR(b, func, var) \ |
289 b->func (offsetof (hb_glyph_info_t, var) - offsetof(hb_glyph_info_t, var1), \ |
368 b->func (offsetof (hb_glyph_info_t, var) - offsetof(hb_glyph_info_t, var1), \ |
290 sizeof (b->info[0].var)) |
369 sizeof (b->info[0].var)) |