[arabic] Split ligature array

Generate marks and 3-component ligatures in separate arrays. The new
arrays are unused currently.
This commit is contained in:
Khaled Hosny 2022-06-18 20:28:43 +02:00 committed by Behdad Esfahbod
parent 6e29060af2
commit 7f362196c5
2 changed files with 117 additions and 27 deletions

View File

@ -195,7 +195,7 @@ def print_shaping_table(f):
items = items[:0:-1]
shape = None
# We only care about a subset of ligatures
if c not in LIGATURES or len (items) != 2:
if c not in LIGATURES:
continue
# Save ligature
@ -231,24 +231,45 @@ def print_shaping_table(f):
print ("#define SHAPING_TABLE_LAST 0x%04Xu" % max_u)
print ()
ligas = {}
for pair in ligatures.keys ():
for shape in ligatures[pair]:
c = ligatures[pair][shape]
if shape is None:
liga = pair
elif shape == 'isolated':
liga = (shapes[pair[0]]['initial'], shapes[pair[1]]['final'])
elif shape == 'final':
liga = (shapes[pair[0]]['medial'], shapes[pair[1]]['final'])
elif shape == 'initial':
liga = (shapes[pair[0]]['initial'], shapes[pair[1]]['medial'])
ligas_2 = {}
ligas_3 = {}
ligas_mark_2 = {}
for key in ligatures.keys ():
for shape in ligatures[key]:
c = ligatures[key][shape]
if len(key) == 3:
if shape == 'isolated':
liga = (shapes[key[0]]['initial'], shapes[key[1]]['medial'], shapes[key[2]]['final'])
elif shape == 'final':
liga = (shapes[key[0]]['medial'], shapes[key[1]]['medial'], shapes[key[2]]['final'])
elif shape == 'initial':
liga = (shapes[key[0]]['initial'], shapes[key[1]]['medial'], shapes[key[2]]['medial'])
else:
raise Exception ("Unexpected shape", shape)
if liga[0] not in ligas_3:
ligas_3[liga[0]] = []
ligas_3[liga[0]].append ((liga[1], liga[2], c))
elif len(key) == 2:
if shape is None:
liga = key
if liga[0] not in ligas_mark_2:
ligas_mark_2[liga[0]] = []
ligas_mark_2[liga[0]].append ((liga[1], c))
continue
elif shape == 'isolated':
liga = (shapes[key[0]]['initial'], shapes[key[1]]['final'])
elif shape == 'final':
liga = (shapes[key[0]]['medial'], shapes[key[1]]['final'])
elif shape == 'initial':
liga = (shapes[key[0]]['initial'], shapes[key[1]]['medial'])
else:
raise Exception ("Unexpected shape", shape)
if liga[0] not in ligas_2:
ligas_2[liga[0]] = []
ligas_2[liga[0]].append ((liga[1], c))
else:
raise Exception ("Unexpected shape", shape)
if liga[0] not in ligas:
ligas[liga[0]] = []
ligas[liga[0]].append ((liga[1], c))
max_i = max (len (ligas[l]) for l in ligas)
raise Exception ("Unexpected number of ligature components", key)
max_i = max (len (ligas_2[l]) for l in ligas_2)
print ()
print ("static const struct ligature_set_t {")
print (" uint16_t first;")
@ -258,16 +279,57 @@ def print_shaping_table(f):
print (" } ligatures[%d];" % max_i)
print ("} ligature_table[] =")
print ("{")
for first in sorted (ligas.keys ()):
for first in sorted (ligas_2.keys ()):
print (" { 0x%04Xu, {" % (first))
for liga in ligas[first]:
for liga in ligas_2[first]:
print (" { 0x%04Xu, 0x%04Xu }, /* %s */" % (liga[0], liga[1], names[liga[1]]))
print (" }},")
print ("};")
print ()
max_i = max (len (ligas_mark_2[l]) for l in ligas_mark_2)
print ()
print ("static const struct ligature_mark_set_t {")
print (" uint16_t first;")
print (" struct ligature_pairs_t {")
print (" uint16_t second;")
print (" uint16_t ligature;")
print (" } ligatures[%d];" % max_i)
print ("} ligature_mark_table[] =")
print ("{")
for first in sorted (ligas_mark_2.keys ()):
print (" { 0x%04Xu, {" % (first))
for liga in ligas_mark_2[first]:
print (" { 0x%04Xu, 0x%04Xu }, /* %s */" % (liga[0], liga[1], names[liga[1]]))
print (" }},")
print ("};")
print ()
max_i = max (len (ligas_3[l]) for l in ligas_3)
print ()
print ("static const struct ligature_3_set_t {")
print (" uint16_t first;")
print (" struct ligature_triplets_t {")
print (" uint16_t second;")
print (" uint16_t third;")
print (" uint16_t ligature;")
print (" } ligatures[%d];" % max_i)
print ("} ligature_3_table[] =")
print ("{")
for first in sorted (ligas_3.keys ()):
print (" { 0x%04Xu, {" % (first))
for liga in ligas_3[first]:
print (" { 0x%04Xu, 0x%04Xu, 0x%04Xu}, /* %s */" % (liga[0], liga[1], liga[2], names[liga[2]]))
print (" }},")
print ("};")
print ()
print ("/* == Start of generated table == */")

View File

@ -421,13 +421,6 @@ static const struct ligature_set_t {
} ligatures[14];
} 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 */
{ 0x064Bu, 0xF2EEu }, /* PUA ARABIC LIGATURE SHADDA WITH FATHATAN ISOLATED FORM */
}},
{ 0xFE91u, {
{ 0xFEE2u, 0xFC08u }, /* ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM */
{ 0xFEE4u, 0xFC9Fu }, /* ARABIC LIGATURE BEH WITH MEEM INITIAL FORM */
@ -524,6 +517,41 @@ static const struct ligature_set_t {
};
static const struct ligature_mark_set_t {
uint16_t first;
struct ligature_pairs_t {
uint16_t second;
uint16_t ligature;
} ligatures[5];
} ligature_mark_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 */
{ 0x064Bu, 0xF2EEu }, /* PUA ARABIC LIGATURE SHADDA WITH FATHATAN ISOLATED FORM */
}},
};
static const struct ligature_3_set_t {
uint16_t first;
struct ligature_triplets_t {
uint16_t second;
uint16_t third;
uint16_t ligature;
} ligatures[3];
} ligature_3_table[] =
{
{ 0xFEDFu, {
{ 0xFEE4u, 0xFEA4u, 0xFD88u}, /* ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM */
{ 0xFEE0u, 0xFEEAu, 0xF201u}, /* PUA ARABIC LIGATURE LELLAH ISOLATED FORM */
{ 0xFEE4u, 0xFEA0u, 0xF211u}, /* PUA ARABIC LIGATURE LAM WITH MEEM WITH JEEM INITIAL FORM */
}},
};
#endif /* HB_OT_SHAPER_ARABIC_TABLE_HH */
/* == End of generated table == */