From 7de8ce51a5087c7b273cc002675f962bff78985a Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Wed, 11 Nov 2020 15:14:39 +0100 Subject: [PATCH] gpu: fix off-by-a-half clipping I don't know why the 1/2 factor is there, but it leads to images being rendered with a 0.5 pixel offset. Remove the other useless checks while here: clipping 1px images shouldn't be a problem and the destination rectangle is always non-zero (otherwise it wouldn't be rendered). Update the reference images that are subtly changed because of this fix. Signed-off-by: Elias Naur --- gpu/gpu.go | 22 +++++++----------- .../refs/TestComplicatedTransform.png | Bin 1116 -> 1081 bytes .../refs/TestOffsetScaleTexture.png | Bin 470 -> 458 bytes .../rendertest/refs/TestOffsetTexture.png | Bin 539 -> 463 bytes 4 files changed, 8 insertions(+), 14 deletions(-) diff --git a/gpu/gpu.go b/gpu/gpu.go index ddc1f6c3..125e0872 100644 --- a/gpu/gpu.go +++ b/gpu/gpu.go @@ -949,20 +949,14 @@ func (d *drawState) materialFor(cache *resourceCache, rect f32.Rectangle, off f3 Y: float32(sz.Y), }, } - if dx := float32(dr.Dx()); dx != 0 { - // Don't clip 1 px width sources. - if sdx := sr.Dx(); sdx > 1 { - sr.Min.X += (float32(clip.Min.X-dr.Min.X)*sdx + dx/2) / dx - sr.Max.X -= (float32(dr.Max.X-clip.Max.X)*sdx + dx/2) / dx - } - } - if dy := float32(dr.Dy()); dy != 0 { - // Don't clip 1 px height sources. - if sdy := sr.Dy(); sdy > 1 { - sr.Min.Y += (float32(clip.Min.Y-dr.Min.Y)*sdy + dy/2) / dy - sr.Max.Y -= (float32(dr.Max.Y-clip.Max.Y)*sdy + dy/2) / dy - } - } + dx := float32(dr.Dx()) + sdx := sr.Dx() + sr.Min.X += float32(clip.Min.X-dr.Min.X) * sdx / dx + sr.Max.X -= float32(dr.Max.X-clip.Max.X) * sdx / dx + dy := float32(dr.Dy()) + sdy := sr.Dy() + sr.Min.Y += float32(clip.Min.Y-dr.Min.Y) * sdy / dy + sr.Max.Y -= float32(dr.Max.Y-clip.Max.Y) * sdy / dy tex, exists := cache.get(d.image.handle) if !exists { t := &texture{ diff --git a/internal/rendertest/refs/TestComplicatedTransform.png b/internal/rendertest/refs/TestComplicatedTransform.png index 33042c5e867b99532fa34e0de841d3c57dac3047..c1f3aeb95fa8df4fcf611dc251f58905004d1158 100644 GIT binary patch literal 1081 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1SEZ8zRh7^U}5ldaSW-L^X9g%zjmn1@sIY+ z+1qt|mSrZHD6XqzT%>>KKwsghds;?mdu^!Tk8r+%K|R^~Na zGv%uk&msm5ktYuvu3b+p-1zkBO~$9vZ>QY-&Zfw;W8Itgr(dno(b*#D*gS#Z)YYQ2 z=YM9u{JtsjYQR*-`}4bb_R5E^n>O9Z`|#((^X2ya|IB{-mH8R1AGRNbUbX}mZK>@v z^uEngkp1r1y<<=OC-1C!_fOQB=lvJ<$bS)k)2`Y`OgR{%b$$A02WE%G7cKsLEqJzj z=Gj+iuV4Eze0);k-R-!4UiU866)~Zg?k`_nH?!)O`+ug67e+5mXBUMtxVsw}Dq73i z)<5{iyuk6d70ZsjQ@5H*%GUn)Tg?8hp5YhIuQyc}PHMe)<@M}YRNub-qduFymz1#nOIe(tJ-T4o2LjGVnFE5nMvq0&FgQm)?(?WwjX$YuN@DbW@Y zmM_gRo6+y2=Mv#ph2`w;R2j}Sw>QPMoK?K+ck@-DUD)Kaq8DFIo7V58a^&Sr@1h5x z0=!?Yoiw_#{@|AdRcBV4zbG)D^4TGLZod2R%L+5!7&fna$9`eK?_GNpg`Jttzg}8A zvCTTk(B#F!*NyX{Cz-skm}~x2cKOfzx;1ah57kLn-Q8VR%y0AUJAcW&DdxT#YkitE zzOS48S>ayw^;z?~7C2roVZNY{@ryA-U_}7KJ6@gB$9IJ13y3j1Z#?hBazLUcGMuk- zs^boZIqavL*gMub8qMu#b`)XwXwq@A__`qDk;@8vpA|067ZetJzCG(v_udb7_Af3c z9J`w~>8t1)$@ME3o9u2cdU0~IuD|)?xPL2-%Q|1#tb1{8licHbrP&RV2cnqIFkF*j nJRry*Gwg^v_KXY+|Nq}L_$6gg%k>agBrtfo`njxgN@xNA0u$0u literal 1116 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1SEZ8zRh7^U{UsTaSW-L^X9g%k8-Na@sIzd z^zZeE+vLosauD{ksVXjyHYw~q_WGUKtQk3H)a1S;I63vS6nsgtnGj+q*i_Uo+fl3I zlTyV4U6~IF6|)VeY|Gj>E$C9iwS-0A7;G+ov;RE1tnU7s)Q2zYcmI9Ey!reTckQWN z3RZTO=l;#J{Xg}5+P@PiTr33u9*2p?r(}+3-8JQEWR{8jxc#v?_{r5Uac?mXVenv0V$jFHw3ne9X zq_FbZFr5%BGVZ>~f3Lo*_U;ywFKqoU`mA+i_#kI$FD?GN)AKX)uQPupx*R!a zWp!S^V&&V0pq*1<{L0RkzyG)M_kZ`d>r-Bcer|T&!!N?1HTBdj|Lnb!_nut*gmwPC z*;5|gex{jdnjxYPe@1$ zr}{tcywm;sc>ay)$G7ulYyIyrddu?raoOu%$D@c;C`zY~84A3gnFaraHG zkCrbxW=-EIk$OAH^ylpL+bwSrUM=7+kuDm^lJyZy|c+lhni^J^)VcgOctPdIwHl13r zK(c~kL2g0tyKM^^w=JEm3O7r&%XXxq3kyp*H|$%C^J|LJ7ULvW(J1;|99Ma WAlDx8RUTMsFnGH9xvX3>BDa5=_*d`jHPkDKd&PLpuVDs*A!8EL5ta^4 z0bvC-2OosM-DT_c#nsop|1SFf&&IVoPTya9ZSIQov$OWRpOvL|V3zxNdpk#LdT(FJ zdi3qv-!qAPsWp4w?aVPc@cf|v1u?&^pLhOZIf}(1PJ!9Cxvl;%o;$TtZ}+lKY}g#b zDX@9QR~@m-d+Oh=7Y!R)HoZ^@abS1LiL6|r9_w)~ z(*5!Bn48_pcgh^!c=2aA|A!Y7KZ?o~Gx5#;m?j4@ipqPhX4PCY;^MtkA*8T0D-5gpUXO@ GgeCyKZF`yk diff --git a/internal/rendertest/refs/TestOffsetTexture.png b/internal/rendertest/refs/TestOffsetTexture.png index 7f9f029d8aaaae5de06af1f46a1ea5f48270d92e..f8d8e6fb84609269f9da727fef7215cb680e44c0 100644 GIT binary patch literal 463 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1SEZ8zRh7^V4UXZ;uumf=gqB)zK0D&94@w$ ziMTcDCWxKV*}y8>8kyzh5hEHKYWv)J)0&u@^4F~U48^Sczp}~AWiVt+VmiXo!6_iD zpyuGyFasfA?N?iCp)>vTHTV4IPk)wHuf5!t{-M^px8J%haK1I;?fUti>lPrXhZ(T3 zG|Qy0*8czVv~?!?;$G>-(;%NmwDxKpTjjadlyFv9N;Kcd;X9Eg5lp3g$>!tN13)!0`Y7`gyj`IM#I-03(XQ M)78&qol`;+0C&=qga7~l delta 297 zcmV+^0oMM{1DgbpBu?Tm(t1Cd}B zGVOd9bbU9UdAuCsc$%Z0{u%cRN1d~s%ec=A+qfUUmtIrdEF5)z9A7?6r_TCk2YrH( vU={}L+XZoQZj)gFRFhxh&AEC^n=00000NkvXXu0mjfeSnO}