31 #ifndef HB_NO_OT_SHAPE
33 #ifdef HB_NO_OT_LAYOUT
34 #error "Cannot compile 'ot' shaper with HB_NO_OT_LAYOUT."
52 {
return hb_in_range<hb_codepoint_t> (
u, 0x1F1E6u, 0x1F1FFu); }
54 #ifndef HB_NO_AAT_SHAPE
77 unsigned int num_user_features);
85 #ifndef HB_NO_AAT_SHAPE
86 , apply_morx (_hb_apply_morx (
face,
props))
89 shaper = hb_ot_shape_complex_categorize (
this);
106 #ifndef HB_NO_AAT_SHAPE
111 #ifndef HB_NO_OT_SHAPE_FRACTIONS
123 #ifndef HB_NO_OT_KERN
127 #ifndef HB_NO_AAT_SHAPE
147 #ifndef HB_NO_AAT_SHAPE
155 #ifndef HB_NO_AAT_SHAPE
162 #ifndef HB_NO_AAT_SHAPE
165 else if (has_kerx && !(has_gsub && has_gpos))
173 #ifndef HB_NO_AAT_SHAPE
178 #ifndef HB_NO_OT_KERN
189 #ifndef HB_NO_OT_KERN
198 #ifndef HB_NO_OT_KERN
206 #ifndef HB_NO_AAT_SHAPE
223 #ifndef HB_NO_AAT_SHAPE
230 hb_ot_shape_collect_features (&planner,
232 key->num_user_features);
242 #ifndef HB_NO_AAT_SHAPE
259 #ifndef HB_NO_AAT_SHAPE
268 #ifndef HB_NO_AAT_SHAPE
282 #ifndef HB_NO_AAT_SHAPE
287 #ifndef HB_NO_OT_KERN
294 #ifndef HB_NO_AAT_SHAPE
315 horizontal_features[] =
329 unsigned int num_user_features)
333 map->enable_feature (
HB_TAG(
'r',
'v',
'r',
'n'));
334 map->add_gsub_pause (
nullptr);
339 map->enable_feature (
HB_TAG (
'l',
't',
'r',
'a'));
340 map->enable_feature (
HB_TAG (
'l',
't',
'r',
'm'));
343 map->enable_feature (
HB_TAG (
'r',
't',
'l',
'a'));
344 map->add_feature (
HB_TAG (
'r',
't',
'l',
'm'));
353 #ifndef HB_NO_OT_SHAPE_FRACTIONS
355 map->add_feature (
HB_TAG (
'f',
'r',
'a',
'c'));
356 map->add_feature (
HB_TAG (
'n',
'u',
'm',
'r'));
357 map->add_feature (
HB_TAG (
'd',
'n',
'o',
'm'));
363 #ifndef HB_NO_AAT_SHAPE
370 map->enable_feature (
HB_TAG (
'H',
'a',
'r',
'f'));
371 map->enable_feature (
HB_TAG (
'H',
'A',
'R',
'F'));
376 map->enable_feature (
HB_TAG (
'B',
'u',
'z',
'z'));
377 map->enable_feature (
HB_TAG (
'B',
'U',
'Z',
'Z'));
380 map->add_feature (common_features[
i]);
384 map->add_feature (horizontal_features[
i]);
398 for (
unsigned int i = 0;
i < num_user_features;
i++)
401 map->add_feature (feature->
tag,
407 #ifndef HB_NO_AAT_SHAPE
411 for (
unsigned int i = 0;
i < num_user_features;
i++)
497 for (
unsigned int i = 0;
i <
count;
i++)
499 _hb_glyph_info_set_unicode_props (&
info[
i],
buffer);
504 hb_in_range<hb_codepoint_t> (
info[
i].codepoint, 0x1F3FBu, 0x1F3FFu)))
506 _hb_glyph_info_set_continuation (&
info[
i]);
510 else if (
unlikely (
i && _hb_codepoint_is_regional_indicator (
info[
i].codepoint)))
512 if (_hb_codepoint_is_regional_indicator (
info[
i - 1].codepoint) &&
513 !_hb_glyph_info_is_continuation (&
info[
i - 1]))
514 _hb_glyph_info_set_continuation (&
info[
i]);
516 #ifndef HB_NO_EMOJI_SEQUENCES
519 _hb_glyph_info_set_continuation (&
info[
i]);
524 _hb_glyph_info_set_unicode_props (&
info[
i],
buffer);
525 _hb_glyph_info_set_continuation (&
info[
i]);
541 else if (
unlikely (hb_in_range<hb_codepoint_t> (
info[
i].codepoint, 0xE0020u, 0xE007Fu)))
542 _hb_glyph_info_set_continuation (&
info[
i]);
554 !_hb_glyph_info_is_unicode_mark (&
buffer->info[0]))
557 if (!
font->has_glyph (0x25CCu))
562 _hb_glyph_info_set_unicode_props (&dottedcircle,
buffer);
614 bool found_number =
false, found_letter =
false, found_ri =
false;
617 for (
unsigned i = 0;
i <
count;
i++)
619 auto gc = _hb_glyph_info_get_general_category (&
info[
i]);
627 else if (_hb_codepoint_is_regional_indicator (
info[
i].codepoint))
630 if ((found_number || found_ri) && !found_letter)
643 _hb_ot_layout_reverse_graphemes (
buffer);
653 #ifndef HB_NO_VERTICAL
659 case 0x20:
switch (
u) {
660 case 0x2013u:
return 0xfe32u;
661 case 0x2014u:
return 0xfe31u;
662 case 0x2025u:
return 0xfe30u;
663 case 0x2026u:
return 0xfe19u;
665 case 0x30:
switch (
u) {
666 case 0x3001u:
return 0xfe11u;
667 case 0x3002u:
return 0xfe12u;
668 case 0x3008u:
return 0xfe3fu;
669 case 0x3009u:
return 0xfe40u;
670 case 0x300au:
return 0xfe3du;
671 case 0x300bu:
return 0xfe3eu;
672 case 0x300cu:
return 0xfe41u;
673 case 0x300du:
return 0xfe42u;
674 case 0x300eu:
return 0xfe43u;
675 case 0x300fu:
return 0xfe44u;
676 case 0x3010u:
return 0xfe3bu;
677 case 0x3011u:
return 0xfe3cu;
678 case 0x3014u:
return 0xfe39u;
679 case 0x3015u:
return 0xfe3au;
680 case 0x3016u:
return 0xfe17u;
681 case 0x3017u:
return 0xfe18u;
683 case 0xfe:
switch (
u) {
684 case 0xfe4fu:
return 0xfe34u;
686 case 0xff:
switch (
u) {
687 case 0xff01u:
return 0xfe15u;
688 case 0xff08u:
return 0xfe35u;
689 case 0xff09u:
return 0xfe36u;
690 case 0xff0cu:
return 0xfe10u;
691 case 0xff1au:
return 0xfe13u;
692 case 0xff1bu:
return 0xfe14u;
693 case 0xff1fu:
return 0xfe16u;
694 case 0xff3bu:
return 0xfe47u;
695 case 0xff3du:
return 0xfe48u;
696 case 0xff3fu:
return 0xfe33u;
697 case 0xff5bu:
return 0xfe37u;
698 case 0xff5du:
return 0xfe38u;
718 for (
unsigned int i = 0;
i <
count;
i++) {
720 if (
unlikely (codepoint !=
info[
i].codepoint &&
c->font->has_glyph (codepoint)))
721 info[
i].codepoint = codepoint;
723 info[
i].mask |= rtlm_mask;
727 #ifndef HB_NO_VERTICAL
730 for (
unsigned int i = 0;
i <
count;
i++) {
732 if (
unlikely (codepoint !=
info[
i].codepoint &&
c->font->has_glyph (codepoint)))
733 info[
i].codepoint = codepoint;
742 #ifdef HB_NO_OT_SHAPE_FRACTIONS
755 pre_mask =
c->plan->numr_mask |
c->plan->frac_mask;
756 post_mask =
c->plan->frac_mask |
c->plan->dnom_mask;
760 pre_mask =
c->plan->frac_mask |
c->plan->dnom_mask;
761 post_mask =
c->plan->numr_mask |
c->plan->frac_mask;
766 for (
unsigned int i = 0;
i <
count;
i++)
768 if (
info[
i].codepoint == 0x2044u)
772 _hb_glyph_info_get_general_category (&
info[
start - 1]) ==
776 _hb_glyph_info_get_general_category (&
info[
end]) ==
784 info[
i].mask |=
c->plan->frac_mask;
785 for (
unsigned int j =
i + 1;
j <
end;
j++)
800 buffer->reset_masks (global_mask);
809 hb_ot_shape_setup_masks_fraction (
c);
811 if (
c->plan->shaper->setup_masks)
812 c->plan->shaper->setup_masks (
c->plan,
buffer,
c->font);
814 for (
unsigned int i = 0;
i <
c->num_user_features;
i++)
838 if (
unlikely (_hb_glyph_info_is_default_ignorable (&
info[
i])))
839 pos[
i].x_advance =
pos[
i].y_advance =
pos[
i].x_offset =
pos[
i].y_offset = 0;
855 (invisible ||
font->get_nominal_glyph (
' ', &invisible)))
858 for (
unsigned int i = 0;
i <
count;
i++)
860 if (_hb_glyph_info_is_default_ignorable (&
info[
i]))
861 info[
i].codepoint = invisible;
875 for (
unsigned int i = 0;
i <
count;
i++)
886 for (
unsigned int i = 0;
i <
count;
i++)
898 klass = (_hb_glyph_info_get_general_category (&
info[
i]) !=
900 _hb_glyph_info_is_default_ignorable (&
info[
i])) ?
903 _hb_glyph_info_set_glyph_props (&
info[
i], klass);
912 hb_ot_rotate_chars (
c);
918 hb_ot_shape_setup_masks (
c);
921 if (
c->plan->fallback_mark_positioning)
924 hb_ot_map_glyphs_fast (
buffer);
936 if (
c->plan->fallback_glyph_classes)
937 hb_synthesize_glyph_classes (
c->buffer);
939 c->plan->substitute (
c->font,
buffer);
945 hb_ot_substitute_default (
c);
947 _hb_buffer_allocate_gsubgpos_vars (
c->buffer);
949 hb_ot_substitute_complex (
c);
951 #ifndef HB_NO_AAT_SHAPE
952 if (
c->plan->apply_morx &&
c->plan->apply_gpos)
960 #ifndef HB_NO_AAT_SHAPE
961 if (
c->plan->apply_morx && !
c->plan->apply_gpos)
965 hb_ot_hide_default_ignorables (
c->buffer,
c->font);
967 if (
c->plan->shaper->postprocess_glyphs &&
968 c->buffer->message(
c->font,
"start postprocess-glyphs")) {
969 c->plan->shaper->postprocess_glyphs (
c->plan,
c->buffer,
c->font);
970 (
void)
c->buffer->message(
c->font,
"end postprocess-glyphs");
982 pos->x_offset -=
pos->x_advance;
983 pos->y_offset -=
pos->y_advance;
998 for (
unsigned int i = 0;
i <
count;
i++)
999 if (_hb_glyph_info_is_mark (&
info[
i]))
1002 adjust_mark_offsets (&
buffer->pos[
i]);
1003 zero_mark_width (&
buffer->pos[
i]);
1011 unsigned int count =
c->buffer->len;
1017 c->font->get_glyph_h_advances (
count, &
info[0].codepoint,
sizeof(
info[0]),
1018 &
pos[0].x_advance,
sizeof(
pos[0]));
1020 if (
c->font->has_glyph_h_origin_func ())
1021 for (
unsigned int i = 0;
i <
count;
i++)
1022 c->font->subtract_glyph_h_origin (
info[
i].codepoint,
1028 c->font->get_glyph_v_advances (
count, &
info[0].codepoint,
sizeof(
info[0]),
1029 &
pos[0].y_advance,
sizeof(
pos[0]));
1030 for (
unsigned int i = 0;
i <
count;
i++)
1032 c->font->subtract_glyph_v_origin (
info[
i].codepoint,
1044 unsigned int count =
c->buffer->len;
1057 bool adjust_offsets_when_zeroing =
c->plan->adjust_mark_positioning_when_zeroing &&
1063 if (
c->font->has_glyph_h_origin_func ())
1064 for (
unsigned int i = 0;
i <
count;
i++)
1065 c->font->add_glyph_h_origin (
info[
i].codepoint,
1071 if (
c->plan->zero_marks)
1072 switch (
c->plan->shaper->zero_width_marks)
1075 zero_mark_widths_by_gdef (
c->buffer, adjust_offsets_when_zeroing);
1084 c->plan->position (
c->font,
c->buffer);
1086 if (
c->plan->zero_marks)
1087 switch (
c->plan->shaper->zero_width_marks)
1090 zero_mark_widths_by_gdef (
c->buffer, adjust_offsets_when_zeroing);
1101 hb_ot_zero_width_default_ignorables (
c->buffer);
1102 #ifndef HB_NO_AAT_SHAPE
1103 if (
c->plan->apply_morx)
1109 if (
c->font->has_glyph_h_origin_func ())
1110 for (
unsigned int i = 0;
i <
count;
i++)
1111 c->font->subtract_glyph_h_origin (
info[
i].codepoint,
1115 if (
c->plan->fallback_mark_positioning)
1117 adjust_offsets_when_zeroing);
1123 c->buffer->clear_positions ();
1125 hb_ot_position_default (
c);
1127 hb_ot_position_complex (
c);
1132 _hb_buffer_deallocate_gsubgpos_vars (
c->buffer);
1148 unsigned int mask = 0;
1162 c->buffer->enter ();
1165 c->target_direction =
c->buffer->props.direction;
1167 _hb_buffer_allocate_unicode_vars (
c->buffer);
1169 hb_ot_shape_initialize_masks (
c);
1170 hb_set_unicode_props (
c->buffer);
1171 hb_insert_dotted_circle (
c->buffer,
c->font);
1173 hb_form_clusters (
c->buffer);
1175 hb_ensure_native_direction (
c->buffer);
1177 if (
c->plan->shaper->preprocess_text &&
1178 c->buffer->message(
c->font,
"start preprocess-text"))
1180 c->plan->shaper->preprocess_text (
c->plan,
c->buffer,
c->font);
1181 (
void)
c->buffer->message(
c->font,
"end preprocess-text");
1184 hb_ot_substitute_pre (
c);
1186 hb_ot_substitute_post (
c);
1188 hb_propagate_flags (
c->buffer);
1190 _hb_buffer_deallocate_unicode_vars (
c->buffer);
1192 c->buffer->props.direction =
c->target_direction;
1194 c->buffer->leave ();
1203 unsigned int num_features)
1206 hb_ot_shape_internal (&
c);
1241 if (
font->get_nominal_glyph (
u, &glyph))
1242 glyphs->
add (glyph);
1246 if (
m !=
u &&
font->get_nominal_glyph (
m, &glyph))
1247 glyphs->
add (glyph);
1270 unsigned int num_features,
1273 const char *shapers[] = {
"ot",
nullptr};
1275 features, num_features, shapers);
1281 for (
unsigned int i = 0;
i <
count;
i++)
small capitals from c petite p scientific f u
small capitals from c petite p scientific i
[1]
QMap< QString, QString > map
[6]
void hb_aat_layout_substitute(const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer)
void hb_aat_layout_track(const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer)
void hb_aat_layout_zero_width_deleted_glyphs(hb_buffer_t *buffer)
hb_bool_t hb_aat_layout_has_substitution(hb_face_t *face)
void hb_aat_layout_remove_deleted_glyphs(hb_buffer_t *buffer)
hb_bool_t hb_aat_layout_has_positioning(hb_face_t *face)
void hb_aat_layout_position(const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer)
hb_bool_t hb_aat_layout_has_tracking(hb_face_t *face)
void hb_buffer_reverse(hb_buffer_t *buffer)
#define HB_BUFFER_DEALLOCATE_VAR(b, var)
@ HB_BUFFER_SCRATCH_FLAG_HAS_DEFAULT_IGNORABLES
@ HB_BUFFER_SCRATCH_FLAG_HAS_SPACE_FALLBACK
@ HB_BUFFER_SCRATCH_FLAG_HAS_GLYPH_FLAGS
@ HB_BUFFER_SCRATCH_FLAG_HAS_NON_ASCII
#define HB_BUFFER_ALLOCATE_VAR(b, var)
#define foreach_cluster(buffer, start, end)
hb_direction_t hb_script_get_horizontal_direction(hb_script_t script)
void const void *obj HB_UNUSED
HB_EXTERN hb_tag_t table_tag
bool hb_ot_layout_has_kerning(hb_face_t *face)
bool hb_ot_layout_has_machine_kerning(hb_face_t *face)
void hb_ot_layout_position_finish_offsets(hb_font_t *font, hb_buffer_t *buffer)
void hb_ot_layout_position_finish_advances(hb_font_t *font, hb_buffer_t *buffer)
bool hb_ot_layout_has_cross_kerning(hb_face_t *face)
void hb_ot_layout_substitute_start(hb_font_t *font, hb_buffer_t *buffer)
hb_bool_t hb_ot_layout_has_glyph_classes(hb_face_t *face)
hb_bool_t hb_ot_layout_has_positioning(hb_face_t *face)
void hb_ot_layout_kern(const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer)
hb_bool_t hb_ot_layout_has_substitution(hb_face_t *face)
void hb_ot_layout_lookups_substitute_closure(hb_face_t *face, const hb_set_t *lookups, hb_set_t *glyphs)
void hb_ot_layout_position_start(hb_font_t *font, hb_buffer_t *buffer)
void hb_ot_layout_delete_glyphs_inplace(hb_buffer_t *buffer, bool(*filter)(const hb_glyph_info_t *info))
#define foreach_grapheme(buffer, start, end)
hb_ot_layout_glyph_props_flags_t
@ HB_OT_LAYOUT_GLYPH_PROPS_MARK
@ HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH
#define HB_OT_MAP_MAX_VALUE
@ F_GLOBAL_MANUAL_JOINERS
const hb_ot_complex_shaper_t _hb_ot_complex_shaper_dumber
const hb_ot_complex_shaper_t _hb_ot_complex_shaper_default
@ HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_EARLY
@ HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE
@ HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE
void _hb_ot_shape_fallback_kern(const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer)
void _hb_ot_shape_fallback_spaces(const hb_ot_shape_plan_t *plan HB_UNUSED, hb_font_t *font, hb_buffer_t *buffer)
void _hb_ot_shape_fallback_mark_position_recategorize_marks(const hb_ot_shape_plan_t *plan HB_UNUSED, hb_font_t *font HB_UNUSED, hb_buffer_t *buffer)
void _hb_ot_shape_fallback_mark_position(const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer, bool adjust_offsets_when_zeroing)
void _hb_ot_shape_normalize(const hb_ot_shape_plan_t *plan, hb_buffer_t *buffer, hb_font_t *font)
void _hb_ot_shaper_face_data_destroy(hb_ot_face_data_t *data)
hb_bool_t _hb_ot_shape(hb_shape_plan_t *shape_plan, hb_font_t *font, hb_buffer_t *buffer, const hb_feature_t *features, unsigned int num_features)
void _hb_ot_shaper_font_data_destroy(hb_ot_font_data_t *data HB_UNUSED)
void hb_ot_shape_plan_collect_lookups(hb_shape_plan_t *shape_plan, hb_tag_t table_tag, hb_set_t *lookup_indexes)
hb_ot_face_data_t * _hb_ot_shaper_face_data_create(hb_face_t *face)
hb_ot_font_data_t * _hb_ot_shaper_font_data_create(hb_font_t *font HB_UNUSED)
void hb_ot_shape_glyphs_closure(hb_font_t *font, hb_buffer_t *buffer, const hb_feature_t *features, unsigned int num_features, hb_set_t *glyphs)
hb_set_t * hb_set_create()
void hb_set_destroy(hb_set_t *set)
void hb_shape_plan_destroy(hb_shape_plan_t *shape_plan)
hb_shape_plan_t * hb_shape_plan_create_cached(hb_face_t *face, const hb_segment_properties_t *props, const hb_feature_t *user_features, unsigned int num_user_features, const char *const *shaper_list)
#define HB_SHAPER_DATA_SUCCEEDED
bool _hb_unicode_is_emoji_Extended_Pictographic(hb_codepoint_t cp)
#define HB_UNICODE_GENERAL_CATEGORY_IS_LETTER(gen_cat)
backing_store_ptr info
[4]
set set set set set set set macro pixldst1 abits if abits op else op endif endm macro pixldst2 abits if abits op else op endif endm macro pixldst4 abits if abits op else op endif endm macro pixldst0 abits op endm macro pixldst3 mem_operand op endm macro pixldst30 mem_operand op endm macro pixldst abits if abits elseif abits elseif abits elseif abits elseif abits pixldst0 abits else pixldst0 abits pixldst0 abits pixldst0 abits pixldst0 abits endif elseif abits else pixldst0 abits pixldst0 abits endif elseif abits else error unsupported bpp *numpix else pixst endif endm macro vuzp8 reg2 vuzp d d ®2 endm macro vzip8 reg2 vzip d d ®2 endm macro pixdeinterleave basereg basereg basereg basereg basereg endif endm macro pixinterleave basereg basereg basereg basereg basereg endif endm macro PF boost_increment endif if endif PF tst PF addne PF subne PF cmp ORIG_W if endif if endif if endif PF subge ORIG_W PF subges if endif if endif if endif endif endm macro cache_preload_simple endif if dst_r_bpp pld[DST_R, #(PREFETCH_DISTANCE_SIMPLE *dst_r_bpp/8)] endif if mask_bpp pld endif[MASK, #(PREFETCH_DISTANCE_SIMPLE *mask_bpp/8)] endif endif endm macro ensure_destination_ptr_alignment process_pixblock_tail_head if beq irp skip1 beq endif SRC MASK if dst_r_bpp DST_R else add endif PF add sub src_basereg pixdeinterleave mask_basereg pixdeinterleave dst_r_basereg process_pixblock_head pixblock_size cache_preload_simple process_pixblock_tail pixinterleave dst_w_basereg irp beq endif process_pixblock_tail_head tst beq irp if pixblock_size chunk_size tst beq pixld SRC pixld MASK if DST_R else pixld DST_R endif if
GLenum GLenum GLsizei count
GLenum GLuint GLsizei const GLenum * props
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLint GLint GLint GLint GLint GLint GLint GLbitfield mask
@ HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES
@ HB_BUFFER_CONTENT_TYPE_GLYPHS
@ HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE
@ HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES
@ HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES
HB_BEGIN_DECLS typedef int hb_bool_t
#define HB_TAG(c1, c2, c3, c4)
#define HB_DIRECTION_REVERSE(dir)
#define HB_FEATURE_GLOBAL_END
#define HB_DIRECTION_IS_FORWARD(dir)
#define HB_DIRECTION_IS_VERTICAL(dir)
#define HB_DIRECTION_IS_BACKWARD(dir)
#define HB_FEATURE_GLOBAL_START
#define HB_DIRECTION_IS_HORIZONTAL(dir)
#define HB_OT_LAYOUT_NO_FEATURE_INDEX
@ HB_UNICODE_GENERAL_CATEGORY_DECIMAL_NUMBER
@ HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK
@ HB_UNICODE_GENERAL_CATEGORY_MODIFIER_SYMBOL
HB_INTERNAL void compile(hb_aat_map_t &m)
HB_INTERNAL void add_feature(hb_tag_t tag, unsigned int value=1)
void(* collect_features)(hb_ot_shape_planner_t *plan)
hb_ot_shape_zero_width_marks_type_t zero_width_marks
void(* data_destroy)(void *data)
void(* override_features)(hb_ot_shape_planner_t *plan)
void *(* data_create)(const hb_ot_shape_plan_t *plan)
HB_INTERNAL void compile(hb_ot_map_t &m, const hb_ot_shape_plan_key_t &key)
hb_mask_t get_mask(hb_tag_t feature_tag, unsigned int *shift=nullptr) const
hb_mask_t get_1_mask(hb_tag_t feature_tag) const
HB_INTERNAL void position(const struct hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) const
hb_tag_t chosen_script[2]
unsigned int get_feature_index(unsigned int table_index, hb_tag_t feature_tag) const
HB_INTERNAL void substitute(const struct hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) const
hb_direction_t target_direction
hb_ot_shape_plan_t * plan
unsigned int num_user_features
const hb_feature_t * user_features
HB_INTERNAL void position(hb_font_t *font, hb_buffer_t *buffer) const
bool fallback_mark_positioning
HB_INTERNAL bool init0(hb_face_t *face, const hb_shape_plan_key_t *key)
void collect_lookups(hb_tag_t table_tag, hb_set_t *lookups) const
HB_INTERNAL void substitute(hb_font_t *font, hb_buffer_t *buffer) const
bool adjust_mark_positioning_when_zeroing
hb_segment_properties_t props
bool fallback_glyph_classes
const struct hb_ot_complex_shaper_t * shaper
HB_INTERNAL void compile(hb_ot_shape_plan_t &plan, const hb_ot_shape_plan_key_t &key)
const struct hb_ot_complex_shaper_t * shaper
HB_INTERNAL hb_ot_shape_planner_t(hb_face_t *face, const hb_segment_properties_t *props)
hb_segment_properties_t props
hb_aat_map_builder_t aat_map
bool script_fallback_mark_positioning
void add(hb_codepoint_t g)