hb-ot-shape-complex-indic.cc revision 4ec30aec3014be6effc09cbbc88dcd075f3826df
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 */ 33867361c3ad39629a8d5b7dc48d558a1c19e37d43Behdad Esfahbod#define indic_category() var2.u8[0] /* indic_category_t */ 34867361c3ad39629a8d5b7dc48d558a1c19e37d43Behdad Esfahbod#define indic_position() var2.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 284b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod 285b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbodvoid 286867361c3ad39629a8d5b7dc48d558a1c19e37d43Behdad Esfahbod_hb_ot_shape_complex_collect_features_indic (hb_ot_shape_planner_t *planner, const hb_segment_properties_t *props HB_UNUSED) 287b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod{ 288b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod for (unsigned int i = 0; i < ARRAY_LENGTH (indic_basic_features); i++) 289c7fe56a1d5d3e969b6ec51cd9ecd471706a19568Behdad Esfahbod planner->map.add_bool_feature (indic_basic_features[i].tag, indic_basic_features[i].is_global); 290b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod 291b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod for (unsigned int i = 0; i < ARRAY_LENGTH (indic_other_features); i++) 292b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod planner->map.add_bool_feature (indic_other_features[i], true); 293b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod} 294b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod 295867361c3ad39629a8d5b7dc48d558a1c19e37d43Behdad Esfahbod 296867361c3ad39629a8d5b7dc48d558a1c19e37d43Behdad Esfahbod 297867361c3ad39629a8d5b7dc48d558a1c19e37d43Behdad Esfahbod#include "hb-ot-shape-complex-indic-machine.hh" 298867361c3ad39629a8d5b7dc48d558a1c19e37d43Behdad Esfahbod 299867361c3ad39629a8d5b7dc48d558a1c19e37d43Behdad Esfahbod 300b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbodvoid 301b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod_hb_ot_shape_complex_setup_masks_indic (hb_ot_shape_context_t *c) 302b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod{ 303b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod unsigned int count = c->buffer->len; 304b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod 305b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod for (unsigned int i = 0; i < count; i++) 306b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod { 307867361c3ad39629a8d5b7dc48d558a1c19e37d43Behdad Esfahbod unsigned int type = get_indic_categories (c->buffer->info[i].codepoint); 308b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod 309867361c3ad39629a8d5b7dc48d558a1c19e37d43Behdad Esfahbod c->buffer->info[i].indic_category() = type & 0x0F; 310867361c3ad39629a8d5b7dc48d558a1c19e37d43Behdad Esfahbod c->buffer->info[i].indic_position() = type >> 4; 311b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod } 312b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod 313867361c3ad39629a8d5b7dc48d558a1c19e37d43Behdad Esfahbod find_syllables (c); 314867361c3ad39629a8d5b7dc48d558a1c19e37d43Behdad Esfahbod 315b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod hb_mask_t mask_array[ARRAY_LENGTH (indic_basic_features)] = {0}; 316b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod unsigned int num_masks = ARRAY_LENGTH (indic_basic_features); 317b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod for (unsigned int i = 0; i < num_masks; i++) 318c7fe56a1d5d3e969b6ec51cd9ecd471706a19568Behdad Esfahbod mask_array[i] = c->plan->map.get_1_mask (indic_basic_features[i].tag); 319b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod} 320b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod 321b9ddbd55930228422e82b34a141ad1b6093f5376Behdad Esfahbod 322b9ddbd55930228422e82b34a141ad1b6093f5376Behdad EsfahbodHB_END_DECLS 323