From 788b469ad5e5f78611f665b6eb17afd0eb040f21 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 25 Jul 2024 14:50:01 -0600 Subject: [PATCH] [ChainContext] Fix fast-path deviation from slow path See comments. The input skippy was hitting the U+200D and NOT seeing it skippable, whereas the context skippy would had. Fixes https://github.com/harfbuzz/harfbuzz/issues/4813 --- src/hb-ot-layout-gsubgpos.hh | 13 +++++++++++-- .../63e224dcb3d559d590f80c83b832cfca789e5dcc.ttf | Bin 0 -> 9080 bytes .../data/in-house/tests/indic-joiners.tests | 1 + 3 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 test/shape/data/in-house/fonts/63e224dcb3d559d590f80c83b832cfca789e5dcc.ttf diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index a0e3f1fde..160a6265f 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -3390,6 +3390,15 @@ struct ChainRuleSet * * Replicated from LigatureSet::apply(). */ + /* If the input skippy has non-auto joiners behavior (as in Indic shapers), + * skip this fast path, as we don't distinguish between input & lookahead + * matching in the fast path. + * + * https://github.com/harfbuzz/harfbuzz/issues/4813 + */ + if (!c->auto_zwnj || !c->auto_zwj) + goto slow; + hb_ot_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input; skippy_iter.reset (c->buffer->idx); skippy_iter.set_match_func (match_always, nullptr); @@ -3429,10 +3438,10 @@ struct ChainRuleSet } matched = skippy_iter.next (); if (likely (matched && !skippy_iter.may_skip (c->buffer->info[skippy_iter.idx]))) - { + { second = &c->buffer->info[skippy_iter.idx]; unsafe_to2 = skippy_iter.idx + 1; - } + } auto match_input = lookup_context.funcs.match[1]; auto match_lookahead = lookup_context.funcs.match[2]; diff --git a/test/shape/data/in-house/fonts/63e224dcb3d559d590f80c83b832cfca789e5dcc.ttf b/test/shape/data/in-house/fonts/63e224dcb3d559d590f80c83b832cfca789e5dcc.ttf new file mode 100644 index 0000000000000000000000000000000000000000..4abb1560a6861ca0b721682a6e26c1bf01c7cd77 GIT binary patch literal 9080 zcmb7J2XI@*nci1W-a`i-3Q3RvK>}HJ7smQJKs* zGwCiVlbhsxaV~e0Nt-y%TpXR1IFchdkz6FJ7pqyML=x--f&2Eo2apn#8D}x??e4$- z{`>d+0T6}|BH_i8$ilYy3w|N~ypj-&5zwD3T)CqCmq*^jQ2!-D*xH5dYg_;0!hfA0 zMEeUunB$8cox8fX>CaCR!kq`wHKi>#r7UdkOPBnD5-uv6uE% z;4ee3-?DT6=H(gx_gg|t-yuYIbqnxk?>Bvu5a)A*n90^n9UFa;^(657fM2^60PWie zdR`ai`CE5&J(uwodlUR^#C*}t-5Wa0Zm)BM0b z$Rqv+doJ(Uy|?S!OIiD&FU-jVVF;5<5(|1l?Bp;w{W{UfGXT`aQ7lMwJ<$R^jKyCW ze?!~$01n-)w0g3ae4894H<&DDCG%zGXUx0I5ZlatlkMU9xqcwgv*=qmi~~Phd*a)l z{`b|}6l6Rh&d&IrTMTUu`l_m`PDe$jEQO*e=jhQ(8}@9a`cq&=dBux2FoV8`{6y4qD2^zykCCUC5*+Iz z^{kC}p{cd{q@D?qEaodjWOw6f0)7+8XV;JldK}@|YUUe614=J~CLv3e zo>@mKnN~nq4Xf2?Se8G)Q?C4UkK7inSg{c5@duBqdaq@Fh6PzB*2AvE*iY%o(sJk} zLhVF*p3qe*J{0a3UlV^S{!u*PHwBNw)+xwaDM<3l(7K^73@sRHxXhoOX;_%16pqooU?o z@x0DU744TQ*Iq4KaZMxKVY$IEX*@nI@1%Gf^+($7^9hDf52E}a%Hattm7k%M?Ied3 zlUlNXtS0NocJf7q5_CahQLrrI1<&A zisMu?j~SPayfUmVf(Cdz8mwsX;SkLRj7`u8jba`+RI^hLg=+E8y;Q2%c*RqY^ zZ&)%XGE3umO{~qUF?(b+Q-@$h(Vn9s5l>DSpoeJ@qJkD$@&^RD`XP;G4~}8sNj#%r zw2Y3?GXf(r2FA#k7&BvGtc*?f>@(ZKbLUp8eZA7R&R6>dN_t8;lj_Q*_C*36qnnW+qi+Z2n5D;sf<7c;blF-hMu4hQAY$Jk5r8=Y5L{n$7PoyEx*w&7n zn@P@|&P{uXq`avfv5SLE6|KX687~ZJ;t!d{i(G%GS#RXCwkL!cmm0_DzvG3Cby$|m$Iu26+r78nL#P$_68P|l(I zd0^93N>{uOBM0ylWdp`EDtO>1BT8M#up)Vcbg8zim2Fuo+cG5EvUZv+Yq1{<)>Gps zJy&eYt>3wC7x8c0wzrF9?&|2=A;)D(k8~^Lk|SrxENE^@2X7N^H}{BaP(w7GE^%ihv*AH;~et`jHzD0#{n97Q*&0H(|cN3=ja@?lsWj3*T0=! zSLQ!T&v~pqZ&&s@Yl1F9Cy;#{TXTC~OhPo^a zeWqynr&06Ipyz*p-qijk;I6=DA!$m}`s{q&&*f+1WgcYML-xy(D|++8{$V_o$mvvH zo6t|uS_#bE(9R~TT@+ITUF)E3uv8^%jI?lLIt5vjm>S7 zsw!*i+*<9mS&vjye6H@Ly{(IUwSjSWfy*bY5^N>bVpEU{u3cYOy(qN0u_1qPn=c?) zJ%u^U&D_ax(d}pxC7kEQc}+Oah8uxsW>60XWEQF_b6B^`gi~S$+#$D5S}7`LBwn-^ z=etWQN|v`)n7hhc8i&nYH2si|T%qy|Z;sAj;7U!l01A4BtW8cZLHSfNQ=;?kkjv*> zCD==>MaH0J2Gh!Z_Rri4$inIUR8N#kT^S2yX`N{Wop%S_K4l))lA+z3ypTP-MwA zx`lw%S6S6sp3ItC&hv{|jiq=QzT(MJvM+yTE~(HJ>lZg~`@&*xLE(lSwGH!qDJ~Tq zTz~rcIVB5Lg)$nz<(3tbeJL)fKDppObyCBg_9b80x2Ygd_u_XJwXH3<|D;P#M_Y^A zR)(_c+RJLTubdpd@1!sPQzy0j>*MX;e{o;AFY?+i*DQUi^!}61b{v{lgp+b=+so^A zu9}=kpH!cmWPZf_3U_om4k{47B4N8Hwfb9M$hc{c6ngqq^VTUYol6jT+ zI;{%oX8QBD6#p%K?2%^c_sU!+6?fGejC`@|uBdOo$#rm&i3pLyq0Vh)Wk0BLruit^6@81 zW+b?2LY)-sJMS^6Ikv#o1MJk;tvMFN@hc){Dx>P4bZY z>CM+pp2EGqk96bLqVJQ}$*;*Dkv0NU%~h3@>*-^tIt?$FHvUI&R^uAA5#0b)&5hpXA0Fp;sbS%pIWI<2a_p)OC6k1`_zt? z)%i0i#MfmW45Bshr_`uCHQ1jTd^I(=lp35!4Vc{2Xh~`?MTyywhNX8hRVi2+lqQxw zke0cO{LpVQjfghdBJx`zuP}aQ8*_s#X8)7R<^G);<(Kil(zI)x+ROBFSpG%j0Eb^} zXqByrfD*Q9A}sx-1x59EwEF;w(-$34yhnhyLd9F5;)S$w;Owzu7g?9mtUo@6q@<{`9Tu&}1GlvLt)PL^oOl#YeX`EDnS*@`wd zvf%TNK0?+4@8LFD0*;ob94%Kl%KzK>UYVn;T%XO593G0>3|32$9|nihS@g;FaY-V> zFgk;FLa+oXD=X`2iqc-1UzF#Nc}|GFl8V}fIg1+VBJ-P@!c+z-M71J>PeX->jcVYf zQijK>Ne&O7-Mf>r(;>^k<~&)dxUG6&d&jQlBjjt2XLs$`v0=k%D(EyxeX>Dr_3PoI zf#QNpUA&hve)W9HLWgAU3_|jtDtStice(uGxenB%zJ7!3-Q!QJe5lyB1_U@=ZecJ(8@~&# zZ(co@7F)@Q)8$Ux42U%>}um!8Ds~a9} z?%Z%~eM4mF?D_@EXa56p_sMcQJZ{9>2*NFP?{->lbK2bYnkA2J-q%XLfnRREZh!t? zwm;qRaGPK4qr&?OLs=R{_{$%qg_k3)3Z7o2MqHKZ=^o^5G)`x?=rt3gvHpw4jvYI5 zXMhY&-GfG*d2Vy+F6`^}==kL1T7Ch^8MEF-rjDnpx4611dGui3c@67l0?bj4F-dLkDaj5%w&?`IIUp3 z{pp?CH;}Q-W~7Rti3Bg2y1iDj0DD?9C5O#onc&<3Tb@5WXU?3uB0u4xnJ8H_8l%kHlwJd7IDy^;hE{>lx6VtX}PkvnX0G4qCmAJ zT2TfFLW0%XoJOOR4WV;09EG_KqX9Q6X7a67RWXZHM6+hjRM(WgXyrl6 zE2(+WA1C`&4enPp*d!O9TAkTrFpONK)n`wvcbGRA41(2c5ZU27D9CVyeRAx> zTf+vY(~0R_)MxLX_$&E1dLR^!-M;q8P1LD~H77sb-`D4G2ooa%{jq_;VT)0K!)OJQ zV`kaXq}MViT6l{m7<6aC-fqe6&5&$18}3+1g56O6qInyugE`sor8=}){0K9zh0Kc< zpm^2lO>Q87NPIHM>BW(e3BqZ?xhRf|j-e(S8W|l)>3gaUYEnvCU1m`vQaG!qsHh;2 z6Uxg$p_SwJ=j7z)=NHH=wBfNxRRtJZhxX)?>%Z8!opeSE5(Mt-3_-Jq-tmcq#%znl zM&e0Ur^DCq*x=Cc@Nj=@FqX2yRPih4I{J^p3#tuXP;DUn`j4ls45PA#`p=v_efkf- z`|ZUWLkB~*-aj|q&s;rx`0(3DjvP6a96bNt@%K)izI6Q#t&2x{FCTg1ZzJSLG}`!J zL2SgO-*@HsyPvR)O>zGF^I{ zKFMd4H?%vP&;6ki1< d<6}dy*g$N26uB`*%f~o=lA%?&WMI3={{#B-Dd7MB literal 0 HcmV?d00001 diff --git a/test/shape/data/in-house/tests/indic-joiners.tests b/test/shape/data/in-house/tests/indic-joiners.tests index 047876bea..b291c3a8e 100644 --- a/test/shape/data/in-house/tests/indic-joiners.tests +++ b/test/shape/data/in-house/tests/indic-joiners.tests @@ -4,3 +4,4 @@ ../fonts/8116e5d8fedfbec74e45dc350d2416d810bed8c4.ttf;;U+091F,U+094D,U+200D,U+092F,U+093F;[uni093F=0+398|uni091F=0+876|uni094D=0@4,0+0|space=0+0|uni092F=0+924] ../fonts/8116e5d8fedfbec74e45dc350d2416d810bed8c4.ttf;;U+091F,U+094D,U+200D,U+091F,U+094D,U+200C,U+091F,U+094D,U+200D,U+092F,U+093F;[uni091F=0+876|uni094D=0@4,0+0|space=0+0|uni091F=3+876|uni094D=3@4,0+0|space=5+0|uni093F=6+398|uni091F=6+876|uni094D=6@4,0+0|space=6+0|uni092F=6+924] ../fonts/8116e5d8fedfbec74e45dc350d2416d810bed8c4.ttf;;U+091F,U+094D,U+200D,U+091F,U+094D,U+200D,U+091F,U+094D,U+200D,U+092F,U+093F;[uni093F=0+398|uni091F=0+876|uni094D=0@4,0+0|space=0+0|uni091F=0+876|uni094D=0@4,0+0|space=0+0|uni091F=0+876|uni094D=0@4,0+0|space=0+0|uni092F=0+924] +../fonts/63e224dcb3d559d590f80c83b832cfca789e5dcc.ttf;;U+0ABE,U+0AA8,U+0ACD,U+200D,U+0AA4,U+0ABF;[uni25CC=0+596|uni0ABE=0+251|uni0ABF.05=1+251|uni0AA80ACD=1+293|space=1+0|uni0AA4=1+543]