1*2d1272b8SAndroid Build Coastguard Worker /*
2*2d1272b8SAndroid Build Coastguard Worker * Copyright © 2007,2008,2009 Red Hat, Inc.
3*2d1272b8SAndroid Build Coastguard Worker * Copyright © 2012,2013 Google, Inc.
4*2d1272b8SAndroid Build Coastguard Worker *
5*2d1272b8SAndroid Build Coastguard Worker * This is part of HarfBuzz, a text shaping library.
6*2d1272b8SAndroid Build Coastguard Worker *
7*2d1272b8SAndroid Build Coastguard Worker * Permission is hereby granted, without written agreement and without
8*2d1272b8SAndroid Build Coastguard Worker * license or royalty fees, to use, copy, modify, and distribute this
9*2d1272b8SAndroid Build Coastguard Worker * software and its documentation for any purpose, provided that the
10*2d1272b8SAndroid Build Coastguard Worker * above copyright notice and the following two paragraphs appear in
11*2d1272b8SAndroid Build Coastguard Worker * all copies of this software.
12*2d1272b8SAndroid Build Coastguard Worker *
13*2d1272b8SAndroid Build Coastguard Worker * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
14*2d1272b8SAndroid Build Coastguard Worker * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
15*2d1272b8SAndroid Build Coastguard Worker * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
16*2d1272b8SAndroid Build Coastguard Worker * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
17*2d1272b8SAndroid Build Coastguard Worker * DAMAGE.
18*2d1272b8SAndroid Build Coastguard Worker *
19*2d1272b8SAndroid Build Coastguard Worker * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
20*2d1272b8SAndroid Build Coastguard Worker * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
21*2d1272b8SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
22*2d1272b8SAndroid Build Coastguard Worker * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
23*2d1272b8SAndroid Build Coastguard Worker * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
24*2d1272b8SAndroid Build Coastguard Worker *
25*2d1272b8SAndroid Build Coastguard Worker * Red Hat Author(s): Behdad Esfahbod
26*2d1272b8SAndroid Build Coastguard Worker * Google Author(s): Behdad Esfahbod
27*2d1272b8SAndroid Build Coastguard Worker */
28*2d1272b8SAndroid Build Coastguard Worker
29*2d1272b8SAndroid Build Coastguard Worker #ifndef HB_OT_LAYOUT_HH
30*2d1272b8SAndroid Build Coastguard Worker #define HB_OT_LAYOUT_HH
31*2d1272b8SAndroid Build Coastguard Worker
32*2d1272b8SAndroid Build Coastguard Worker #include "hb.hh"
33*2d1272b8SAndroid Build Coastguard Worker
34*2d1272b8SAndroid Build Coastguard Worker #include "hb-font.hh"
35*2d1272b8SAndroid Build Coastguard Worker #include "hb-buffer.hh"
36*2d1272b8SAndroid Build Coastguard Worker #include "hb-open-type.hh"
37*2d1272b8SAndroid Build Coastguard Worker #include "hb-ot-shape.hh"
38*2d1272b8SAndroid Build Coastguard Worker #include "hb-set-digest.hh"
39*2d1272b8SAndroid Build Coastguard Worker
40*2d1272b8SAndroid Build Coastguard Worker
41*2d1272b8SAndroid Build Coastguard Worker struct hb_ot_shape_plan_t;
42*2d1272b8SAndroid Build Coastguard Worker
43*2d1272b8SAndroid Build Coastguard Worker
44*2d1272b8SAndroid Build Coastguard Worker /*
45*2d1272b8SAndroid Build Coastguard Worker * kern
46*2d1272b8SAndroid Build Coastguard Worker */
47*2d1272b8SAndroid Build Coastguard Worker
48*2d1272b8SAndroid Build Coastguard Worker HB_INTERNAL bool
49*2d1272b8SAndroid Build Coastguard Worker hb_ot_layout_has_kerning (hb_face_t *face);
50*2d1272b8SAndroid Build Coastguard Worker
51*2d1272b8SAndroid Build Coastguard Worker HB_INTERNAL bool
52*2d1272b8SAndroid Build Coastguard Worker hb_ot_layout_has_machine_kerning (hb_face_t *face);
53*2d1272b8SAndroid Build Coastguard Worker
54*2d1272b8SAndroid Build Coastguard Worker HB_INTERNAL bool
55*2d1272b8SAndroid Build Coastguard Worker hb_ot_layout_has_cross_kerning (hb_face_t *face);
56*2d1272b8SAndroid Build Coastguard Worker
57*2d1272b8SAndroid Build Coastguard Worker HB_INTERNAL void
58*2d1272b8SAndroid Build Coastguard Worker hb_ot_layout_kern (const hb_ot_shape_plan_t *plan,
59*2d1272b8SAndroid Build Coastguard Worker hb_font_t *font,
60*2d1272b8SAndroid Build Coastguard Worker hb_buffer_t *buffer);
61*2d1272b8SAndroid Build Coastguard Worker
62*2d1272b8SAndroid Build Coastguard Worker
63*2d1272b8SAndroid Build Coastguard Worker /* Private API corresponding to hb-ot-layout.h: */
64*2d1272b8SAndroid Build Coastguard Worker
65*2d1272b8SAndroid Build Coastguard Worker HB_INTERNAL bool
66*2d1272b8SAndroid Build Coastguard Worker hb_ot_layout_table_find_feature (hb_face_t *face,
67*2d1272b8SAndroid Build Coastguard Worker hb_tag_t table_tag,
68*2d1272b8SAndroid Build Coastguard Worker hb_tag_t feature_tag,
69*2d1272b8SAndroid Build Coastguard Worker unsigned int *feature_index);
70*2d1272b8SAndroid Build Coastguard Worker
71*2d1272b8SAndroid Build Coastguard Worker
72*2d1272b8SAndroid Build Coastguard Worker /*
73*2d1272b8SAndroid Build Coastguard Worker * GDEF
74*2d1272b8SAndroid Build Coastguard Worker */
75*2d1272b8SAndroid Build Coastguard Worker
76*2d1272b8SAndroid Build Coastguard Worker enum hb_ot_layout_glyph_props_flags_t
77*2d1272b8SAndroid Build Coastguard Worker {
78*2d1272b8SAndroid Build Coastguard Worker /* The following three match LookupFlags::Ignore* numbers. */
79*2d1272b8SAndroid Build Coastguard Worker HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH = 0x02u,
80*2d1272b8SAndroid Build Coastguard Worker HB_OT_LAYOUT_GLYPH_PROPS_LIGATURE = 0x04u,
81*2d1272b8SAndroid Build Coastguard Worker HB_OT_LAYOUT_GLYPH_PROPS_MARK = 0x08u,
82*2d1272b8SAndroid Build Coastguard Worker
83*2d1272b8SAndroid Build Coastguard Worker /* The following are used internally; not derived from GDEF. */
84*2d1272b8SAndroid Build Coastguard Worker HB_OT_LAYOUT_GLYPH_PROPS_SUBSTITUTED = 0x10u,
85*2d1272b8SAndroid Build Coastguard Worker HB_OT_LAYOUT_GLYPH_PROPS_LIGATED = 0x20u,
86*2d1272b8SAndroid Build Coastguard Worker HB_OT_LAYOUT_GLYPH_PROPS_MULTIPLIED = 0x40u,
87*2d1272b8SAndroid Build Coastguard Worker
88*2d1272b8SAndroid Build Coastguard Worker HB_OT_LAYOUT_GLYPH_PROPS_PRESERVE = HB_OT_LAYOUT_GLYPH_PROPS_SUBSTITUTED |
89*2d1272b8SAndroid Build Coastguard Worker HB_OT_LAYOUT_GLYPH_PROPS_LIGATED |
90*2d1272b8SAndroid Build Coastguard Worker HB_OT_LAYOUT_GLYPH_PROPS_MULTIPLIED
91*2d1272b8SAndroid Build Coastguard Worker };
92*2d1272b8SAndroid Build Coastguard Worker HB_MARK_AS_FLAG_T (hb_ot_layout_glyph_props_flags_t);
93*2d1272b8SAndroid Build Coastguard Worker
94*2d1272b8SAndroid Build Coastguard Worker
95*2d1272b8SAndroid Build Coastguard Worker /*
96*2d1272b8SAndroid Build Coastguard Worker * GSUB/GPOS
97*2d1272b8SAndroid Build Coastguard Worker */
98*2d1272b8SAndroid Build Coastguard Worker
99*2d1272b8SAndroid Build Coastguard Worker
100*2d1272b8SAndroid Build Coastguard Worker /* Should be called before all the substitute_lookup's are done. */
101*2d1272b8SAndroid Build Coastguard Worker HB_INTERNAL void
102*2d1272b8SAndroid Build Coastguard Worker hb_ot_layout_substitute_start (hb_font_t *font,
103*2d1272b8SAndroid Build Coastguard Worker hb_buffer_t *buffer);
104*2d1272b8SAndroid Build Coastguard Worker
105*2d1272b8SAndroid Build Coastguard Worker namespace OT {
106*2d1272b8SAndroid Build Coastguard Worker struct hb_ot_apply_context_t;
107*2d1272b8SAndroid Build Coastguard Worker struct hb_ot_layout_lookup_accelerator_t;
108*2d1272b8SAndroid Build Coastguard Worker namespace Layout {
109*2d1272b8SAndroid Build Coastguard Worker namespace GSUB_impl {
110*2d1272b8SAndroid Build Coastguard Worker struct SubstLookup;
111*2d1272b8SAndroid Build Coastguard Worker }
112*2d1272b8SAndroid Build Coastguard Worker }
113*2d1272b8SAndroid Build Coastguard Worker }
114*2d1272b8SAndroid Build Coastguard Worker
115*2d1272b8SAndroid Build Coastguard Worker HB_INTERNAL void
116*2d1272b8SAndroid Build Coastguard Worker hb_ot_layout_substitute_lookup (OT::hb_ot_apply_context_t *c,
117*2d1272b8SAndroid Build Coastguard Worker const OT::Layout::GSUB_impl::SubstLookup &lookup,
118*2d1272b8SAndroid Build Coastguard Worker const OT::hb_ot_layout_lookup_accelerator_t &accel);
119*2d1272b8SAndroid Build Coastguard Worker
120*2d1272b8SAndroid Build Coastguard Worker
121*2d1272b8SAndroid Build Coastguard Worker /* Should be called before all the position_lookup's are done. */
122*2d1272b8SAndroid Build Coastguard Worker HB_INTERNAL void
123*2d1272b8SAndroid Build Coastguard Worker hb_ot_layout_position_start (hb_font_t *font,
124*2d1272b8SAndroid Build Coastguard Worker hb_buffer_t *buffer);
125*2d1272b8SAndroid Build Coastguard Worker
126*2d1272b8SAndroid Build Coastguard Worker /* Should be called after all the position_lookup's are done, to fini advances. */
127*2d1272b8SAndroid Build Coastguard Worker HB_INTERNAL void
128*2d1272b8SAndroid Build Coastguard Worker hb_ot_layout_position_finish_advances (hb_font_t *font,
129*2d1272b8SAndroid Build Coastguard Worker hb_buffer_t *buffer);
130*2d1272b8SAndroid Build Coastguard Worker
131*2d1272b8SAndroid Build Coastguard Worker /* Should be called after hb_ot_layout_position_finish_advances, to fini offsets. */
132*2d1272b8SAndroid Build Coastguard Worker HB_INTERNAL void
133*2d1272b8SAndroid Build Coastguard Worker hb_ot_layout_position_finish_offsets (hb_font_t *font,
134*2d1272b8SAndroid Build Coastguard Worker hb_buffer_t *buffer);
135*2d1272b8SAndroid Build Coastguard Worker
136*2d1272b8SAndroid Build Coastguard Worker
137*2d1272b8SAndroid Build Coastguard Worker /*
138*2d1272b8SAndroid Build Coastguard Worker * Buffer var routines.
139*2d1272b8SAndroid Build Coastguard Worker */
140*2d1272b8SAndroid Build Coastguard Worker
141*2d1272b8SAndroid Build Coastguard Worker /* buffer var allocations, used during the entire shaping process */
142*2d1272b8SAndroid Build Coastguard Worker #define unicode_props() var2.u16[0]
143*2d1272b8SAndroid Build Coastguard Worker
144*2d1272b8SAndroid Build Coastguard Worker /* buffer var allocations, used during the GSUB/GPOS processing */
145*2d1272b8SAndroid Build Coastguard Worker #define glyph_props() var1.u16[0] /* GDEF glyph properties */
146*2d1272b8SAndroid Build Coastguard Worker #define lig_props() var1.u8[2] /* GSUB/GPOS ligature tracking */
147*2d1272b8SAndroid Build Coastguard Worker #define syllable() var1.u8[3] /* GSUB/GPOS shaping boundaries */
148*2d1272b8SAndroid Build Coastguard Worker
149*2d1272b8SAndroid Build Coastguard Worker
150*2d1272b8SAndroid Build Coastguard Worker /* Loop over syllables. Based on foreach_cluster(). */
151*2d1272b8SAndroid Build Coastguard Worker #define foreach_syllable(buffer, start, end) \
152*2d1272b8SAndroid Build Coastguard Worker for (unsigned int \
153*2d1272b8SAndroid Build Coastguard Worker _count = buffer->len, \
154*2d1272b8SAndroid Build Coastguard Worker start = 0, end = _count ? _hb_next_syllable (buffer, 0) : 0; \
155*2d1272b8SAndroid Build Coastguard Worker start < _count; \
156*2d1272b8SAndroid Build Coastguard Worker start = end, end = _hb_next_syllable (buffer, start))
157*2d1272b8SAndroid Build Coastguard Worker
158*2d1272b8SAndroid Build Coastguard Worker static inline unsigned int
_hb_next_syllable(hb_buffer_t * buffer,unsigned int start)159*2d1272b8SAndroid Build Coastguard Worker _hb_next_syllable (hb_buffer_t *buffer, unsigned int start)
160*2d1272b8SAndroid Build Coastguard Worker {
161*2d1272b8SAndroid Build Coastguard Worker hb_glyph_info_t *info = buffer->info;
162*2d1272b8SAndroid Build Coastguard Worker unsigned int count = buffer->len;
163*2d1272b8SAndroid Build Coastguard Worker
164*2d1272b8SAndroid Build Coastguard Worker unsigned int syllable = info[start].syllable();
165*2d1272b8SAndroid Build Coastguard Worker while (++start < count && syllable == info[start].syllable())
166*2d1272b8SAndroid Build Coastguard Worker ;
167*2d1272b8SAndroid Build Coastguard Worker
168*2d1272b8SAndroid Build Coastguard Worker return start;
169*2d1272b8SAndroid Build Coastguard Worker }
170*2d1272b8SAndroid Build Coastguard Worker
171*2d1272b8SAndroid Build Coastguard Worker
172*2d1272b8SAndroid Build Coastguard Worker /* unicode_props */
173*2d1272b8SAndroid Build Coastguard Worker
174*2d1272b8SAndroid Build Coastguard Worker /* Design:
175*2d1272b8SAndroid Build Coastguard Worker * unicode_props() is a two-byte number. The low byte includes:
176*2d1272b8SAndroid Build Coastguard Worker * - Modified General_Category: 5 bits.
177*2d1272b8SAndroid Build Coastguard Worker * - A bit each for:
178*2d1272b8SAndroid Build Coastguard Worker * * Is it Default_Ignorable(); we have a modified Default_Ignorable().
179*2d1272b8SAndroid Build Coastguard Worker * * Whether it's one of the four Mongolian Free Variation Selectors,
180*2d1272b8SAndroid Build Coastguard Worker * CGJ, or other characters that are hidden but should not be ignored
181*2d1272b8SAndroid Build Coastguard Worker * like most other Default_Ignorable()s do during GSUB matching.
182*2d1272b8SAndroid Build Coastguard Worker * * Whether it's a grapheme continuation.
183*2d1272b8SAndroid Build Coastguard Worker *
184*2d1272b8SAndroid Build Coastguard Worker * The high-byte has different meanings, switched by the Gen-Cat:
185*2d1272b8SAndroid Build Coastguard Worker * - For Mn,Mc,Me: the modified Combining_Class.
186*2d1272b8SAndroid Build Coastguard Worker * - For Cf: whether it's ZWJ, ZWNJ, or something else.
187*2d1272b8SAndroid Build Coastguard Worker * - For Ws: index of which space character this is, if space fallback
188*2d1272b8SAndroid Build Coastguard Worker * is needed, ie. we don't set this by default, only if asked to.
189*2d1272b8SAndroid Build Coastguard Worker *
190*2d1272b8SAndroid Build Coastguard Worker * Above I said "modified" General_Category. This is because we need to
191*2d1272b8SAndroid Build Coastguard Worker * remember Variation Selectors, and we don't have bits left. So we
192*2d1272b8SAndroid Build Coastguard Worker * change their Gen_Cat from Mn to Cf, and use a bit of the high byte to
193*2d1272b8SAndroid Build Coastguard Worker * remember them.
194*2d1272b8SAndroid Build Coastguard Worker */
195*2d1272b8SAndroid Build Coastguard Worker
196*2d1272b8SAndroid Build Coastguard Worker enum hb_unicode_props_flags_t {
197*2d1272b8SAndroid Build Coastguard Worker UPROPS_MASK_GEN_CAT = 0x001Fu,
198*2d1272b8SAndroid Build Coastguard Worker UPROPS_MASK_IGNORABLE = 0x0020u,
199*2d1272b8SAndroid Build Coastguard Worker UPROPS_MASK_HIDDEN = 0x0040u, /* MONGOLIAN FREE VARIATION SELECTOR 1..4, or TAG characters, or CGJ sometimes */
200*2d1272b8SAndroid Build Coastguard Worker UPROPS_MASK_CONTINUATION=0x0080u,
201*2d1272b8SAndroid Build Coastguard Worker
202*2d1272b8SAndroid Build Coastguard Worker /* If GEN_CAT=FORMAT, top byte masks: */
203*2d1272b8SAndroid Build Coastguard Worker UPROPS_MASK_Cf_ZWJ = 0x0100u,
204*2d1272b8SAndroid Build Coastguard Worker UPROPS_MASK_Cf_ZWNJ = 0x0200u,
205*2d1272b8SAndroid Build Coastguard Worker UPROPS_MASK_Cf_VS = 0x0400u
206*2d1272b8SAndroid Build Coastguard Worker };
207*2d1272b8SAndroid Build Coastguard Worker HB_MARK_AS_FLAG_T (hb_unicode_props_flags_t);
208*2d1272b8SAndroid Build Coastguard Worker
209*2d1272b8SAndroid Build Coastguard Worker static inline void
_hb_glyph_info_set_unicode_props(hb_glyph_info_t * info,hb_buffer_t * buffer)210*2d1272b8SAndroid Build Coastguard Worker _hb_glyph_info_set_unicode_props (hb_glyph_info_t *info, hb_buffer_t *buffer)
211*2d1272b8SAndroid Build Coastguard Worker {
212*2d1272b8SAndroid Build Coastguard Worker hb_unicode_funcs_t *unicode = buffer->unicode;
213*2d1272b8SAndroid Build Coastguard Worker unsigned int u = info->codepoint;
214*2d1272b8SAndroid Build Coastguard Worker unsigned int gen_cat = (unsigned int) unicode->general_category (u);
215*2d1272b8SAndroid Build Coastguard Worker unsigned int props = gen_cat;
216*2d1272b8SAndroid Build Coastguard Worker
217*2d1272b8SAndroid Build Coastguard Worker if (u >= 0x80u)
218*2d1272b8SAndroid Build Coastguard Worker {
219*2d1272b8SAndroid Build Coastguard Worker buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_NON_ASCII;
220*2d1272b8SAndroid Build Coastguard Worker
221*2d1272b8SAndroid Build Coastguard Worker if (unlikely (unicode->is_default_ignorable (u)))
222*2d1272b8SAndroid Build Coastguard Worker {
223*2d1272b8SAndroid Build Coastguard Worker buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_DEFAULT_IGNORABLES;
224*2d1272b8SAndroid Build Coastguard Worker props |= UPROPS_MASK_IGNORABLE;
225*2d1272b8SAndroid Build Coastguard Worker if (u == 0x200Cu) props |= UPROPS_MASK_Cf_ZWNJ;
226*2d1272b8SAndroid Build Coastguard Worker else if (u == 0x200Du) props |= UPROPS_MASK_Cf_ZWJ;
227*2d1272b8SAndroid Build Coastguard Worker /* Mongolian Free Variation Selectors need to be remembered
228*2d1272b8SAndroid Build Coastguard Worker * because although we need to hide them like default-ignorables,
229*2d1272b8SAndroid Build Coastguard Worker * they need to non-ignorable during shaping. This is similar to
230*2d1272b8SAndroid Build Coastguard Worker * what we do for joiners in Indic-like shapers, but since the
231*2d1272b8SAndroid Build Coastguard Worker * FVSes are GC=Mn, we have use a separate bit to remember them.
232*2d1272b8SAndroid Build Coastguard Worker * Fixes:
233*2d1272b8SAndroid Build Coastguard Worker * https://github.com/harfbuzz/harfbuzz/issues/234 */
234*2d1272b8SAndroid Build Coastguard Worker else if (unlikely (hb_in_ranges<hb_codepoint_t> (u, 0x180Bu, 0x180Du, 0x180Fu, 0x180Fu))) props |= UPROPS_MASK_HIDDEN;
235*2d1272b8SAndroid Build Coastguard Worker /* TAG characters need similar treatment. Fixes:
236*2d1272b8SAndroid Build Coastguard Worker * https://github.com/harfbuzz/harfbuzz/issues/463 */
237*2d1272b8SAndroid Build Coastguard Worker else if (unlikely (hb_in_range<hb_codepoint_t> (u, 0xE0020u, 0xE007Fu))) props |= UPROPS_MASK_HIDDEN;
238*2d1272b8SAndroid Build Coastguard Worker /* COMBINING GRAPHEME JOINER should not be skipped during GSUB either.
239*2d1272b8SAndroid Build Coastguard Worker * https://github.com/harfbuzz/harfbuzz/issues/554 */
240*2d1272b8SAndroid Build Coastguard Worker else if (unlikely (u == 0x034Fu))
241*2d1272b8SAndroid Build Coastguard Worker {
242*2d1272b8SAndroid Build Coastguard Worker buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_CGJ;
243*2d1272b8SAndroid Build Coastguard Worker props |= UPROPS_MASK_HIDDEN;
244*2d1272b8SAndroid Build Coastguard Worker }
245*2d1272b8SAndroid Build Coastguard Worker }
246*2d1272b8SAndroid Build Coastguard Worker
247*2d1272b8SAndroid Build Coastguard Worker if (unlikely (HB_UNICODE_GENERAL_CATEGORY_IS_MARK (gen_cat)))
248*2d1272b8SAndroid Build Coastguard Worker {
249*2d1272b8SAndroid Build Coastguard Worker props |= UPROPS_MASK_CONTINUATION;
250*2d1272b8SAndroid Build Coastguard Worker props |= unicode->modified_combining_class (u)<<8;
251*2d1272b8SAndroid Build Coastguard Worker }
252*2d1272b8SAndroid Build Coastguard Worker }
253*2d1272b8SAndroid Build Coastguard Worker
254*2d1272b8SAndroid Build Coastguard Worker info->unicode_props() = props;
255*2d1272b8SAndroid Build Coastguard Worker }
256*2d1272b8SAndroid Build Coastguard Worker
257*2d1272b8SAndroid Build Coastguard Worker static inline void
_hb_glyph_info_set_general_category(hb_glyph_info_t * info,hb_unicode_general_category_t gen_cat)258*2d1272b8SAndroid Build Coastguard Worker _hb_glyph_info_set_general_category (hb_glyph_info_t *info,
259*2d1272b8SAndroid Build Coastguard Worker hb_unicode_general_category_t gen_cat)
260*2d1272b8SAndroid Build Coastguard Worker {
261*2d1272b8SAndroid Build Coastguard Worker /* Clears top-byte. */
262*2d1272b8SAndroid Build Coastguard Worker info->unicode_props() = (unsigned int) gen_cat | (info->unicode_props() & (0xFF & ~UPROPS_MASK_GEN_CAT));
263*2d1272b8SAndroid Build Coastguard Worker }
264*2d1272b8SAndroid Build Coastguard Worker
265*2d1272b8SAndroid Build Coastguard Worker static inline hb_unicode_general_category_t
_hb_glyph_info_get_general_category(const hb_glyph_info_t * info)266*2d1272b8SAndroid Build Coastguard Worker _hb_glyph_info_get_general_category (const hb_glyph_info_t *info)
267*2d1272b8SAndroid Build Coastguard Worker {
268*2d1272b8SAndroid Build Coastguard Worker return (hb_unicode_general_category_t) (info->unicode_props() & UPROPS_MASK_GEN_CAT);
269*2d1272b8SAndroid Build Coastguard Worker }
270*2d1272b8SAndroid Build Coastguard Worker
271*2d1272b8SAndroid Build Coastguard Worker static inline bool
_hb_glyph_info_is_unicode_mark(const hb_glyph_info_t * info)272*2d1272b8SAndroid Build Coastguard Worker _hb_glyph_info_is_unicode_mark (const hb_glyph_info_t *info)
273*2d1272b8SAndroid Build Coastguard Worker {
274*2d1272b8SAndroid Build Coastguard Worker return HB_UNICODE_GENERAL_CATEGORY_IS_MARK (info->unicode_props() & UPROPS_MASK_GEN_CAT);
275*2d1272b8SAndroid Build Coastguard Worker }
276*2d1272b8SAndroid Build Coastguard Worker static inline void
_hb_glyph_info_set_modified_combining_class(hb_glyph_info_t * info,unsigned int modified_class)277*2d1272b8SAndroid Build Coastguard Worker _hb_glyph_info_set_modified_combining_class (hb_glyph_info_t *info,
278*2d1272b8SAndroid Build Coastguard Worker unsigned int modified_class)
279*2d1272b8SAndroid Build Coastguard Worker {
280*2d1272b8SAndroid Build Coastguard Worker if (unlikely (!_hb_glyph_info_is_unicode_mark (info)))
281*2d1272b8SAndroid Build Coastguard Worker return;
282*2d1272b8SAndroid Build Coastguard Worker info->unicode_props() = (modified_class<<8) | (info->unicode_props() & 0xFF);
283*2d1272b8SAndroid Build Coastguard Worker }
284*2d1272b8SAndroid Build Coastguard Worker static inline unsigned int
_hb_glyph_info_get_modified_combining_class(const hb_glyph_info_t * info)285*2d1272b8SAndroid Build Coastguard Worker _hb_glyph_info_get_modified_combining_class (const hb_glyph_info_t *info)
286*2d1272b8SAndroid Build Coastguard Worker {
287*2d1272b8SAndroid Build Coastguard Worker return _hb_glyph_info_is_unicode_mark (info) ? info->unicode_props()>>8 : 0;
288*2d1272b8SAndroid Build Coastguard Worker }
289*2d1272b8SAndroid Build Coastguard Worker #define info_cc(info) (_hb_glyph_info_get_modified_combining_class (&(info)))
290*2d1272b8SAndroid Build Coastguard Worker
291*2d1272b8SAndroid Build Coastguard Worker static inline bool
_hb_glyph_info_is_unicode_space(const hb_glyph_info_t * info)292*2d1272b8SAndroid Build Coastguard Worker _hb_glyph_info_is_unicode_space (const hb_glyph_info_t *info)
293*2d1272b8SAndroid Build Coastguard Worker {
294*2d1272b8SAndroid Build Coastguard Worker return _hb_glyph_info_get_general_category (info) ==
295*2d1272b8SAndroid Build Coastguard Worker HB_UNICODE_GENERAL_CATEGORY_SPACE_SEPARATOR;
296*2d1272b8SAndroid Build Coastguard Worker }
297*2d1272b8SAndroid Build Coastguard Worker static inline void
_hb_glyph_info_set_unicode_space_fallback_type(hb_glyph_info_t * info,hb_unicode_funcs_t::space_t s)298*2d1272b8SAndroid Build Coastguard Worker _hb_glyph_info_set_unicode_space_fallback_type (hb_glyph_info_t *info, hb_unicode_funcs_t::space_t s)
299*2d1272b8SAndroid Build Coastguard Worker {
300*2d1272b8SAndroid Build Coastguard Worker if (unlikely (!_hb_glyph_info_is_unicode_space (info)))
301*2d1272b8SAndroid Build Coastguard Worker return;
302*2d1272b8SAndroid Build Coastguard Worker info->unicode_props() = (((unsigned int) s)<<8) | (info->unicode_props() & 0xFF);
303*2d1272b8SAndroid Build Coastguard Worker }
304*2d1272b8SAndroid Build Coastguard Worker static inline hb_unicode_funcs_t::space_t
_hb_glyph_info_get_unicode_space_fallback_type(const hb_glyph_info_t * info)305*2d1272b8SAndroid Build Coastguard Worker _hb_glyph_info_get_unicode_space_fallback_type (const hb_glyph_info_t *info)
306*2d1272b8SAndroid Build Coastguard Worker {
307*2d1272b8SAndroid Build Coastguard Worker return _hb_glyph_info_is_unicode_space (info) ?
308*2d1272b8SAndroid Build Coastguard Worker (hb_unicode_funcs_t::space_t) (info->unicode_props()>>8) :
309*2d1272b8SAndroid Build Coastguard Worker hb_unicode_funcs_t::NOT_SPACE;
310*2d1272b8SAndroid Build Coastguard Worker }
311*2d1272b8SAndroid Build Coastguard Worker static inline bool
_hb_glyph_info_is_variation_selector(const hb_glyph_info_t * info)312*2d1272b8SAndroid Build Coastguard Worker _hb_glyph_info_is_variation_selector (const hb_glyph_info_t *info)
313*2d1272b8SAndroid Build Coastguard Worker {
314*2d1272b8SAndroid Build Coastguard Worker return _hb_glyph_info_get_general_category (info) ==
315*2d1272b8SAndroid Build Coastguard Worker HB_UNICODE_GENERAL_CATEGORY_FORMAT &&
316*2d1272b8SAndroid Build Coastguard Worker (info->unicode_props() & UPROPS_MASK_Cf_VS);
317*2d1272b8SAndroid Build Coastguard Worker }
318*2d1272b8SAndroid Build Coastguard Worker static inline void
_hb_glyph_info_set_variation_selector(hb_glyph_info_t * info,bool customize)319*2d1272b8SAndroid Build Coastguard Worker _hb_glyph_info_set_variation_selector (hb_glyph_info_t *info, bool customize)
320*2d1272b8SAndroid Build Coastguard Worker {
321*2d1272b8SAndroid Build Coastguard Worker if (customize)
322*2d1272b8SAndroid Build Coastguard Worker {
323*2d1272b8SAndroid Build Coastguard Worker _hb_glyph_info_set_general_category (info, HB_UNICODE_GENERAL_CATEGORY_FORMAT);
324*2d1272b8SAndroid Build Coastguard Worker info->unicode_props() |= UPROPS_MASK_Cf_VS;
325*2d1272b8SAndroid Build Coastguard Worker }
326*2d1272b8SAndroid Build Coastguard Worker else
327*2d1272b8SAndroid Build Coastguard Worker {
328*2d1272b8SAndroid Build Coastguard Worker // Reset to their original condition
329*2d1272b8SAndroid Build Coastguard Worker _hb_glyph_info_set_general_category (info, HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK);
330*2d1272b8SAndroid Build Coastguard Worker }
331*2d1272b8SAndroid Build Coastguard Worker }
332*2d1272b8SAndroid Build Coastguard Worker
333*2d1272b8SAndroid Build Coastguard Worker static inline bool _hb_glyph_info_substituted (const hb_glyph_info_t *info);
334*2d1272b8SAndroid Build Coastguard Worker
335*2d1272b8SAndroid Build Coastguard Worker static inline bool
_hb_glyph_info_is_default_ignorable(const hb_glyph_info_t * info)336*2d1272b8SAndroid Build Coastguard Worker _hb_glyph_info_is_default_ignorable (const hb_glyph_info_t *info)
337*2d1272b8SAndroid Build Coastguard Worker {
338*2d1272b8SAndroid Build Coastguard Worker return (info->unicode_props() & UPROPS_MASK_IGNORABLE) &&
339*2d1272b8SAndroid Build Coastguard Worker !_hb_glyph_info_substituted (info);
340*2d1272b8SAndroid Build Coastguard Worker }
341*2d1272b8SAndroid Build Coastguard Worker static inline void
_hb_glyph_info_clear_default_ignorable(hb_glyph_info_t * info)342*2d1272b8SAndroid Build Coastguard Worker _hb_glyph_info_clear_default_ignorable (hb_glyph_info_t *info)
343*2d1272b8SAndroid Build Coastguard Worker {
344*2d1272b8SAndroid Build Coastguard Worker info->unicode_props() &= ~ UPROPS_MASK_IGNORABLE;
345*2d1272b8SAndroid Build Coastguard Worker }
346*2d1272b8SAndroid Build Coastguard Worker static inline bool
_hb_glyph_info_is_hidden(const hb_glyph_info_t * info)347*2d1272b8SAndroid Build Coastguard Worker _hb_glyph_info_is_hidden (const hb_glyph_info_t *info)
348*2d1272b8SAndroid Build Coastguard Worker {
349*2d1272b8SAndroid Build Coastguard Worker return info->unicode_props() & UPROPS_MASK_HIDDEN;
350*2d1272b8SAndroid Build Coastguard Worker }
351*2d1272b8SAndroid Build Coastguard Worker static inline void
_hb_glyph_info_unhide(hb_glyph_info_t * info)352*2d1272b8SAndroid Build Coastguard Worker _hb_glyph_info_unhide (hb_glyph_info_t *info)
353*2d1272b8SAndroid Build Coastguard Worker {
354*2d1272b8SAndroid Build Coastguard Worker info->unicode_props() &= ~ UPROPS_MASK_HIDDEN;
355*2d1272b8SAndroid Build Coastguard Worker }
356*2d1272b8SAndroid Build Coastguard Worker
357*2d1272b8SAndroid Build Coastguard Worker static inline void
_hb_glyph_info_set_continuation(hb_glyph_info_t * info)358*2d1272b8SAndroid Build Coastguard Worker _hb_glyph_info_set_continuation (hb_glyph_info_t *info)
359*2d1272b8SAndroid Build Coastguard Worker {
360*2d1272b8SAndroid Build Coastguard Worker info->unicode_props() |= UPROPS_MASK_CONTINUATION;
361*2d1272b8SAndroid Build Coastguard Worker }
362*2d1272b8SAndroid Build Coastguard Worker static inline void
_hb_glyph_info_reset_continuation(hb_glyph_info_t * info)363*2d1272b8SAndroid Build Coastguard Worker _hb_glyph_info_reset_continuation (hb_glyph_info_t *info)
364*2d1272b8SAndroid Build Coastguard Worker {
365*2d1272b8SAndroid Build Coastguard Worker info->unicode_props() &= ~ UPROPS_MASK_CONTINUATION;
366*2d1272b8SAndroid Build Coastguard Worker }
367*2d1272b8SAndroid Build Coastguard Worker static inline bool
_hb_glyph_info_is_continuation(const hb_glyph_info_t * info)368*2d1272b8SAndroid Build Coastguard Worker _hb_glyph_info_is_continuation (const hb_glyph_info_t *info)
369*2d1272b8SAndroid Build Coastguard Worker {
370*2d1272b8SAndroid Build Coastguard Worker return info->unicode_props() & UPROPS_MASK_CONTINUATION;
371*2d1272b8SAndroid Build Coastguard Worker }
372*2d1272b8SAndroid Build Coastguard Worker
373*2d1272b8SAndroid Build Coastguard Worker static inline bool
_hb_grapheme_group_func(const hb_glyph_info_t & a HB_UNUSED,const hb_glyph_info_t & b)374*2d1272b8SAndroid Build Coastguard Worker _hb_grapheme_group_func (const hb_glyph_info_t& a HB_UNUSED,
375*2d1272b8SAndroid Build Coastguard Worker const hb_glyph_info_t& b)
376*2d1272b8SAndroid Build Coastguard Worker { return _hb_glyph_info_is_continuation (&b); }
377*2d1272b8SAndroid Build Coastguard Worker
378*2d1272b8SAndroid Build Coastguard Worker #define foreach_grapheme(buffer, start, end) \
379*2d1272b8SAndroid Build Coastguard Worker foreach_group (buffer, start, end, _hb_grapheme_group_func)
380*2d1272b8SAndroid Build Coastguard Worker
381*2d1272b8SAndroid Build Coastguard Worker static inline void
_hb_ot_layout_reverse_graphemes(hb_buffer_t * buffer)382*2d1272b8SAndroid Build Coastguard Worker _hb_ot_layout_reverse_graphemes (hb_buffer_t *buffer)
383*2d1272b8SAndroid Build Coastguard Worker {
384*2d1272b8SAndroid Build Coastguard Worker buffer->reverse_groups (_hb_grapheme_group_func,
385*2d1272b8SAndroid Build Coastguard Worker buffer->cluster_level == HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS);
386*2d1272b8SAndroid Build Coastguard Worker }
387*2d1272b8SAndroid Build Coastguard Worker
388*2d1272b8SAndroid Build Coastguard Worker static inline bool
_hb_glyph_info_is_unicode_format(const hb_glyph_info_t * info)389*2d1272b8SAndroid Build Coastguard Worker _hb_glyph_info_is_unicode_format (const hb_glyph_info_t *info)
390*2d1272b8SAndroid Build Coastguard Worker {
391*2d1272b8SAndroid Build Coastguard Worker return _hb_glyph_info_get_general_category (info) ==
392*2d1272b8SAndroid Build Coastguard Worker HB_UNICODE_GENERAL_CATEGORY_FORMAT;
393*2d1272b8SAndroid Build Coastguard Worker }
394*2d1272b8SAndroid Build Coastguard Worker static inline bool
_hb_glyph_info_is_zwnj(const hb_glyph_info_t * info)395*2d1272b8SAndroid Build Coastguard Worker _hb_glyph_info_is_zwnj (const hb_glyph_info_t *info)
396*2d1272b8SAndroid Build Coastguard Worker {
397*2d1272b8SAndroid Build Coastguard Worker return _hb_glyph_info_is_unicode_format (info) && (info->unicode_props() & UPROPS_MASK_Cf_ZWNJ);
398*2d1272b8SAndroid Build Coastguard Worker }
399*2d1272b8SAndroid Build Coastguard Worker static inline bool
_hb_glyph_info_is_zwj(const hb_glyph_info_t * info)400*2d1272b8SAndroid Build Coastguard Worker _hb_glyph_info_is_zwj (const hb_glyph_info_t *info)
401*2d1272b8SAndroid Build Coastguard Worker {
402*2d1272b8SAndroid Build Coastguard Worker return _hb_glyph_info_is_unicode_format (info) && (info->unicode_props() & UPROPS_MASK_Cf_ZWJ);
403*2d1272b8SAndroid Build Coastguard Worker }
404*2d1272b8SAndroid Build Coastguard Worker static inline bool
_hb_glyph_info_is_joiner(const hb_glyph_info_t * info)405*2d1272b8SAndroid Build Coastguard Worker _hb_glyph_info_is_joiner (const hb_glyph_info_t *info)
406*2d1272b8SAndroid Build Coastguard Worker {
407*2d1272b8SAndroid Build Coastguard Worker return _hb_glyph_info_is_unicode_format (info) && (info->unicode_props() & (UPROPS_MASK_Cf_ZWNJ|UPROPS_MASK_Cf_ZWJ));
408*2d1272b8SAndroid Build Coastguard Worker }
409*2d1272b8SAndroid Build Coastguard Worker static inline void
_hb_glyph_info_flip_joiners(hb_glyph_info_t * info)410*2d1272b8SAndroid Build Coastguard Worker _hb_glyph_info_flip_joiners (hb_glyph_info_t *info)
411*2d1272b8SAndroid Build Coastguard Worker {
412*2d1272b8SAndroid Build Coastguard Worker if (!_hb_glyph_info_is_unicode_format (info))
413*2d1272b8SAndroid Build Coastguard Worker return;
414*2d1272b8SAndroid Build Coastguard Worker info->unicode_props() ^= UPROPS_MASK_Cf_ZWNJ | UPROPS_MASK_Cf_ZWJ;
415*2d1272b8SAndroid Build Coastguard Worker }
416*2d1272b8SAndroid Build Coastguard Worker
417*2d1272b8SAndroid Build Coastguard Worker /* lig_props: aka lig_id / lig_comp
418*2d1272b8SAndroid Build Coastguard Worker *
419*2d1272b8SAndroid Build Coastguard Worker * When a ligature is formed:
420*2d1272b8SAndroid Build Coastguard Worker *
421*2d1272b8SAndroid Build Coastguard Worker * - The ligature glyph and any marks in between all the same newly allocated
422*2d1272b8SAndroid Build Coastguard Worker * lig_id,
423*2d1272b8SAndroid Build Coastguard Worker * - The ligature glyph will get lig_num_comps set to the number of components
424*2d1272b8SAndroid Build Coastguard Worker * - The marks get lig_comp > 0, reflecting which component of the ligature
425*2d1272b8SAndroid Build Coastguard Worker * they were applied to.
426*2d1272b8SAndroid Build Coastguard Worker * - This is used in GPOS to attach marks to the right component of a ligature
427*2d1272b8SAndroid Build Coastguard Worker * in MarkLigPos,
428*2d1272b8SAndroid Build Coastguard Worker * - Note that when marks are ligated together, much of the above is skipped
429*2d1272b8SAndroid Build Coastguard Worker * and the current lig_id reused.
430*2d1272b8SAndroid Build Coastguard Worker *
431*2d1272b8SAndroid Build Coastguard Worker * When a multiple-substitution is done:
432*2d1272b8SAndroid Build Coastguard Worker *
433*2d1272b8SAndroid Build Coastguard Worker * - All resulting glyphs will have lig_id = 0,
434*2d1272b8SAndroid Build Coastguard Worker * - The resulting glyphs will have lig_comp = 0, 1, 2, ... respectively.
435*2d1272b8SAndroid Build Coastguard Worker * - This is used in GPOS to attach marks to the first component of a
436*2d1272b8SAndroid Build Coastguard Worker * multiple substitution in MarkBasePos.
437*2d1272b8SAndroid Build Coastguard Worker *
438*2d1272b8SAndroid Build Coastguard Worker * The numbers are also used in GPOS to do mark-to-mark positioning only
439*2d1272b8SAndroid Build Coastguard Worker * to marks that belong to the same component of the same ligature.
440*2d1272b8SAndroid Build Coastguard Worker */
441*2d1272b8SAndroid Build Coastguard Worker
442*2d1272b8SAndroid Build Coastguard Worker static inline void
_hb_glyph_info_clear_lig_props(hb_glyph_info_t * info)443*2d1272b8SAndroid Build Coastguard Worker _hb_glyph_info_clear_lig_props (hb_glyph_info_t *info)
444*2d1272b8SAndroid Build Coastguard Worker {
445*2d1272b8SAndroid Build Coastguard Worker info->lig_props() = 0;
446*2d1272b8SAndroid Build Coastguard Worker }
447*2d1272b8SAndroid Build Coastguard Worker
448*2d1272b8SAndroid Build Coastguard Worker #define IS_LIG_BASE 0x10
449*2d1272b8SAndroid Build Coastguard Worker
450*2d1272b8SAndroid Build Coastguard Worker static inline void
_hb_glyph_info_set_lig_props_for_ligature(hb_glyph_info_t * info,unsigned int lig_id,unsigned int lig_num_comps)451*2d1272b8SAndroid Build Coastguard Worker _hb_glyph_info_set_lig_props_for_ligature (hb_glyph_info_t *info,
452*2d1272b8SAndroid Build Coastguard Worker unsigned int lig_id,
453*2d1272b8SAndroid Build Coastguard Worker unsigned int lig_num_comps)
454*2d1272b8SAndroid Build Coastguard Worker {
455*2d1272b8SAndroid Build Coastguard Worker info->lig_props() = (lig_id << 5) | IS_LIG_BASE | (lig_num_comps & 0x0F);
456*2d1272b8SAndroid Build Coastguard Worker }
457*2d1272b8SAndroid Build Coastguard Worker
458*2d1272b8SAndroid Build Coastguard Worker static inline void
_hb_glyph_info_set_lig_props_for_mark(hb_glyph_info_t * info,unsigned int lig_id,unsigned int lig_comp)459*2d1272b8SAndroid Build Coastguard Worker _hb_glyph_info_set_lig_props_for_mark (hb_glyph_info_t *info,
460*2d1272b8SAndroid Build Coastguard Worker unsigned int lig_id,
461*2d1272b8SAndroid Build Coastguard Worker unsigned int lig_comp)
462*2d1272b8SAndroid Build Coastguard Worker {
463*2d1272b8SAndroid Build Coastguard Worker info->lig_props() = (lig_id << 5) | (lig_comp & 0x0F);
464*2d1272b8SAndroid Build Coastguard Worker }
465*2d1272b8SAndroid Build Coastguard Worker
466*2d1272b8SAndroid Build Coastguard Worker static inline void
_hb_glyph_info_set_lig_props_for_component(hb_glyph_info_t * info,unsigned int comp)467*2d1272b8SAndroid Build Coastguard Worker _hb_glyph_info_set_lig_props_for_component (hb_glyph_info_t *info, unsigned int comp)
468*2d1272b8SAndroid Build Coastguard Worker {
469*2d1272b8SAndroid Build Coastguard Worker _hb_glyph_info_set_lig_props_for_mark (info, 0, comp);
470*2d1272b8SAndroid Build Coastguard Worker }
471*2d1272b8SAndroid Build Coastguard Worker
472*2d1272b8SAndroid Build Coastguard Worker static inline unsigned int
_hb_glyph_info_get_lig_id(const hb_glyph_info_t * info)473*2d1272b8SAndroid Build Coastguard Worker _hb_glyph_info_get_lig_id (const hb_glyph_info_t *info)
474*2d1272b8SAndroid Build Coastguard Worker {
475*2d1272b8SAndroid Build Coastguard Worker return info->lig_props() >> 5;
476*2d1272b8SAndroid Build Coastguard Worker }
477*2d1272b8SAndroid Build Coastguard Worker
478*2d1272b8SAndroid Build Coastguard Worker static inline bool
_hb_glyph_info_ligated_internal(const hb_glyph_info_t * info)479*2d1272b8SAndroid Build Coastguard Worker _hb_glyph_info_ligated_internal (const hb_glyph_info_t *info)
480*2d1272b8SAndroid Build Coastguard Worker {
481*2d1272b8SAndroid Build Coastguard Worker return info->lig_props() & IS_LIG_BASE;
482*2d1272b8SAndroid Build Coastguard Worker }
483*2d1272b8SAndroid Build Coastguard Worker
484*2d1272b8SAndroid Build Coastguard Worker static inline unsigned int
_hb_glyph_info_get_lig_comp(const hb_glyph_info_t * info)485*2d1272b8SAndroid Build Coastguard Worker _hb_glyph_info_get_lig_comp (const hb_glyph_info_t *info)
486*2d1272b8SAndroid Build Coastguard Worker {
487*2d1272b8SAndroid Build Coastguard Worker if (_hb_glyph_info_ligated_internal (info))
488*2d1272b8SAndroid Build Coastguard Worker return 0;
489*2d1272b8SAndroid Build Coastguard Worker else
490*2d1272b8SAndroid Build Coastguard Worker return info->lig_props() & 0x0F;
491*2d1272b8SAndroid Build Coastguard Worker }
492*2d1272b8SAndroid Build Coastguard Worker
493*2d1272b8SAndroid Build Coastguard Worker static inline unsigned int
_hb_glyph_info_get_lig_num_comps(const hb_glyph_info_t * info)494*2d1272b8SAndroid Build Coastguard Worker _hb_glyph_info_get_lig_num_comps (const hb_glyph_info_t *info)
495*2d1272b8SAndroid Build Coastguard Worker {
496*2d1272b8SAndroid Build Coastguard Worker if ((info->glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_LIGATURE) &&
497*2d1272b8SAndroid Build Coastguard Worker _hb_glyph_info_ligated_internal (info))
498*2d1272b8SAndroid Build Coastguard Worker return info->lig_props() & 0x0F;
499*2d1272b8SAndroid Build Coastguard Worker else
500*2d1272b8SAndroid Build Coastguard Worker return 1;
501*2d1272b8SAndroid Build Coastguard Worker }
502*2d1272b8SAndroid Build Coastguard Worker
503*2d1272b8SAndroid Build Coastguard Worker static inline uint8_t
_hb_allocate_lig_id(hb_buffer_t * buffer)504*2d1272b8SAndroid Build Coastguard Worker _hb_allocate_lig_id (hb_buffer_t *buffer)
505*2d1272b8SAndroid Build Coastguard Worker {
506*2d1272b8SAndroid Build Coastguard Worker uint8_t lig_id = buffer->next_serial () & 0x07;
507*2d1272b8SAndroid Build Coastguard Worker if (unlikely (!lig_id))
508*2d1272b8SAndroid Build Coastguard Worker lig_id = _hb_allocate_lig_id (buffer); /* in case of overflow */
509*2d1272b8SAndroid Build Coastguard Worker return lig_id;
510*2d1272b8SAndroid Build Coastguard Worker }
511*2d1272b8SAndroid Build Coastguard Worker
512*2d1272b8SAndroid Build Coastguard Worker /* glyph_props: */
513*2d1272b8SAndroid Build Coastguard Worker
514*2d1272b8SAndroid Build Coastguard Worker static inline void
_hb_glyph_info_set_glyph_props(hb_glyph_info_t * info,unsigned int props)515*2d1272b8SAndroid Build Coastguard Worker _hb_glyph_info_set_glyph_props (hb_glyph_info_t *info, unsigned int props)
516*2d1272b8SAndroid Build Coastguard Worker {
517*2d1272b8SAndroid Build Coastguard Worker info->glyph_props() = props;
518*2d1272b8SAndroid Build Coastguard Worker }
519*2d1272b8SAndroid Build Coastguard Worker
520*2d1272b8SAndroid Build Coastguard Worker static inline unsigned int
_hb_glyph_info_get_glyph_props(const hb_glyph_info_t * info)521*2d1272b8SAndroid Build Coastguard Worker _hb_glyph_info_get_glyph_props (const hb_glyph_info_t *info)
522*2d1272b8SAndroid Build Coastguard Worker {
523*2d1272b8SAndroid Build Coastguard Worker return info->glyph_props();
524*2d1272b8SAndroid Build Coastguard Worker }
525*2d1272b8SAndroid Build Coastguard Worker
526*2d1272b8SAndroid Build Coastguard Worker static inline bool
_hb_glyph_info_is_base_glyph(const hb_glyph_info_t * info)527*2d1272b8SAndroid Build Coastguard Worker _hb_glyph_info_is_base_glyph (const hb_glyph_info_t *info)
528*2d1272b8SAndroid Build Coastguard Worker {
529*2d1272b8SAndroid Build Coastguard Worker return info->glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH;
530*2d1272b8SAndroid Build Coastguard Worker }
531*2d1272b8SAndroid Build Coastguard Worker
532*2d1272b8SAndroid Build Coastguard Worker static inline bool
_hb_glyph_info_is_ligature(const hb_glyph_info_t * info)533*2d1272b8SAndroid Build Coastguard Worker _hb_glyph_info_is_ligature (const hb_glyph_info_t *info)
534*2d1272b8SAndroid Build Coastguard Worker {
535*2d1272b8SAndroid Build Coastguard Worker return info->glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_LIGATURE;
536*2d1272b8SAndroid Build Coastguard Worker }
537*2d1272b8SAndroid Build Coastguard Worker
538*2d1272b8SAndroid Build Coastguard Worker static inline bool
_hb_glyph_info_is_mark(const hb_glyph_info_t * info)539*2d1272b8SAndroid Build Coastguard Worker _hb_glyph_info_is_mark (const hb_glyph_info_t *info)
540*2d1272b8SAndroid Build Coastguard Worker {
541*2d1272b8SAndroid Build Coastguard Worker return info->glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_MARK;
542*2d1272b8SAndroid Build Coastguard Worker }
543*2d1272b8SAndroid Build Coastguard Worker
544*2d1272b8SAndroid Build Coastguard Worker static inline bool
_hb_glyph_info_substituted(const hb_glyph_info_t * info)545*2d1272b8SAndroid Build Coastguard Worker _hb_glyph_info_substituted (const hb_glyph_info_t *info)
546*2d1272b8SAndroid Build Coastguard Worker {
547*2d1272b8SAndroid Build Coastguard Worker return info->glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_SUBSTITUTED;
548*2d1272b8SAndroid Build Coastguard Worker }
549*2d1272b8SAndroid Build Coastguard Worker
550*2d1272b8SAndroid Build Coastguard Worker static inline bool
_hb_glyph_info_ligated(const hb_glyph_info_t * info)551*2d1272b8SAndroid Build Coastguard Worker _hb_glyph_info_ligated (const hb_glyph_info_t *info)
552*2d1272b8SAndroid Build Coastguard Worker {
553*2d1272b8SAndroid Build Coastguard Worker return info->glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_LIGATED;
554*2d1272b8SAndroid Build Coastguard Worker }
555*2d1272b8SAndroid Build Coastguard Worker
556*2d1272b8SAndroid Build Coastguard Worker static inline bool
_hb_glyph_info_multiplied(const hb_glyph_info_t * info)557*2d1272b8SAndroid Build Coastguard Worker _hb_glyph_info_multiplied (const hb_glyph_info_t *info)
558*2d1272b8SAndroid Build Coastguard Worker {
559*2d1272b8SAndroid Build Coastguard Worker return info->glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_MULTIPLIED;
560*2d1272b8SAndroid Build Coastguard Worker }
561*2d1272b8SAndroid Build Coastguard Worker
562*2d1272b8SAndroid Build Coastguard Worker static inline bool
_hb_glyph_info_ligated_and_didnt_multiply(const hb_glyph_info_t * info)563*2d1272b8SAndroid Build Coastguard Worker _hb_glyph_info_ligated_and_didnt_multiply (const hb_glyph_info_t *info)
564*2d1272b8SAndroid Build Coastguard Worker {
565*2d1272b8SAndroid Build Coastguard Worker return _hb_glyph_info_ligated (info) && !_hb_glyph_info_multiplied (info);
566*2d1272b8SAndroid Build Coastguard Worker }
567*2d1272b8SAndroid Build Coastguard Worker
568*2d1272b8SAndroid Build Coastguard Worker static inline void
_hb_glyph_info_clear_ligated_and_multiplied(hb_glyph_info_t * info)569*2d1272b8SAndroid Build Coastguard Worker _hb_glyph_info_clear_ligated_and_multiplied (hb_glyph_info_t *info)
570*2d1272b8SAndroid Build Coastguard Worker {
571*2d1272b8SAndroid Build Coastguard Worker info->glyph_props() &= ~(HB_OT_LAYOUT_GLYPH_PROPS_LIGATED |
572*2d1272b8SAndroid Build Coastguard Worker HB_OT_LAYOUT_GLYPH_PROPS_MULTIPLIED);
573*2d1272b8SAndroid Build Coastguard Worker }
574*2d1272b8SAndroid Build Coastguard Worker
575*2d1272b8SAndroid Build Coastguard Worker static inline void
_hb_glyph_info_clear_substituted(hb_glyph_info_t * info)576*2d1272b8SAndroid Build Coastguard Worker _hb_glyph_info_clear_substituted (hb_glyph_info_t *info)
577*2d1272b8SAndroid Build Coastguard Worker {
578*2d1272b8SAndroid Build Coastguard Worker info->glyph_props() &= ~(HB_OT_LAYOUT_GLYPH_PROPS_SUBSTITUTED);
579*2d1272b8SAndroid Build Coastguard Worker }
580*2d1272b8SAndroid Build Coastguard Worker
581*2d1272b8SAndroid Build Coastguard Worker static inline bool
_hb_clear_substitution_flags(const hb_ot_shape_plan_t * plan HB_UNUSED,hb_font_t * font HB_UNUSED,hb_buffer_t * buffer)582*2d1272b8SAndroid Build Coastguard Worker _hb_clear_substitution_flags (const hb_ot_shape_plan_t *plan HB_UNUSED,
583*2d1272b8SAndroid Build Coastguard Worker hb_font_t *font HB_UNUSED,
584*2d1272b8SAndroid Build Coastguard Worker hb_buffer_t *buffer)
585*2d1272b8SAndroid Build Coastguard Worker {
586*2d1272b8SAndroid Build Coastguard Worker hb_glyph_info_t *info = buffer->info;
587*2d1272b8SAndroid Build Coastguard Worker unsigned int count = buffer->len;
588*2d1272b8SAndroid Build Coastguard Worker for (unsigned int i = 0; i < count; i++)
589*2d1272b8SAndroid Build Coastguard Worker _hb_glyph_info_clear_substituted (&info[i]);
590*2d1272b8SAndroid Build Coastguard Worker return false;
591*2d1272b8SAndroid Build Coastguard Worker }
592*2d1272b8SAndroid Build Coastguard Worker
593*2d1272b8SAndroid Build Coastguard Worker
594*2d1272b8SAndroid Build Coastguard Worker /* Allocation / deallocation. */
595*2d1272b8SAndroid Build Coastguard Worker
596*2d1272b8SAndroid Build Coastguard Worker static inline void
_hb_buffer_allocate_unicode_vars(hb_buffer_t * buffer)597*2d1272b8SAndroid Build Coastguard Worker _hb_buffer_allocate_unicode_vars (hb_buffer_t *buffer)
598*2d1272b8SAndroid Build Coastguard Worker {
599*2d1272b8SAndroid Build Coastguard Worker HB_BUFFER_ALLOCATE_VAR (buffer, unicode_props);
600*2d1272b8SAndroid Build Coastguard Worker }
601*2d1272b8SAndroid Build Coastguard Worker
602*2d1272b8SAndroid Build Coastguard Worker static inline void
_hb_buffer_deallocate_unicode_vars(hb_buffer_t * buffer)603*2d1272b8SAndroid Build Coastguard Worker _hb_buffer_deallocate_unicode_vars (hb_buffer_t *buffer)
604*2d1272b8SAndroid Build Coastguard Worker {
605*2d1272b8SAndroid Build Coastguard Worker HB_BUFFER_DEALLOCATE_VAR (buffer, unicode_props);
606*2d1272b8SAndroid Build Coastguard Worker }
607*2d1272b8SAndroid Build Coastguard Worker
608*2d1272b8SAndroid Build Coastguard Worker static inline void
_hb_buffer_assert_unicode_vars(hb_buffer_t * buffer)609*2d1272b8SAndroid Build Coastguard Worker _hb_buffer_assert_unicode_vars (hb_buffer_t *buffer)
610*2d1272b8SAndroid Build Coastguard Worker {
611*2d1272b8SAndroid Build Coastguard Worker HB_BUFFER_ASSERT_VAR (buffer, unicode_props);
612*2d1272b8SAndroid Build Coastguard Worker }
613*2d1272b8SAndroid Build Coastguard Worker
614*2d1272b8SAndroid Build Coastguard Worker static inline void
_hb_buffer_allocate_gsubgpos_vars(hb_buffer_t * buffer)615*2d1272b8SAndroid Build Coastguard Worker _hb_buffer_allocate_gsubgpos_vars (hb_buffer_t *buffer)
616*2d1272b8SAndroid Build Coastguard Worker {
617*2d1272b8SAndroid Build Coastguard Worker HB_BUFFER_ALLOCATE_VAR (buffer, glyph_props);
618*2d1272b8SAndroid Build Coastguard Worker HB_BUFFER_ALLOCATE_VAR (buffer, lig_props);
619*2d1272b8SAndroid Build Coastguard Worker }
620*2d1272b8SAndroid Build Coastguard Worker
621*2d1272b8SAndroid Build Coastguard Worker static inline void
_hb_buffer_deallocate_gsubgpos_vars(hb_buffer_t * buffer)622*2d1272b8SAndroid Build Coastguard Worker _hb_buffer_deallocate_gsubgpos_vars (hb_buffer_t *buffer)
623*2d1272b8SAndroid Build Coastguard Worker {
624*2d1272b8SAndroid Build Coastguard Worker HB_BUFFER_DEALLOCATE_VAR (buffer, lig_props);
625*2d1272b8SAndroid Build Coastguard Worker HB_BUFFER_DEALLOCATE_VAR (buffer, glyph_props);
626*2d1272b8SAndroid Build Coastguard Worker }
627*2d1272b8SAndroid Build Coastguard Worker
628*2d1272b8SAndroid Build Coastguard Worker static inline void
_hb_buffer_assert_gsubgpos_vars(hb_buffer_t * buffer)629*2d1272b8SAndroid Build Coastguard Worker _hb_buffer_assert_gsubgpos_vars (hb_buffer_t *buffer)
630*2d1272b8SAndroid Build Coastguard Worker {
631*2d1272b8SAndroid Build Coastguard Worker HB_BUFFER_ASSERT_VAR (buffer, glyph_props);
632*2d1272b8SAndroid Build Coastguard Worker HB_BUFFER_ASSERT_VAR (buffer, lig_props);
633*2d1272b8SAndroid Build Coastguard Worker }
634*2d1272b8SAndroid Build Coastguard Worker
635*2d1272b8SAndroid Build Coastguard Worker /* Make sure no one directly touches our props... */
636*2d1272b8SAndroid Build Coastguard Worker #undef unicode_props0
637*2d1272b8SAndroid Build Coastguard Worker #undef unicode_props1
638*2d1272b8SAndroid Build Coastguard Worker #undef lig_props
639*2d1272b8SAndroid Build Coastguard Worker #undef glyph_props
640*2d1272b8SAndroid Build Coastguard Worker
641*2d1272b8SAndroid Build Coastguard Worker #endif /* HB_OT_LAYOUT_HH */
642