From d307c8e63afe29fcc8fc0c8d4e561b07a4ebb391 Mon Sep 17 00:00:00 2001 From: Andrey Lushnikov Date: Fri, 21 Jul 2023 12:27:52 -0700 Subject: [PATCH] fix(ssim-cie94): make sure a single off pixel yields diff in comparator (#24348) This patch brings in antialiasing tests from `looks-same` project for our experimental `ssim-cie94` comparator. One of the new tests found a bug in our implementation. References https://github.com/microsoft/playwright/issues/24312 --- .../playwright-core/src/image_tools/compare.ts | 6 +++--- .../should-fail/looks-same-tests/README.md | 2 ++ .../looks-same-tests/blue-actual.png | Bin 0 -> 137 bytes .../looks-same-tests/blue-expected.png | Bin 0 -> 139 bytes .../looks-same-tests/green-actual.png | Bin 0 -> 137 bytes .../looks-same-tests/green-expected.png | Bin 0 -> 139 bytes .../looks-same-tests/no-caret-actual.png | Bin 0 -> 211 bytes .../looks-same-tests/no-caret-expected.png | Bin 0 -> 286 bytes .../should-fail/looks-same-tests/red-actual.png | Bin 0 -> 137 bytes .../looks-same-tests/red-expected.png | Bin 0 -> 140 bytes .../should-match/looks-same-tests/README.md | 2 ++ .../looks-same-tests/antialiasing-actual.png | Bin 0 -> 17869 bytes .../looks-same-tests/antialiasing-expected.png | Bin 0 -> 17876 bytes .../antialiasing-tolerance-1-actual.png | Bin 0 -> 691 bytes .../antialiasing-tolerance-1-expected.png | Bin 0 -> 689 bytes .../antialiasing-tolerance-2-actual.png | Bin 0 -> 705 bytes .../antialiasing-tolerance-2-expected.png | Bin 0 -> 659 bytes 17 files changed, 7 insertions(+), 3 deletions(-) create mode 100644 tests/image_tools/fixtures/should-fail/looks-same-tests/README.md create mode 100644 tests/image_tools/fixtures/should-fail/looks-same-tests/blue-actual.png create mode 100644 tests/image_tools/fixtures/should-fail/looks-same-tests/blue-expected.png create mode 100644 tests/image_tools/fixtures/should-fail/looks-same-tests/green-actual.png create mode 100644 tests/image_tools/fixtures/should-fail/looks-same-tests/green-expected.png create mode 100644 tests/image_tools/fixtures/should-fail/looks-same-tests/no-caret-actual.png create mode 100644 tests/image_tools/fixtures/should-fail/looks-same-tests/no-caret-expected.png create mode 100644 tests/image_tools/fixtures/should-fail/looks-same-tests/red-actual.png create mode 100644 tests/image_tools/fixtures/should-fail/looks-same-tests/red-expected.png create mode 100644 tests/image_tools/fixtures/should-match/looks-same-tests/README.md create mode 100644 tests/image_tools/fixtures/should-match/looks-same-tests/antialiasing-actual.png create mode 100644 tests/image_tools/fixtures/should-match/looks-same-tests/antialiasing-expected.png create mode 100644 tests/image_tools/fixtures/should-match/looks-same-tests/antialiasing-tolerance-1-actual.png create mode 100644 tests/image_tools/fixtures/should-match/looks-same-tests/antialiasing-tolerance-1-expected.png create mode 100644 tests/image_tools/fixtures/should-match/looks-same-tests/antialiasing-tolerance-2-actual.png create mode 100644 tests/image_tools/fixtures/should-match/looks-same-tests/antialiasing-tolerance-2-expected.png diff --git a/packages/playwright-core/src/image_tools/compare.ts b/packages/playwright-core/src/image_tools/compare.ts index 9ce86d91ec..e3be162675 100644 --- a/packages/playwright-core/src/image_tools/compare.ts +++ b/packages/playwright-core/src/image_tools/compare.ts @@ -86,8 +86,6 @@ export function compare(actual: Buffer, expected: Buffer, diff: Buffer|null, wid continue; } - // if this pixel is a part of a flood fill of a 3x3 square then it cannot be - // anti-aliasing pixel so it must be a pixel difference. if (!fastR || !fastG || !fastB) { fastR = new FastStats(r1, r2); fastG = new FastStats(g1, g2); @@ -97,7 +95,9 @@ export function compare(actual: Buffer, expected: Buffer, diff: Buffer|null, wid const [varX2, varY2] = r1.boundXY(x + VARIANCE_WINDOW_RADIUS, y + VARIANCE_WINDOW_RADIUS); const var1 = fastR.varianceC1(varX1, varY1, varX2, varY2) + fastG.varianceC1(varX1, varY1, varX2, varY2) + fastB.varianceC1(varX1, varY1, varX2, varY2); const var2 = fastR.varianceC2(varX1, varY1, varX2, varY2) + fastG.varianceC2(varX1, varY1, varX2, varY2) + fastB.varianceC2(varX1, varY1, varX2, varY2); - if (var1 === 0 && var2 === 0) { + // if this pixel is a part of a flood fill of a 3x3 square of either of the images, then it cannot be + // anti-aliasing pixel so it must be a pixel difference. + if (var1 === 0 || var2 === 0) { drawRedPixel(x, y); ++diffCount; continue; diff --git a/tests/image_tools/fixtures/should-fail/looks-same-tests/README.md b/tests/image_tools/fixtures/should-fail/looks-same-tests/README.md new file mode 100644 index 0000000000..e3fedc8230 --- /dev/null +++ b/tests/image_tools/fixtures/should-fail/looks-same-tests/README.md @@ -0,0 +1,2 @@ +These tests are coming from the `looks-same` library: +- https://github.com/gemini-testing/looks-same/blob/b9399bce8fd980e6e59cf740bee3cd3fe66c3eae/test/test.js diff --git a/tests/image_tools/fixtures/should-fail/looks-same-tests/blue-actual.png b/tests/image_tools/fixtures/should-fail/looks-same-tests/blue-actual.png new file mode 100644 index 0000000000000000000000000000000000000000..f9bcd4d00f7801fbc521084802cded0ab9ae1cf0 GIT binary patch literal 137 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nET08bakkcwMxFB|eQFz_7S@JW5| x$Bvkl3`G^U^*(u=aJ|Nv*dpjAK_s!rO|D90Z`*49Y)7Ek44$rjF6*2UngHr_C%*sy literal 0 HcmV?d00001 diff --git a/tests/image_tools/fixtures/should-fail/looks-same-tests/blue-expected.png b/tests/image_tools/fixtures/should-fail/looks-same-tests/blue-expected.png new file mode 100644 index 0000000000000000000000000000000000000000..14dc4e75e55f9bdbedc835b1df71c5c0c31bd2b2 GIT binary patch literal 139 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nETAWs*^kcwMxFFW!w7ziBR&?H;W zWiB^SThu}B-nVrhy-v7Z<4kN3bdw;GSmb6mNqT3=BD>(pK+_pKUHx3vIVCg!0K;G> ARsaA1 literal 0 HcmV?d00001 diff --git a/tests/image_tools/fixtures/should-fail/looks-same-tests/green-actual.png b/tests/image_tools/fixtures/should-fail/looks-same-tests/green-actual.png new file mode 100644 index 0000000000000000000000000000000000000000..f9bcd4d00f7801fbc521084802cded0ab9ae1cf0 GIT binary patch literal 137 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nET08bakkcwMxFB|eQFz_7S@JW5| x$Bvkl3`G^U^*(u=aJ|Nv*dpjAK_s!rO|D90Z`*49Y)7Ek44$rjF6*2UngHr_C%*sy literal 0 HcmV?d00001 diff --git a/tests/image_tools/fixtures/should-fail/looks-same-tests/green-expected.png b/tests/image_tools/fixtures/should-fail/looks-same-tests/green-expected.png new file mode 100644 index 0000000000000000000000000000000000000000..c2f298cfae525e0f6edf404040ba2da0c77bb431 GIT binary patch literal 139 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nETAWs*^kcwMxFFW!w7ziBR&?H;W zWiB^SThu}B-aWmKJ||qSaVEA1x=9d8EON8!dSe?v~&4=r3YNX7*jZGHHsJX72L0`_3P>s}eo*<@}ym&zFU% zzN`tB`!+jOcrRDtwcV#*T4lX5>4`}yZrLh>OcQYXD@kwwe*X`AAx@Y2Kv39v|STfF3EuW=;`X`vd$@?2>_1$Y6k!S literal 0 HcmV?d00001 diff --git a/tests/image_tools/fixtures/should-fail/looks-same-tests/red-actual.png b/tests/image_tools/fixtures/should-fail/looks-same-tests/red-actual.png new file mode 100644 index 0000000000000000000000000000000000000000..f9bcd4d00f7801fbc521084802cded0ab9ae1cf0 GIT binary patch literal 137 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nET08bakkcwMxFB|eQFz_7S@JW5| x$Bvkl3`G^U^*(u=aJ|Nv*dpjAK_s!rO|D90Z`*49Y)7Ek44$rjF6*2UngHr_C%*sy literal 0 HcmV?d00001 diff --git a/tests/image_tools/fixtures/should-fail/looks-same-tests/red-expected.png b/tests/image_tools/fixtures/should-fail/looks-same-tests/red-expected.png new file mode 100644 index 0000000000000000000000000000000000000000..c6ea115f3bdc4046dfefb7293b861e581fc3449d GIT binary patch literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nETU{4pvkcwMxFFW!w7ziBRP$XN= zV=gyQThu}B-tBcCQl0cR`Ee-s7#t#!5HkJ5c<$wvgy2`VLAEe>y85}Sb4q9e064@d Ad;kCd literal 0 HcmV?d00001 diff --git a/tests/image_tools/fixtures/should-match/looks-same-tests/README.md b/tests/image_tools/fixtures/should-match/looks-same-tests/README.md new file mode 100644 index 0000000000..e3fedc8230 --- /dev/null +++ b/tests/image_tools/fixtures/should-match/looks-same-tests/README.md @@ -0,0 +1,2 @@ +These tests are coming from the `looks-same` library: +- https://github.com/gemini-testing/looks-same/blob/b9399bce8fd980e6e59cf740bee3cd3fe66c3eae/test/test.js diff --git a/tests/image_tools/fixtures/should-match/looks-same-tests/antialiasing-actual.png b/tests/image_tools/fixtures/should-match/looks-same-tests/antialiasing-actual.png new file mode 100644 index 0000000000000000000000000000000000000000..32ada647b11a8736e369ef7cba51c72adbc32c77 GIT binary patch literal 17869 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 K)_GRzxBdqfb(gRJ literal 0 HcmV?d00001 diff --git a/tests/image_tools/fixtures/should-match/looks-same-tests/antialiasing-expected.png b/tests/image_tools/fixtures/should-match/looks-same-tests/antialiasing-expected.png new file mode 100644 index 0000000000000000000000000000000000000000..2f14ac0ff4ac15bfd05bd016559f33513f8621fc GIT binary patch literal 17876 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 XgH$X_*FDAM00000NkvXXu0mjfa#ufw literal 0 HcmV?d00001 diff --git a/tests/image_tools/fixtures/should-match/looks-same-tests/antialiasing-tolerance-2-actual.png b/tests/image_tools/fixtures/should-match/looks-same-tests/antialiasing-tolerance-2-actual.png new file mode 100644 index 0000000000000000000000000000000000000000..e9a9859ce7623ad3e4069e5c4958c49694d2a090 GIT binary patch literal 705 zcmV;y0zUnTP)Vr@OvL$87eiU$q!=*1tf9)uc8jVT2~ zONd>i9`w?KNVdC8Gal9?{V}zzec^@Knc1Ch=9`&Sl111E6#%0XLj4fF$cs#X;o)Hl zg#t<`_KK!$8YzQo!^%_mJjj{IU2NNCVq${*KyAxlYdnGDR}>3h4VIR^U|H6GX0Y`H z3eKGn9LMG6jpY7IR9tTCG|&fz4(Z94#N%<4QWT5D-3JhXYvZu|{qIhFanLkh&gb(a z5(!#bTK1N~k;8C#WV3O79lSLNnh=ZD_2F+S=M`x@a^?EEc1?yPMY5)(u^fMI?*7dxR*301|9Q z^ng#(@O6zC3WdZpP0@8-bX^xs(`0OHOsc45U^Z_~ts-Cqz;So3aivnJvHI+~?)DP> zSn)6W)>XK07N%xl)rGZn-~MJ6J}%ThoJyr=Z*ND}bpSd#I_T}~rKhK7^Q=e~seC}L zUqVhD^ULMF_jRRdpOW=$)v^o?4T*?Ixm=b~sU)uJN+Z;|D8B@gP)L1J@g;&7oH6E=*1sY@l<1rVGBaE zgtV*l(u)N_vhJEX9@b=QYqV+mg@Ly-v&_tQ=FL-5Mc51#1CxORBapnvvr3Gyu`%lP zI!Y;eMc+1!w7_>^{Shpm=hVU5xUS3e^fbGH+E&5Vcml_-C_a8RtgL*(w(UJuur&h( zXHE#7=X2xw)!kFnSncjKIs_&T<(cQ?aygVzG#ZVa2M~ec6s)fO-DxNXT8HOatwuhd zCy_|>R>9#kT%P#TxUm7j53u^-=%GlTOeV2yn;;1AJdYppQmIW-QbnYSym^Qyg#cpWh}NN) zc&O_pmSu@CMzq$VwHBq6jE|2?8y$)^XV~W3#6ybqf(}J%U&3ZjUW0R|;nf0oe&jei z50&@Pcd1m`IYmF;A*D;m@Uf6C|81yi&V?e?(AK7$*6OgVq|$vM|Q{drXyryAzP%Urc$ZkI8JXp zIFjk^^m0DD6Zz2*p1znvM0UJcWB+pyf!TS5Wf|_=fBbttsr_4a-}FfqYJE&j-XfF9 t?8Ca=^5DF75)_L?mX?;#?F-TaegW8({&$~CX#@ZO002ovPDHLkV1k-DGk*X8 literal 0 HcmV?d00001