hb-ot-shape-complex-indic.cc revision b65c06025d2b54a44f716e030d4b10072c65bea8
1b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod/*
220503ccd578c9983162857954e3236413469ed35Behdad Esfahbod * Copyright © 2011  Google, Inc.
3b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod *
4b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod *  This is part of HarfBuzz, a text shaping library.
5b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod *
6b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod * Permission is hereby granted, without written agreement and without
7b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod * license or royalty fees, to use, copy, modify, and distribute this
8b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod * software and its documentation for any purpose, provided that the
9b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod * above copyright notice and the following two paragraphs appear in
10b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod * all copies of this software.
11b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod *
12b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
13b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
14b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
15b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
16b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod * DAMAGE.
17b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod *
18b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
19b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
20b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
21b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
22b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
23b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod *
24b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod * Google Author(s): Behdad Esfahbod
25b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod */
26b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod
27b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod#include "hb-ot-shape-complex-private.hh"
28b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod
29b9ddbd55930228422e82b34a141ad1b6093f5376Behdad EsfahbodHB_BEGIN_DECLS
30b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod
31b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod
32b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod/* buffer var allocations */
33b65c06025d2b54a44f716e030d4b10072c65bea8Behdad Esfahbod#define indic_category() complex_var_persistent_u8_0() /* indic_category_t */
34b65c06025d2b54a44f716e030d4b10072c65bea8Behdad Esfahbod#define indic_position() complex_var_persistent_u8_1() /* indic_matra_category_t */
35b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod
36b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod#define INDIC_TABLE_ELEMENT_TYPE uint8_t
37b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod
3820503ccd578c9983162857954e3236413469ed35Behdad Esfahbod/* Cateories used in the OpenType spec:
3920503ccd578c9983162857954e3236413469ed35Behdad Esfahbod * https://www.microsoft.com/typography/otfntdev/devanot/shaping.aspx
4020503ccd578c9983162857954e3236413469ed35Behdad Esfahbod */
41c7fe56a1d5d3e969b6ec51cd9ecd471706a19568Behdad Esfahbod/* Note: This enum is duplicated in the -machine.rl source file.
42c7fe56a1d5d3e969b6ec51cd9ecd471706a19568Behdad Esfahbod * Not sure how to avoid duplication. */
43867361c3ad39629a8d5b7dc48d558a1c19e37d43Behdad Esfahbodenum indic_category_t {
4420503ccd578c9983162857954e3236413469ed35Behdad Esfahbod  OT_X = 0,
4520503ccd578c9983162857954e3236413469ed35Behdad Esfahbod  OT_C,
46c7fe56a1d5d3e969b6ec51cd9ecd471706a19568Behdad Esfahbod  OT_Ra, /* Not explicitly listed in the OT spec, but used in the grammar. */
4720503ccd578c9983162857954e3236413469ed35Behdad Esfahbod  OT_V,
4820503ccd578c9983162857954e3236413469ed35Behdad Esfahbod  OT_N,
4920503ccd578c9983162857954e3236413469ed35Behdad Esfahbod  OT_H,
5020503ccd578c9983162857954e3236413469ed35Behdad Esfahbod  OT_ZWNJ,
5120503ccd578c9983162857954e3236413469ed35Behdad Esfahbod  OT_ZWJ,
5220503ccd578c9983162857954e3236413469ed35Behdad Esfahbod  OT_M,
5320503ccd578c9983162857954e3236413469ed35Behdad Esfahbod  OT_SM,
5420503ccd578c9983162857954e3236413469ed35Behdad Esfahbod  OT_VD,
5520503ccd578c9983162857954e3236413469ed35Behdad Esfahbod  OT_A,
56b9452bfc1696457e156e79037c863903da5454fcBehdad Esfahbod  OT_NBSP
5720503ccd578c9983162857954e3236413469ed35Behdad Esfahbod};
5820503ccd578c9983162857954e3236413469ed35Behdad Esfahbod
598fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod/* Visual positions in a syllable from left to right. */
608fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbodenum indic_position_t {
618fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  POS_PRE,
628fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  POS_BASE,
638fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  POS_ABOVE,
648fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  POS_BELOW,
658fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  POS_POST,
668fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod
678fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  POS_INHERIT /* For Halant, Nukta, ZWJ, ZWNJ */
688fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod};
698fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod
7020503ccd578c9983162857954e3236413469ed35Behdad Esfahbod/* Categories used in IndicSyllabicCategory.txt from UCD */
7120503ccd578c9983162857954e3236413469ed35Behdad Esfahbod/* The assignments are guesswork */
72b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbodenum indic_syllabic_category_t {
7320503ccd578c9983162857954e3236413469ed35Behdad Esfahbod  INDIC_SYLLABIC_CATEGORY_OTHER			= OT_X,
7420503ccd578c9983162857954e3236413469ed35Behdad Esfahbod
75422e08dbb8e2c0c5664f1bdc7e159a673cfea8c5Behdad Esfahbod  INDIC_SYLLABIC_CATEGORY_AVAGRAHA		= OT_X,
7620503ccd578c9983162857954e3236413469ed35Behdad Esfahbod  INDIC_SYLLABIC_CATEGORY_BINDU			= OT_SM,
7720503ccd578c9983162857954e3236413469ed35Behdad Esfahbod  INDIC_SYLLABIC_CATEGORY_CONSONANT		= OT_C,
7820503ccd578c9983162857954e3236413469ed35Behdad Esfahbod  INDIC_SYLLABIC_CATEGORY_CONSONANT_DEAD	= OT_C,
7920503ccd578c9983162857954e3236413469ed35Behdad Esfahbod  INDIC_SYLLABIC_CATEGORY_CONSONANT_FINAL	= OT_C,
8020503ccd578c9983162857954e3236413469ed35Behdad Esfahbod  INDIC_SYLLABIC_CATEGORY_CONSONANT_HEAD_LETTER	= OT_C,
8120503ccd578c9983162857954e3236413469ed35Behdad Esfahbod  INDIC_SYLLABIC_CATEGORY_CONSONANT_MEDIAL	= OT_C,
8220503ccd578c9983162857954e3236413469ed35Behdad Esfahbod  INDIC_SYLLABIC_CATEGORY_CONSONANT_PLACEHOLDER	= OT_NBSP,
8320503ccd578c9983162857954e3236413469ed35Behdad Esfahbod  INDIC_SYLLABIC_CATEGORY_CONSONANT_SUBJOINED	= OT_C,
8420503ccd578c9983162857954e3236413469ed35Behdad Esfahbod  INDIC_SYLLABIC_CATEGORY_CONSONANT_REPHA	= OT_C,
85422e08dbb8e2c0c5664f1bdc7e159a673cfea8c5Behdad Esfahbod  INDIC_SYLLABIC_CATEGORY_MODIFYING_LETTER	= OT_X,
8620503ccd578c9983162857954e3236413469ed35Behdad Esfahbod  INDIC_SYLLABIC_CATEGORY_NUKTA			= OT_N,
87422e08dbb8e2c0c5664f1bdc7e159a673cfea8c5Behdad Esfahbod  INDIC_SYLLABIC_CATEGORY_REGISTER_SHIFTER	= OT_X,
88422e08dbb8e2c0c5664f1bdc7e159a673cfea8c5Behdad Esfahbod  INDIC_SYLLABIC_CATEGORY_TONE_LETTER		= OT_X,
89422e08dbb8e2c0c5664f1bdc7e159a673cfea8c5Behdad Esfahbod  INDIC_SYLLABIC_CATEGORY_TONE_MARK		= OT_X,
9020503ccd578c9983162857954e3236413469ed35Behdad Esfahbod  INDIC_SYLLABIC_CATEGORY_VIRAMA		= OT_H,
9120503ccd578c9983162857954e3236413469ed35Behdad Esfahbod  INDIC_SYLLABIC_CATEGORY_VISARGA		= OT_SM,
9220503ccd578c9983162857954e3236413469ed35Behdad Esfahbod  INDIC_SYLLABIC_CATEGORY_VOWEL			= OT_V,
9320503ccd578c9983162857954e3236413469ed35Behdad Esfahbod  INDIC_SYLLABIC_CATEGORY_VOWEL_DEPENDENT	= OT_M,
94b9452bfc1696457e156e79037c863903da5454fcBehdad Esfahbod  INDIC_SYLLABIC_CATEGORY_VOWEL_INDEPENDENT	= OT_V
95b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod};
96b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod
9720503ccd578c9983162857954e3236413469ed35Behdad Esfahbod/* Categories used in IndicSMatraCategory.txt from UCD */
98b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbodenum indic_matra_category_t {
998fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  INDIC_MATRA_CATEGORY_NOT_APPLICABLE		= POS_BASE,
10020503ccd578c9983162857954e3236413469ed35Behdad Esfahbod
1018fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  INDIC_MATRA_CATEGORY_LEFT			= POS_PRE,
1028fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  INDIC_MATRA_CATEGORY_TOP			= POS_ABOVE,
1038fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  INDIC_MATRA_CATEGORY_BOTTOM			= POS_BELOW,
1048fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  INDIC_MATRA_CATEGORY_RIGHT			= POS_POST,
105422e08dbb8e2c0c5664f1bdc7e159a673cfea8c5Behdad Esfahbod
106422e08dbb8e2c0c5664f1bdc7e159a673cfea8c5Behdad Esfahbod  /* We don't really care much about these since we decompose them
1078fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod   * in the generic pre-shaping layer.  They will only be used if
1088fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod   * the font does not cover the decomposition.  In which case, we
1098fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod   * define these as aliases to the place we want the split-matra
1108fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod   * glyph to show up.  Quite arbitrary. */
1118fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  INDIC_MATRA_CATEGORY_BOTTOM_AND_RIGHT		= INDIC_MATRA_CATEGORY_BOTTOM,
1128fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  INDIC_MATRA_CATEGORY_LEFT_AND_RIGHT		= INDIC_MATRA_CATEGORY_LEFT,
1138fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  INDIC_MATRA_CATEGORY_TOP_AND_BOTTOM		= INDIC_MATRA_CATEGORY_BOTTOM,
1148fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  INDIC_MATRA_CATEGORY_TOP_AND_BOTTOM_AND_RIGHT	= INDIC_MATRA_CATEGORY_BOTTOM,
1158fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  INDIC_MATRA_CATEGORY_TOP_AND_LEFT		= INDIC_MATRA_CATEGORY_LEFT,
1168fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  INDIC_MATRA_CATEGORY_TOP_AND_LEFT_AND_RIGHT	= INDIC_MATRA_CATEGORY_LEFT,
1178fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  INDIC_MATRA_CATEGORY_TOP_AND_RIGHT		= INDIC_MATRA_CATEGORY_RIGHT,
118422e08dbb8e2c0c5664f1bdc7e159a673cfea8c5Behdad Esfahbod
119422e08dbb8e2c0c5664f1bdc7e159a673cfea8c5Behdad Esfahbod  INDIC_MATRA_CATEGORY_INVISIBLE		= INDIC_MATRA_CATEGORY_NOT_APPLICABLE,
120422e08dbb8e2c0c5664f1bdc7e159a673cfea8c5Behdad Esfahbod  INDIC_MATRA_CATEGORY_OVERSTRUCK		= INDIC_MATRA_CATEGORY_NOT_APPLICABLE,
121422e08dbb8e2c0c5664f1bdc7e159a673cfea8c5Behdad Esfahbod  INDIC_MATRA_CATEGORY_VISUAL_ORDER_LEFT	= INDIC_MATRA_CATEGORY_NOT_APPLICABLE
122b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod};
123b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod
1244ec30aec3014be6effc09cbbc88dcd075f3826dfBehdad Esfahbod/* Note: We use ASSERT_STATIC_EXPR_ZERO() instead of ASSERT_STATIC_EXPR() and the comma operation
1254ec30aec3014be6effc09cbbc88dcd075f3826dfBehdad Esfahbod * because gcc fails to optimize the latter and fills the table in at runtime. */
12620503ccd578c9983162857954e3236413469ed35Behdad Esfahbod#define INDIC_COMBINE_CATEGORIES(S,M) \
1274ec30aec3014be6effc09cbbc88dcd075f3826dfBehdad Esfahbod  (ASSERT_STATIC_EXPR_ZERO (M == INDIC_MATRA_CATEGORY_NOT_APPLICABLE || (S == INDIC_SYLLABIC_CATEGORY_VIRAMA || S == INDIC_SYLLABIC_CATEGORY_VOWEL_DEPENDENT)) + \
1284ec30aec3014be6effc09cbbc88dcd075f3826dfBehdad Esfahbod   ASSERT_STATIC_EXPR_ZERO (S < 16 && M < 16) + \
1294ec30aec3014be6effc09cbbc88dcd075f3826dfBehdad Esfahbod   ((M << 4) | S))
130b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod
131b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod#include "hb-ot-shape-complex-indic-table.hh"
132b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod
13365988a145b4a52c37fd53c1473034f9e701f61d9Behdad Esfahbod/* XXX
13465988a145b4a52c37fd53c1473034f9e701f61d9Behdad Esfahbod * This is a hack for now.  We should:
13565988a145b4a52c37fd53c1473034f9e701f61d9Behdad Esfahbod * 1. Move this data into the main Indic table,
13665988a145b4a52c37fd53c1473034f9e701f61d9Behdad Esfahbod * and/or
13765988a145b4a52c37fd53c1473034f9e701f61d9Behdad Esfahbod * 2. Probe font lookups to determine consonant positions.
13865988a145b4a52c37fd53c1473034f9e701f61d9Behdad Esfahbod */
13965988a145b4a52c37fd53c1473034f9e701f61d9Behdad Esfahbodstatic const struct {
14065988a145b4a52c37fd53c1473034f9e701f61d9Behdad Esfahbod  hb_codepoint_t u;
1418fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  indic_position_t position;
14265988a145b4a52c37fd53c1473034f9e701f61d9Behdad Esfahbod} consonant_positions[] = {
1438fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0930, POS_BELOW},
1448fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x09AC, POS_BELOW},
1458fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x09AF, POS_POST},
1468fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x09B0, POS_BELOW},
1478fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x09F0, POS_BELOW},
1488fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0A2F, POS_POST},
1498fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0A30, POS_BELOW},
1508fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0A35, POS_BELOW},
1518fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0A39, POS_BELOW},
1528fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0AB0, POS_BELOW},
1538fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0B24, POS_BELOW},
1548fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0B28, POS_BELOW},
1558fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0B2C, POS_BELOW},
1568fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0B2D, POS_BELOW},
1578fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0B2E, POS_BELOW},
1588fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0B2F, POS_POST},
1598fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0B30, POS_BELOW},
1608fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0B32, POS_BELOW},
1618fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0B33, POS_BELOW},
1628fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0B5F, POS_POST},
1638fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0B71, POS_BELOW},
1648fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0C15, POS_BELOW},
1658fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0C16, POS_BELOW},
1668fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0C17, POS_BELOW},
1678fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0C18, POS_BELOW},
1688fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0C19, POS_BELOW},
1698fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0C1A, POS_BELOW},
1708fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0C1B, POS_BELOW},
1718fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0C1C, POS_BELOW},
1728fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0C1D, POS_BELOW},
1738fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0C1E, POS_BELOW},
1748fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0C1F, POS_BELOW},
1758fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0C20, POS_BELOW},
1768fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0C21, POS_BELOW},
1778fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0C22, POS_BELOW},
1788fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0C23, POS_BELOW},
1798fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0C24, POS_BELOW},
1808fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0C25, POS_BELOW},
1818fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0C26, POS_BELOW},
1828fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0C27, POS_BELOW},
1838fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0C28, POS_BELOW},
1848fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0C2A, POS_BELOW},
1858fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0C2B, POS_BELOW},
1868fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0C2C, POS_BELOW},
1878fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0C2D, POS_BELOW},
1888fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0C2E, POS_BELOW},
1898fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0C2F, POS_BELOW},
1908fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0C30, POS_BELOW},
1918fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0C32, POS_BELOW},
1928fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0C33, POS_BELOW},
1938fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0C35, POS_BELOW},
1948fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0C36, POS_BELOW},
1958fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0C37, POS_BELOW},
1968fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0C38, POS_BELOW},
1978fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0C39, POS_BELOW},
1988fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0C95, POS_BELOW},
1998fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0C96, POS_BELOW},
2008fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0C97, POS_BELOW},
2018fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0C98, POS_BELOW},
2028fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0C99, POS_BELOW},
2038fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0C9A, POS_BELOW},
2048fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0C9B, POS_BELOW},
2058fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0C9C, POS_BELOW},
2068fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0C9D, POS_BELOW},
2078fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0C9E, POS_BELOW},
2088fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0C9F, POS_BELOW},
2098fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0CA0, POS_BELOW},
2108fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0CA1, POS_BELOW},
2118fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0CA2, POS_BELOW},
2128fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0CA3, POS_BELOW},
2138fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0CA4, POS_BELOW},
2148fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0CA5, POS_BELOW},
2158fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0CA6, POS_BELOW},
2168fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0CA7, POS_BELOW},
2178fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0CA8, POS_BELOW},
2188fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0CAA, POS_BELOW},
2198fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0CAB, POS_BELOW},
2208fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0CAC, POS_BELOW},
2218fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0CAD, POS_BELOW},
2228fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0CAE, POS_BELOW},
2238fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0CAF, POS_BELOW},
2248fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0CB0, POS_BELOW},
2258fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0CB2, POS_BELOW},
2268fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0CB3, POS_BELOW},
2278fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0CB5, POS_BELOW},
2288fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0CB6, POS_BELOW},
2298fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0CB7, POS_BELOW},
2308fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0CB8, POS_BELOW},
2318fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0CB9, POS_BELOW},
2328fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0CDE, POS_BELOW},
2338fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0D2F, POS_POST},
2348fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0D30, POS_POST},
2358fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0D32, POS_BELOW},
2368fdba506f0f1c66b50f8f4b114d624cb956d03b7Behdad Esfahbod  {0x0D35, POS_POST},
23765988a145b4a52c37fd53c1473034f9e701f61d9Behdad Esfahbod};
23865988a145b4a52c37fd53c1473034f9e701f61d9Behdad Esfahbod
239c7fe56a1d5d3e969b6ec51cd9ecd471706a19568Behdad Esfahbod
240c7fe56a1d5d3e969b6ec51cd9ecd471706a19568Behdad Esfahbodstatic const struct {
241c7fe56a1d5d3e969b6ec51cd9ecd471706a19568Behdad Esfahbod  hb_tag_t tag;
242c7fe56a1d5d3e969b6ec51cd9ecd471706a19568Behdad Esfahbod  hb_bool_t is_global;
243c7fe56a1d5d3e969b6ec51cd9ecd471706a19568Behdad Esfahbod} indic_basic_features[] =
244b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod{
245c7fe56a1d5d3e969b6ec51cd9ecd471706a19568Behdad Esfahbod  {HB_TAG('n','u','k','t'), true},
246c7fe56a1d5d3e969b6ec51cd9ecd471706a19568Behdad Esfahbod  {HB_TAG('a','k','h','n'), false},
247c7fe56a1d5d3e969b6ec51cd9ecd471706a19568Behdad Esfahbod  {HB_TAG('r','p','h','f'), false},
248c7fe56a1d5d3e969b6ec51cd9ecd471706a19568Behdad Esfahbod  {HB_TAG('r','k','r','f'), false},
249c7fe56a1d5d3e969b6ec51cd9ecd471706a19568Behdad Esfahbod  {HB_TAG('p','r','e','f'), false},
250c7fe56a1d5d3e969b6ec51cd9ecd471706a19568Behdad Esfahbod  {HB_TAG('b','l','w','f'), false},
251c7fe56a1d5d3e969b6ec51cd9ecd471706a19568Behdad Esfahbod  {HB_TAG('h','a','l','f'), false},
252c7fe56a1d5d3e969b6ec51cd9ecd471706a19568Behdad Esfahbod  {HB_TAG('v','a','t','u'), true},
253c7fe56a1d5d3e969b6ec51cd9ecd471706a19568Behdad Esfahbod  {HB_TAG('p','s','t','f'), false},
254c7fe56a1d5d3e969b6ec51cd9ecd471706a19568Behdad Esfahbod  {HB_TAG('c','j','c','t'), true},
255c7fe56a1d5d3e969b6ec51cd9ecd471706a19568Behdad Esfahbod};
256c7fe56a1d5d3e969b6ec51cd9ecd471706a19568Behdad Esfahbod
257c7fe56a1d5d3e969b6ec51cd9ecd471706a19568Behdad Esfahbod/* Same order as the indic_basic_features array */
258c7fe56a1d5d3e969b6ec51cd9ecd471706a19568Behdad Esfahbodenum {
259c7fe56a1d5d3e969b6ec51cd9ecd471706a19568Behdad Esfahbod  _NUKT,
260c7fe56a1d5d3e969b6ec51cd9ecd471706a19568Behdad Esfahbod  AKHN,
261c7fe56a1d5d3e969b6ec51cd9ecd471706a19568Behdad Esfahbod  RPHF,
262c7fe56a1d5d3e969b6ec51cd9ecd471706a19568Behdad Esfahbod  RKRF,
263c7fe56a1d5d3e969b6ec51cd9ecd471706a19568Behdad Esfahbod  PREF,
264c7fe56a1d5d3e969b6ec51cd9ecd471706a19568Behdad Esfahbod  BLWF,
265c7fe56a1d5d3e969b6ec51cd9ecd471706a19568Behdad Esfahbod  HALF,
266c7fe56a1d5d3e969b6ec51cd9ecd471706a19568Behdad Esfahbod  _VATU,
267c7fe56a1d5d3e969b6ec51cd9ecd471706a19568Behdad Esfahbod  PSTF,
268c7fe56a1d5d3e969b6ec51cd9ecd471706a19568Behdad Esfahbod  _CJCT,
269b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod};
270b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod
271b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbodstatic const hb_tag_t indic_other_features[] =
272b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod{
273b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod  HB_TAG('p','r','e','s'),
274b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod  HB_TAG('a','b','v','s'),
275b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod  HB_TAG('b','l','w','s'),
276b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod  HB_TAG('p','s','t','s'),
277b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod  HB_TAG('h','a','l','n'),
278b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod
279b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod  HB_TAG('d','i','s','t'),
280b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod  HB_TAG('a','b','v','m'),
281b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod  HB_TAG('b','l','w','m'),
282b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod};
283b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod
284f6fd3780e12b23ff7ed3743497c8996e71dcb064Behdad Esfahbodstatic void
285f6fd3780e12b23ff7ed3743497c8996e71dcb064Behdad Esfahbodfinal_reordering (const hb_ot_map_t *map,
286f6fd3780e12b23ff7ed3743497c8996e71dcb064Behdad Esfahbod		  hb_face_t *face,
287f6fd3780e12b23ff7ed3743497c8996e71dcb064Behdad Esfahbod		  hb_buffer_t *buffer,
288f6fd3780e12b23ff7ed3743497c8996e71dcb064Behdad Esfahbod		  void *user_data HB_UNUSED)
289f6fd3780e12b23ff7ed3743497c8996e71dcb064Behdad Esfahbod{
290f6fd3780e12b23ff7ed3743497c8996e71dcb064Behdad Esfahbod}
291b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod
292b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbodvoid
29376f76812ac7cca8ac6935952a2360d5e151480faBehdad Esfahbod_hb_ot_shape_complex_collect_features_indic (hb_ot_map_builder_t *map, const hb_segment_properties_t  *props)
294b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod{
295f6fd3780e12b23ff7ed3743497c8996e71dcb064Behdad Esfahbod  map->add_bool_feature (HB_TAG('l','o','c','l'));
296a54a5505a35eef5315a8e2e7a79502901e3eff5fBehdad Esfahbod  /* The Indic specs do not require ccmp, but we apply it here since if
297a54a5505a35eef5315a8e2e7a79502901e3eff5fBehdad Esfahbod   * there is a use of it, it's typically at the beginning. */
298f6fd3780e12b23ff7ed3743497c8996e71dcb064Behdad Esfahbod  map->add_bool_feature (HB_TAG('c','c','m','p'));
299f6fd3780e12b23ff7ed3743497c8996e71dcb064Behdad Esfahbod
300f6fd3780e12b23ff7ed3743497c8996e71dcb064Behdad Esfahbod  map->add_gsub_pause (NULL, NULL);
301f6fd3780e12b23ff7ed3743497c8996e71dcb064Behdad Esfahbod
302b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod  for (unsigned int i = 0; i < ARRAY_LENGTH (indic_basic_features); i++)
30376f76812ac7cca8ac6935952a2360d5e151480faBehdad Esfahbod    map->add_bool_feature (indic_basic_features[i].tag, indic_basic_features[i].is_global);
304b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod
305f6fd3780e12b23ff7ed3743497c8996e71dcb064Behdad Esfahbod  map->add_gsub_pause (final_reordering, NULL);
306f6fd3780e12b23ff7ed3743497c8996e71dcb064Behdad Esfahbod
307b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod  for (unsigned int i = 0; i < ARRAY_LENGTH (indic_other_features); i++)
30876f76812ac7cca8ac6935952a2360d5e151480faBehdad Esfahbod    map->add_bool_feature (indic_other_features[i], true);
309b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod}
310b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod
311867361c3ad39629a8d5b7dc48d558a1c19e37d43Behdad Esfahbod
31202cdf743c2ec345a44d4fcf865594b6ac13fccd0Behdad Esfahbodbool
31302cdf743c2ec345a44d4fcf865594b6ac13fccd0Behdad Esfahbod_hb_ot_shape_complex_prefer_decomposed_indic (void)
31402cdf743c2ec345a44d4fcf865594b6ac13fccd0Behdad Esfahbod{
31502cdf743c2ec345a44d4fcf865594b6ac13fccd0Behdad Esfahbod  /* We want split matras decomposed by the common shaping logic. */
31602cdf743c2ec345a44d4fcf865594b6ac13fccd0Behdad Esfahbod  return TRUE;
31702cdf743c2ec345a44d4fcf865594b6ac13fccd0Behdad Esfahbod}
31802cdf743c2ec345a44d4fcf865594b6ac13fccd0Behdad Esfahbod
319d69d5ceaa0ad30e8d4b9783507c59c6d4221de4fBehdad Esfahbodstatic void
32076f76812ac7cca8ac6935952a2360d5e151480faBehdad Esfahbodfound_syllable (hb_ot_map_t *map, hb_buffer_t *buffer,
32176f76812ac7cca8ac6935952a2360d5e151480faBehdad Esfahbod		unsigned int start, unsigned int end)
322d69d5ceaa0ad30e8d4b9783507c59c6d4221de4fBehdad Esfahbod{
323d69d5ceaa0ad30e8d4b9783507c59c6d4221de4fBehdad Esfahbod  //fprintf (stderr, "%d %d\n", start, end);
324d69d5ceaa0ad30e8d4b9783507c59c6d4221de4fBehdad Esfahbod}
325867361c3ad39629a8d5b7dc48d558a1c19e37d43Behdad Esfahbod
326867361c3ad39629a8d5b7dc48d558a1c19e37d43Behdad Esfahbod#include "hb-ot-shape-complex-indic-machine.hh"
327867361c3ad39629a8d5b7dc48d558a1c19e37d43Behdad Esfahbod
328867361c3ad39629a8d5b7dc48d558a1c19e37d43Behdad Esfahbod
329b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbodvoid
33076f76812ac7cca8ac6935952a2360d5e151480faBehdad Esfahbod_hb_ot_shape_complex_setup_masks_indic (hb_ot_map_t *map, hb_buffer_t *buffer)
331b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod{
33276f76812ac7cca8ac6935952a2360d5e151480faBehdad Esfahbod  unsigned int count = buffer->len;
333b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod
334b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod  for (unsigned int i = 0; i < count; i++)
335b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod  {
33676f76812ac7cca8ac6935952a2360d5e151480faBehdad Esfahbod    unsigned int type = get_indic_categories (buffer->info[i].codepoint);
337b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod
33876f76812ac7cca8ac6935952a2360d5e151480faBehdad Esfahbod    buffer->info[i].indic_category() = type & 0x0F;
33976f76812ac7cca8ac6935952a2360d5e151480faBehdad Esfahbod    buffer->info[i].indic_position() = type >> 4;
340b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod  }
341b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod
34276f76812ac7cca8ac6935952a2360d5e151480faBehdad Esfahbod  find_syllables (map, buffer);
343867361c3ad39629a8d5b7dc48d558a1c19e37d43Behdad Esfahbod
344b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod  hb_mask_t mask_array[ARRAY_LENGTH (indic_basic_features)] = {0};
345b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod  unsigned int num_masks = ARRAY_LENGTH (indic_basic_features);
346b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod  for (unsigned int i = 0; i < num_masks; i++)
34776f76812ac7cca8ac6935952a2360d5e151480faBehdad Esfahbod    mask_array[i] = map->get_1_mask (indic_basic_features[i].tag);
348b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod}
349b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod
350b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod
351b9ddbd55930228422e82b34a141ad1b6093f5376Behdad EsfahbodHB_END_DECLS
352