From ba05164bb67071bfaab858daf2fb2b3387cc17c5 Mon Sep 17 00:00:00 2001 From: Anton Wetzel <59712243+antonWetzel@users.noreply.github.com> Date: Wed, 8 Nov 2023 15:30:00 +0100 Subject: [PATCH] Change rectangle clip to use the inside of the stroke, not the middle. (#2626) --- crates/typst-library/src/layout/container.rs | 4 +- crates/typst/src/geom/mod.rs | 2 +- crates/typst/src/geom/rect.rs | 73 ++++++++----------- tests/ref/layout/clip.png | Bin 29586 -> 33092 bytes tests/typ/layout/clip.typ | 12 +++ 5 files changed, 44 insertions(+), 47 deletions(-) diff --git a/crates/typst-library/src/layout/container.rs b/crates/typst-library/src/layout/container.rs index 36b628643..2e6ccdd2f 100644 --- a/crates/typst-library/src/layout/container.rs +++ b/crates/typst-library/src/layout/container.rs @@ -155,7 +155,7 @@ impl Layout for BoxElem { let outset = self.outset(styles).relative_to(frame.size()); let size = frame.size() + outset.sum_by_axis(); let radius = self.radius(styles); - frame.clip(path_rect(size, radius, &stroke)); + frame.clip(clip_rect(size, radius, &stroke)); } // Add fill and/or stroke. @@ -421,7 +421,7 @@ impl Layout for BlockElem { let outset = self.outset(styles).relative_to(frame.size()); let size = frame.size() + outset.sum_by_axis(); let radius = self.radius(styles); - frame.clip(path_rect(size, radius, &stroke)); + frame.clip(clip_rect(size, radius, &stroke)); } } diff --git a/crates/typst/src/geom/mod.rs b/crates/typst/src/geom/mod.rs index 8ad6cea09..1b2a79bce 100644 --- a/crates/typst/src/geom/mod.rs +++ b/crates/typst/src/geom/mod.rs @@ -46,7 +46,7 @@ pub use self::paint::Paint; pub use self::path::{Path, PathItem}; pub use self::point::Point; pub use self::ratio::Ratio; -pub use self::rect::{path_rect, styled_rect}; +pub use self::rect::{clip_rect, styled_rect}; pub use self::rel::Rel; pub use self::scalar::Scalar; pub use self::shape::{Geometry, Shape}; diff --git a/crates/typst/src/geom/rect.rs b/crates/typst/src/geom/rect.rs index 37b94527f..230f8e8c5 100644 --- a/crates/typst/src/geom/rect.rs +++ b/crates/typst/src/geom/rect.rs @@ -43,16 +43,41 @@ impl PathExtension for Path { } /// Creates a new rectangle as a path. -pub fn path_rect( +pub fn clip_rect( size: Size, radius: Corners>, stroke: &Sides>, ) -> Path { - if stroke.is_uniform() && radius.iter().cloned().all(Rel::is_zero) { - Path::rect(size) + let stroke_widths = stroke + .as_ref() + .map(|s| s.as_ref().map_or(Abs::zero(), |s| s.thickness / 2.0)); + + let max_radius = (size.x.min(size.y)) / 2.0 + + stroke_widths.iter().cloned().min().unwrap_or(Abs::zero()); + + let radius = radius.map(|side| side.relative_to(max_radius * 2.0).min(max_radius)); + + let corners = corners_control_points(size, radius, stroke, stroke_widths); + + let mut path = Path::new(); + if corners.top_left.arc_inner() { + path.arc_move( + corners.top_left.start_inner(), + corners.top_left.center_inner(), + corners.top_left.end_inner(), + ); } else { - segmented_path_rect(size, radius, stroke) + path.move_to(corners.top_left.center_inner()); } + for corner in [&corners.top_right, &corners.bottom_right, &corners.bottom_left] { + if corner.arc_inner() { + path.arc_line(corner.start_inner(), corner.center_inner(), corner.end_inner()) + } else { + path.line_to(corner.center_inner()); + } + } + path.close_path(); + path } /// Create a styled rectangle with shapes. @@ -110,46 +135,6 @@ fn corners_control_points( }) } -fn segmented_path_rect( - size: Size, - radius: Corners>, - strokes: &Sides>, -) -> Path { - let stroke_widths = strokes - .as_ref() - .map(|s| s.as_ref().map_or(Abs::zero(), |s| s.thickness / 2.0)); - - let max_radius = (size.x.min(size.y)) / 2.0 - + stroke_widths.iter().cloned().min().unwrap_or(Abs::zero()); - - let radius = radius.map(|side| side.relative_to(max_radius * 2.0).min(max_radius)); - - // insert stroked sides below filled sides - let mut path = Path::new(); - let corners = corners_control_points(size, radius, strokes, stroke_widths); - let current = corners.iter().find(|c| !c.same).map(|c| c.corner); - if let Some(mut current) = current { - // multiple segments - // start at a corner with a change between sides and iterate clockwise all other corners - let mut last = current; - for _ in 0..4 { - current = current.next_cw(); - if corners.get_ref(current).same { - continue; - } - // create segment - let start = last; - let end = current; - last = current; - path_segment(start, end, &corners, &mut path); - } - } else if strokes.top.is_some() { - // single segment - path_segment(Corner::TopLeft, Corner::TopLeft, &corners, &mut path); - } - path -} - /// Use stroke and fill for the rectangle fn segmented_rect( size: Size, diff --git a/tests/ref/layout/clip.png b/tests/ref/layout/clip.png index c847fc63d8f03bdde9f7620734031495a8fcec6b..f37bf9ad1508f796e203a5f3fa68eeecfb20fab2 100644 GIT binary patch delta 19645 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 rTja=c@dpnVYmi`thJWz85?Sd9o$ZUm> z!>nZ(=DNWOL`sU5PJzg|*7pj&*b-8tk-!1$S$)Q)lAy{l!bXK38rA89qC(vYDF)@z z1Hh~j>=+Uqd$2aptk%aPu(l4}|4dv>kH=;OhAMhoy+pdt8wIPn--}MeX#f1t1lGPE z4G5}woKebAS{iwD>`xdxiV-?!)!!s!mc}l1Fe%2EoKj%R|)# zLU<)rH+|CyukX*_KJmZK&%uslY2O(-(6DQ*f*^v+B`*ZE2desJpkEIz zrDbAba({h&b?R=#o7jzKGOBbkGl&|72-((TLc8Vd26=|gYJOy7B*byy$L)<};)KhB zWuK_=qqR|L&R?Z=&5ZZ*@zFH{(XaA_LiD*dbKFKmbGC}j#`O_ekMOD{l}#61qw;hh zthVJj3&v$Q9-e%BY~Rn>oSsE;F)}bX(DIuwQLq}zKyFmHDUN>@b$Cx*i?CFMLMr=~ z(|7szD}}Z9w|)XdmXd0$`$PrzC6vWEF>IO-ZLq+wPu`b#3npoJz15dKuGaT zTgCwa6p!!>ca~i1>J01H*E+Vxa0|ozM%I3~-+HOQCP>uwUFog)1O$MIVDo|`k_6;c zAzQySjTBRMs@{P6nAdv-C{=A%d6;l01|v|+$rZr+TTK(UBv%;aNlg0?=`&+p~V z1uZ|<@X&HF3b{*#VZMd4XgYC!i)o2U)AR6G=|qOWd6<4_MigXA1jf+iAm?E~ES#<7 z*culXmr=m}7s7DiHn9A)h~o9By(Ase)PaSlcabMDP)u)$;$7_*-yHx22p{#a%{=X% zF!uo;1tXVSOv}7bCFLj1y^z4DwV8pp+)+xP{>&AA3Jn!(!d^;eo@v+Tun`l<#aR@N= z+)$&*Z2beLRf;zU)+0~kti5al*#T@4S~7Uk_iy^<;=<|1^xx^FZ04X%P@Y0nI=1HA znC!`3CH0d`$2mt(v`Wj6$XXXB2`+A*R%i(UzE!W0FWvuJp?tTE+A0z>Xt= z2XJRW%)`32L&N($g~>^<8wPOAaE%3`>x z1TT89gLz!`^e*h&SQO-BGnq9CA<#%%T`CaQKlqG?(seoky2bOhat<_W*}q6uY`X~=i$)dQq#ag2_2D4^w8GSAn}f| z1?kf-opTY-=%wAFw(AHAKHlu*)ucR$z$7nDB=rr1p<-|?6qaS$?nAJXY#Ih5TRu5I z{(i&`@ls%nj=|+AtX{mNB0Ci{Cn96WFrFs91f?UYshSIa&fy|;^ed}=@u1QTe2dYIY51dfsWbJ%DSv)3!j;j9)G$Z4A814u!IuRBm&_`lkv5>z;_y zBRf1E1I{9%n_DSQAF4;=rUHS8OK&=mHGY8WImc|V?Q%$fvWXG&RQ!$+NtUlcjw+0& zLz>6b)8*vY_F}fB(C-H~^n&Glv^BaKofzG1weW9{C+j$%@eIPE4o_N1e>?@v zS@xmD1}Ch@%t2Si^v}5OIG~#?l00Hh=D78IForvde)!Aap!O^aPWx%%#Eq~JXr;AJ zGMKB1xe)Xd@e}GR&cDDd3~kUbf*0WAliioi3cjC-FjBQS#l{8@ao1(!K-^A^U?G5~ z*tjsmaPBGC{iqs*f(n9Yg8h&A&nL z;P;!a?K{qvmLs_4)xX$32pR6bNaw=^lgL#qaoz34Y9^HQtPE{)t+P@h367_94!=&U1Lyjc=#TEA_iaqvT_Wvs6tAV4(xG4kAs*GDY%g>Hy262Dv<2q9OlkGYSt(Ww9L(dgS?-QiyXG}yy`QtSy?cp9Z5tsZaXUKO zJlc?bx!-?OeK7X(vUm2X&|G)=X3!U^T9w{wFp1{4yOGE?@sQqkrg8aJwLRxFK=}8S zjl+oJ)n6?;J6k>ta%9V^XPbh9aN@En?I>s$KxL|NY@_`$Skx z!_b)sarma}NaK#VkB!9{#vVn4`rEHPZg;1dOqQt@nsc)$1A8w~134jgLm*9G4Yp?Y z5QgME)NN#Nlnh~JLFm3E$UEK|^QffDK>GZg4E$l#2yVo)FNU?}KKTwuDnPhV^luQh zY!U+|QSP;Rq>{JWH=Ar4{55L>4@8(a{!5CNdTV>z*>};}g$JEdYC1@yUE<)YzMT>6 z6(`D~L4*zI$$gHo^bhMZ)5;;8Gw?#bj=3>gxG72iL8u;CG_o~Hr%;7dVtlb#f_q62 zHTHvw^cQjcXUzrR$ai~lA0K=_(hV4?eJ-glCy%q*af8zAvp|LiaGNl< zu&K56-qcX9@uywIR4^2%;olr=phaygsxbQ_4jyz0zeDjY^r2+{p%7H4hV*e?qz$HB z4wVdH0im`FS2J%6_=`#T9^TJoeW1E+=yX&He)q)oh%T0il!OM1^}dobJTTey$6|z= zhevpRCEAONF*PBVRH59XLk<;_Bv(6*uK7??%_4rv`TF-%^vJbOSO`{yxd{Ge&|2mB z3O-jYkz=%kN3ksY{2T(aSpJMbE=}3!pvkt_Gg6(+-K~iXa3tHqEW0o&go?xqCpmxX z@7=%QG9*CwOYQ!xD1Ke%%!U+BS?)yJ@1j=NPQ1Z2CZdeJaD10)pMJ8rDl{OmW2RKK`E@W&%Y_%h!3=|b4WUH!2$bl=P8X@726%l_G z;(;;7e}^*g34(;1DlF@G{+xaeu|bpEQyV5oBVv!|3_z|Z#!D87T}S_ z58sTkARnTK2Y87t*h+Qn!6wdmIpSo+dmdWAt7Vj=P=!uKG0+d2pMDl)!7CvQ7sSdh z0W)A=Yvp)<3zh;A>DV@%S@cY|$oDGR6jae>xw79llq<=&osX|V4o6!tumU<%M&0&@ z;lCvy>$OnrQDVuJ78Xi!smCY}?Ba5!UVTEAN?i3*rsX6Iw{tR~w~~fYCumEct*X2` z^F7I5X{S&VoSt2-B(dIc1fFd*4Gs7OgRSIg2-Fe{5BzPmJO7TA?SgX+bK{4cu{i?W zZVw!mD@)XS5>g1jyq!YoIe*?s05_}lG4fYFOwSs+%@1*kwkok8p2&7(ZwDtWdgSN* zc)yR!_1A|}Cz0#7*4)Ab150C1>RG|*&sMzwT^Eej(V6-T^|pO$LvJ%h!Fn+wU~kCG zP)4bVzMot=%nmi>@dqhnZ{A*)h0&NO5{?<4vZ{pUj$xHpH&}x8Y*nDWm{EDWt25-huC`}Z*Ow**xIp|aKR_zsdNgrdJ@fFWn*;a;_oJlEc?{y=yrK?hiRaDb|KDY!uE z#3)=!t;j1AyLEoJQknGWj0M06ugqf2&t8lN9m(&sC=fo9>22HBloJR*44~&1$Qp%Lj{W(aW!Fxhsp};uGzTTn2KY^)|l}J!=pP&V&s^i zsfj=K^Vp1mE_u%?-FK_MgOEx>p>qECx)`He?+AB#u{_?;60ZN+w}V&WnYQ}|7va+( zzRQcXF4XytYi~eT@p3aN`|;}H! z+U`-n+xxNK`~B>FXZ%!R$L728;KffRjl@aTJUQ`xIg~@h1$%c_cr2Q*bB+P$?dlMT zubk>%%7JauabPw5z)gx|LGwGZR)A1YE%{drUvslf#|@O8yI80kJb6A7fU`!{j%%nq z0Wao@d(zrnb^)RLvTHE*1TvCXj^G`fBL50$J=}L_iPl+IC2W)L_7wFdcu~SXR%nq~ z?|6UcG7!)!dY(L1WN&F*bkLzCO3hxSw#|%Lfx>{$)`tlIgl^J)~?1&!#)& z0@Sx4c4HZ6Rlyv4jv}x$VOF?J*iP>~I<0wi_9)OM1`=rvydU&ZeDqYSro=wskC?e*1|))=o(MJ==V}650r02de>p znVW4$rVrMQ#)#3=a$V1m%V8hL( zr_5=#I87116KSi9e?lRO<9{~y^wJn8UT>N`y7yZHr;zZ<$^NTrb;HVZmU~qy5K1tl z3hOq60B^ErC8m>iT^IoC@~x@!7a!y3H=QGJxbdZ!D4roST&Ld$c9diPrWQ#EJI=M3lOKGXCZ|)(48qpe3<_$wla`MJIiBYV$$a`EGuqu zwv}XJO5ddUtZUMxSNO&IK0?QtovuCD zTGvJU%j$B&t$;G+9*F4F)L6f;z+&Hohz3^Xbo%D$;DEWY?D#|chzY#z6Jw%3;RbajniPSCblih@e;1&Rrf0zy_d zfBZ1o)i%^I)lnT#@BkhDDwAS9UYrDrcYIX9yk%o6`FFJ$)pQIN=+N za6Sc{_3OVU^cE39#IT@k=S1!ik&A=Z0xVeL;jQ}6zDss=Loqs(04@id%ygiM*yOLCWwz_G6qlbs(TSWHa(kweNz}^O`(zh5qnZ$!a z_o?!TCc@yfmQFfK;xo)0CMN;It-U#*DtF&DzGeTAQ*rw~my==amr+N=~Os41kupk)`dPiKlPf(~)x-DiW-C1o{u;O}cWZ!GZv z(^WsLRp=F}70}~v+tEDPO}N3VMnfk&Ol4+>R#77ePYY)av3FkWD;lv#cm5w&B-C8u z8}e0Z1ueWwJS!S}T#KCFfBx}i7xTP?n?zZ~+b*?6LrY_~ShQzZPpPL_i zS}z@Iql@H`pxwss*^KnWdfpZ{PPb*;$B;q=Qb{i#a541v1Try*I|b}!op6>q@#N;ZL=JUX6l2RXhwQ>}97s1Froz)~{* z?%J~6&SF+C%eD>{4`C!SqwSGH`M*yqgFQQygqe4)=xrR-u_lKd~RUwwDhHH@*YU24g|S1trsPJiEzJXS{TK>hvT zd-oHK?)OhxE#zK2Ki=9{dO=BIIbF;OYTjcQhsVdV;TIdrZhjID&