diff options
| author | eunhhu <[email protected]> | 2026-09-28 15:20:08 +0100 |
|---|---|---|
| committer | eunhhu <[email protected]> | 2026-09-28 15:20:08 +0100 |
| commit | bafb710f0047751e26b87897eaf2a05609708536 (patch) | |
| tree | a5ccb5e8a3c7cc936b1b9f2c7e46fbeeee36cf92 /text/syllabic-data.c | |
| parent | 218298bb16ef6c147aa6dafc3ea88f62c6fa6ef6 (diff) | |
| download | vega-bafb710f0047751e26b87897eaf2a05609708536.tar.gz vega-bafb710f0047751e26b87897eaf2a05609708536.zip | |
Shape Syriac, stretch with stch, and fall back for fonts without Arabic forms
The rest of HarfBuzz 10.2's Arabic shaper. Joining types now come from
HarfBuzz's own table (Unicode 16, with Syriac's Alaph and Dalath-Rish
groups the state machine's last two columns use), the general category
deciding where it has none, so Syriac shapes with fin2, fin3 and med2.
What stch multiplies is recorded and, after positioning, stretched under
the word before it, repeating pieces copied as often as fit. A font with
presentation forms but no Arabic features gets HarfBuzz's fallback
lookups, which the build tool writes as OpenType and the runtime applies
at their pause like any GSUB lookup.
The generator now reads HarfBuzz's generated tables through their lookup
functions' ranges and offsets: rows whose range starts mid-row have
blank cells in front, which the row comments alone miscounted (Arabic
Supplement); the Indic table, read again this way, did not change.
Noto Sans Syriac, FreeSans's Syriac, Unifont's Arabic and Noto Sans
Arabic shape as HarfBuzz does at 3,000 runs a plan; no installed font
is refused any more (213 fonts, 1,822 plans).
Diffstat (limited to 'text/syllabic-data.c')
| -rw-r--r-- | text/syllabic-data.c | 328 |
1 files changed, 328 insertions, 0 deletions
diff --git a/text/syllabic-data.c b/text/syllabic-data.c index cfff1b5..cd7e59b 100644 --- a/text/syllabic-data.c +++ b/text/syllabic-data.c @@ -452,6 +452,334 @@ static const uint16_t use_u16[856] = { static unsigned use_b4(const uint8_t *a, unsigned i) { return (a[i >> 1] >> ((i & 1u) << 2)) & 15u; } uint8_t vega_use_category(uint32_t u) { return (uint8_t)(u<921600u?use_u8[2953+(((use_u8[625+(((use_u16[((use_u8[113+(((use_b4(use_u8,u>>1>>3>>3>>5))<<5)+((u>>1>>3>>3)&31u))])<<3)+((u>>1>>3)&7u)])<<3)+((u>>1)&7u))])<<1)+((u)&1u))]:0); } +/* Arabic joining types (hb-ot-shaper-arabic-table.hh, Unicode 16): U 0, L 1, R 2, D and C 3, + * Alaph 4, Dalath-Rish 5, T 7; 8 where the general category decides. */ +static const uint8_t joining_cells[1434] = { + 0, 0, 0, 0, 0, 0, 8, 8, 0, 8, 8, 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 3, 0, 2, 2, 2, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 2, 3, 3, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 3, 3, 8, 2, 2, 2, 0, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 2, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 3, 2, 3, 3, 2, 2, 8, 2, 8, 8, 8, 8, 8, 8, 8, 0, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 2, 2, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 3, 3, 3, 8, 8, 3, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 4, 8, 3, 3, 3, 5, 5, 2, 2, 2, 3, 3, 3, 3, 2, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 2, 3, 5, 3, 2, 3, 3, 5, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 3, 3, 3, 3, 2, 3, 2, 2, 3, 3, 3, 2, 2, 3, 3, 3, 3, 3, 3, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 3, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 2, 3, 3, 3, 3, 3, 2, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 3, 2, 2, 2, 8, 8, 8, 8, 8, 8, 8, + 3, 0, 3, 3, 3, 3, 0, 2, 3, 2, 2, 8, 8, 8, 8, 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 3, 3, 3, 3, 0, 0, 3, 3, 3, 3, 3, 2, 8, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 0, 2, 3, 3, 2, 2, 3, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 0, 0, 3, 8, 8, 3, 8, 8, 8, 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, + 0, 0, 7, 7, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 8, 3, 0, 3, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 0, 3, 3, 3, 3, 3, 2, + 0, 2, 0, 2, 2, 0, 0, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 1, 3, 3, 3, 3, 3, 2, 3, 3, 3, 2, 0, 0, 2, 8, + 8, 8, 8, 8, 8, 3, 3, 3, 3, 2, 3, 2, 3, 2, 2, 2, 3, 3, 3, 2, 3, 3, 2, 3, 2, 2, 3, 2, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 2, 2, 2, 2, 3, 3, 0, 1, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 3, 2, 3, + 3, 3, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 3, 3, 3, 2, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 3, 3, 3, 3, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 3, 0, 3, 3, 2, 2, 2, 0, 3, 2, 2, 3, 3, 2, 3, 3, 0, 3, 2, 2, 3, 0, 0, 0, 0, 2, 3, 1, 0, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 8, 8, 8, 8, 8, 8, 8, 7, +}; +static const struct { uint32_t first, last, at; } joining_runs[11] = { + {0x0600, 0x08E2, 0}, + {0x1806, 0x18AA, 739}, + {0x200C, 0x2069, 904}, + {0xA840, 0xA873, 998}, + {0x10AC0, 0x10AEF, 1050}, + {0x10B80, 0x10BAF, 1098}, + {0x10D00, 0x10D23, 1146}, + {0x10EC2, 0x10EC4, 1182}, + {0x10F30, 0x10FCB, 1185}, + {0x110BD, 0x110CD, 1341}, + {0x1E900, 0x1E94B, 1358}, +}; +uint8_t vega_arabic_joining(uint32_t u) { + for (unsigned i = 0; i < 11 && u >= joining_runs[i].first; ++i) + if (u <= joining_runs[i].last) return joining_cells[joining_runs[i].at + u - joining_runs[i].first]; + return 8; +} + +/* Presentation forms of U+0621..U+06D3: init, medi, fina, isol. */ +const uint16_t vega_arabic_forms[179][4] = { + {0x0000, 0x0000, 0x0000, 0xFE80}, + {0x0000, 0x0000, 0xFE82, 0xFE81}, + {0x0000, 0x0000, 0xFE84, 0xFE83}, + {0x0000, 0x0000, 0xFE86, 0xFE85}, + {0x0000, 0x0000, 0xFE88, 0xFE87}, + {0xFE8B, 0xFE8C, 0xFE8A, 0xFE89}, + {0x0000, 0x0000, 0xFE8E, 0xFE8D}, + {0xFE91, 0xFE92, 0xFE90, 0xFE8F}, + {0x0000, 0x0000, 0xFE94, 0xFE93}, + {0xFE97, 0xFE98, 0xFE96, 0xFE95}, + {0xFE9B, 0xFE9C, 0xFE9A, 0xFE99}, + {0xFE9F, 0xFEA0, 0xFE9E, 0xFE9D}, + {0xFEA3, 0xFEA4, 0xFEA2, 0xFEA1}, + {0xFEA7, 0xFEA8, 0xFEA6, 0xFEA5}, + {0x0000, 0x0000, 0xFEAA, 0xFEA9}, + {0x0000, 0x0000, 0xFEAC, 0xFEAB}, + {0x0000, 0x0000, 0xFEAE, 0xFEAD}, + {0x0000, 0x0000, 0xFEB0, 0xFEAF}, + {0xFEB3, 0xFEB4, 0xFEB2, 0xFEB1}, + {0xFEB7, 0xFEB8, 0xFEB6, 0xFEB5}, + {0xFEBB, 0xFEBC, 0xFEBA, 0xFEB9}, + {0xFEBF, 0xFEC0, 0xFEBE, 0xFEBD}, + {0xFEC3, 0xFEC4, 0xFEC2, 0xFEC1}, + {0xFEC7, 0xFEC8, 0xFEC6, 0xFEC5}, + {0xFECB, 0xFECC, 0xFECA, 0xFEC9}, + {0xFECF, 0xFED0, 0xFECE, 0xFECD}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0xFED3, 0xFED4, 0xFED2, 0xFED1}, + {0xFED7, 0xFED8, 0xFED6, 0xFED5}, + {0xFEDB, 0xFEDC, 0xFEDA, 0xFED9}, + {0xFEDF, 0xFEE0, 0xFEDE, 0xFEDD}, + {0xFEE3, 0xFEE4, 0xFEE2, 0xFEE1}, + {0xFEE7, 0xFEE8, 0xFEE6, 0xFEE5}, + {0xFEEB, 0xFEEC, 0xFEEA, 0xFEE9}, + {0x0000, 0x0000, 0xFEEE, 0xFEED}, + {0xFBE8, 0xFBE9, 0xFEF0, 0xFEEF}, + {0xFEF3, 0xFEF4, 0xFEF2, 0xFEF1}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0xFB51, 0xFB50}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0xFBDD}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0xFB68, 0xFB69, 0xFB67, 0xFB66}, + {0xFB60, 0xFB61, 0xFB5F, 0xFB5E}, + {0xFB54, 0xFB55, 0xFB53, 0xFB52}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0xFB58, 0xFB59, 0xFB57, 0xFB56}, + {0xFB64, 0xFB65, 0xFB63, 0xFB62}, + {0xFB5C, 0xFB5D, 0xFB5B, 0xFB5A}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0xFB78, 0xFB79, 0xFB77, 0xFB76}, + {0xFB74, 0xFB75, 0xFB73, 0xFB72}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0xFB7C, 0xFB7D, 0xFB7B, 0xFB7A}, + {0xFB80, 0xFB81, 0xFB7F, 0xFB7E}, + {0x0000, 0x0000, 0xFB89, 0xFB88}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0xFB85, 0xFB84}, + {0x0000, 0x0000, 0xFB83, 0xFB82}, + {0x0000, 0x0000, 0xFB87, 0xFB86}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0xFB8D, 0xFB8C}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0xFB8B, 0xFB8A}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0xFB6C, 0xFB6D, 0xFB6B, 0xFB6A}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0xFB70, 0xFB71, 0xFB6F, 0xFB6E}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0xFB90, 0xFB91, 0xFB8F, 0xFB8E}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0xFBD5, 0xFBD6, 0xFBD4, 0xFBD3}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0xFB94, 0xFB95, 0xFB93, 0xFB92}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0xFB9C, 0xFB9D, 0xFB9B, 0xFB9A}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0xFB98, 0xFB99, 0xFB97, 0xFB96}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0xFB9F, 0xFB9E}, + {0xFBA2, 0xFBA3, 0xFBA1, 0xFBA0}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0xFBAC, 0xFBAD, 0xFBAB, 0xFBAA}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0xFBA5, 0xFBA4}, + {0xFBA8, 0xFBA9, 0xFBA7, 0xFBA6}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0xFBE1, 0xFBE0}, + {0x0000, 0x0000, 0xFBDA, 0xFBD9}, + {0x0000, 0x0000, 0xFBD8, 0xFBD7}, + {0x0000, 0x0000, 0xFBDC, 0xFBDB}, + {0x0000, 0x0000, 0xFBE3, 0xFBE2}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0xFBDF, 0xFBDE}, + {0xFBFE, 0xFBFF, 0xFBFD, 0xFBFC}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0xFBE6, 0xFBE7, 0xFBE5, 0xFBE4}, + {0x0000, 0x0000, 0x0000, 0x0000}, + {0x0000, 0x0000, 0xFBAF, 0xFBAE}, + {0x0000, 0x0000, 0xFBB1, 0xFBB0}, +}; +/* Ligatures fallback shaping forms: three components, two, and marks. */ +static const VegaArabicLigature ligatures_three[3] = { + {0xFEDF, 0xFD88, {0xFEE4, 0xFEA4}}, + {0xFEDF, 0xF201, {0xFEE0, 0xFEEA}}, + {0xFEDF, 0xF211, {0xFEE4, 0xFEA0}}, +}; +static const VegaArabicLigature ligatures_two[57] = { + {0xFE91, 0xFC08, {0xFEE2, 0x0000}}, + {0xFE91, 0xFC9F, {0xFEE4, 0x0000}}, + {0xFE91, 0xFC9C, {0xFEA0, 0x0000}}, + {0xFE91, 0xFC9D, {0xFEA4, 0x0000}}, + {0xFE91, 0xFC9E, {0xFEA8, 0x0000}}, + {0xFE92, 0xFC6A, {0xFEAE, 0x0000}}, + {0xFE92, 0xFC6D, {0xFEE6, 0x0000}}, + {0xFE92, 0xFC6F, {0xFEF2, 0x0000}}, + {0xFE97, 0xFC0E, {0xFEE2, 0x0000}}, + {0xFE97, 0xFCA4, {0xFEE4, 0x0000}}, + {0xFE97, 0xFCA1, {0xFEA0, 0x0000}}, + {0xFE97, 0xFCA2, {0xFEA4, 0x0000}}, + {0xFE97, 0xFCA3, {0xFEA8, 0x0000}}, + {0xFE98, 0xFC70, {0xFEAE, 0x0000}}, + {0xFE98, 0xFC73, {0xFEE6, 0x0000}}, + {0xFE98, 0xFC75, {0xFEF2, 0x0000}}, + {0xFE9B, 0xFC12, {0xFEE2, 0x0000}}, + {0xFE9F, 0xFCA8, {0xFEE4, 0x0000}}, + {0xFEA3, 0xFCAA, {0xFEE4, 0x0000}}, + {0xFEA7, 0xFCAC, {0xFEE4, 0x0000}}, + {0xFEB3, 0xFCB0, {0xFEE4, 0x0000}}, + {0xFEB7, 0xFD30, {0xFEE4, 0x0000}}, + {0xFED3, 0xFC32, {0xFEF2, 0x0000}}, + {0xFEDF, 0xFC3F, {0xFE9E, 0x0000}}, + {0xFEDF, 0xFCC9, {0xFEA0, 0x0000}}, + {0xFEDF, 0xFC40, {0xFEA2, 0x0000}}, + {0xFEDF, 0xFCCA, {0xFEA4, 0x0000}}, + {0xFEDF, 0xFC41, {0xFEA6, 0x0000}}, + {0xFEDF, 0xFCCB, {0xFEA8, 0x0000}}, + {0xFEDF, 0xFC42, {0xFEE2, 0x0000}}, + {0xFEDF, 0xFCCC, {0xFEE4, 0x0000}}, + {0xFEDF, 0xFC44, {0xFEF2, 0x0000}}, + {0xFEDF, 0xFCCD, {0xFEEC, 0x0000}}, + {0xFEDF, 0xFEF5, {0xFE82, 0x0000}}, + {0xFEDF, 0xFEF7, {0xFE84, 0x0000}}, + {0xFEDF, 0xFEF9, {0xFE88, 0x0000}}, + {0xFEDF, 0xFEFB, {0xFE8E, 0x0000}}, + {0xFEE0, 0xFC86, {0xFEF0, 0x0000}}, + {0xFEE0, 0xFEF6, {0xFE82, 0x0000}}, + {0xFEE0, 0xFEF8, {0xFE84, 0x0000}}, + {0xFEE0, 0xFEFA, {0xFE88, 0x0000}}, + {0xFEE0, 0xFEFC, {0xFE8E, 0x0000}}, + {0xFEE3, 0xFCCE, {0xFEA0, 0x0000}}, + {0xFEE3, 0xFCCF, {0xFEA4, 0x0000}}, + {0xFEE3, 0xFCD0, {0xFEA8, 0x0000}}, + {0xFEE3, 0xFCD1, {0xFEE4, 0x0000}}, + {0xFEE7, 0xFC4E, {0xFEE2, 0x0000}}, + {0xFEE7, 0xFCD5, {0xFEE4, 0x0000}}, + {0xFEE7, 0xFCD2, {0xFEA0, 0x0000}}, + {0xFEE7, 0xFCD3, {0xFEA4, 0x0000}}, + {0xFEE8, 0xFC8F, {0xFEF2, 0x0000}}, + {0xFEF3, 0xFCDA, {0xFEA0, 0x0000}}, + {0xFEF3, 0xFCDB, {0xFEA4, 0x0000}}, + {0xFEF3, 0xFCDC, {0xFEA8, 0x0000}}, + {0xFEF3, 0xFCDD, {0xFEE4, 0x0000}}, + {0xFEF4, 0xFC91, {0xFEAE, 0x0000}}, + {0xFEF4, 0xFC94, {0xFEE6, 0x0000}}, +}; +static const VegaArabicLigature ligatures_marks[5] = { + {0x0651, 0xFC5E, {0x064C, 0x0000}}, + {0x0651, 0xFC60, {0x064E, 0x0000}}, + {0x0651, 0xFC61, {0x064F, 0x0000}}, + {0x0651, 0xFC62, {0x0650, 0x0000}}, + {0x0651, 0xF2EE, {0x064B, 0x0000}}, +}; +const VegaArabicLigatures vega_arabic_ligatures[3] = { + {ligatures_three, 3, 3}, + {ligatures_two, 57, 2}, + {ligatures_marks, 5, 2}, +}; + /* The categories syllabic.h names are the machines' own. */ _Static_assert(VEGA_OT_A == 9, "indic A"); _Static_assert(VEGA_OT_C == 1, "indic C"); |
