harfrust 0.13.3

A complete HarfBuzz shaping algorithm port to Rust.
Documentation
/* == Start of generated table == */
/*
 * The following table is generated by running:
 *
 *   ./gen-arabic-table.py --rust ArabicShaping.txt UnicodeData.txt Blocks.txt
 *
 * on files with these headers:
 *
 * # ArabicShaping-17.0.0.txt
 * # Date: 2025-08-14
 * # Blocks-17.0.0.txt
 * # Date: 2025-08-01
 * UnicodeData.txt does not have a header.
 */

#![allow(unused_parens)]
#![allow(clippy::unnecessary_cast, clippy::unreadable_literal, clippy::double_parens)]

use crate::unicode::Codepoint;

use super::ot_shaper_arabic::hb_arabic_joining_type_t::{self, D, GroupAlaph, GroupDalathRish, L, R, T, U, X};

#[allow(dead_code, non_upper_case_globals, clippy::allow_attributes_without_reason, missing_docs)]
pub(crate) static _hb_arabic_joining_u8: [u8; 737]=
[
    0, 16,  2,  0,  0,  0,  3,  0,  4,  0,  0,  0,  0,  0,  0,  0,
    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  5,  0,  0,  0,  0,  0,
    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    0,  0, 96,135,  9,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10,  0,  0,  0,  0,  0,
    0,  0,  0,  8, 16, 24, 32, 40, 48,  0, 56,  0, 64, 72, 80,  0,
    0,  0,  0, 88, 96,104,  0,  0,  0,  0,  0,112,120,  0,  0,  0,
    0,  0,  0,  0,128,  0,  0,  0,  0,  0,  0,  0,  0,  0,136,  0,
    0,144,  0,  0,  0,  0,  0,152,  0,  0,  0,  0,  0,  0,160,168,
  176,184,192,  0,  0,200,208,  0,  0,  0,  0,  0,  0,  0,  0,216,
  224,  0,  0,  0,  0,  0,  0,  0,  0,  8,  9,  0,  0, 10, 11, 12,
    1,  1, 13,  0,  0,  0, 14, 15,  1,  1,  2,  2,  4,  1,  1,  1,
    1, 16, 17, 18,  3,  0, 19,  0, 20,  0, 21, 22, 23,  1, 24,  0,
    0,  0, 25,  1, 26,  1, 27, 28,  4,  0, 29,  1,  1,  1, 30,  0,
   31, 32,  5, 33, 34, 35, 36,  2,  2, 37, 38,  6,  0,  1, 39, 40,
    5,  1,  7,  0,  0, 41,  0,  0,  0, 42, 43,  0,  0,  1,  1,  1,
    1,  1,  1,  1,  1,  1,  1,  1,  7, 44,  1,  1,  1,  1, 45,  0,
    0,  0, 46,  0,  0,  0, 47,  0,  0,  0,  0,  0,  0, 48,  6,  0,
    0,  1,  1,  1,  1,  1,  1, 49,  0, 50, 51, 52, 53, 54, 55,  0,
    0, 56, 57, 58,  0,  0, 59,  0,  0, 60,  1,  1,  1, 61,  0,  0,
    0, 62,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 63,
    1, 64,  0, 65,  0,  0,  0, 66,  1, 67,  0,  0,  0,  0,  0, 68,
   69, 70, 71,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    3,  0,  3,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  1,  1,  1,
    1, 72, 73,  0,  0,  0,  0,  0,  0,119,119,119,119, 51, 51, 51,
   51, 34, 34, 34, 34,119,119,  7,119, 34, 51, 51, 51, 35, 51, 51,
   51,  0,119,119,119,115,119,119,119,  0,  0,  0,119,112,  7,119,
  119,  3, 34, 34, 35, 35, 51, 51, 35, 34, 50, 51, 51, 50,115,119,
  119,119,119,119, 51, 39, 34, 32, 34, 50, 35, 34, 34, 34, 34, 35,
   35, 51, 34, 39,119,119,119,119, 34,119, 51,115, 55,119,119,119,
  103,116, 51, 83, 37, 34, 51, 51, 50, 50, 53, 50, 83,119,119, 39,
   51, 35, 34, 51, 51, 51, 35, 50, 51, 35, 35, 50, 51,119, 51, 51,
   51, 51,115,119,119,119,115,119,119, 50, 51, 51, 34, 51, 51, 50,
   34,114,119,119,119,  3, 51, 51, 32, 35,114,119,119, 34, 50, 51,
    3, 48, 51, 51, 50, 51, 34,  2, 50, 35, 50, 51, 51,119,112,119,
  119,119,119,119, 48,119,115,119,112,  0,  0, 96, 54,115,115,119,
  119,119,119, 48,119,119,119,119,  7,119,119,119,  0, 51,  1,119,
  119, 51, 51, 35, 32, 32,  2, 16, 34, 34, 50, 51, 19, 51, 51, 35,
   51, 35,  0,114,119,119, 55, 51, 35, 35, 35, 34, 51, 35, 51, 50,
   34, 35,119,119,119, 39, 34, 50,  3, 49, 51, 51, 51, 51, 50,119,
  119,119, 50,115, 51, 51, 35, 51, 51, 51, 51,  3,119, 55, 51,114,
  119, 51, 51, 34, 51, 51,119,119,119,  3, 51, 34,  2, 35, 50, 35,
   51, 48, 34,  3,  0, 32, 19,119,119, 51, 51,119,119,119,103,119,
  119,
];

