Enforce Regional_Indicators native direction to LTR

And undo the morx direction reversal change introduced in
https://github.com/harfbuzz/harfbuzz/pull/3315
23159084b4

This fixes original bug https://github.com/harfbuzz/harfbuzz/issues/3314

And the reversion in morx code fixes regressions:
https://github.com/harfbuzz/harfbuzz/issues/3528
https://github.com/harfbuzz/harfbuzz/issues/3535

Supersedes:
https://github.com/harfbuzz/harfbuzz/pull/3529
This commit is contained in:
Behdad Esfahbod 2022-04-20 11:35:19 -06:00
parent a85461b9b6
commit 4d48fae4f2
3 changed files with 23 additions and 8 deletions

View File

@ -1038,12 +1038,12 @@ struct Chain
goto skip; goto skip;
if (reverse) if (reverse)
_hb_ot_layout_reverse_graphemes (c->buffer); c->buffer->reverse ();
subtable->apply (c); subtable->apply (c);
if (reverse) if (reverse)
_hb_ot_layout_reverse_graphemes (c->buffer); c->buffer->reverse ();
(void) c->buffer->message (c->font, "end chainsubtable %d", c->lookup_index); (void) c->buffer->message (c->font, "end chainsubtable %d", c->lookup_index);

View File

@ -598,24 +598,33 @@ hb_ensure_native_direction (hb_buffer_t *buffer)
* direction, so that features like ligatures will work as intended. * direction, so that features like ligatures will work as intended.
* *
* https://github.com/harfbuzz/harfbuzz/issues/501 * https://github.com/harfbuzz/harfbuzz/issues/501
*
* Similar thing about Regional_Indicators; They are bidi=L, but Script=Common.
* If they are presentin a run of natively-RTL text, they get assigned a script
* with natively RTL direction, which would result in wrong shaping if we
* assign such native RTL direction to them then. Detect that as well.
*
* https://github.com/harfbuzz/harfbuzz/issues/3314
*/ */
if (unlikely (horiz_dir == HB_DIRECTION_RTL && direction == HB_DIRECTION_LTR)) if (unlikely (horiz_dir == HB_DIRECTION_RTL && direction == HB_DIRECTION_LTR))
{ {
bool found_number = false, found_letter = false; bool found_number = false, found_letter = false, found_ri = false;
const auto* info = buffer->info; const auto* info = buffer->info;
const auto count = buffer->len; const auto count = buffer->len;
for (unsigned i = 0; i < count; i++) for (unsigned i = 0; i < count; i++)
{ {
auto gc = _hb_glyph_info_get_general_category (&info[i]); auto gc = _hb_glyph_info_get_general_category (&info[i]);
if (gc == HB_UNICODE_GENERAL_CATEGORY_DECIMAL_NUMBER) if (gc == HB_UNICODE_GENERAL_CATEGORY_DECIMAL_NUMBER)
found_number = true; found_number = true;
else if (HB_UNICODE_GENERAL_CATEGORY_IS_LETTER (gc)) else if (HB_UNICODE_GENERAL_CATEGORY_IS_LETTER (gc))
{ {
found_letter = true; found_letter = true;
break; break;
} }
else if (hb_in_range<hb_codepoint_t> (info[i].codepoint, 0x1F1E6u, 0x1F1FFu))
found_ri = true;
} }
if (found_number && !found_letter) if ((found_number || found_ri) && !found_letter)
horiz_dir = HB_DIRECTION_LTR; horiz_dir = HB_DIRECTION_LTR;
} }

View File

@ -1,5 +1,11 @@
# https://github.com/harfbuzz/harfbuzz/issues/3314 # https://github.com/harfbuzz/harfbuzz/issues/3314
/System/Library/Fonts/Apple\ Color\ Emoji.ttc;;U+05D0,U+1F1FA,U+1F1F8,U+1F1EE,U+1F1F1;[u1F1EE_u1F1F1=3+800|u1F1FA_u1F1F8=1+800|.notdef=0+800] /System/Library/Fonts/Apple\ Color\ Emoji.ttc;--script=hebrew --direction ltr;U+1F1FA,U+1F1F8,U+1F1EE,U+1F1F1;[u1F1FA_u1F1F8=0+800|u1F1EE_u1F1F1=2+800]
# https://github.com/harfbuzz/harfbuzz/issues/3528
/System/Library/Fonts/Supplemental/Bangla MN.ttc;;U+09AC,U+09BF;[bn_ikaar=0+474|bn_ba=0+998]
# https://github.com/harfbuzz/harfbuzz/issues/3535
/System/Library/Fonts/LucidaGrande.ttc;;U+20DD,U+1F174,U+1F175;[circlecmb=0+0|.notdef=1+1536|.notdef=2+1536]
# https;//github.com/harfbuzz/harfbuzz/issues/3008 # https;//github.com/harfbuzz/harfbuzz/issues/3008
/System/Library/Fonts/ヒラギノ丸ゴ\ ProN\ W4.ttc;--features=palt;U+FF11;[gid781=0@-78,0+842] /System/Library/Fonts/ヒラギノ丸ゴ\ ProN\ W4.ttc;--features=palt;U+FF11;[gid781=0@-78,0+842]