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()