[arabic] Support legacy PUA shaping

Support legacy pre-OpenType Windows 3.1-era fonts, by remapping PUA code
points in cmap table and letting our fallback shaper build the GSUB
table.

Uniscribe applies also mset-like substitution, but our fallback mark
positioning gives better results, so this is not implemented.
This commit is contained in:
Khaled Hosny 2022-06-16 11:04:13 -06:00 committed by Behdad Esfahbod
parent b172f88c7d
commit c3f590bb1e
10 changed files with 449 additions and 17 deletions

View File

@ -133,6 +133,7 @@ HB_BASE_sources = \
hb-ot-post-table.hh \ hb-ot-post-table.hh \
hb-ot-shaper-arabic-fallback.hh \ hb-ot-shaper-arabic-fallback.hh \
hb-ot-shaper-arabic-joining-list.hh \ hb-ot-shaper-arabic-joining-list.hh \
hb-ot-shaper-arabic-pua.hh \
hb-ot-shaper-arabic-table.hh \ hb-ot-shaper-arabic-table.hh \
hb-ot-shaper-arabic-win1256.hh \ hb-ot-shaper-arabic-win1256.hh \
hb-ot-shaper-arabic.cc \ hb-ot-shaper-arabic.cc \

View File

@ -153,6 +153,16 @@ def print_joining_table(f):
print ("#undef %s" % (short)) print ("#undef %s" % (short))
print () print ()
LIGATURES = (
0xF2EE, 0xFC08, 0xFC0E, 0xFC12, 0xFC32, 0xFC3F, 0xFC40, 0xFC41, 0xFC42,
0xFC44, 0xFC4E, 0xFC5E, 0xFC60, 0xFC61, 0xFC62, 0xFC6A, 0xFC6D, 0xFC6F,
0xFC70, 0xFC73, 0xFC75, 0xFC86, 0xFC8F, 0xFC91, 0xFC94, 0xFC9C, 0xFC9D,
0xFC9E, 0xFC9F, 0xFCA1, 0xFCA2, 0xFCA3, 0xFCA4, 0xFCA8, 0xFCAA, 0xFCAC,
0xFCB0, 0xFCC9, 0xFCCA, 0xFCCB, 0xFCCC, 0xFCCD, 0xFCCE, 0xFCCF, 0xFCD0,
0xFCD1, 0xFCD2, 0xFCD3, 0xFCD5, 0xFCDA, 0xFCDB, 0xFCDC, 0xFCDD, 0xFD30,
0xFD88, 0xFEF5, 0xFEF6, 0xFEF7, 0xFEF8, 0xFEF9, 0xFEFA, 0xFEFB, 0xFEFC,
)
def print_shaping_table(f): def print_shaping_table(f):
shapes = {} shapes = {}
@ -166,14 +176,19 @@ def print_shaping_table(f):
items = fields[5].split (' ') items = fields[5].split (' ')
shape, items = items[0][1:-1], tuple (int (x, 16) for x in items[1:]) shape, items = items[0][1:-1], tuple (int (x, 16) for x in items[1:])
c = int (fields[0], 16)
if not shape in ['initial', 'medial', 'isolated', 'final']: if not shape in ['initial', 'medial', 'isolated', 'final']:
continue continue
c = int (fields[0], 16)
if len (items) != 1: if len (items) != 1:
# We only care about lam-alef ligatures # Mark ligatures start with space and are in visual order, so we
if len (items) != 2 or items[0] != 0x0644 or items[1] not in [0x0622, 0x0623, 0x0625, 0x0627]: # remove the space and reverse the items.
if items[0] == 0x0020:
items = items[:0:-1]
shape = None
# We only care about a subset of ligatures
if c not in LIGATURES or len (items) != 2:
continue continue
# Save ligature # Save ligature
@ -213,10 +228,14 @@ def print_shaping_table(f):
for pair in ligatures.keys (): for pair in ligatures.keys ():
for shape in ligatures[pair]: for shape in ligatures[pair]:
c = ligatures[pair][shape] c = ligatures[pair][shape]
if shape == 'isolated': if shape is None:
liga = pair
elif shape == 'isolated':
liga = (shapes[pair[0]]['initial'], shapes[pair[1]]['final']) liga = (shapes[pair[0]]['initial'], shapes[pair[1]]['final'])
elif shape == 'final': elif shape == 'final':
liga = (shapes[pair[0]]['medial'], shapes[pair[1]]['final']) liga = (shapes[pair[0]]['medial'], shapes[pair[1]]['final'])
elif shape == 'initial':
liga = (shapes[pair[0]]['initial'], shapes[pair[1]]['medial'])
else: else:
raise Exception ("Unexpected shape", shape) raise Exception ("Unexpected shape", shape)
if liga[0] not in ligas: if liga[0] not in ligas:

View File

