Skip to content

Commit

Permalink
[3.12] gh-106498: Revert incorrect colorsys.rgb_to_hls change (GH-106627
Browse files Browse the repository at this point in the history
) (#106632)

gh-106498: Revert incorrect colorsys.rgb_to_hls change (GH-106627)

gh-86618 assumed a-b-c = a-(b+c) = a-d where d = b+d.
For floats 2.0, 1.0, and 0.9999999999999999, this assumption
is false.  The net change of 1.1102230246251565e-16 to 0.0
results in division by 0.  Revert the replacement.  Add test.
(cherry picked from commit a2d54d4)

Co-authored-by: Terry Jan Reedy <tjreedy@udel.edu>
  • Loading branch information
miss-islington and terryjreedy committed Jul 11, 2023
1 parent 6968f9e commit c594e25
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 1 deletion.
2 changes: 1 addition & 1 deletion Lib/colorsys.py
Expand Up @@ -83,7 +83,7 @@ def rgb_to_hls(r, g, b):
if l <= 0.5:
s = rangec / sumc
else:
s = rangec / (2.0-sumc)
s = rangec / (2.0-maxc-minc) # Not always 2.0-sumc: gh-106498.
rc = (maxc-r) / rangec
gc = (maxc-g) / rangec
bc = (maxc-b) / rangec
Expand Down
10 changes: 10 additions & 0 deletions Lib/test/test_colorsys.py
Expand Up @@ -69,6 +69,16 @@ def test_hls_values(self):
self.assertTripleEqual(hls, colorsys.rgb_to_hls(*rgb))
self.assertTripleEqual(rgb, colorsys.hls_to_rgb(*hls))

def test_hls_nearwhite(self): # gh-106498
values = (
# rgb, hls: these do not work in reverse
((0.9999999999999999, 1, 1), (0.5, 1.0, 1.0)),
((1, 0.9999999999999999, 0.9999999999999999), (0.0, 1.0, 1.0)),
)
for rgb, hls in values:
self.assertTripleEqual(hls, colorsys.rgb_to_hls(*rgb))
self.assertTripleEqual((1.0, 1.0, 1.0), colorsys.hls_to_rgb(*hls))

def test_yiq_roundtrip(self):
for r in frange(0.0, 1.0, 0.2):
for g in frange(0.0, 1.0, 0.2):
Expand Down
@@ -0,0 +1,2 @@
Revert a change to :func:`colorsys.rgb_to_hls` that caused division by zero
for certain almost-white inputs. Patch by Terry Jan Reedy.

0 comments on commit c594e25

Please sign in to comment.