[use] Reuse category numbers exported from ragel machine

Part of https://github.com/harfbuzz/harfbuzz/pull/2726
This commit is contained in:
Behdad Esfahbod 2021-01-28 20:36:51 -07:00
parent c417e0d2f9
commit 3bb2653a5e
6 changed files with 107 additions and 150 deletions

View File

@ -462,6 +462,7 @@ print ()
print ('#ifndef HB_NO_OT_SHAPE')
print ()
print ('#include "hb-ot-shape-complex-use.hh"')
print ('#include "hb-ot-shape-complex-use-machine.hh"')
print ()
total = 0
@ -503,12 +504,12 @@ print ('#pragma GCC diagnostic push')
print ('#pragma GCC diagnostic ignored "-Wunused-macros"')
for k,v in sorted(use_mapping.items()):
if k in use_positions and use_positions[k]: continue
print ("#define %s USE_%s /* %s */" % (k, k, v.__name__[3:]))
print ("#define %s USE(%s) /* %s */" % (k, k, v.__name__[3:]))
for k,v in sorted(use_positions.items()):
if not v: continue
for suf in v.keys():
tag = k + suf
print ("#define %s USE_%s" % (tag, tag))
print ("#define %s USE(%s)" % (tag, tag))
print ('#pragma GCC diagnostic pop')
print ("")
print ("static const USE_TABLE_ELEMENT_TYPE use_table[] = {")
@ -564,7 +565,7 @@ for p in sorted(pages):
print (" default:")
print (" break;")
print (" }")
print (" return USE_O;")
print (" return USE(O);")
print ("}")
print ()
for k in sorted(use_mapping.keys()):

View File