#[allow(dead_code, unused_parens, trivial_numeric_casts, clippy::allow_attributes_without_reason, clippy::unseparated_literal_suffix, clippy::double_parens, clippy::unnecessary_cast)]
#[inline(always)]
fn _hb_arabic_joining_b4 (a: &[u8], i: usize) -> u8
{
  (a[i>>1]>>((i&1)<<2))&15
}
#[allow(dead_code, unused_parens, trivial_numeric_casts, clippy::allow_attributes_without_reason, clippy::unseparated_literal_suffix, clippy::double_parens, clippy::unnecessary_cast, missing_docs)]
#[inline]
pub(crate) fn _hb_arabic_joining_joining_type_u8 (u: usize) -> u8
{
  /* packtab: [2^4,2^3,2^3,2^3] */
  if u<125260usize { (_hb_arabic_joining_b4(&_hb_arabic_joining_u8[441usize..],(((_hb_arabic_joining_u8[209usize+(((_hb_arabic_joining_u8[123usize+((((_hb_arabic_joining_b4(&_hb_arabic_joining_u8,(((((((u)>>3))>>3))>>3) as usize) as usize)) as usize)<<3) as usize+((((((u)>>3))>>3))&7) as usize) as usize]) as usize) as usize+((((u)>>3))&7) as usize) as usize]) as usize)<<3) as usize+((u)&7) as usize)) as u8 } else { 7 }
}

#[inline]
pub(crate) fn joining_type (u: Codepoint) -> hb_arabic_joining_type_t
{
  match _hb_arabic_joining_joining_type_u8 (u as usize) {
    0 => U,
    1 => L,
    2 => R,
    3 => D,
    4 => GroupAlaph,
    5 => GroupDalathRish,
    6 => T,
    7 => X,
    _ => unreachable! (),
  }
}


