From f29fbea2fcabed9ed6fc3c19d585edc6fe45370b Mon Sep 17 00:00:00 2001 From: Max Date: Wed, 27 Nov 2024 11:11:49 +0000 Subject: [PATCH] Use extended shape information for glyph `text_like`-ness (#5483) --- crates/typst-layout/src/math/fragment.rs | 11 +++++++++-- crates/typst-layout/src/math/stretch.rs | 1 + .../ref/math-attach-scripts-extended-shapes.png | Bin 0 -> 1057 bytes tests/ref/math-lr-scripts.png | Bin 0 -> 611 bytes tests/ref/math-stretch-vertical-scripts.png | Bin 0 -> 379 bytes tests/suite/math/attach.typ | 6 ++++++ tests/suite/math/delimited.typ | 6 ++++++ tests/suite/math/stretch.typ | 6 ++++++ 8 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 tests/ref/math-attach-scripts-extended-shapes.png create mode 100644 tests/ref/math-lr-scripts.png create mode 100644 tests/ref/math-stretch-vertical-scripts.png diff --git a/crates/typst-layout/src/math/fragment.rs b/crates/typst-layout/src/math/fragment.rs index 691a97f7..ac894668 100644 --- a/crates/typst-layout/src/math/fragment.rs +++ b/crates/typst-layout/src/math/fragment.rs @@ -148,7 +148,8 @@ impl MathFragment { pub fn is_text_like(&self) -> bool { match self { - Self::Glyph(_) | Self::Variant(_) => self.class() != MathClass::Large, + Self::Glyph(glyph) => !glyph.extended_shape, + Self::Variant(variant) => !variant.extended_shape, MathFragment::Frame(frame) => frame.text_like, _ => false, } @@ -247,6 +248,7 @@ pub struct GlyphFragment { pub dests: SmallVec<[Destination; 1]>, pub hidden: bool, pub limits: Limits, + pub extended_shape: bool, } impl GlyphFragment { @@ -302,6 +304,7 @@ impl GlyphFragment { span, dests: LinkElem::dests_in(styles), hidden: HideElem::hidden_in(styles), + extended_shape: false, }; fragment.set_id(ctx, id); fragment @@ -332,7 +335,8 @@ impl GlyphFragment { let accent_attach = accent_attach(ctx, id, self.font_size).unwrap_or((width + italics) / 2.0); - if !is_extended_shape(ctx, id) { + let extended_shape = is_extended_shape(ctx, id); + if !extended_shape { width += italics; } @@ -342,6 +346,7 @@ impl GlyphFragment { self.descent = -bbox.y_min.scaled(ctx, self.font_size); self.italics_correction = italics; self.accent_attach = accent_attach; + self.extended_shape = extended_shape; } pub fn height(&self) -> Abs { @@ -358,6 +363,7 @@ impl GlyphFragment { math_size: self.math_size, span: self.span, limits: self.limits, + extended_shape: self.extended_shape, frame: self.into_frame(), mid_stretched: None, } @@ -465,6 +471,7 @@ pub struct VariantFragment { pub span: Span, pub limits: Limits, pub mid_stretched: Option, + pub extended_shape: bool, } impl VariantFragment { diff --git a/crates/typst-layout/src/math/stretch.rs b/crates/typst-layout/src/math/stretch.rs index 9b5cd47a..3d7c88cf 100644 --- a/crates/typst-layout/src/math/stretch.rs +++ b/crates/typst-layout/src/math/stretch.rs @@ -295,6 +295,7 @@ fn assemble( span: base.span, limits: base.limits, mid_stretched: None, + extended_shape: true, } } diff --git a/tests/ref/math-attach-scripts-extended-shapes.png b/tests/ref/math-attach-scripts-extended-shapes.png new file mode 100644 index 0000000000000000000000000000000000000000..c99d3c7fdbf1ece5e07dc52ebaf6ae8359dcfd37 GIT binary patch literal 1057 zcmV++1m63JP)2JqPVzZ7IXTTa#6ETC z06u{C9A4Ab?hnjJ(cZzCw-8mQJ_nxBA!q7Ek>{R`kfxhez~|)$C48j|fG3&%Fntoy z)Yn`7!3-2R3%ZpHgy~Ze!k(g33!;3a20I}EsX{-F5SVfWTz>*chzu4*2ydP_svb6I zjg_;z;QDI4Hn0twk4?&O)5i`({l6M3t*-Q+H{~@vehEgSAE|*?bVKjA5A1|HEjibV z+}p6->X6}Cs|$do7JbY;qi4?ILu$H-7rb+vkNRGtXB*zibzTCyfM;);%ka3s;ygan@2?pv znGz%D#^IGoZ~jt_8u+)o%(6OU`1U0Mr`k0E!Tv0X6gD>Z{lSz2 z_;wl5@15SWq=Ozjnf~F@m8&esJNK%kW{`g5HqyulA5NY`G@S&OXS}BnwLS#Ed)L8C zv$Tl$J20vXfSj+l7b$sfyTXU>cOla2Aa&07`M&%+wbq%ns4QSWnZM?{2w)zzqqd>r zgtU5A1#E6fHxg`}XSXKJ8v?-A8EhlueD1!}t`6>4Z@Pw5l^b?v46t7Pbe^t2`hB>m zr>Cp&`y-_xu*TJ)4rc3{B}Dz*D4Mk*syO0=zl@4`c`*R^F5>>cNia(+P?@SY7v-0fl;qgQhZ-QJRjKAyjMg!LD?1aSZY?}-xqO9drc6RZX@L}Fy z@eeU9}FBW5p26ijS4dKJK6Wq|&0C2MjhzETdS-Q3mc;e-@4KW5#+6-XJ zLeWP7fDaAf!<#c~NC?&jpl}uEBFhgDb?FiH_4PVgE=Dxh2zXPT08l||OBHC{0B^Z) zbZn|VGAADao(i5<`KDstg*gCw+Bv==)y;hXqVeT=vsA;LVLHz4Or;llo0QynetgNykA bydV7!t$WH?;%)5K00000NkvXXu0mjf^UwmD literal 0 HcmV?d00001 diff --git a/tests/ref/math-lr-scripts.png b/tests/ref/math-lr-scripts.png new file mode 100644 index 0000000000000000000000000000000000000000..7ce35475be4aa21022611c155bf2fee8b3340d9c GIT binary patch literal 611 zcmV-p0-XJcP)FIKXstJFX=(bV`BjSwr9xRSM6 z+B7wNi8LX_2GfmclHJYz%(Kfv8*}imYoX5f^uP>!U>F#f4s1{z3}!Hc8SDU@JPlaw z&7p0tZaDzI=6}NKa0cz`u^X&FjN>>2qwDy3 zJ0Z~2yCADDD$Dz2r{E{Pm<88{`l<$81gs7c{B-Ap{jiYulI`{7C;xM;y+v5*1#Bi}$Z zUPQLbz?%^E*$it%c#EDNpq5a-p!L#}5CjQS{k|ZmKp<>4Or6wrkHaj*N4Z)2S;4FJ x*$-#MFL`Son~S4eGtcYn^M%0-X7GOl{{~1`6Uc<_=okP1002ovPDHLkV1fW?A)){P literal 0 HcmV?d00001 diff --git a/tests/ref/math-stretch-vertical-scripts.png b/tests/ref/math-stretch-vertical-scripts.png new file mode 100644 index 0000000000000000000000000000000000000000..ce933c3c36895bcc76d253ceac8f071cc5d9bfc1 GIT binary patch literal 379 zcmV->0fhdEP)jxL}(PZpGKWSzrJV zSm4oxA5O^NNn_Wr$lwW`1pst#Sf@=2+eTiF<#}Me{^QwBy4!Sc3b;M(rbP!wH5?r^ zIM@R&ZG=3P?)ceI@39G+NeMsRce0W$5W>m#=cLMYtX2mP@AQBdeJ`YP7W*%Br+Uu+ zT~RrMy-zAQhASuYq;km**QwwJ@bl5l>>q{=I~R8>k3`YNJQX~xGlQELrWhs=;46X! zDtOD-9Xr=DR|_m~A8;;RV}W1KOPdVv5f1YRGQdq7