From 564cb7e989fcbc6ef3d55a17f9b38faba9f80c4f Mon Sep 17 00:00:00 2001 From: Laurenz Date: Sun, 31 Oct 2021 13:51:28 +0100 Subject: [PATCH] Fix panic in pad node --- src/geom/length.rs | 7 +++++++ src/layout/pad.rs | 4 +++- tests/ref/layout/pad.png | Bin 52073 -> 52232 bytes tests/typ/layout/pad.typ | 6 ++++-- 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/geom/length.rs b/src/geom/length.rs index d0f11bd23..de184e6ce 100644 --- a/src/geom/length.rs +++ b/src/geom/length.rs @@ -126,6 +126,13 @@ impl Length { pub fn approx_eq(self, other: Self) -> bool { self == other || (self - other).to_raw().abs() < 1e-6 } + + /// Perform a checked division by a number, returning `None` if the result + /// is not finite. + pub fn div_finite(self, number: f64) -> Option { + let result = self.to_raw() / number; + result.is_finite().then(|| Self::raw(result)) + } } impl Debug for Length { diff --git a/src/layout/pad.rs b/src/layout/pad.rs index 55c11e451..52766dfab 100644 --- a/src/layout/pad.rs +++ b/src/layout/pad.rs @@ -25,7 +25,9 @@ impl BlockLevel for PadNode { frames.iter_mut().zip(regions.iter()) { fn solve_axis(length: Length, padding: Linear) -> Length { - (length + padding.abs) / (1.0 - padding.rel.get()) + (length + padding.abs) + .div_finite(1.0 - padding.rel.get()) + .unwrap_or_default() } // Solve for the size `padded` that satisfies (approximately): diff --git a/tests/ref/layout/pad.png b/tests/ref/layout/pad.png index cdf08c78fc3ef5eb6b40eaf25453da0a0ba77190..4d381ce24010fd0ba81c1a1a096c6561687414a9 100644 GIT binary patch delta 6110 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 VnUni)>*7B>8Y()0WR}gryrnmXwfG znnhUR_@DFUyf|-ubIvoLxu3b8xt_UZu6OqxpNGGbgP%r6-c58D4-ZcauF;Q&H!Rw~ zrQZw$`DSeue>n@>22~2-ZMbzvO@9_L?(qlT(#f&+=3hmIlW0l(bW7M`T z8Cv&wkkYS|zs}i-YLp?)TPSfTCDVqDmX6Ug9y;QQW%-m(ELR&Y95xAnK6*%rqRAiY`02?s74ulJabz3RQaq+#rkvimNxVcm!CUVB1O(4pHUH- zOunyIVVhSKmL)5?MEXo0wxQ$K-{>@^gQeeVq@yRMC+9X@A~`A#JAIP!g(V?Iq4E(x zUE!o}e2RG0%NT_=4~@5dS|`yO;6VdM(v39|vftlewizF#pUIVSy`tfrCnSVhw)sfO zG$nm{R*<8*#z2*=>vE{PjIru4<$o`l&@PGG0Ex(f%O{%r9m2g|;dmsipOmsYsF=G5 z(ss@S9Qu|NVdfHV=S_ns@>g8yx4k5R99?t_hskF%N*=L#l}}n-mz(*d7~WWI4oA^% zD*RfUKiEINi|-k5Drb10o6n(D@l^XgzcS5gd$ZmXK$c3I+C8|fJJ&|DcDxCKiuk_U zX`4%gc~J0c$d009z^SjMv1kn{pKH}VL05W%9qnFTJ-U;%n_trM+b1-uw*qbmq}(r& zy@cGdY{(hdcjqw0jMS7KuJg`hU#JcLh=FYx_*FYW%Xyeotk|*&F`ufw{w6O%eKQrDpc$5k^xrJ>Gn5*rA%)^qhzj37JjK_ z%oPCdkhf*V(c#wl_DHM^tFR$L=3YtTeOR)^Mpe0G{#gEs0LDRigy5Q@B`Fl3A%r!H{~D(qdUPlvMr1~0Y!0xhsUA_fLMW_M71fXNUfOq z;6`b^K;*$Vqt3mI#-wG&vNiS!Cy(_HIt&E@l9L(>n0&d6*!T)@Koqjf2|Di!Y3vHXIz^n^(x?R0G({@p=g zM-#IF*Y)j|Le(iIK$x%C(5mle`cEMVGTc0At}?Yzv%ph*IfIziZy52X- zRb10wGA;_^$miJ0>eq9?+C`70tP~YHHmqJu)(`GBNmn2F18Tfk+sP)}s!Z65j0*p` zCns?|Ct9$FK;qkq`2vKg_b}!ezD~IkSM;E>;Q0N-At(=gs~G#P6}8#&T?Cgbuy8)O z8Bm*ojT06DyuH446&YNJF$;YwPHLj+NIvpR z^^vv5{CjSI*VOheuMr5XhRch;>a$q5 z41JR~!ZZA!?Wwx9TDiBcQ-yz_$qSK?i`k;^ZpY&5>9pEgeb1Uf(V}F(JOT&zWPMg4 z4KDmfDuvj@_f7+#`I7RcUieBd!dcIqQuF6ggMtXKyh`#jXGpps44JWGHQ6SyDHa1Z z4coEn=V;r!loC*((#`%9n8H-K#? z@-oFUGd8-Dr6e%0E_Bnkq*~}vA}0!V8Ck!QjiwZpeh}5+`T^d^2M5uAW5_v|V)>?L zV-X0bUbWtH7oJ?#%n^Vwcwr+y)RH>p=3mjT!R-zkyoJ0c+oLrpkWubQJ-L)S8g9Jt zdG3FHWymO1{%`^-WK&rOa#ll!16l$yr7p=jFsOypkt7{XF^scog~z(d%5Eb>rXZ8U z*J7zEZ`$SLcst9EQN66)@l|z4d+cCxF9$$mJ3`S>CZ~3Y88E-ISWQ+(f5 zZmS28o+AI6CG_yi!MHW=fI){+V2R4r2J>9xXVZZoVD1rxYMy`MG$T{K*dy94(qKOV z7@2JJ@l_bJmj569`+c-xAS)Fy3EHH-aHq|ndWaE1lb-DC7|)J$}Zf>D>}`Kt4l&gxw(aW9RXZmPq+^n zF%pu_uKEOlot}lQ{Er6tYE2lJWUb;?X3fxv`Noxl54wgN$WKwwnuaRj4S$|udUIje zXm=xYnlO%xrDCq8)rhb#z7Iw^1>-Ix;*mKWNJ&TtGKDA2k3CUIUD`X#o)I0r%s&V_ zZZB=|LW);skyzPNC+ieh14X#mOkb%T8#XTVO~c@@e*}5-h=gz`DGdD9p#(B@Uh0FT z8{lPtw|zSNGWx!WRMu6T;c&i4>`oAx);55%xkZQY8q-vl?6H7QCQz^3?QSRC({mNC zE~5XM2v>3vH2;vcMomZ+=?mT1%mJH!^U!+eW_rKYl=ho|OeJg#xCagE;BEUEL#F^Y z5c}v!!(k{ta}P98e}L#H5+OMYz=j7<}DynW{1Ow2n9$d7C}Ns;7th9oS|x!#D8UIsF1pKfcI ziqNX|#%}M_*sMIRP1L>F2~Ha!+lNw8IPbYHAStQ8MuqC9_3uDZ?S5p`n}b#_wq(8uY9V(ZG6ok+|79P=jm%j+)lJauDZI4j5t+70?%8% zFmUfwys^$ORXKFbomtsW60beORLf@`;x7upT%!V!|)ps ztX8)5b(@DmksiyD^=o&zSnq0B4=^055IdX$>olw=G&OX1p2k{pq-Q0B%=bl$*mfSj z>j(**iBw+0G^^KXO*r><7fx3;T4)!vHW^=Gxt4fjTO~Gp;@6~MnOgQn^vQKZz74il z5I5jEv$>!aPnvI_9@FD@=4J2aU;e~m)yL0D%mb30%B%RwGgHTHi_WIZ9&l$juO)!Z zXp~|NjH{_gUpbm|nw4c{gbb~r-QJe+u+}51MS|po1^8zm`YXY%FAUA)K_FuTBc#E^ zalaNF9PShB63``oqWglc&B7XDYroObS^&i1;=lC@U3)oNde3{NZ5(o{A_e;LsYX*` z&|DAWx>Gd9$Oy|Oi%7yB3A&tF)`Q7 zq{gYozA8D(>*xH4D7m=uzQsobq@;Mdj=tpDK{fkhs3}f4TEGxKc4ioF6Dh6c2-Nej z2R=jRBqXw{`1^ZoT(;Y|mNGFwM+=nA7h7FrBUIQk7umE3I}_hQ7#@S80H(^jIBy}GC6I+oD(=5JL7egb)K?7EipACC9;od$qAhO4O=i$*r<R5*PbQU~IrNHX;Lda+h2r-p z3m8`-nd5AG9gk$tyb7Pz282a)K5EIdFb0f+t_R~SSw~mvkMsRYL|z#h9v%w#T+bI4 zQ^upowfvku^aBUi#j>VaqrQ8dCGFy(*S$RCm;RGm%peH4V3&k^ald;tFRbfg_e;uH z?DUq6z*IZrtVY52uqso;zwOuJW{D%j8&Xu9Cv#bmqs`ajlKfbLJ$#X-)fNqN*E^^- z9qMfwBZ@1!_~mFj|GABgiLnovgP}?^qeHHV%Sf`v!IUkQiuT z2(ml};fxlSYShoS{X3jnF(cQsUI!l7d+{yHA$%0;}mSn z&G(KcfGhLzB$ejMV!^wEnP4hW^EN$KvYoTdkw}y`N2ahisN0#^A>E19oi)vOM>{Nl zi$=4frIL&4gEUpbNghVSPTFaZ7q&p_&r$es@4>Lv`-(Q?r&hpygjRHlDDSB&A)`eF z>SSi!i2z*7V*d$zV}am2$*}lEI3wRZTfM|Ghy#ZyMILL zx@2Z^`^>N{ijn1M#$FzI8PTI=tWe+PbnD5-{&1C^)j^TKUiflI7)9Ey6UL`Y?p8 zzxrt|8y2o~w07$?%6xbEyF*2 z6-|%#=3fB(EA{^(#-qglpZvic;;!Z8<;N9oKTWz_DIUch9o7-vh_A1&|9vHjVp5E_ z!q*xY9zMZc6GgeT02Y-miN)RkMguUB&wr-0MA(SROb{Rt=pgj;Ta{r%7mMm7h=Lgu zs9iqEB;)549>Jc+9oeO?r>AFXN(V#l?(cubHJq!*c2b}e^QyP_sFNQ25Sd(B`hAW| zeFADVLCY%)JBf$SDHBD}C-()&7b@NP!)k49O%iigb#fXG=y4GF9d8USq`pI;P(j72 zf2&0ewnw*SdD$jettl{V)TLDV)!LXyGghT^JZP<#I9aWH#^YAX=dl{$;rGDTDQ{Ud zTwS;3wRf;!JOlph{#2HOy}iAI16xZ=f$Sj;^^|8467siKCl)oWRaHCKVb<{Q@X^uH zzb>ac(}0&`XI5sOTs<`&CSh1|8n8pii}~$_uSCi6hi>G zT_W8(2VJx)()Z%+f1j7=#DxbjAMETPR~BA)iX|l{3yFxVgjgYFZmeesDe>D^=sOOU zErV~BZem2j-gkE5YGuaN9h)#jQAK~#+n4V=BhG>S(DlqctgWr>WO;5t3#*)T+xGzc%p7o6&CF8knQ`JwWAz9TmB9A8Y0?+`85vQoQR-Kr>YF$ zvnhYBZ~g|gztVM!FI8{vgtvDuv5Ya<#k=k|q%CMA;%c1*m>YOg_K!u44X6%sP>hn2 zuC~TygPjcxr{{Zj#vWI(Yz^Rf0))PGlmt85+kfgSz5hBLt@nQ)b0K)Kzi8h18zt1b zzrPRqj`4i#y|lFCSq@fLSN|(2MjW;*b);@h+uy*`@5DgyuF9W_=B3K6+K=Ml_5Le> zf2ICk#A1K<$^Qp{fBTu05bytmzkBfi9QOad{!?##uIRFVav5$IILZE}*HqP2sa3Lz F`Y$t-L$3e; diff --git a/tests/typ/layout/pad.typ b/tests/typ/layout/pad.typ index bce13d425..3729761a8 100644 --- a/tests/typ/layout/pad.typ +++ b/tests/typ/layout/pad.typ @@ -27,9 +27,11 @@ Hi #box(pad(left: 10pt)[]) there --- // Test that the pad node doesn't consume the whole region. - #page(height: 6cm) - #align(left)[Before] #pad(10pt, image("../../res/tiger.jpg")) #align(right)[After] + +--- +// Test that padding adding up to 100% does not panic. +#pad(50%)[]