pub(crate) const SHAPING_TABLE: &[(u16, [u16; 4])] = &[
    (0x0621, [0x0000, 0x0000, 0x0000, 0xFE80]),
    (0x0622, [0x0000, 0x0000, 0xFE82, 0xFE81]),
    (0x0623, [0x0000, 0x0000, 0xFE84, 0xFE83]),
    (0x0624, [0x0000, 0x0000, 0xFE86, 0xFE85]),
    (0x0625, [0x0000, 0x0000, 0xFE88, 0xFE87]),
    (0x0626, [0xFE8B, 0xFE8C, 0xFE8A, 0xFE89]),
    (0x0627, [0x0000, 0x0000, 0xFE8E, 0xFE8D]),
    (0x0628, [0xFE91, 0xFE92, 0xFE90, 0xFE8F]),
    (0x0629, [0x0000, 0x0000, 0xFE94, 0xFE93]),
    (0x062A, [0xFE97, 0xFE98, 0xFE96, 0xFE95]),
    (0x062B, [0xFE9B, 0xFE9C, 0xFE9A, 0xFE99]),
    (0x062C, [0xFE9F, 0xFEA0, 0xFE9E, 0xFE9D]),
    (0x062D, [0xFEA3, 0xFEA4, 0xFEA2, 0xFEA1]),
    (0x062E, [0xFEA7, 0xFEA8, 0xFEA6, 0xFEA5]),
    (0x062F, [0x0000, 0x0000, 0xFEAA, 0xFEA9]),
    (0x0630, [0x0000, 0x0000, 0xFEAC, 0xFEAB]),
    (0x0631, [0x0000, 0x0000, 0xFEAE, 0xFEAD]),
    (0x0632, [0x0000, 0x0000, 0xFEB0, 0xFEAF]),
    (0x0633, [0xFEB3, 0xFEB4, 0xFEB2, 0xFEB1]),
    (0x0634, [0xFEB7, 0xFEB8, 0xFEB6, 0xFEB5]),
    (0x0635, [0xFEBB, 0xFEBC, 0xFEBA, 0xFEB9]),
    (0x0636, [0xFEBF, 0xFEC0, 0xFEBE, 0xFEBD]),
    (0x0637, [0xFEC3, 0xFEC4, 0xFEC2, 0xFEC1]),
    (0x0638, [0xFEC7, 0xFEC8, 0xFEC6, 0xFEC5]),
    (0x0639, [0xFECB, 0xFECC, 0xFECA, 0xFEC9]),
    (0x063A, [0xFECF, 0xFED0, 0xFECE, 0xFECD]),
    (0x0641, [0xFED3, 0xFED4, 0xFED2, 0xFED1]),
    (0x0642, [0xFED7, 0xFED8, 0xFED6, 0xFED5]),
    (0x0643, [0xFEDB, 0xFEDC, 0xFEDA, 0xFED9]),
    (0x0644, [0xFEDF, 0xFEE0, 0xFEDE, 0xFEDD]),
    (0x0645, [0xFEE3, 0xFEE4, 0xFEE2, 0xFEE1]),
    (0x0646, [0xFEE7, 0xFEE8, 0xFEE6, 0xFEE5]),
    (0x0647, [0xFEEB, 0xFEEC, 0xFEEA, 0xFEE9]),
    (0x0648, [0x0000, 0x0000, 0xFEEE, 0xFEED]),
    (0x0649, [0xFBE8, 0xFBE9, 0xFEF0, 0xFEEF]),
    (0x064A, [0xFEF3, 0xFEF4, 0xFEF2, 0xFEF1]),
    (0x0671, [0x0000, 0x0000, 0xFB51, 0xFB50]),
    (0x0677, [0x0000, 0x0000, 0x0000, 0xFBDD]),
    (0x0679, [0xFB68, 0xFB69, 0xFB67, 0xFB66]),
    (0x067A, [0xFB60, 0xFB61, 0xFB5F, 0xFB5E]),
    (0x067B, [0xFB54, 0xFB55, 0xFB53, 0xFB52]),
    (0x067E, [0xFB58, 0xFB59, 0xFB57, 0xFB56]),
    (0x067F, [0xFB64, 0xFB65, 0xFB63, 0xFB62]),
    (0x0680, [0xFB5C, 0xFB5D, 0xFB5B, 0xFB5A]),
    (0x0683, [0xFB78, 0xFB79, 0xFB77, 0xFB76]),
    (0x0684, [0xFB74, 0xFB75, 0xFB73, 0xFB72]),
    (0x0686, [0xFB7C, 0xFB7D, 0xFB7B, 0xFB7A]),
    (0x0687, [0xFB80, 0xFB81, 0xFB7F, 0xFB7E]),
    (0x0688, [0x0000, 0x0000, 0xFB89, 0xFB88]),
    (0x068C, [0x0000, 0x0000, 0xFB85, 0xFB84]),
    (0x068D, [0x0000, 0x0000, 0xFB83, 0xFB82]),
    (0x068E, [0x0000, 0x0000, 0xFB87, 0xFB86]),
    (0x0691, [0x0000, 0x0000, 0xFB8D, 0xFB8C]),
    (0x0698, [0x0000, 0x0000, 0xFB8B, 0xFB8A]),
    (0x06A4, [0xFB6C, 0xFB6D, 0xFB6B, 0xFB6A]),
    (0x06A6, [0xFB70, 0xFB71, 0xFB6F, 0xFB6E]),
    (0x06A9, [0xFB90, 0xFB91, 0xFB8F, 0xFB8E]),
    (0x06AD, [0xFBD5, 0xFBD6, 0xFBD4, 0xFBD3]),
    (0x06AF, [0xFB94, 0xFB95, 0xFB93, 0xFB92]),
    (0x06B1, [0xFB9C, 0xFB9D, 0xFB9B, 0xFB9A]),
    (0x06B3, [0xFB98, 0xFB99, 0xFB97, 0xFB96]),
    (0x06BA, [0x0000, 0x0000, 0xFB9F, 0xFB9E]),
    (0x06BB, [0xFBA2, 0xFBA3, 0xFBA1, 0xFBA0]),
    (0x06BE, [0xFBAC, 0xFBAD, 0xFBAB, 0xFBAA]),
    (0x06C0, [0x0000, 0x0000, 0xFBA5, 0xFBA4]),
    (0x06C1, [0xFBA8, 0xFBA9, 0xFBA7, 0xFBA6]),
    (0x06C5, [0x0000, 0x0000, 0xFBE1, 0xFBE0]),
    (0x06C6, [0x0000, 0x0000, 0xFBDA, 0xFBD9]),
    (0x06C7, [0x0000, 0x0000, 0xFBD8, 0xFBD7]),
    (0x06C8, [0x0000, 0x0000, 0xFBDC, 0xFBDB]),
    (0x06C9, [0x0000, 0x0000, 0xFBE3, 0xFBE2]),
    (0x06CB, [0x0000, 0x0000, 0xFBDF, 0xFBDE]),
    (0x06CC, [0xFBFE, 0xFBFF, 0xFBFD, 0xFBFC]),
    (0x06D0, [0xFBE6, 0xFBE7, 0xFBE5, 0xFBE4]),
    (0x06D2, [0x0000, 0x0000, 0xFBAF, 0xFBAE]),
    (0x06D3, [0x0000, 0x0000, 0xFBB1, 0xFBB0]),
];

