⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 284878 in webkit


Ignore:
Timestamp:
Oct 26, 2021, 10:39:19 AM (5 years ago)
Author:
Simon Fraser
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):

Location:
trunk/Tools
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Tools/ChangeLog

    r284875 r284878  
     12021-10-26  Simon Fraser  <simon.fraser@apple.com>
     2
     3        The script should decide when an image diff cases, not ImageDiff
     4        https://bugs.webkit.org/show_bug.cgi?id=232225
     5
     6        Reviewed by Martin Robinson.
     7
     8        Rather than have ImageDiff decide if the comparison passes or fails (with some built-in
     9        tolerance), have it just print the percentage difference, and have the script compare it
     10        against the tolerance.
     11
     12        Code to prettify diff_percent is moved into the script (but should eventually
     13        move closer to display time).
     14
     15        * ImageDiff/ImageDiff.cpp:
     16        (processImages):
     17        * Scripts/webkitpy/port/image_diff.py:
     18        (ImageDiffer._read):
     19        * Scripts/webkitpy/port/port_testcase.py:
     20        (PortTestCase.test_diff_image.make_proc):
     21        (PortTestCase.test_diff_image_passed):
     22        (PortTestCase):
     23        (PortTestCase.test_diff_image_passed_with_tolerance):
     24        (PortTestCase.test_diff_image_failed_with_rounded_diff):
     25        (PortTestCase.test_diff_image_failed):
     26
    1272021-10-26  Kate Cheney  <katherine_cheney@apple.com>
    228
  • trunk/Tools/ImageDiff/ImageDiff.cpp

    r284870 r284878  
    6666    PlatformImage::Difference differenceData = { 100, 0, 0 };
    6767    auto diffImage = actualImage->difference(*baselineImage, differenceData);
    68     float legacyDifference = differenceData.percentageDifference;
    69     if (legacyDifference <= tolerance)
    70         legacyDifference = 0.0f;
    71     else {
    72         legacyDifference = roundf(legacyDifference * 100.0f) / 100.0f;
    73         legacyDifference = std::max<float>(legacyDifference, 0.01f); // round to 2 decimal places
    74     }
    75 
    7668    if (diffImage)
    7769        diffImage->writeAsPNGToStdout();
    7870
    79     if (legacyDifference > 0.0f) {
    80         fprintf(stdout, "diff: %01.2f%% failed\n", legacyDifference);
    81     } else
    82         fprintf(stdout, "diff: %01.2f%% passed\n", legacyDifference);
     71    fprintf(stdout, "diff: %01.8f%%\n", differenceData.percentageDifference);
    8372
    8473    if (printDifference)
  • trunk/Tools/Scripts/webkitpy/port/image_diff.py

    r284870 r284878  
    130130            err_str += "ImageDiff crashed\n"
    131131
    132         diff_percent = 0
    133         if diff_output:
    134             m = re.match(b'diff: (.+)% (passed|failed)', diff_output)
    135             if m.group(2) == b'passed':
    136                 return ImageDiffResult(passed=True, diff_image=output_image, difference=0)
    137             diff_percent = float(string_utils.decode(m.group(1), target_type=str))
     132        if not diff_output:
     133            return ImageDiffResult(passed=False, diff_image=None, difference=0, tolerance=self._tolerance, error_string=err_str or "Failed to read ImageDiff output")
    138134
    139         return ImageDiffResult(passed=False, diff_image=output_image, difference=diff_percent, tolerance=self._tolerance, error_string=err_str or None)
     135        m = re.match(b'diff: (.+)%', diff_output)
     136        if not m:
     137            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)
     138
     139        diff_percent = float(string_utils.decode(m.group(1), target_type=str))
     140
     141        passed = diff_percent <= self._tolerance
     142        if not passed:
     143            # FIXME: This prettification should happen at display time.
     144            diff_percent = round(diff_percent * 100) / 100
     145            diff_percent = max(diff_percent, 0.01)
     146
     147        return ImageDiffResult(passed=passed, diff_image=output_image, difference=diff_percent, tolerance=self._tolerance, error_string=err_str or None)
    140148
    141149    def stop(self):
  • trunk/Tools/Scripts/webkitpy/port/port_testcase.py

    r284870 r284878  
    285285
    286286        def make_proc(port, nm, cmd, env, crash_message=None):
    287             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'])
     287            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'])
    288288            return self.proc
    289289
     
    326326    def test_diff_image_passed(self):
    327327        port = self.make_port()
    328         port._server_process_constructor = lambda port, nm, cmd, env, crash_message=None: MockServerProcess(lines=['diff: 0% passed\n', '#EOF\n'])
     328        port._server_process_constructor = lambda port, nm, cmd, env, crash_message=None: MockServerProcess(lines=['diff: 0%\n', '#EOF\n'])
    329329        image_differ = ImageDiffer(port)
    330         self.assertEqual(image_differ.diff_image(b'foo', b'bar', tolerance=0.1), ImageDiffResult(passed=True, diff_image=None, difference=0))
     330        self.assertEqual(image_differ.diff_image(b'foo', b'foo', tolerance=0), ImageDiffResult(passed=True, diff_image=None, difference=0, tolerance=0))
     331
     332    def test_diff_image_passed_with_tolerance(self):
     333        port = self.make_port()
     334        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'])
     335        image_differ = ImageDiffer(port)
     336        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))
     337
     338    def test_diff_image_failed_with_rounded_diff(self):
     339        port = self.make_port()
     340        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'])
     341        image_differ = ImageDiffer(port)
     342        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))
    331343
    332344    def test_diff_image_failed(self):
    333345        port = self.make_port()
    334         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'])
     346        port._server_process_constructor = lambda port, nm, cmd, env, crash_message=None: MockServerProcess(lines=['Content-Length: 4\n', 'test', 'diff: 10%\n', '#EOF\n'])
    335347        image_differ = ImageDiffer(port)
    336         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))
     348        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))
    337349
    338350    def test_diff_image_crashed(self):
Note: See TracChangeset for help on using the changeset viewer.