aboutsummaryrefslogtreecommitdiffstats
path: root/text/syllabic-data.c
diff options
context:
space:
mode:
authoreunhhu <[email protected]>2026-09-28 15:20:08 +0100
committereunhhu <[email protected]>2026-09-28 15:20:08 +0100
commitbafb710f0047751e26b87897eaf2a05609708536 (patch)
treea5ccb5e8a3c7cc936b1b9f2c7e46fbeeee36cf92 /text/syllabic-data.c
parent218298bb16ef6c147aa6dafc3ea88f62c6fa6ef6 (diff)
downloadvega-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.c328
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");