QtBase  v6.3.1
hb-ot-layout.hh
Go to the documentation of this file.
1 /*
2  * Copyright © 2007,2008,2009 Red Hat, Inc.
3  * Copyright © 2012,2013 Google, Inc.
4  *
5  * This is part of HarfBuzz, a text shaping library.
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
26  * Google Author(s): Behdad Esfahbod
27  */
28 
29 #ifndef HB_OT_LAYOUT_HH
30 #define HB_OT_LAYOUT_HH
31 
32 #include "hb.hh"
33 
34 #include "hb-font.hh"
35 #include "hb-buffer.hh"
36 #include "hb-open-type.hh"
37 #include "hb-ot-shape.hh"
38 #include "hb-set-digest.hh"
39 
40 
41 struct hb_ot_shape_plan_t;
42 
43 
44 /*
45  * kern
46  */
47 
48 HB_INTERNAL bool
50 
51 HB_INTERNAL bool
53 
54 HB_INTERNAL bool
56 
57 HB_INTERNAL void
59  hb_font_t *font,
61 
62 
63 /* Private API corresponding to hb-ot-layout.h: */
64 
65 HB_INTERNAL bool
68  hb_tag_t feature_tag,
69  unsigned int *feature_index);
70 
71 
72 /*
73  * GDEF
74  */
75 
77 {
78  /* The following three match LookupFlags::Ignore* numbers. */
82 
83  /* The following are used internally; not derived from GDEF. */
87 
91 };
93 
94 
95 /*
96  * GSUB/GPOS
97  */
98 
99 
100 /* Should be called before all the substitute_lookup's are done. */
101 HB_INTERNAL void
104 
105 HB_INTERNAL void
107  bool (*filter) (const hb_glyph_info_t *info));
108 
109 namespace OT {
110  struct hb_ot_apply_context_t;
111  struct hb_ot_layout_lookup_accelerator_t;
112 namespace Layout {
113 namespace GSUB {
114  struct SubstLookup;
115 }
116 }
117 }
118 
119 HB_INTERNAL void
121  const OT::Layout::GSUB::SubstLookup &lookup,
123 
124 
125 /* Should be called before all the position_lookup's are done. */
126 HB_INTERNAL void
129 
130 /* Should be called after all the position_lookup's are done, to fini advances. */
131 HB_INTERNAL void
134 
135 /* Should be called after hb_ot_layout_position_finish_advances, to fini offsets. */
136 HB_INTERNAL void
139 
140 
141 /*
142  * Buffer var routines.
143  */
144 
145 /* buffer var allocations, used during the entire shaping process */
146 #define unicode_props() var2.u16[0]
147 
148 /* buffer var allocations, used during the GSUB/GPOS processing */
149 #define glyph_props() var1.u16[0] /* GDEF glyph properties */
150 #define lig_props() var1.u8[2] /* GSUB/GPOS ligature tracking */
151 #define syllable() var1.u8[3] /* GSUB/GPOS shaping boundaries */
152 
153 
154 /* Loop over syllables. Based on foreach_cluster(). */
155 #define foreach_syllable(buffer, start, end) \
156  for (unsigned int \
157  _count = buffer->len, \
158  start = 0, end = _count ? _hb_next_syllable (buffer, 0) : 0; \
159  start < _count; \
160  start = end, end = _hb_next_syllable (buffer, start))
161 
162 static inline unsigned int
163 _hb_next_syllable (hb_buffer_t *buffer, unsigned int start)
164 {
165  hb_glyph_info_t *info = buffer->info;
166  unsigned int count = buffer->len;
167 
168  unsigned int syllable = info[start].syllable();
169  while (++start < count && syllable == info[start].syllable())
170  ;
171 
172  return start;
173 }
174 
175 
176 /* unicode_props */
177 
178 /* Design:
179  * unicode_props() is a two-byte number. The low byte includes:
180  * - General_Category: 5 bits.
181  * - A bit each for:
182  * * Is it Default_Ignorable(); we have a modified Default_Ignorable().
183  * * Whether it's one of the four Mongolian Free Variation Selectors,
184  * CGJ, or other characters that are hidden but should not be ignored
185  * like most other Default_Ignorable()s do during matching.
186  * * Whether it's a grapheme continuation.
187  *
188  * The high-byte has different meanings, switched by the Gen-Cat:
189  * - For Mn,Mc,Me: the modified Combining_Class.
190  * - For Cf: whether it's ZWJ, ZWNJ, or something else.
191  * - For Ws: index of which space character this is, if space fallback
192  * is needed, ie. we don't set this by default, only if asked to.
193  */
194 
198  UPROPS_MASK_HIDDEN = 0x0040u, /* MONGOLIAN FREE VARIATION SELECTOR 1..4, or TAG characters */
200 
201  /* If GEN_CAT=FORMAT, top byte masks: */
203  UPROPS_MASK_Cf_ZWNJ = 0x0200u
204 };
206 
207 static inline void
208 _hb_glyph_info_set_unicode_props (hb_glyph_info_t *info, hb_buffer_t *buffer)
209 {
210  hb_unicode_funcs_t *unicode = buffer->unicode;
211  unsigned int u = info->codepoint;
212  unsigned int gen_cat = (unsigned int) unicode->general_category (u);
213  unsigned int props = gen_cat;
214 
215  if (u >= 0x80u)
216  {
218 
219  if (unlikely (unicode->is_default_ignorable (u)))
220  {
223  if (u == 0x200Cu) props |= UPROPS_MASK_Cf_ZWNJ;
224  else if (u == 0x200Du) props |= UPROPS_MASK_Cf_ZWJ;
225  /* Mongolian Free Variation Selectors need to be remembered
226  * because although we need to hide them like default-ignorables,
227  * they need to non-ignorable during shaping. This is similar to
228  * what we do for joiners in Indic-like shapers, but since the
229  * FVSes are GC=Mn, we have use a separate bit to remember them.
230  * Fixes:
231  * https://github.com/harfbuzz/harfbuzz/issues/234 */
232  else if (unlikely (hb_in_ranges<hb_codepoint_t> (u, 0x180Bu, 0x180Du, 0x180Fu, 0x180Fu))) props |= UPROPS_MASK_HIDDEN;
233  /* TAG characters need similar treatment. Fixes:
234  * https://github.com/harfbuzz/harfbuzz/issues/463 */
235  else if (unlikely (hb_in_range<hb_codepoint_t> (u, 0xE0020u, 0xE007Fu))) props |= UPROPS_MASK_HIDDEN;
236  /* COMBINING GRAPHEME JOINER should not be skipped; at least some times.
237  * https://github.com/harfbuzz/harfbuzz/issues/554 */
238  else if (unlikely (u == 0x034Fu))
239  {
240  buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_CGJ;
242  }
243  }
244 
246  {
248  props |= unicode->modified_combining_class (u)<<8;
249  }
250  }
251 
252  info->unicode_props() = props;
253 }
254 
255 static inline void
256 _hb_glyph_info_set_general_category (hb_glyph_info_t *info,
258 {
259  /* Clears top-byte. */
260  info->unicode_props() = (unsigned int) gen_cat | (info->unicode_props() & (0xFF & ~UPROPS_MASK_GEN_CAT));
261 }
262 
263 static inline hb_unicode_general_category_t
264 _hb_glyph_info_get_general_category (const hb_glyph_info_t *info)
265 {
266  return (hb_unicode_general_category_t) (info->unicode_props() & UPROPS_MASK_GEN_CAT);
267 }
268 
269 static inline bool
270 _hb_glyph_info_is_unicode_mark (const hb_glyph_info_t *info)
271 {
273 }
274 static inline void
275 _hb_glyph_info_set_modified_combining_class (hb_glyph_info_t *info,
276  unsigned int modified_class)
277 {
278  if (unlikely (!_hb_glyph_info_is_unicode_mark (info)))
279  return;
280  info->unicode_props() = (modified_class<<8) | (info->unicode_props() & 0xFF);
281 }
282 static inline unsigned int
283 _hb_glyph_info_get_modified_combining_class (const hb_glyph_info_t *info)
284 {
285  return _hb_glyph_info_is_unicode_mark (info) ? info->unicode_props()>>8 : 0;
286 }
287 #define info_cc(info) (_hb_glyph_info_get_modified_combining_class (&(info)))
288 
289 static inline bool
290 _hb_glyph_info_is_unicode_space (const hb_glyph_info_t *info)
291 {
292  return _hb_glyph_info_get_general_category (info) ==
294 }
295 static inline void
296 _hb_glyph_info_set_unicode_space_fallback_type (hb_glyph_info_t *info, hb_unicode_funcs_t::space_t s)
297 {
298  if (unlikely (!_hb_glyph_info_is_unicode_space (info)))
299  return;
300  info->unicode_props() = (((unsigned int) s)<<8) | (info->unicode_props() & 0xFF);
301 }
302 static inline hb_unicode_funcs_t::space_t
303 _hb_glyph_info_get_unicode_space_fallback_type (const hb_glyph_info_t *info)
304 {
305  return _hb_glyph_info_is_unicode_space (info) ?
306  (hb_unicode_funcs_t::space_t) (info->unicode_props()>>8) :
308 }
309 
310 static inline bool _hb_glyph_info_substituted (const hb_glyph_info_t *info);
311 
312 static inline bool
313 _hb_glyph_info_is_default_ignorable (const hb_glyph_info_t *info)
314 {
315  return (info->unicode_props() & UPROPS_MASK_IGNORABLE) &&
316  !_hb_glyph_info_substituted (info);
317 }
318 static inline bool
319 _hb_glyph_info_is_default_ignorable_and_not_hidden (const hb_glyph_info_t *info)
320 {
321  return ((info->unicode_props() & (UPROPS_MASK_IGNORABLE|UPROPS_MASK_HIDDEN))
322  == UPROPS_MASK_IGNORABLE) &&
323  !_hb_glyph_info_substituted (info);
324 }
325 static inline void
326 _hb_glyph_info_unhide (hb_glyph_info_t *info)
327 {
328  info->unicode_props() &= ~ UPROPS_MASK_HIDDEN;
329 }
330 
331 static inline void
332 _hb_glyph_info_set_continuation (hb_glyph_info_t *info)
333 {
334  info->unicode_props() |= UPROPS_MASK_CONTINUATION;
335 }
336 static inline void
337 _hb_glyph_info_reset_continuation (hb_glyph_info_t *info)
338 {
339  info->unicode_props() &= ~ UPROPS_MASK_CONTINUATION;
340 }
341 static inline bool
342 _hb_glyph_info_is_continuation (const hb_glyph_info_t *info)
343 {
344  return info->unicode_props() & UPROPS_MASK_CONTINUATION;
345 }
346 
347 static inline bool
348 _hb_grapheme_group_func (const hb_glyph_info_t& a HB_UNUSED,
349  const hb_glyph_info_t& b)
350 { return _hb_glyph_info_is_continuation (&b); }
351 
352 #define foreach_grapheme(buffer, start, end) \
353  foreach_group (buffer, start, end, _hb_grapheme_group_func)
354 
355 static inline void
356 _hb_ot_layout_reverse_graphemes (hb_buffer_t *buffer)
357 {
358  buffer->reverse_groups (_hb_grapheme_group_func,
360 }
361 
362 static inline bool
363 _hb_glyph_info_is_unicode_format (const hb_glyph_info_t *info)
364 {
365  return _hb_glyph_info_get_general_category (info) ==
367 }
368 static inline bool
369 _hb_glyph_info_is_zwnj (const hb_glyph_info_t *info)
370 {
371  return _hb_glyph_info_is_unicode_format (info) && (info->unicode_props() & UPROPS_MASK_Cf_ZWNJ);
372 }
373 static inline bool
374 _hb_glyph_info_is_zwj (const hb_glyph_info_t *info)
375 {
376  return _hb_glyph_info_is_unicode_format (info) && (info->unicode_props() & UPROPS_MASK_Cf_ZWJ);
377 }
378 static inline bool
379 _hb_glyph_info_is_joiner (const hb_glyph_info_t *info)
380 {
381  return _hb_glyph_info_is_unicode_format (info) && (info->unicode_props() & (UPROPS_MASK_Cf_ZWNJ|UPROPS_MASK_Cf_ZWJ));
382 }
383 static inline void
384 _hb_glyph_info_flip_joiners (hb_glyph_info_t *info)
385 {
386  if (!_hb_glyph_info_is_unicode_format (info))
387  return;
388  info->unicode_props() ^= UPROPS_MASK_Cf_ZWNJ | UPROPS_MASK_Cf_ZWJ;
389 }
390 
391 /* lig_props: aka lig_id / lig_comp
392  *
393  * When a ligature is formed:
394  *
395  * - The ligature glyph and any marks in between all the same newly allocated
396  * lig_id,
397  * - The ligature glyph will get lig_num_comps set to the number of components
398  * - The marks get lig_comp > 0, reflecting which component of the ligature
399  * they were applied to.
400  * - This is used in GPOS to attach marks to the right component of a ligature
401  * in MarkLigPos,
402  * - Note that when marks are ligated together, much of the above is skipped
403  * and the current lig_id reused.
404  *
405  * When a multiple-substitution is done:
406  *
407  * - All resulting glyphs will have lig_id = 0,
408  * - The resulting glyphs will have lig_comp = 0, 1, 2, ... respectively.
409  * - This is used in GPOS to attach marks to the first component of a
410  * multiple substitution in MarkBasePos.
411  *
412  * The numbers are also used in GPOS to do mark-to-mark positioning only
413  * to marks that belong to the same component of the same ligature.
414  */
415 
416 static inline void
417 _hb_glyph_info_clear_lig_props (hb_glyph_info_t *info)
418 {
419  info->lig_props() = 0;
420 }
421 
422 #define IS_LIG_BASE 0x10
423 
424 static inline void
425 _hb_glyph_info_set_lig_props_for_ligature (hb_glyph_info_t *info,
426  unsigned int lig_id,
427  unsigned int lig_num_comps)
428 {
429  info->lig_props() = (lig_id << 5) | IS_LIG_BASE | (lig_num_comps & 0x0F);
430 }
431 
432 static inline void
433 _hb_glyph_info_set_lig_props_for_mark (hb_glyph_info_t *info,
434  unsigned int lig_id,
435  unsigned int lig_comp)
436 {
437  info->lig_props() = (lig_id << 5) | (lig_comp & 0x0F);
438 }
439 
440 static inline void
441 _hb_glyph_info_set_lig_props_for_component (hb_glyph_info_t *info, unsigned int comp)
442 {
443  _hb_glyph_info_set_lig_props_for_mark (info, 0, comp);
444 }
445 
446 static inline unsigned int
447 _hb_glyph_info_get_lig_id (const hb_glyph_info_t *info)
448 {
449  return info->lig_props() >> 5;
450 }
451 
452 static inline bool
453 _hb_glyph_info_ligated_internal (const hb_glyph_info_t *info)
454 {
455  return !!(info->lig_props() & IS_LIG_BASE);
456 }
457 
458 static inline unsigned int
459 _hb_glyph_info_get_lig_comp (const hb_glyph_info_t *info)
460 {
461  if (_hb_glyph_info_ligated_internal (info))
462  return 0;
463  else
464  return info->lig_props() & 0x0F;
465 }
466 
467 static inline unsigned int
468 _hb_glyph_info_get_lig_num_comps (const hb_glyph_info_t *info)
469 {
470  if ((info->glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_LIGATURE) &&
471  _hb_glyph_info_ligated_internal (info))
472  return info->lig_props() & 0x0F;
473  else
474  return 1;
475 }
476 
477 static inline uint8_t
478 _hb_allocate_lig_id (hb_buffer_t *buffer)
479 {
480  uint8_t lig_id = buffer->next_serial () & 0x07;
481  if (unlikely (!lig_id))
482  lig_id = _hb_allocate_lig_id (buffer); /* in case of overflow */
483  return lig_id;
484 }
485 
486 /* glyph_props: */
487 
488 static inline void
489 _hb_glyph_info_set_glyph_props (hb_glyph_info_t *info, unsigned int props)
490 {
491  info->glyph_props() = props;
492 }
493 
494 static inline unsigned int
495 _hb_glyph_info_get_glyph_props (const hb_glyph_info_t *info)
496 {
497  return info->glyph_props();
498 }
499 
500 static inline bool
501 _hb_glyph_info_is_base_glyph (const hb_glyph_info_t *info)
502 {
503  return !!(info->glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH);
504 }
505 
506 static inline bool
507 _hb_glyph_info_is_ligature (const hb_glyph_info_t *info)
508 {
509  return !!(info->glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_LIGATURE);
510 }
511 
512 static inline bool
513 _hb_glyph_info_is_mark (const hb_glyph_info_t *info)
514 {
515  return !!(info->glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_MARK);
516 }
517 
518 static inline bool
519 _hb_glyph_info_substituted (const hb_glyph_info_t *info)
520 {
521  return !!(info->glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_SUBSTITUTED);
522 }
523 
524 static inline bool
525 _hb_glyph_info_ligated (const hb_glyph_info_t *info)
526 {
527  return !!(info->glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_LIGATED);
528 }
529 
530 static inline bool
531 _hb_glyph_info_multiplied (const hb_glyph_info_t *info)
532 {
533  return !!(info->glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_MULTIPLIED);
534 }
535 
536 static inline bool
537 _hb_glyph_info_ligated_and_didnt_multiply (const hb_glyph_info_t *info)
538 {
539  return _hb_glyph_info_ligated (info) && !_hb_glyph_info_multiplied (info);
540 }
541 
542 static inline void
543 _hb_glyph_info_clear_ligated_and_multiplied (hb_glyph_info_t *info)
544 {
545  info->glyph_props() &= ~(HB_OT_LAYOUT_GLYPH_PROPS_LIGATED |
547 }
548 
549 static inline void
550 _hb_glyph_info_clear_substituted (hb_glyph_info_t *info)
551 {
552  info->glyph_props() &= ~(HB_OT_LAYOUT_GLYPH_PROPS_SUBSTITUTED);
553 }
554 
555 static inline void
556 _hb_clear_substitution_flags (const hb_ot_shape_plan_t *plan HB_UNUSED,
559 {
560  hb_glyph_info_t *info = buffer->info;
561  unsigned int count = buffer->len;
562  for (unsigned int i = 0; i < count; i++)
563  _hb_glyph_info_clear_substituted (&info[i]);
564 }
565 
566 
567 /* Allocation / deallocation. */
568 
569 static inline void
570 _hb_buffer_allocate_unicode_vars (hb_buffer_t *buffer)
571 {
573 }
574 
575 static inline void
576 _hb_buffer_deallocate_unicode_vars (hb_buffer_t *buffer)
577 {
579 }
580 
581 static inline void
582 _hb_buffer_assert_unicode_vars (hb_buffer_t *buffer)
583 {
585 }
586 
587 static inline void
588 _hb_buffer_allocate_gsubgpos_vars (hb_buffer_t *buffer)
589 {
593 }
594 
595 static inline void
596 _hb_buffer_deallocate_gsubgpos_vars (hb_buffer_t *buffer)
597 {
601 }
602 
603 static inline void
604 _hb_buffer_assert_gsubgpos_vars (hb_buffer_t *buffer)
605 {
609 }
610 
611 /* Make sure no one directly touches our props... */
612 #undef unicode_props0
613 #undef unicode_props1
614 #undef lig_props
615 #undef glyph_props
616 
617 #endif /* HB_OT_LAYOUT_HH */
small capitals from c petite p scientific f u
Definition: afcover.h:88
small capitals from c petite p scientific i
[1]
Definition: afcover.h:80
#define HB_BUFFER_ASSERT_VAR(b, var)
Definition: hb-buffer.hh:624
#define HB_BUFFER_DEALLOCATE_VAR(b, var)
Definition: hb-buffer.hh:623
@ HB_BUFFER_SCRATCH_FLAG_HAS_DEFAULT_IGNORABLES
Definition: hb-buffer.hh:67
@ HB_BUFFER_SCRATCH_FLAG_HAS_CGJ
Definition: hb-buffer.hh:70
@ HB_BUFFER_SCRATCH_FLAG_HAS_NON_ASCII
Definition: hb-buffer.hh:66
#define HB_BUFFER_ALLOCATE_VAR(b, var)
Definition: hb-buffer.hh:622
void const void *obj HB_UNUSED
Definition: hb-debug.hh:180
HB_EXTERN hb_tag_t table_tag
HB_INTERNAL bool hb_ot_layout_has_kerning(hb_face_t *face)
Definition: hb-ot-layout.cc:85
#define glyph_props()
HB_INTERNAL void hb_ot_layout_position_start(hb_font_t *font, hb_buffer_t *buffer)
hb_unicode_props_flags_t
@ UPROPS_MASK_HIDDEN
@ UPROPS_MASK_Cf_ZWNJ
@ UPROPS_MASK_Cf_ZWJ
@ UPROPS_MASK_GEN_CAT
@ UPROPS_MASK_CONTINUATION
@ UPROPS_MASK_IGNORABLE
HB_INTERNAL void hb_ot_layout_position_finish_offsets(hb_font_t *font, hb_buffer_t *buffer)
HB_INTERNAL bool hb_ot_layout_has_cross_kerning(hb_face_t *face)
HB_INTERNAL void hb_ot_layout_position_finish_advances(hb_font_t *font, hb_buffer_t *buffer)
HB_INTERNAL bool hb_ot_layout_has_machine_kerning(hb_face_t *face)
#define IS_LIG_BASE
HB_INTERNAL void hb_ot_layout_substitute_start(hb_font_t *font, hb_buffer_t *buffer)
HB_INTERNAL void hb_ot_layout_delete_glyphs_inplace(hb_buffer_t *buffer, bool(*filter)(const hb_glyph_info_t *info))
HB_INTERNAL bool hb_ot_layout_table_find_feature(hb_face_t *face, hb_tag_t table_tag, hb_tag_t feature_tag, unsigned int *feature_index)
HB_INTERNAL void hb_ot_layout_kern(const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer)
HB_INTERNAL void hb_ot_layout_substitute_lookup(OT::hb_ot_apply_context_t *c, const OT::Layout::GSUB::SubstLookup &lookup, const OT::hb_ot_layout_lookup_accelerator_t &accel)
#define syllable()
HB_MARK_AS_FLAG_T(hb_ot_layout_glyph_props_flags_t)
#define lig_props()
#define unicode_props()
hb_ot_layout_glyph_props_flags_t
Definition: hb-ot-layout.hh:77
@ HB_OT_LAYOUT_GLYPH_PROPS_MARK
Definition: hb-ot-layout.hh:81
@ HB_OT_LAYOUT_GLYPH_PROPS_SUBSTITUTED
Definition: hb-ot-layout.hh:84
@ HB_OT_LAYOUT_GLYPH_PROPS_PRESERVE
Definition: hb-ot-layout.hh:88
@ HB_OT_LAYOUT_GLYPH_PROPS_MULTIPLIED
Definition: hb-ot-layout.hh:86
@ HB_OT_LAYOUT_GLYPH_PROPS_LIGATURE
Definition: hb-ot-layout.hh:80
@ HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH
Definition: hb-ot-layout.hh:79
@ HB_OT_LAYOUT_GLYPH_PROPS_LIGATED
Definition: hb-ot-layout.hh:85
#define HB_UNICODE_GENERAL_CATEGORY_IS_MARK(gen_cat)
Definition: hb-unicode.hh:357
#define unlikely(expr)
Definition: hb.hh:251
#define HB_INTERNAL
Definition: hb.hh:274
backing_store_ptr info
[4]
Definition: jmemsys.h:161
GLboolean GLboolean GLboolean b
GLboolean GLboolean GLboolean GLboolean a
[7]
GLenum GLenum GLsizei count
GLenum face
GLenum GLuint buffer
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
GLenum GLuint GLsizei const GLenum * props
GLuint start
const GLubyte * c
Definition: qopenglext.h:12701
GLdouble s
[6]
Definition: qopenglext.h:235
@ HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS
Definition: hb-buffer.h:429
uint32_t hb_tag_t
Definition: hb-common.h:157
hb_unicode_general_category_t
Definition: hb-unicode.h:92
@ HB_UNICODE_GENERAL_CATEGORY_SPACE_SEPARATOR
Definition: hb-unicode.h:122
@ HB_UNICODE_GENERAL_CATEGORY_FORMAT
Definition: hb-unicode.h:94
unsigned int modified_combining_class(hb_codepoint_t u)
Definition: hb-unicode.hh:106
static hb_bool_t is_default_ignorable(hb_codepoint_t ch)
Definition: hb-unicode.hh:170