From 456f22c986b8677b4c332a37d64a81b83f630c29 Mon Sep 17 00:00:00 2001 From: Andy Balholm Date: Tue, 11 Jan 2022 11:24:53 -0800 Subject: [PATCH] gpu/internal/rendertest: add regression test for issue 331 References: https://todo.sr.ht/~eliasnaur/gio/331 Signed-off-by: Andy Balholm --- gpu/internal/rendertest/clip_test.go | 22 ++++++++++++++++++ .../TestStrokedPathCoincidentControlPoint.png | Bin 0 -> 1918 bytes gpu/internal/rendertest/util_test.go | 7 +++++- 3 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 gpu/internal/rendertest/refs/TestStrokedPathCoincidentControlPoint.png diff --git a/gpu/internal/rendertest/clip_test.go b/gpu/internal/rendertest/clip_test.go index 22703617..0820639f 100644 --- a/gpu/internal/rendertest/clip_test.go +++ b/gpu/internal/rendertest/clip_test.go @@ -185,6 +185,28 @@ func TestStrokedPathZeroWidth(t *testing.T) { }) } +func TestStrokedPathCoincidentControlPoint(t *testing.T) { + run(t, func(o *op.Ops) { + p := new(clip.Path) + p.Begin(o) + p.MoveTo(f32.Pt(70, 20)) + p.CubeTo(f32.Pt(70, 20), f32.Pt(70, 110), f32.Pt(120, 120)) + p.LineTo(f32.Pt(20, 120)) + p.LineTo(f32.Pt(70, 20)) + cl := clip.Stroke{ + Path: p.End(), + Width: 20, + }.Op().Push(o) + + paint.Fill(o, black) + cl.Pop() + }, func(r result) { + r.expect(0, 0, transparent) + r.expect(70, 20, colornames.Black) + r.expect(70, 90, transparent) + }) +} + func TestPathReuse(t *testing.T) { run(t, func(o *op.Ops) { var path clip.Path diff --git a/gpu/internal/rendertest/refs/TestStrokedPathCoincidentControlPoint.png b/gpu/internal/rendertest/refs/TestStrokedPathCoincidentControlPoint.png new file mode 100644 index 0000000000000000000000000000000000000000..77540a4b6b0d29720a493a2ec3060898b87f6895 GIT binary patch literal 1918 zcmV-^2Z8vBP)a*q9`Jw3rC}aPa>!Z$#lzM>O#}>?Y>p_oH})?>IX&7^z`(ts{8xbec!tV zm7=Kv6iyYOaH;@>Qw1oTDnQ{>0Sc!IP&ie9!l?ojP8DF41pqq%902e=fa9(#x%cjM zpQ&WXb^wO~jOG;j%-!0Rt?;oHz}^lsezNR!|64K6V!+IA%A$7VEB)BfW9Bzyhjt?> zVbIFl&kO?4cbuf%n2JAp7-oJ`c4;@J;>QBx%%}3Uc7ys-+J1oD%-?qn^Y>K*S?IXE z?^BLzH>%Pd&Sn32DQy%riA4IFVtN;GDfZH`|6HN(UN7{$6(%IpKLoH@yMcWuVFZv& zKkCk)w2@4IGXh+t-N-)VJ_1OmpEy^wjG15J0O%?)&Vq@ z{o|akIPG5KAVBQx{%LGco_;Vn2%w#Q;zH%=7fZ;Rzr;Gg8`>QaiuDm7h4d2_YgeE| zLbv-RMu6Y6J0ld!BS0$YhdUr-`mnGy`t0?S7y+osJINPI z>j0@P`^VX;T>)RL2$1TU|0GvySHKr50$4~t>OF&G;6B%He7XHO^E$xMdcz2QxX<-# zW*SL#lfVk)_1Ybl6B1|oHZyIHOY1Ra0rqHjT24ru={s~%H8*$qgjs+$mHR9kq|Wmn zPNZ}nvj9tqeU=qc=lTCQacj2+m<1Tsa|HV%d6mzj6Vtj#*S+M z{J|{1t4jTr1(N9}u?AD7`7W~n-zoH4Hb|#`ngCBR3qbE*q|kTfkxoBa1h`p10Pb7U z7eS0=|1<&C1NfI&fVU#|oq1xUA1wk9A217W1i-pTeU}BX*8JN9c!pU3dc7@D-W1b8Jv-(^9}?fy0a)&ls8S%9S()2ldQrXMqA2)%!hSpX_G2=||PVx}K+ z1b9e5fR}{(&or^qk2wNd;Ca??7Xf}Sbn0DnVy7Q-1Ry?R7J$mFLj7kNjr5~~0M7~t z@R~sXnMWi2=pevW0Rd?1;$(q7G>caH(Ln&>TV?^M+|Ss5=Fv(&ItuW-fB+vc_Md4q z(~ph6iqX=|@Kah_3_$*w4^^rqND6JOt=+l8CPWe_MaTNME$m4-Wyh zxNH771sFN8iX?^f!$Sb#kbnTo05$~np=nY`KRgAvM?iqllvC5QCzbTWQvj;>?*al$ zUYwFWsiYsC0uV0?2teg=&w86BrSu~}fXh5*bXNg>1#ntG{mqe5`Vk-iz5l*|090NG zsJ|&vOFsey*d`>vQ2>_&w!;Ler5}L;tO4+~fB;n93v5U7q?mpL3P3z4BmkAWdbB55 zQcOR32(aF5zDWqMoZBwqRMU?h0uYZ02{5w!+@Wctntt>YV8evioC0LCC`dW|=qUj4 zh@b#}=5Seg%IOD#0PEZhAS47By1SN{Jy?`_`oSOo+)yng0KL9$^^&sG(+?&A2JRd` zDFLWF$JE|vSV%vZ1b}-szzIPCxZ5p`h4h0_fPp*5Pf~!PyIwJQtfU{z0&D{Ci=Y6_ zdrvU6T?{Mf2eSYJcT-470h;n+su!7BNl2nqoAtbiB-H02A;JCRvTKZFH1 z-R&lhB|uXS0l1|{p9Ens{SX!a?#W^QL>8bapSt}98w2~MGgi}&2m%oIwd~Z97N9A| z+?L71Qs*2>r9Vbl8SCir*U9%rGyc}Rw=(g2+jnS}WdH}U!6mzw^V0;DX#$UQ7;t?x1C1-F)K;W4gljK-GTZ9jMYJlyY-|2zJ-l-cjQ zZ`sN-d{bhiU4a?w_AxYv^h03;X#3tI@EHN_%wXnglH^F>Bf#x~^{6P}BfzzS^(cv? zMgkuJ&JnCfX(S_oj{wQ8$W+4d5#T4mdQ_C~5#VFNdQ_C~5#XR;Ju0h2UpJ^bg5vE6 z8h^!%X|?@Lg#USb_JljEc!ywpVln9ObC=JL|K4^9S=(o3&EzBnAie~!IfH!yRe)6% zeg9$Lq}i9i;mpty`*85AlTW5iE7oD;y)-ZX3jhHB|633Euvasz%m4rY07*qoM6N<$ Eg1B6M0ssI2 literal 0 HcmV?d00001 diff --git a/gpu/internal/rendertest/util_test.go b/gpu/internal/rendertest/util_test.go index a19f3026..3725301e 100644 --- a/gpu/internal/rendertest/util_test.go +++ b/gpu/internal/rendertest/util_test.go @@ -195,7 +195,7 @@ func verifyRef(t *testing.T, img *image.RGBA, frame int) (ok bool) { for y := bnd.Min.Y; y < bnd.Max.Y; y++ { exp := ref.RGBAAt(x, y) got := img.RGBAAt(x, y) - if !colorsClose(exp, got) { + if !colorsClose(exp, got) || !alphaClose(exp, got) { t.Error("not equal to ref at", x, y, " ", got, exp) return false } @@ -209,6 +209,11 @@ func colorsClose(c1, c2 color.RGBA) bool { return yiqEqApprox(c1, c2, delta) } +func alphaClose(c1, c2 color.RGBA) bool { + d := int8(c1.A - c2.A) + return d > -5 && d < 5 +} + // yiqEqApprox compares the colors of 2 pixels, in the NTSC YIQ color space, // as described in: //