@ -32,6 +32,7 @@
#define HB_OT_SHAPE_COMPLEX_USE_MACHINE_HH
#include "hb.hh"
#include "hb-ot-shape-complex-use.hh"
/* buffer var allocations */
#define use_category() complex_var_u8_category()
@ -50,7 +51,7 @@ enum use_syllable_type_t {
};
#line 54 "hb-ot-shape-complex-use-machine.hh"
#line 55 "hb-ot-shape-complex-use-machine.hh"
#define use_syllable_machine_ex_B 1u
#define use_syllable_machine_ex_CMAbv 31u
#define use_syllable_machine_ex_CMBlw 32u
@ -92,7 +93,7 @@ enum use_syllable_type_t {
#define use_syllable_machine_ex_ZWNJ 14u
#line 96 "hb-ot-shape-complex-use-machine.hh"
#line 97 "hb-ot-shape-complex-use-machine.hh"
static const unsigned char _use_syllable_machine_trans_keys[] = {
1u, 1u, 1u, 1u, 0u, 51u, 11u, 48u, 11u, 48u, 1u, 1u, 22u, 48u, 23u, 48u,
24u, 47u, 25u, 47u, 26u, 47u, 45u, 46u, 46u, 46u, 24u, 48u, 24u, 48u, 24u, 48u,
@ -361,11 +362,11 @@ static const int use_syllable_machine_error = -1;
static const int use_syllable_machine_en_main = 2;
#line 55 "hb-ot-shape-complex-use-machine.rl"
#line 56 "hb-ot-shape-complex-use-machine.rl"
#line 168 "hb-ot-shape-complex-use-machine.rl"
#line 173 "hb-ot-shape-complex-use-machine.rl"
#define found_syllable(syllable_type) \
@ -379,9 +380,9 @@ static const int use_syllable_machine_en_main = 2;
static bool
not_standard_default_ignorable (const hb_glyph_info_t &i)
{ return !(i.use_category() == USE_O && _hb_glyph_info_is_default_ignorable (&i)); }
{ return !(i.use_category() == USE(O) && _hb_glyph_info_is_default_ignorable (&i)); }
static void
static inline void
find_syllables_use (hb_buffer_t *buffer)
{
hb_glyph_info_t *info = buffer->info;
@ -392,7 +393,7 @@ find_syllables_use (hb_buffer_t *buffer)
hb_second)
| hb_filter ([&] (const hb_pair_t<unsigned, const hb_glyph_info_t &> p)
{
if (p.second.use_category() == USE_ZWNJ)
if (p.second.use_category() == USE(ZWNJ))
for (unsigned i = p.first + 1; i < buffer->len; ++i)
if (not_standard_default_ignorable (info[i]))
return !_hb_glyph_info_is_unicode_mark (&info[i]);
@ -408,7 +409,7 @@ find_syllables_use (hb_buffer_t *buffer)
unsigned int act HB_UNUSED;
int cs;
#line 412 "hb-ot-shape-complex-use-machine.hh"
#line 413 "hb-ot-shape-complex-use-machine.hh"
{
cs = use_syllable_machine_start;
ts = 0;
@ -416,12 +417,12 @@ find_syllables_use (hb_buffer_t *buffer)
act = 0;
}
#line 212 "hb-ot-shape-complex-use-machine.rl"
#line 217 "hb-ot-shape-complex-use-machine.rl"
unsigned int syllable_serial = 1;
#line 425 "hb-ot-shape-complex-use-machine.hh"
#line 426 "hb-ot-shape-complex-use-machine.hh"
{
int _slen;
int _trans;
@ -435,7 +436,7 @@ _resume:
#line 1 "NONE"
{ts = p;}
break;
#line 439 "hb-ot-shape-complex-use-machine.hh"
#line 440 "hb-ot-shape-complex-use-machine.hh"
}
_keys = _use_syllable_machine_trans_keys + (cs<<1);
@ -458,62 +459,62 @@ _eof_trans:
{te = p+1;}
break;
case 5:
#line 155 "hb-ot-shape-complex-use-machine.rl"
#line 160 "hb-ot-shape-complex-use-machine.rl"
{te = p+1;{ found_syllable (independent_cluster); }}
break;
case 9:
#line 158 "hb-ot-shape-complex-use-machine.rl"
#line 163 "hb-ot-shape-complex-use-machine.rl"
{te = p+1;{ found_syllable (standard_cluster); }}
break;
case 7:
#line 163 "hb-ot-shape-complex-use-machine.rl"
#line 168 "hb-ot-shape-complex-use-machine.rl"
{te = p+1;{ found_syllable (broken_cluster); }}
break;
case 6:
#line 164 "hb-ot-shape-complex-use-machine.rl"
#line 169 "hb-ot-shape-complex-use-machine.rl"
{te = p+1;{ found_syllable (non_cluster); }}
break;
case 10:
#line 156 "hb-ot-shape-complex-use-machine.rl"
#line 161 "hb-ot-shape-complex-use-machine.rl"
{te = p;p--;{ found_syllable (virama_terminated_cluster); }}
break;
case 11:
#line 157 "hb-ot-shape-complex-use-machine.rl"
#line 162 "hb-ot-shape-complex-use-machine.rl"
{te = p;p--;{ found_syllable (sakot_terminated_cluster); }}
break;
case 8:
#line 158 "hb-ot-shape-complex-use-machine.rl"
#line 163 "hb-ot-shape-complex-use-machine.rl"
{te = p;p--;{ found_syllable (standard_cluster); }}
break;
case 13:
#line 159 "hb-ot-shape-complex-use-machine.rl"
#line 164 "hb-ot-shape-complex-use-machine.rl"
{te = p;p--;{ found_syllable (number_joiner_terminated_cluster); }}
break;
case 12:
#line 160 "hb-ot-shape-complex-use-machine.rl"
#line 165 "hb-ot-shape-complex-use-machine.rl"
{te = p;p--;{ found_syllable (numeral_cluster); }}
break;
case 14:
#line 161 "hb-ot-shape-complex-use-machine.rl"
#line 166 "hb-ot-shape-complex-use-machine.rl"
{te = p;p--;{ found_syllable (symbol_cluster); }}
break;
case 17:
#line 162 "hb-ot-shape-complex-use-machine.rl"
#line 167 "hb-ot-shape-complex-use-machine.rl"
{te = p;p--;{ found_syllable (hieroglyph_cluster); }}
break;
case 15:
#line 163 "hb-ot-shape-complex-use-machine.rl"
#line 168 "hb-ot-shape-complex-use-machine.rl"
{te = p;p--;{ found_syllable (broken_cluster); }}
break;
case 16:
#line 164 "hb-ot-shape-complex-use-machine.rl"
#line 169 "hb-ot-shape-complex-use-machine.rl"
{te = p;p--;{ found_syllable (non_cluster); }}
break;
case 1:
#line 163 "hb-ot-shape-complex-use-machine.rl"
#line 168 "hb-ot-shape-complex-use-machine.rl"
{{p = ((te))-1;}{ found_syllable (broken_cluster); }}
break;
#line 517 "hb-ot-shape-complex-use-machine.hh"
#line 518 "hb-ot-shape-complex-use-machine.hh"
}
_again:
@ -522,7 +523,7 @@ _again:
#line 1 "NONE"
{ts = 0;}
break;
#line 526 "hb-ot-shape-complex-use-machine.hh"
#line 527 "hb-ot-shape-complex-use-machine.hh"
}
if ( ++p != pe )
@ -538,7 +539,7 @@ _again:
}
#line 217 "hb-ot-shape-complex-use-machine.rl"
#line 222 "hb-ot-shape-complex-use-machine.rl"
}