@ -27,6 +27,8 @@
#ifndef HB_OT_CMAP_TABLE_HH #ifndef HB_OT_CMAP_TABLE_HH
#define HB_OT_CMAP_TABLE_HH #define HB_OT_CMAP_TABLE_HH
#include "hb-ot-os2-table.hh"
#include "hb-ot-shaper-arabic-pua.hh"
#include "hb-open-type.hh" #include "hb-open-type.hh"
#include "hb-set.hh" #include "hb-set.hh"
@ -1502,6 +1504,21 @@ struct SubtableUnicodesCache {
}; };
static inline hb_codepoint_t
_hb_remap_symbol_pua (hb_codepoint_t codepoint)
{
if (codepoint <= 0x00FFu)
{
/* For symbol-encoded OpenType fonts, we duplicate the
* U+F000..F0FF range at U+0000..U+00FF. That's what
* Windows seems to do, and that's hinted about at:
* https://docs.microsoft.com/en-us/typography/opentype/spec/recom
* under "Non-Standard (Symbol) Fonts". */
return 0xF000u + codepoint;
}
return 0;
}
struct cmap struct cmap
{ {
static constexpr hb_tag_t tableTag = HB_OT_TAG_cmap; static constexpr hb_tag_t tableTag = HB_OT_TAG_cmap;
@ -1725,7 +1742,19 @@ struct cmap
this->get_glyph_data = subtable; this->get_glyph_data = subtable;
if (unlikely (symbol)) if (unlikely (symbol))
this->get_glyph_funcZ = get_glyph_from_symbol<CmapSubtable>; {
switch ((unsigned) face->table.OS2->get_font_page ()) {
default:
this->get_glyph_funcZ = get_glyph_from_symbol<CmapSubtable, _hb_remap_symbol_pua>;
break;
case OS2::font_page_t::FONT_PAGE_SIMP_ARABIC:
this->get_glyph_funcZ = get_glyph_from_symbol<CmapSubtable, _hb_remap_arabic_pua1>;
break;
case OS2::font_page_t::FONT_PAGE_TRAD_ARABIC:
this->get_glyph_funcZ = get_glyph_from_symbol<CmapSubtable, _hb_remap_arabic_pua2>;
break;
}
}
else else
{ {
switch (subtable->u.format) { switch (subtable->u.format) {
@ -1807,6 +1836,7 @@ struct cmap
typedef bool (*hb_cmap_get_glyph_func_t) (const void *obj, typedef bool (*hb_cmap_get_glyph_func_t) (const void *obj,
hb_codepoint_t codepoint, hb_codepoint_t codepoint,
hb_codepoint_t *glyph); hb_codepoint_t *glyph);
typedef hb_codepoint_t (*hb_pua_remap_func_t) (hb_codepoint_t);
template <typename Type> template <typename Type>
HB_INTERNAL static bool get_glyph_from (const void *obj, HB_INTERNAL static bool get_glyph_from (const void *obj,
@ -1817,7 +1847,7 @@ struct cmap
return typed_obj->get_glyph (codepoint, glyph); return typed_obj->get_glyph (codepoint, glyph);
} }
template <typename Type> template <typename Type, hb_pua_remap_func_t remap>
HB_INTERNAL static bool get_glyph_from_symbol (const void *obj, HB_INTERNAL static bool get_glyph_from_symbol (const void *obj,
hb_codepoint_t codepoint, hb_codepoint_t codepoint,
hb_codepoint_t *glyph) hb_codepoint_t *glyph)
@ -1826,15 +1856,8 @@ struct cmap
if (likely (typed_obj->get_glyph (codepoint, glyph))) if (likely (typed_obj->get_glyph (codepoint, glyph)))
return true; return true;
if (codepoint <= 0x00FFu) if (hb_codepoint_t c = remap (codepoint))
{ return typed_obj->get_glyph (c, glyph);
/* For symbol-encoded OpenType fonts, we duplicate the
* U+F000..F0FF range at U+0000..U+00FF. That's what
* Windows seems to do, and that's hinted about at:
* https://docs.microsoft.com/en-us/typography/opentype/spec/recom
* under "Non-Standard (Symbol) Fonts". */
return typed_obj->get_glyph (0xF000u + codepoint, glyph);
}
return false; return false;
} }

View File

@ -224,9 +224,11 @@ struct OS2
*max_cp = hb_min (0xFFFFu, codepoints->get_max ()); *max_cp = hb_min (0xFFFFu, codepoints->get_max ());
} }
/* https://github.com/Microsoft/Font-Validator/blob/520aaae/OTFontFileVal/val_OS2.cs#L644-L681 */ /* https://github.com/Microsoft/Font-Validator/blob/520aaae/OTFontFileVal/val_OS2.cs#L644-L681
* https://docs.microsoft.com/en-us/typography/legacy/legacy_arabic_fonts */
enum font_page_t enum font_page_t
{ {
FONT_PAGE_NONE = 0,
FONT_PAGE_HEBREW = 0xB100, /* Hebrew Windows 3.1 font page */ FONT_PAGE_HEBREW = 0xB100, /* Hebrew Windows 3.1 font page */
FONT_PAGE_SIMP_ARABIC = 0xB200, /* Simplified Arabic Windows 3.1 font page */ FONT_PAGE_SIMP_ARABIC = 0xB200, /* Simplified Arabic Windows 3.1 font page */
FONT_PAGE_TRAD_ARABIC = 0xB300, /* Traditional Arabic Windows 3.1 font page */ FONT_PAGE_TRAD_ARABIC = 0xB300, /* Traditional Arabic Windows 3.1 font page */

View File

@ -0,0 +1,289 @@
#ifndef HB_OT_SHAPER_ARABIC_PUA_HH
#define HB_OT_SHAPER_ARABIC_PUA_HH
static const uint16_t _arabic_table_pua1[][128] = {
{ /* 0x0000u..0x007Fu */
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0xF120u, 0xF121u, 0xF122u, 0x0000u, 0x0000u, 0xF125u, 0x0000u, 0x0000u,
0xF128u, 0xF129u, 0xF12Au, 0xF12Bu, 0xF15Eu, 0xF12Du, 0xF12Eu, 0xF12Fu,
0xF1B0u, 0xF1B1u, 0xF1B2u, 0xF1B3u, 0xF1B4u, 0xF1B5u, 0xF1B6u, 0xF1B7u,
0xF1B8u, 0xF1B9u, 0xF13Au, 0xF13Bu, 0x0000u, 0xF13Du, 0x0000u, 0xF13Fu,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0xF15Bu, 0xF15Cu, 0xF15Du, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
},
{ /* 0x0080u..0x00FFu */
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0xF123u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0xF124u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0xF126u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0xF127u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
},
{ /* 0x0600u..0x067Fu */
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0xF12Cu, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0xF13Bu, 0x0000u, 0x0000u, 0x0000u, 0xF13Fu,
0x0000u, 0xF1ADu, 0xF145u, 0xF143u, 0xF1BBu, 0xF147u, 0xF1BAu, 0xF141u,
0xF14Au, 0xF1A9u, 0xF14Cu, 0xF14Eu, 0xF151u, 0xF154u, 0xF157u, 0xF158u,
0xF159u, 0xF15Au, 0xF160u, 0xF162u, 0xF164u, 0xF166u, 0xF168u, 0xF169u,
0xF16Au, 0xF16Eu, 0xF172u, 0xF100u, 0xF100u, 0xF100u, 0xF100u, 0xF100u,
0xF15Fu, 0xF175u, 0xF178u, 0xF17Au, 0xF17Cu, 0xF17Eu, 0xF1E1u, 0xF1A4u,
0xF1A5u, 0xF1ACu, 0xF1A8u, 0xF1C7u, 0xF1C8u, 0xF1CBu, 0xF1C4u, 0xF1C5u,
0xF1CAu, 0xF1C9u, 0xF1C6u, 0xF100u, 0xF100u, 0xF100u, 0xF100u, 0xF100u,
0xF100u, 0xF100u, 0xF100u, 0xF100u, 0xF100u, 0xF100u, 0xF100u, 0x0000u,
0xF130u, 0xF131u, 0xF132u, 0xF133u, 0xF134u, 0xF135u, 0xF136u, 0xF137u,
0xF138u, 0xF139u, 0x0000u, 0xF15Eu, 0xF15Eu, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
},
{ /* 0x2000u..0x207Fu */
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0xF10Cu, 0xF10Du, 0xF10Eu, 0xF10Fu,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0xF13Cu, 0xF13Eu, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
},
{ /* 0xFE80u..0xFEFFu */
0x0000u, 0xF145u, 0xF146u, 0xF143u, 0xF144u, 0xF1BBu, 0xF1BBu, 0xF147u,
0xF148u, 0xF1BAu, 0xF1AFu, 0xF1AEu, 0xF1AEu, 0xF141u, 0xF142u, 0xF14Au,
0xF14Au, 0xF149u, 0xF149u, 0xF1A9u, 0xF1AAu, 0xF14Cu, 0xF14Cu, 0xF14Bu,
0xF14Bu, 0xF14Eu, 0xF14Eu, 0xF14Du, 0xF14Du, 0xF151u, 0xF150u, 0xF14Fu,
0xF14Fu, 0xF154u, 0xF153u, 0xF152u, 0xF152u, 0xF157u, 0xF156u, 0xF155u,
0xF155u, 0xF158u, 0xF158u, 0xF159u, 0xF159u, 0xF15Au, 0xF15Au, 0xF160u,
0xF160u, 0xF162u, 0xF162u, 0xF161u, 0xF161u, 0xF164u, 0xF164u, 0xF163u,
0xF163u, 0xF166u, 0xF166u, 0xF165u, 0xF165u, 0xF168u, 0xF168u, 0xF167u,
0xF167u, 0xF169u, 0xF169u, 0xF169u, 0xF169u, 0xF16Au, 0xF16Au, 0xF16Au,
0xF16Au, 0xF16Eu, 0xF16Du, 0xF16Bu, 0xF16Cu, 0xF172u, 0xF171u, 0xF16Fu,
0xF170u, 0xF175u, 0xF175u, 0xF173u, 0xF174u, 0xF178u, 0xF178u, 0xF176u,
0xF177u, 0xF17Au, 0xF17Au, 0xF179u, 0xF179u, 0xF17Cu, 0xF17Cu, 0xF17Bu,
0xF17Bu, 0xF17Eu, 0xF17Eu, 0xF17Du, 0xF17Du, 0xF1E1u, 0xF1E1u, 0xF17Fu,
0xF17Fu, 0xF1A4u, 0xF1A3u, 0xF1A1u, 0xF1A2u, 0xF1A5u, 0xF1A5u, 0xF1ACu,
0xF1ABu, 0xF1A8u, 0xF1A7u, 0xF1A6u, 0xF1A6u, 0xF1C0u, 0xF1C1u, 0xF1BEu,
0xF1BFu, 0xF1C2u, 0xF1C3u, 0xF1BDu, 0xF1BCu, 0x0000u, 0x0000u, 0x0000u,
},
};
static inline hb_codepoint_t
_hb_remap_arabic_pua1(hb_codepoint_t codepoint)
{
if (hb_in_range<hb_codepoint_t> (codepoint, 0x0000u, 0x007Fu)) return _arabic_table_pua1[0][codepoint];
if (hb_in_range<hb_codepoint_t> (codepoint, 0x0080u, 0x00FFu)) return _arabic_table_pua1[1][codepoint - 0x0080u];
if (hb_in_range<hb_codepoint_t> (codepoint, 0x0600u, 0x067Fu)) return _arabic_table_pua1[2][codepoint - 0x0600u];
if (hb_in_range<hb_codepoint_t> (codepoint, 0x2000u, 0x207Fu)) return _arabic_table_pua1[3][codepoint - 0x2000u];
if (hb_in_range<hb_codepoint_t> (codepoint, 0xFE80u, 0xFEFFu)) return _arabic_table_pua1[4][codepoint - 0xFE80u];
return 0;
}
static const uint16_t _arabic_table_pua2[][128] = {
{ /* 0x0000u..0x007Fu */
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0xF220u, 0xF221u, 0xF222u, 0x0000u, 0x0000u, 0xF225u, 0x0000u, 0x0000u,
0xF228u, 0xF229u, 0xF22Au, 0xF22Bu, 0xF25Eu, 0xF22Du, 0xF22Eu, 0xF22Fu,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0xF23Au, 0xF23Bu, 0x0000u, 0xF23Du, 0x0000u, 0xF23Fu,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0xF25Bu, 0x0000u, 0xF25Du, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
},
{ /* 0x0080u..0x00FFu */
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0xF223u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0xF224u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0xF226u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0xF227u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
},
{ /* 0x0600u..0x067Fu */
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0xF22Cu, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0xF23Bu, 0x0000u, 0x0000u, 0x0000u, 0xF23Fu,
0x0000u, 0xF2D5u, 0xF245u, 0xF243u, 0xF2DAu, 0xF247u, 0xF2D9u, 0xF241u,
0xF24Cu, 0xF2D1u, 0xF250u, 0xF254u, 0xF258u, 0xF260u, 0xF264u, 0xF265u,
0xF267u, 0xF269u, 0xF26Bu, 0xF270u, 0xF274u, 0xF278u, 0xF27Eu, 0xF2A2u,
0xF2A3u, 0xF2AAu, 0xF2AEu, 0xF200u, 0xF200u, 0xF200u, 0xF200u, 0xF200u,
0xF25Fu, 0xF2B2u, 0xF2B6u, 0xF2BAu, 0xF2BEu, 0xF2C2u, 0xF2C6u, 0xF2CAu,
0xF2CBu, 0xF2D4u, 0xF2D0u, 0xF2E7u, 0xF2E8u, 0xF2EBu, 0xF2E4u, 0xF2E5u,
0xF2EAu, 0xF2E9u, 0xF2E6u, 0xF200u, 0xF200u, 0xF200u, 0xF200u, 0xF200u,
0xF200u, 0xF200u, 0xF200u, 0xF200u, 0xF200u, 0xF200u, 0xF200u, 0x0000u,
0xF230u, 0xF231u, 0xF232u, 0xF233u, 0xF234u, 0xF235u, 0xF236u, 0xF237u,
0xF238u, 0xF239u, 0x0000u, 0xF25Eu, 0xF25Eu, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
},
{ /* 0x2000u..0x207Fu */
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0xF20Cu, 0xF20Du, 0xF20Eu, 0xF20Fu,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0xF23Cu, 0xF23Eu, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
},
{ /* 0xFBD0u..0xFC4Fu */
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0xF202u, 0x0000u, 0xF21Du, 0x0000u, 0x0000u, 0x0000u, 0xF203u, 0x0000u,
0xF21Eu, 0x0000u, 0xF204u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0xF29Fu, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0xF212u,
0xF213u, 0xF214u, 0xF205u, 0x0000u, 0xF21Cu, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0xF206u, 0x0000u,
},
{ /* 0xFC50u..0xFCCFu */
0xF21Fu, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0xF2EFu, 0x0000u,
0xF2ECu, 0xF2EDu, 0xF2F0u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0xF215u, 0x0000u, 0x0000u, 0xF292u, 0x0000u, 0x0000u,
0xF216u, 0x0000u, 0x0000u, 0xF293u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0xF295u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0xF217u, 0x0000u, 0x0000u, 0xF294u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0xF280u, 0xF281u, 0xF282u, 0xF296u,
0x0000u, 0xF283u, 0xF284u, 0xF285u, 0xF297u, 0x0000u, 0x0000u, 0x0000u,
0xF29Au, 0x0000u, 0xF29Bu, 0x0000u, 0xF29Cu, 0x0000u, 0x0000u, 0x0000u,
0xF218u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0xF286u, 0xF287u, 0xF288u, 0xF29Du, 0xF21Au, 0xF289u, 0xF28Au,
},
{ /* 0xFCD0u..0xFD4Fu */
0xF28Bu, 0xF29Eu, 0xF28Du, 0xF28Eu, 0x0000u, 0xF298u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0xF28Fu, 0xF290u, 0xF291u, 0xF299u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0xF219u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0xF27Bu, 0xF27Du,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
},
{ /* 0xFD50u..0xFDCFu */
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0xF210u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u, 0x0000u,
},
{ /* 0xFE80u..0xFEFFu */
0x0000u, 0xF245u, 0xF246u, 0xF243u, 0xF244u, 0xF2DAu, 0xF2DBu, 0xF247u,
0xF248u, 0xF2D9u, 0xF2D8u, 0xF2D6u, 0xF2D7u, 0xF241u, 0xF242u, 0xF24Cu,
0xF24Bu, 0xF249u, 0xF24Au, 0xF2D1u, 0xF2D2u, 0xF250u, 0xF24Fu, 0xF24Du,
0xF24Eu, 0xF254u, 0xF253u, 0xF251u, 0xF252u, 0xF258u, 0xF257u, 0xF255u,
0xF256u, 0xF260u, 0xF25Cu, 0xF259u, 0xF25Au, 0xF264u, 0xF263u, 0xF261u,
0xF262u, 0xF265u, 0xF266u, 0xF267u, 0xF268u, 0xF269u, 0xF26Au, 0xF26Bu,
0xF26Cu, 0xF270u, 0xF26Fu, 0xF26Du, 0xF26Eu, 0xF274u, 0xF273u, 0xF271u,
0xF272u, 0xF278u, 0xF277u, 0xF275u, 0xF276u, 0xF27Eu, 0xF27Cu, 0xF279u,
0xF27Au, 0xF2A2u, 0xF2A1u, 0xF27Fu, 0xF2F1u, 0xF2A6u, 0xF2A5u, 0xF2A3u,
0xF2A4u, 0xF2AAu, 0xF2A9u, 0xF2A7u, 0xF2A8u, 0xF2AEu, 0xF2ADu, 0xF2ABu,
0xF2ACu, 0xF2B2u, 0xF2B1u, 0xF2AFu, 0xF2B0u, 0xF2B6u, 0xF2B5u, 0xF2B3u,
0xF2B4u, 0xF2BAu, 0xF2B9u, 0xF2B7u, 0xF2B8u, 0xF2BEu, 0xF2BDu, 0xF2BBu,
0xF2BCu, 0xF2C2u, 0xF2C1u, 0xF2BFu, 0xF2C0u, 0xF2C6u, 0xF2C5u, 0xF2C3u,
0xF2C4u, 0xF2CAu, 0xF2C9u, 0xF2C7u, 0xF2C8u, 0xF2CBu, 0xF2CCu, 0xF2D4u,
0xF2D3u, 0xF2D0u, 0xF2CFu, 0xF2CDu, 0xF2CEu, 0xF2E0u, 0xF2E1u, 0xF2DEu,
0xF2DFu, 0xF2E2u, 0xF2E3u, 0xF2DCu, 0xF2DDu, 0x0000u, 0x0000u, 0x0000u,
},
};
static inline hb_codepoint_t
_hb_remap_arabic_pua2(hb_codepoint_t codepoint)
{
if (hb_in_range<hb_codepoint_t> (codepoint, 0x0000u, 0x007Fu)) return _arabic_table_pua2[0][codepoint];
if (hb_in_range<hb_codepoint_t> (codepoint, 0x0080u, 0x00FFu)) return _arabic_table_pua2[1][codepoint - 0x0080u];
if (hb_in_range<hb_codepoint_t> (codepoint, 0x0600u, 0x067Fu)) return _arabic_table_pua2[2][codepoint - 0x0600u];
if (hb_in_range<hb_codepoint_t> (codepoint, 0x2000u, 0x207Fu)) return _arabic_table_pua2[3][codepoint - 0x2000u];
if (hb_in_range<hb_codepoint_t> (codepoint, 0xFBD0u, 0xFC4Fu)) return _arabic_table_pua2[4][codepoint - 0xFBD0u];
if (hb_in_range<hb_codepoint_t> (codepoint, 0xFC50u, 0xFCCFu)) return _arabic_table_pua2[5][codepoint - 0xFC50u];
if (hb_in_range<hb_codepoint_t> (codepoint, 0xFCD0u, 0xFD4Fu)) return _arabic_table_pua2[6][codepoint - 0xFCD0u];
if (hb_in_range<hb_codepoint_t> (codepoint, 0xFD50u, 0xFDCFu)) return _arabic_table_pua2[7][codepoint - 0xFD50u];
if (hb_in_range<hb_codepoint_t> (codepoint, 0xFE80u, 0xFEFFu)) return _arabic_table_pua2[8][codepoint - 0xFE80u];
return 0;
}
#endif /* HB_OT_SHAPER_ARABIC_PUA_HH */

View File

@ -418,21 +418,108 @@ static const struct ligature_set_t {
struct ligature_pairs_t { struct ligature_pairs_t {
uint16_t second; uint16_t second;
uint16_t ligature; uint16_t ligature;
} ligatures[4]; } ligatures[14];
} ligature_table[] = } ligature_table[] =
{ {
{ 0x0651u, {
{ 0x064Cu, 0xFC5Eu }, /* ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM */
{ 0x064Eu, 0xFC60u }, /* ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM */
{ 0x064Fu, 0xFC61u }, /* ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM */
{ 0x0650u, 0xFC62u }, /* ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM */
}},
{ 0xFE91u, {
{ 0xFEE2u, 0xFC08u }, /* ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM */
{ 0xFEE4u, 0xFC9Fu }, /* ARABIC LIGATURE BEH WITH MEEM INITIAL FORM */
{ 0xFEA0u, 0xFC9Cu }, /* ARABIC LIGATURE BEH WITH JEEM INITIAL FORM */
{ 0xFEA4u, 0xFC9Du }, /* ARABIC LIGATURE BEH WITH HAH INITIAL FORM */
{ 0xFEA8u, 0xFC9Eu }, /* ARABIC LIGATURE BEH WITH KHAH INITIAL FORM */
}},
{ 0xFE92u, {
{ 0xFEAEu, 0xFC6Au }, /* ARABIC LIGATURE BEH WITH REH FINAL FORM */
{ 0xFEE6u, 0xFC6Du }, /* ARABIC LIGATURE BEH WITH NOON FINAL FORM */
{ 0xFEF2u, 0xFC6Fu }, /* ARABIC LIGATURE BEH WITH YEH FINAL FORM */
}},
{ 0xFE97u, {
{ 0xFEE2u, 0xFC0Eu }, /* ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM */
{ 0xFEE4u, 0xFCA4u }, /* ARABIC LIGATURE TEH WITH MEEM INITIAL FORM */
{ 0xFEA0u, 0xFCA1u }, /* ARABIC LIGATURE TEH WITH JEEM INITIAL FORM */
{ 0xFEA4u, 0xFCA2u }, /* ARABIC LIGATURE TEH WITH HAH INITIAL FORM */
{ 0xFEA8u, 0xFCA3u }, /* ARABIC LIGATURE TEH WITH KHAH INITIAL FORM */
}},
{ 0xFE98u, {
{ 0xFEAEu, 0xFC70u }, /* ARABIC LIGATURE TEH WITH REH FINAL FORM */
{ 0xFEE6u, 0xFC73u }, /* ARABIC LIGATURE TEH WITH NOON FINAL FORM */
{ 0xFEF2u, 0xFC75u }, /* ARABIC LIGATURE TEH WITH YEH FINAL FORM */
}},
{ 0xFE9Bu, {
{ 0xFEE2u, 0xFC12u }, /* ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM */
}},
{ 0xFE9Fu, {
{ 0xFEE4u, 0xFCA8u }, /* ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM */
}},
{ 0xFEA3u, {
{ 0xFEE4u, 0xFCAAu }, /* ARABIC LIGATURE HAH WITH MEEM INITIAL FORM */
}},
{ 0xFEA7u, {
{ 0xFEE4u, 0xFCACu }, /* ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM */
}},
{ 0xFEB3u, {
{ 0xFEE4u, 0xFCB0u }, /* ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM */
}},
{ 0xFEB7u, {
{ 0xFEE4u, 0xFD30u }, /* ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM */
}},
{ 0xFED3u, {
{ 0xFEF2u, 0xFC32u }, /* ARABIC LIGATURE FEH WITH YEH ISOLATED FORM */
}},
{ 0xFEDFu, { { 0xFEDFu, {
{ 0xFE9Eu, 0xFC3Fu }, /* ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM */
{ 0xFEA0u, 0xFCC9u }, /* ARABIC LIGATURE LAM WITH JEEM INITIAL FORM */
{ 0xFEA2u, 0xFC40u }, /* ARABIC LIGATURE LAM WITH HAH ISOLATED FORM */
{ 0xFEA4u, 0xFCCAu }, /* ARABIC LIGATURE LAM WITH HAH INITIAL FORM */
{ 0xFEA6u, 0xFC41u }, /* ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM */
{ 0xFEA8u, 0xFCCBu }, /* ARABIC LIGATURE LAM WITH KHAH INITIAL FORM */
{ 0xFEE2u, 0xFC42u }, /* ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM */
{ 0xFEE4u, 0xFCCCu }, /* ARABIC LIGATURE LAM WITH MEEM INITIAL FORM */
{ 0xFEF2u, 0xFC44u }, /* ARABIC LIGATURE LAM WITH YEH ISOLATED FORM */
{ 0xFEECu, 0xFCCDu }, /* ARABIC LIGATURE LAM WITH HEH INITIAL FORM */
{ 0xFE82u, 0xFEF5u }, /* ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM */ { 0xFE82u, 0xFEF5u }, /* ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM */
{ 0xFE84u, 0xFEF7u }, /* ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM */ { 0xFE84u, 0xFEF7u }, /* ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM */
{ 0xFE88u, 0xFEF9u }, /* ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM */ { 0xFE88u, 0xFEF9u }, /* ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM */
{ 0xFE8Eu, 0xFEFBu }, /* ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM */ { 0xFE8Eu, 0xFEFBu }, /* ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM */
}}, }},
{ 0xFEE0u, { { 0xFEE0u, {
{ 0xFEF0u, 0xFC86u }, /* ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM */
{ 0xFE82u, 0xFEF6u }, /* ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM */ { 0xFE82u, 0xFEF6u }, /* ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM */
{ 0xFE84u, 0xFEF8u }, /* ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM */ { 0xFE84u, 0xFEF8u }, /* ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM */
{ 0xFE88u, 0xFEFAu }, /* ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM */ { 0xFE88u, 0xFEFAu }, /* ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM */
{ 0xFE8Eu, 0xFEFCu }, /* ARABIC LIGATURE LAM WITH ALEF FINAL FORM */ { 0xFE8Eu, 0xFEFCu }, /* ARABIC LIGATURE LAM WITH ALEF FINAL FORM */
}}, }},
{ 0xFEE3u, {
{ 0xFEA0u, 0xFCCEu }, /* ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM */
{ 0xFEA4u, 0xFCCFu }, /* ARABIC LIGATURE MEEM WITH HAH INITIAL FORM */
{ 0xFEA8u, 0xFCD0u }, /* ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM */
{ 0xFEE4u, 0xFCD1u }, /* ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM */
}},
{ 0xFEE7u, {
{ 0xFEE2u, 0xFC4Eu }, /* ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM */
{ 0xFEE4u, 0xFCD5u }, /* ARABIC LIGATURE NOON WITH MEEM INITIAL FORM */
{ 0xFEA0u, 0xFCD2u }, /* ARABIC LIGATURE NOON WITH JEEM INITIAL FORM */
{ 0xFEA4u, 0xFCD3u }, /* ARABIC LIGATURE NOON WITH HAH INITIAL FORM */
}},
{ 0xFEE8u, {
{ 0xFEF2u, 0xFC8Fu }, /* ARABIC LIGATURE NOON WITH YEH FINAL FORM */
}},
{ 0xFEF3u, {
{ 0xFEA0u, 0xFCDAu }, /* ARABIC LIGATURE YEH WITH JEEM INITIAL FORM */
{ 0xFEA4u, 0xFCDBu }, /* ARABIC LIGATURE YEH WITH HAH INITIAL FORM */
{ 0xFEA8u, 0xFCDCu }, /* ARABIC LIGATURE YEH WITH KHAH INITIAL FORM */
{ 0xFEE4u, 0xFCDDu }, /* ARABIC LIGATURE YEH WITH MEEM INITIAL FORM */
}},
{ 0xFEF4u, {
{ 0xFEAEu, 0xFC91u }, /* ARABIC LIGATURE YEH WITH REH FINAL FORM */
{ 0xFEE6u, 0xFC94u }, /* ARABIC LIGATURE YEH WITH NOON FINAL FORM */
}},
}; };

View File

@ -137,6 +137,7 @@ hb_base_sources = files(
'hb-ot-post-table.hh', 'hb-ot-post-table.hh',
'hb-ot-shaper-arabic-fallback.hh', 'hb-ot-shaper-arabic-fallback.hh',
'hb-ot-shaper-arabic-joining-list.hh', 'hb-ot-shaper-arabic-joining-list.hh',
'hb-ot-shaper-arabic-pua.hh',
'hb-ot-shaper-arabic-table.hh', 'hb-ot-shaper-arabic-table.hh',
'hb-ot-shaper-arabic-win1256.hh', 'hb-ot-shaper-arabic-win1256.hh',
'hb-ot-shaper-arabic.cc', 'hb-ot-shaper-arabic.cc',

Binary file not shown.

Binary file not shown.

View File

@ -1 +1,11 @@
../fonts/df768b9c257e0c9c35786c47cae15c46571d56be.ttf;;U+0633,U+064F,U+0644,U+064E,U+0651,U+0627,U+0651,U+0650,U+0645,U+062A,U+06CC;[uni06CC.fina=10+1655|uni062A.medi=9+868|uni0645.init=8+1098|uni0650=2@148,0+0|uni0651=2@187,736+0|uni064E=2@883,1259+0|uni0651=2@922,736+0|uni06440627.fina=2+1470|uni064F=0@629,-10+0|uni0633.init=0+1585] ../fonts/df768b9c257e0c9c35786c47cae15c46571d56be.ttf;;U+0633,U+064F,U+0644,U+064E,U+0651,U+0627,U+0651,U+0650,U+0645,U+062A,U+06CC;[uni06CC.fina=10+1655|uni062A.medi=9+868|uni0645.init=8+1098|uni0650=2@148,0+0|uni0651=2@187,736+0|uni064E=2@883,1259+0|uni0651=2@922,736+0|uni06440627.fina=2+1470|uni064F=0@629,-10+0|uni0633.init=0+1585]
../fonts/SimpArabicTest.ttf;--font-funcs=ot;U+0628,U+0650,U+0633,U+0652,U+0645,U+0650,U+0020,U+0020,U+0627,U+0644,U+0644,U+0647,U+0020,U+0627,U+0644,U+0631,U+0651,U+064E,U+062D,U+0652,U+0645,U+064E,U+0646,U+0650,U+0020,U+0627,U+0644,U+0631,U+062D,U+0650,U+064A,U+0645;[daggerdbl=31+584|c142=30+276|twosuperior=28@130,0+0|bracketleft=28+515|c=27+240|quotedblbase=26+216|J=25+289|parenright=24+391|twosuperior=22@166,-236+0|Eacute=22+587|logicalnot=20@127,-87+0|dagger=20+509|registered=18@137,-97+0|bracketleft=18+515|logicalnot=15@-7,261+0|plusminus=15@-49,-97+0|c=15+240|quotedblbase=14+216|J=13+289|parenright=12+391|guilsinglleft=11+599|quotedblbase=10+216|quotedblbase=9+216|J=8+289|parenright=7+391|parenright=6+391|twosuperior=4@165,-316+0|daggerdbl=4+584|registered=2@276,-102+0|j=2+793|twosuperior=0@-11,-196+0|R=0+232]
../fonts/SimpArabicTest.ttf;--font-funcs=ot;U+0020,U+0644,U+0627,U+0020,U+0644,U+0623,U+0020,U+0644,U+064E,U+0623,U+064E,U+0020,U+0623,U+064E,U+0646,U+062A;[U=15+693|DEL=14+227|logicalnot=12@17,307+0|L=12+289|parenright=11+391|logicalnot=7@41,267+0|logicalnot=7@378,267+0|brokenbar=7+674|parenright=6+391|brokenbar=4+674|parenright=3+391|yen=1+709|parenright=0+391]
../fonts/SimpArabicTest.ttf;--font-funcs=ot;U+0021,U+0022,U+00AB,U+00BB,U+0025,U+00D7,U+00F7,U+0028,U+0020,U+0029,U+002A,U+002B,U+060C,U+002E,U+002F,U+003A,U+061B,U+2018,U+003D,U+2019,U+061F,U+005B,U+005D,U+002D,U+0022;[asterisk=0+269|plus=1+408|comma=2+509|hyphen=3+509|period=4+573|slash=5+572|zero=6+572|one=7+300|parenright=8+391|two=9+300|three=10+551|four=11+572|five=12+283|seven=13+268|eight=14+372|C=15+268|D=16+295|E=17+175|F=18+572|G=19+175|H=20+485|d=21+329|f=22+329|six=23+322|plus=24+408]
../fonts/SimpArabicTest.ttf;--font-funcs=ot;U+061F,U+003F,U+0640;[H=0+485|H=1+485|h=2+171]
../fonts/SimpArabicTest.ttf;--font-funcs=ot;U+0628,U+0644,U+0627,U+0020,U+0628,U+0644,U+0625;[ordfeminine=5+674|R=4+232|parenright=3+391|yen=1+709|R=0+232]
../fonts/TradArabicTest.ttf;--font-funcs=ot;U+0628,U+0650,U+0633,U+0652,U+0645,U+0650,U+0020,U+0020,U+0627,U+0644,U+0644,U+0647,U+0020,U+0627,U+0644,U+0631,U+0651,U+064E,U+062D,U+0652,U+0645,U+064E,U+0646,U+0650,U+0020,U+0627,U+0644,U+0631,U+062D,U+0650,U+064A,U+0645;[fnmeem=31+1069|midya=30+499|kasrah2=28@151,0+0|inhaa=28+1341|fnra=27+702|inlam=26+358|alef=25+444|righttoleftspace=24+468|kasrah2=22@110,-604+0|fnnoon=22+1259|fathah2=18@-145,-168+0|sukun2=18@760,-166+0|f29b=18+1497|fathah2=15@-168,56+0|shaddah2=15@-51,-416+0|fnra=15+702|inlam=14+358|alef=13+444|righttoleftspace=12+468|fnha=11+776|midlam=10+403|inlam=9+358|alef=8+444|righttoleftspace=7+468|righttoleftspace=6+468|kasrah2=4@15,-1102+0|fnmeem=4+1069|sukun2=2@220,-386+0|midseen=2+1163|kasrah2=0@-324,-403+0|inbaa=0+389]
../fonts/TradArabicTest.ttf;--font-funcs=ot;U+0020,U+0644,U+0627,U+0020,U+0644,U+0623,U+0020,U+0644,U+064E,U+0623,U+064E,U+0020,U+0623,U+064E,U+0646,U+062A;[fntaa=15+1808|innoon=14+389|fathah2=12@-279,883+0|hamzahonalef=12+479|righttoleftspace=11+468|fathah2=7@-190,862+0|fathah2=7@468,862+0|hamzahonlamelef=7+1316|righttoleftspace=6+468|hamzahonlamelef=4+1316|righttoleftspace=3+468|lamelef=1+1316|righttoleftspace=0+468]
../fonts/TradArabicTest.ttf;--font-funcs=ot;U+0021,U+0022,U+00AB,U+00BB,U+0025,U+00D7,U+00F7,U+0028,U+0020,U+0029,U+002A,U+002B,U+060C,U+002E,U+002F,U+003A,U+061B,U+2018,U+003D,U+2019,U+061F,U+005B,U+005D,U+002D,U+0022;[greater=0+481|question=1+559|at=2+849|A=3+849|percentarabic=4+1353|C=5+927|D=6+1196|E=7+855|righttoleftspace=8+468|F=9+855|G=10+884|H=11+1083|commaarabic=12+755|K=13+649|L=14+704|W=15+450|semicolonarabic=16+755|.notdef=17+745|Z=18+1128|.notdef=19+745|questionarabic=20+845|x=21+739|z=22+739|J=23+753|question=24+559]
../fonts/TradArabicTest.ttf;--font-funcs=ot;U+061F,U+003F,U+0640;[questionarabic=0+845|questionarabic=1+845|tatweelnarrow=2+378]
../fonts/TradArabicTest.ttf;--font-funcs=ot;U+0644,U+0645,U+0020,U+0628,U+0645,U+0627;[fnalef=5+468|f296=3+897|righttoleftspace=2+468|f205=0+903]