Title: [284878] trunk/Tools
Revision
284878
Author
[email protected]
Date
2021-10-26 10:39:19 -0700 (Tue, 26 Oct 2021)

Log Message

The script should decide when an image diff cases, not ImageDiff
https://bugs.webkit.org/show_bug.cgi?id=232225

Reviewed by Martin Robinson.

Rather than have ImageDiff decide if the comparison passes or fails (with some built-in
tolerance), have it just print the percentage difference, and have the script compare it
against the tolerance.

Code to prettify diff_percent is moved into the script (but should eventually
move closer to display time).

* ImageDiff/ImageDiff.cpp:
(processImages):
* Scripts/webkitpy/port/image_diff.py:
(ImageDiffer._read):
* Scripts/webkitpy/port/port_testcase.py:
(PortTestCase.test_diff_image.make_proc):
(PortTestCase.test_diff_image_passed):
(PortTestCase):
(PortTestCase.test_diff_image_passed_with_tolerance):
(PortTestCase.test_diff_image_failed_with_rounded_diff):
(PortTestCase.test_diff_image_failed):

Modified Paths

Diff

Modified: trunk/Tools/ChangeLog (284877 => 284878)


--- trunk/Tools/ChangeLog	2021-10-26 17:28:34 UTC (rev 284877)
+++ trunk/Tools/ChangeLog	2021-10-26 17:39:19 UTC (rev 284878)
@@ -1,3 +1,29 @@
+2021-10-26  Simon Fraser  <[email protected]>
+
+        The script should decide when an image diff cases, not ImageDiff
+        https://bugs.webkit.org/show_bug.cgi?id=232225
+
+        Reviewed by Martin Robinson.
+
+        Rather than have ImageDiff decide if the comparison passes or fails (with some built-in
+        tolerance), have it just print the percentage difference, and have the script compare it
+        against the tolerance.
+
+        Code to prettify diff_percent is moved into the script (but should eventually
+        move closer to display time).
+
+        * ImageDiff/ImageDiff.cpp:
+        (processImages):
+        * Scripts/webkitpy/port/image_diff.py:
+        (ImageDiffer._read):
+        * Scripts/webkitpy/port/port_testcase.py:
+        (PortTestCase.test_diff_image.make_proc):
+        (PortTestCase.test_diff_image_passed):
+        (PortTestCase):
+        (PortTestCase.test_diff_image_passed_with_tolerance):
+        (PortTestCase.test_diff_image_failed_with_rounded_diff):
+        (PortTestCase.test_diff_image_failed):
+
 2021-10-26  Kate Cheney  <[email protected]>
 
         [ App Privacy Report ] Restoring a session after clearing the cache results in app initiated loads in Safari

Modified: trunk/Tools/ImageDiff/ImageDiff.cpp (284877 => 284878)


--- trunk/Tools/ImageDiff/ImageDiff.cpp	2021-10-26 17:28:34 UTC (rev 284877)
+++ trunk/Tools/ImageDiff/ImageDiff.cpp	2021-10-26 17:39:19 UTC (rev 284878)
@@ -65,21 +65,10 @@
 
     PlatformImage::Difference differenceData = { 100, 0, 0 };
     auto diffImage = actualImage->difference(*baselineImage, differenceData);
-    float legacyDifference = differenceData.percentageDifference;
-    if (legacyDifference <= tolerance)
-        legacyDifference = 0.0f;
-    else {
-        legacyDifference = roundf(legacyDifference * 100.0f) / 100.0f;
-        legacyDifference = std::max<float>(legacyDifference, 0.01f); // round to 2 decimal places
-    }
-
     if (diffImage)
         diffImage->writeAsPNGToStdout();
 
-    if (legacyDifference > 0.0f) {
-        fprintf(stdout, "diff: %01.2f%% failed\n", legacyDifference);
-    } else
-        fprintf(stdout, "diff: %01.2f%% passed\n", legacyDifference);
+    fprintf(stdout, "diff: %01.8f%%\n", differenceData.percentageDifference);
 
     if (printDifference)
         fprintf(stdout, "maxDifference=%u; totalPixels=%lu\n", differenceData.maxDifference, differenceData.totalPixels);

Modified: trunk/Tools/Scripts/webkitpy/port/image_diff.py (284877 => 284878)


--- trunk/Tools/Scripts/webkitpy/port/image_diff.py	2021-10-26 17:28:34 UTC (rev 284877)
+++ trunk/Tools/Scripts/webkitpy/port/image_diff.py	2021-10-26 17:39:19 UTC (rev 284878)
@@ -129,15 +129,23 @@
         if self._process.has_crashed():
             err_str += "ImageDiff crashed\n"
 
-        diff_percent = 0
-        if diff_output:
-            m = re.match(b'diff: (.+)% (passed|failed)', diff_output)
-            if m.group(2) == b'passed':
-                return ImageDiffResult(passed=True, diff_image=output_image, difference=0)
-            diff_percent = float(string_utils.decode(m.group(1), target_type=str))
+        if not diff_output:
+            return ImageDiffResult(passed=False, diff_image=None, difference=0, tolerance=self._tolerance, error_string=err_str or "Failed to read ImageDiff output")
 