View File

@ -30,6 +30,7 @@
#define HB_OT_SHAPE_COMPLEX_USE_MACHINE_HH
#include "hb.hh"
#include "hb-ot-shape-complex-use.hh"
/* buffer var allocations */
#define use_category() complex_var_u8_category()
@ -56,6 +57,9 @@ enum use_syllable_type_t {
%%{
# Cateories used in the Universal Shaping Engine spec:
# https://docs.microsoft.com/en-us/typography/script-development/use
export O = 0; # OTHER
export B = 1; # BASE
@ -99,6 +103,7 @@ export FMAbv = 45; # CONS_FINAL_MOD UIPC = Top
export FMBlw = 46; # CONS_FINAL_MOD UIPC = Bottom
export FMPst = 47; # CONS_FINAL_MOD UIPC = Not_Applicable
h = H | HVM | Sk;
consonant_modifiers = CMAbv* CMBlw* ((h B | SUB) CMAbv? CMBlw*)*;
@ -178,9 +183,9 @@ main := |*
static bool
not_standard_default_ignorable (const hb_glyph_info_t &i)
{ return !(i.use_category() == USE_O && _hb_glyph_info_is_default_ignorable (&i)); }
{ return !(i.use_category() == USE(O) && _hb_glyph_info_is_default_ignorable (&i)); }
static void
static inline void
find_syllables_use (hb_buffer_t *buffer)
{
hb_glyph_info_t *info = buffer->info;
@ -191,7 +196,7 @@ find_syllables_use (hb_buffer_t *buffer)
hb_second)
| hb_filter ([&] (const hb_pair_t<unsigned, const hb_glyph_info_t &> p)
{
if (p.second.use_category() == USE_ZWNJ)
if (p.second.use_category() == USE(ZWNJ))
for (unsigned i = p.first + 1; i < buffer->len; ++i)
if (not_standard_default_ignorable (info[i]))
return !_hb_glyph_info_is_unicode_mark (&info[i]);

View File

@ -36,48 +36,49 @@
#ifndef HB_NO_OT_SHAPE
#include "hb-ot-shape-complex-use.hh"
#include "hb-ot-shape-complex-use-machine.hh"
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-macros"
#define B USE_B /* BASE */
#define CS USE_CS /* CONS_WITH_STACKER */
#define G USE_G /* HIEROGLYPH */
#define GB USE_GB /* BASE_OTHER */
#define H USE_H /* HALANT */
#define HN USE_HN /* HALANT_NUM */
#define HVM USE_HVM /* HALANT_OR_VOWEL_MODIFIER */
#define J USE_J /* HIEROGLYPH_JOINER */
#define N USE_N /* BASE_NUM */
#define O USE_O /* OTHER */
#define R USE_R /* REPHA */
#define S USE_S /* SYM */
#define SB USE_SB /* HIEROGLYPH_SEGMENT_BEGIN */
#define SE USE_SE /* HIEROGLYPH_SEGMENT_END */
#define SUB USE_SUB /* CONS_SUB */
#define Sk USE_Sk /* SAKOT */
#define ZWNJ USE_ZWNJ /* ZWNJ */
#define CMAbv USE_CMAbv
#define CMBlw USE_CMBlw
#define FAbv USE_FAbv
#define FBlw USE_FBlw
#define FPst USE_FPst
#define FMAbv USE_FMAbv
#define FMBlw USE_FMBlw
#define FMPst USE_FMPst
#define MAbv USE_MAbv
#define MBlw USE_MBlw
#define MPst USE_MPst
#define MPre USE_MPre
#define SMAbv USE_SMAbv
#define SMBlw USE_SMBlw
#define VAbv USE_VAbv
#define VBlw USE_VBlw
#define VPst USE_VPst
#define VPre USE_VPre
#define VMAbv USE_VMAbv
#define VMBlw USE_VMBlw
#define VMPst USE_VMPst
#define VMPre USE_VMPre
#define B USE(B) /* BASE */
#define CS USE(CS) /* CONS_WITH_STACKER */
#define G USE(G) /* HIEROGLYPH */
#define GB USE(GB) /* BASE_OTHER */
#define H USE(H) /* HALANT */
#define HN USE(HN) /* HALANT_NUM */
#define HVM USE(HVM) /* HALANT_OR_VOWEL_MODIFIER */
#define J USE(J) /* HIEROGLYPH_JOINER */
#define N USE(N) /* BASE_NUM */
#define O USE(O) /* OTHER */
#define R USE(R) /* REPHA */
#define S USE(S) /* SYM */
#define SB USE(SB) /* HIEROGLYPH_SEGMENT_BEGIN */
#define SE USE(SE) /* HIEROGLYPH_SEGMENT_END */
#define SUB USE(SUB) /* CONS_SUB */
#define Sk USE(Sk) /* SAKOT */
#define ZWNJ USE(ZWNJ) /* ZWNJ */
#define CMAbv USE(CMAbv)
#define CMBlw USE(CMBlw)
#define FAbv USE(FAbv)
#define FBlw USE(FBlw)
#define FPst USE(FPst)
#define FMAbv USE(FMAbv)
#define FMBlw USE(FMBlw)
#define FMPst USE(FMPst)
#define MAbv USE(MAbv)
#define MBlw USE(MBlw)
#define MPst USE(MPst)
#define MPre USE(MPre)
#define SMAbv USE(SMAbv)
#define SMBlw USE(SMBlw)
#define VAbv USE(VAbv)
#define VBlw USE(VBlw)
#define VPst USE(VPst)
#define VPre USE(VPre)
#define VMAbv USE(VMAbv)
#define VMBlw USE(VMBlw)
#define VMPst USE(VMPst)
#define VMPre USE(VMPre)
#pragma GCC diagnostic pop
static const USE_TABLE_ELEMENT_TYPE use_table[] = {
@ -1154,7 +1155,7 @@ hb_use_get_category (hb_codepoint_t u)
default:
break;
}
return USE_O;
return USE(O);
}
#undef B

View File

@ -221,7 +221,7 @@ setup_rphf_mask (const hb_ot_shape_plan_t *plan,
foreach_syllable (buffer, start, end)
{
unsigned int limit = info[start].use_category() == USE_R ? 1 : hb_min (3u, end - start);
unsigned int limit = info[start].use_category() == USE(R) ? 1 : hb_min (3u, end - start);
for (unsigned int i = start; i < start + limit; i++)
info[i].mask |= mask;
}
@ -318,11 +318,11 @@ record_rphf_use (const hb_ot_shape_plan_t *plan,
foreach_syllable (buffer, start, end)
{
/* Mark a substituted repha as USE_R. */
/* Mark a substituted repha as USE(R). */
for (unsigned int i = start; i < end && (info[i].mask & mask); i++)
if (_hb_glyph_info_substituted (&info[i]))
{
info[i].use_category() = USE_R;
info[i].use_category() = USE(R);
break;
}
}
@ -341,7 +341,7 @@ record_pref_use (const hb_ot_shape_plan_t *plan HB_UNUSED,
for (unsigned int i = start; i < end; i++)
if (_hb_glyph_info_substituted (&info[i]))
{
info[i].use_category() = USE_VPre;
info[i].use_category() = USE(VPre);
break;
}
}
@ -350,7 +350,7 @@ record_pref_use (const hb_ot_shape_plan_t *plan HB_UNUSED,
static inline bool
is_halant_use (const hb_glyph_info_t &info)
{
return (info.use_category() == USE_H || info.use_category() == USE_HVM) &&
return (info.use_category() == USE(H) || info.use_category() == USE(HVM)) &&
!_hb_glyph_info_ligated (&info);
}
@ -369,24 +369,24 @@ reorder_syllable_use (hb_buffer_t *buffer, unsigned int start, unsigned int end)
hb_glyph_info_t *info = buffer->info;
#define POST_BASE_FLAGS64 (FLAG64 (USE_FAbv) | \
FLAG64 (USE_FBlw) | \
FLAG64 (USE_FPst) | \
FLAG64 (USE_MAbv) | \
FLAG64 (USE_MBlw) | \
FLAG64 (USE_MPst) | \
FLAG64 (USE_MPre) | \
FLAG64 (USE_VAbv) | \
FLAG64 (USE_VBlw) | \
FLAG64 (USE_VPst) | \
FLAG64 (USE_VPre) | \
FLAG64 (USE_VMAbv) | \
FLAG64 (USE_VMBlw) | \
FLAG64 (USE_VMPst) | \
FLAG64 (USE_VMPre))
#define POST_BASE_FLAGS64 (FLAG64 (USE(FAbv)) | \
FLAG64 (USE(FBlw)) | \
FLAG64 (USE(FPst)) | \
FLAG64 (USE(MAbv)) | \
FLAG64 (USE(MBlw)) | \
FLAG64 (USE(MPst)) | \
FLAG64 (USE(MPre)) | \
FLAG64 (USE(VAbv)) | \
FLAG64 (USE(VBlw)) | \
FLAG64 (USE(VPst)) | \
FLAG64 (USE(VPre)) | \
FLAG64 (USE(VMAbv)) | \
FLAG64 (USE(VMBlw)) | \
FLAG64 (USE(VMPst)) | \
FLAG64 (USE(VMPre)))
/* Move things forward. */
if (info[start].use_category() == USE_R && end - start > 1)
if (info[start].use_category() == USE(R) && end - start > 1)
{
/* Got a repha. Reorder it towards the end, but before the first post-base
* glyph. */
@ -423,7 +423,7 @@ reorder_syllable_use (hb_buffer_t *buffer, unsigned int start, unsigned int end)
* shift things in between forward. */
j = i + 1;
}
else if (((flag) & (FLAG (USE_VPre) | FLAG (USE_VMPre))) &&
else if (((flag) & (FLAG (USE(VPre)) | FLAG (USE(VMPre)))) &&
/* Only move the first component of a MultipleSubst. */
0 == _hb_glyph_info_get_lig_comp (&info[i]) &&
j < i)
@ -445,8 +445,8 @@ reorder_use (const hb_ot_shape_plan_t *plan,
{
hb_syllabic_insert_dotted_circles (font, buffer,
use_broken_cluster,
USE_B,
USE_R);
USE(B),
USE(R));
foreach_syllable (buffer, start, end)
reorder_syllable_use (buffer, start, end);

View File

@ -36,58 +36,7 @@
#define USE_TABLE_ELEMENT_TYPE uint8_t
/* Cateories used in the Universal Shaping Engine spec:
* https://docs.microsoft.com/en-us/typography/script-development/use
*/
/* Note: This enum is duplicated in the -machine.rl source file.
* Not sure how to avoid duplication. */
enum use_category_t {
USE_O = 0, /* OTHER */
USE_B = 1, /* BASE */
USE_N = 4, /* BASE_NUM */
USE_GB = 5, /* BASE_OTHER */
USE_SUB = 11, /* CONS_SUB */
USE_H = 12, /* HALANT */
USE_HN = 13, /* HALANT_NUM */
USE_ZWNJ = 14, /* Zero width non-joiner */
USE_R = 18, /* REPHA */
USE_S = 19, /* SYM */
USE_CS = 43, /* CONS_WITH_STACKER */
/* https://github.com/harfbuzz/harfbuzz/issues/1102 */
USE_HVM = 44, /* HALANT_OR_VOWEL_MODIFIER */
USE_Sk = 48, /* SAKOT */
USE_G = 49, /* HIEROGLYPH */
USE_J = 50, /* HIEROGLYPH_JOINER */
USE_SB = 51, /* HIEROGLYPH_SEGMENT_BEGIN */
USE_SE = 52, /* HIEROGLYPH_SEGMENT_END */
USE_FAbv = 24, /* CONS_FINAL_ABOVE */
USE_FBlw = 25, /* CONS_FINAL_BELOW */
USE_FPst = 26, /* CONS_FINAL_POST */
USE_MAbv = 27, /* CONS_MED_ABOVE */
USE_MBlw = 28, /* CONS_MED_BELOW */
USE_MPst = 29, /* CONS_MED_POST */
USE_MPre = 30, /* CONS_MED_PRE */
USE_CMAbv = 31, /* CONS_MOD_ABOVE */
USE_CMBlw = 32, /* CONS_MOD_BELOW */
USE_VAbv = 33, /* VOWEL_ABOVE / VOWEL_ABOVE_BELOW / VOWEL_ABOVE_BELOW_POST / VOWEL_ABOVE_POST */
USE_VBlw = 34, /* VOWEL_BELOW / VOWEL_BELOW_POST */
USE_VPst = 35, /* VOWEL_POST UIPC = Right */
USE_VPre = 22, /* VOWEL_PRE / VOWEL_PRE_ABOVE / VOWEL_PRE_ABOVE_POST / VOWEL_PRE_POST */
USE_VMAbv = 37, /* VOWEL_MOD_ABOVE */
USE_VMBlw = 38, /* VOWEL_MOD_BELOW */
USE_VMPst = 39, /* VOWEL_MOD_POST */
USE_VMPre = 23, /* VOWEL_MOD_PRE */
USE_SMAbv = 41, /* SYM_MOD_ABOVE */
USE_SMBlw = 42, /* SYM_MOD_BELOW */
USE_FMAbv = 45, /* CONS_FINAL_MOD UIPC = Top */
USE_FMBlw = 46, /* CONS_FINAL_MOD UIPC = Bottom */
USE_FMPst = 47, /* CONS_FINAL_MOD UIPC = Not_Applicable */
};
#define USE(Cat) use_syllable_machine_ex_##Cat
HB_INTERNAL USE_TABLE_ELEMENT_TYPE
hb_use_get_category (hb_codepoint_t u);