pub(crate) const LIGATURE_3_TABLE: &[([u16; 3], u16)] = &[
    ([0xFEDF, 0xFEE4, 0xFEA4], 0xFD88),
    ([0xFEDF, 0xFEE0, 0xFEEA], 0xF201),
    ([0xFEDF, 0xFEE4, 0xFEA0], 0xF211),
];

pub(crate) const LIGATURE_TABLE: &[([u16; 2], u16)] = &[
    ([0xFE91, 0xFEE2], 0xFC08),
    ([0xFE91, 0xFEE4], 0xFC9F),
    ([0xFE91, 0xFEA0], 0xFC9C),
    ([0xFE91, 0xFEA4], 0xFC9D),
    ([0xFE91, 0xFEA8], 0xFC9E),
    ([0xFE92, 0xFEAE], 0xFC6A),
    ([0xFE92, 0xFEE6], 0xFC6D),
    ([0xFE92, 0xFEF2], 0xFC6F),
    ([0xFE97, 0xFEE2], 0xFC0E),
    ([0xFE97, 0xFEE4], 0xFCA4),
    ([0xFE97, 0xFEA0], 0xFCA1),
    ([0xFE97, 0xFEA4], 0xFCA2),
    ([0xFE97, 0xFEA8], 0xFCA3),
    ([0xFE98, 0xFEAE], 0xFC70),
    ([0xFE98, 0xFEE6], 0xFC73),
    ([0xFE98, 0xFEF2], 0xFC75),
    ([0xFE9B, 0xFEE2], 0xFC12),
    ([0xFE9F, 0xFEE4], 0xFCA8),
    ([0xFEA3, 0xFEE4], 0xFCAA),
    ([0xFEA7, 0xFEE4], 0xFCAC),
    ([0xFEB3, 0xFEE4], 0xFCB0),
    ([0xFEB7, 0xFEE4], 0xFD30),
    ([0xFED3, 0xFEF2], 0xFC32),
    ([0xFEDF, 0xFE9E], 0xFC3F),
    ([0xFEDF, 0xFEA0], 0xFCC9),
    ([0xFEDF, 0xFEA2], 0xFC40),
    ([0xFEDF, 0xFEA4], 0xFCCA),
    ([0xFEDF, 0xFEA6], 0xFC41),
    ([0xFEDF, 0xFEA8], 0xFCCB),
    ([0xFEDF, 0xFEE2], 0xFC42),
    ([0xFEDF, 0xFEE4], 0xFCCC),
    ([0xFEDF, 0xFEF0], 0xFC43),
    ([0xFEDF, 0xFEF2], 0xFC44),
    ([0xFEDF, 0xFEEC], 0xFCCD),
    ([0xFEDF, 0xFE82], 0xFEF5),
    ([0xFEDF, 0xFE84], 0xFEF7),
    ([0xFEDF, 0xFE88], 0xFEF9),
    ([0xFEDF, 0xFE8E], 0xFEFB),
    ([0xFEE0, 0xFEF0], 0xFC86),
    ([0xFEE0, 0xFE82], 0xFEF6),
    ([0xFEE0, 0xFE84], 0xFEF8),
    ([0xFEE0, 0xFE88], 0xFEFA),
    ([0xFEE0, 0xFE8E], 0xFEFC),
    ([0xFEE3, 0xFEA0], 0xFCCE),
    ([0xFEE3, 0xFEA4], 0xFCCF),
    ([0xFEE3, 0xFEA8], 0xFCD0),
    ([0xFEE3, 0xFEE4], 0xFCD1),
    ([0xFEE7, 0xFEE2], 0xFC4E),
    ([0xFEE7, 0xFEE4], 0xFCD5),
    ([0xFEE7, 0xFEA0], 0xFCD2),
    ([0xFEE7, 0xFEA4], 0xFCD3),
    ([0xFEE8, 0xFEF2], 0xFC8F),
    ([0xFEF3, 0xFEA0], 0xFCDA),
    ([0xFEF3, 0xFEA4], 0xFCDB),
    ([0xFEF3, 0xFEA8], 0xFCDC),
    ([0xFEF3, 0xFEE4], 0xFCDD),
    ([0xFEF4, 0xFEAE], 0xFC91),
    ([0xFEF4, 0xFEE6], 0xFC94),
];

pub(crate) const LIGATURE_MARK_TABLE: &[([u16; 2], u16)] = &[
    ([0x0651, 0x064C], 0xFC5E),
    ([0x0651, 0x064E], 0xFC60),
    ([0x0651, 0x064F], 0xFC61),
    ([0x0651, 0x0650], 0xFC62),
    ([0x0651, 0x064B], 0xF2EE),
];

/* == End of generated table == */