-        return ImageDiffResult(passed=False, diff_image=output_image, difference=diff_percent, tolerance=self._tolerance, error_string=err_str or None)
+        m = re.match(b'diff: (.+)%', diff_output)
+        if not m:
+            return ImageDiffResult(passed=False, diff_image=None, difference=0, tolerance=self._tolerance, error_string=err_str or "Failed to match ImageDiff output %s" % diff_output)
 
+        diff_percent = float(string_utils.decode(m.group(1), target_type=str))
+
+        passed = diff_percent <= self._tolerance
+        if not passed:
+            # FIXME: This prettification should happen at display time.
+            diff_percent = round(diff_percent * 100) / 100
+            diff_percent = max(diff_percent, 0.01)
+
+        return ImageDiffResult(passed=passed, diff_image=output_image, difference=diff_percent, tolerance=self._tolerance, error_string=err_str or None)
+
     def stop(self):
         if self._process:
             self._process.stop()

Modified: trunk/Tools/Scripts/webkitpy/port/port_testcase.py (284877 => 284878)


--- trunk/Tools/Scripts/webkitpy/port/port_testcase.py	2021-10-26 17:28:34 UTC (rev 284877)
+++ trunk/Tools/Scripts/webkitpy/port/port_testcase.py	2021-10-26 17:39:19 UTC (rev 284878)
@@ -284,7 +284,7 @@
         self.proc = None
 
         def make_proc(port, nm, cmd, env, crash_message=None):
-            self.proc = MockServerProcess(port, nm, cmd, env, lines=['Content-Length: 6\n', 'image1', 'diff: 90% failed\n', '#EOF\n', 'Content-Length: 6\n', 'image2', 'diff: 100% failed\n', '#EOF\n'])
+            self.proc = MockServerProcess(port, nm, cmd, env, lines=['Content-Length: 6\n', 'image1', 'diff: 90%\n', '#EOF\n', 'Content-Length: 6\n', 'image2', 'diff: 100%\n', '#EOF\n'])
             return self.proc
 
         # FIXME: Can't pretend to run setup for some ports, so just skip this test.
@@ -325,15 +325,27 @@
 
     def test_diff_image_passed(self):
         port = self.make_port()
-        port._server_process_constructor = lambda port, nm, cmd, env, crash_message=None: MockServerProcess(lines=['diff: 0% passed\n', '#EOF\n'])
+        port._server_process_constructor = lambda port, nm, cmd, env, crash_message=None: MockServerProcess(lines=['diff: 0%\n', '#EOF\n'])
         image_differ = ImageDiffer(port)
-        self.assertEqual(image_differ.diff_image(b'foo', b'bar', tolerance=0.1), ImageDiffResult(passed=True, diff_image=None, difference=0))
+        self.assertEqual(image_differ.diff_image(b'foo', b'foo', tolerance=0), ImageDiffResult(passed=True, diff_image=None, difference=0, tolerance=0))
 
+    def test_diff_image_passed_with_tolerance(self):
+        port = self.make_port()
+        port._server_process_constructor = lambda port, nm, cmd, env, crash_message=None: MockServerProcess(lines=['Content-Length: 4\n', 'test', 'diff: 0.05%\n', '#EOF\n'])
+        image_differ = ImageDiffer(port)
+        self.assertEqual(image_differ.diff_image(b'foo', b'bar', tolerance=0.1), ImageDiffResult(passed=True, diff_image=b'test', difference=0.05, tolerance=0.1))
+
+    def test_diff_image_failed_with_rounded_diff(self):
+        port = self.make_port()
+        port._server_process_constructor = lambda port, nm, cmd, env, crash_message=None: MockServerProcess(lines=['Content-Length: 4\n', 'test', 'diff: 0.101234%\n', '#EOF\n'])
+        image_differ = ImageDiffer(port)
+        self.assertEqual(image_differ.diff_image(b'foo', b'bar', tolerance=0.1), ImageDiffResult(passed=False, diff_image=b'test', difference=0.1, tolerance=0.1))
+
     def test_diff_image_failed(self):
         port = self.make_port()
-        port._server_process_constructor = lambda port, nm, cmd, env, crash_message=None: MockServerProcess(lines=['Content-Length: 4\n', 'test', 'diff: 100% failed\n', '#EOF\n'])
+        port._server_process_constructor = lambda port, nm, cmd, env, crash_message=None: MockServerProcess(lines=['Content-Length: 4\n', 'test', 'diff: 10%\n', '#EOF\n'])
         image_differ = ImageDiffer(port)
-        self.assertEqual(image_differ.diff_image(b'foo', b'bar', tolerance=0.1), ImageDiffResult(passed=False, diff_image=b'test', difference=100.0, tolerance=0.1))
+        self.assertEqual(image_differ.diff_image(b'foo', b'bar', tolerance=0.1), ImageDiffResult(passed=False, diff_image=b'test', difference=10, tolerance=0.1))
 
     def test_diff_image_crashed(self):
         port = self.make_port()
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to