Source code for pyface.util.color_helpers
# (C) Copyright 2005-2023 Enthought, Inc., Austin, TX
# All rights reserved.
#
# This software is provided without warranty under the terms of the BSD
# license included in LICENSE.txt and may be redistributed only under
# the conditions described in the aforementioned license. The license
# is also available online at http://www.enthought.com/licenses/BSD.txt
#
# Thanks for using Enthought open source!
""" Routines supporting color computations
Most of what is needed is provided by Python's builtin colorsys module,
but we need a few additional routines for things that are not covered by
that code.
"""
[docs]def channels_to_ints(channels, maximum=255):
""" Convert an iterable of floating point channel values to integers.
Values are rounded to the nearest integer, rather than truncated.
Parameters
----------
channels : iterable of float
An iterable of channel values, each value between 0.0 and 1.0,
inclusive.
maximum : int
The maximum value of the integer range. Common values are 15,
65535 or 255, which is the default.
Returns
-------
values : tuple of int
A tuple of values as integers between 0 and max, inclusive.
"""
return tuple(int(round(channel * maximum)) for channel in channels)
[docs]def ints_to_channels(values, maximum=255):
""" Convert an iterable of integers to floating point channel values.
Parameters
----------
values : tuple of int
An iterable of values as integers between 0 and max, inclusive.
maximum : int
The maximum value of the integer range. Common values are 15,
65535 or 255, which is the default.
Returns
-------
channels : iterable of float
A tuple of channel values, each value between 0.0 and 1.0,
inclusive.
"""
return tuple(value / maximum for value in values)
[docs]def relative_luminance(rgb):
""" The relative luminance of the color.
This value is the critical value when comparing colors for contrast when
displayed next to each other, in particular for readability of text.
Parameters
----------
rgb : tuple of red, green, blue values
A tuple of values representing red, green and blue components of
the color, as values from 0.0 to 1.0.
Returns
-------
luminance : float
The relative luminance of the color.
References
----------
Web Contrast Accessibility Guidelines
https://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef
"""
gamma_corrected = [
x/12.92 if x <= 0.03928 else ((x + 0.055)/1.055)**2.4
for x in rgb
]
luminance = (
0.2126 * gamma_corrected[0]
+ 0.7152 * gamma_corrected[1]
+ 0.0722 * gamma_corrected[2]
)
return luminance
[docs]def is_dark(rgb):
""" Is the color dark to human perception?
A color is dark if white contasts better with it according to the WC3
definition of contrast ratio. This is allows GUI code to choose either
black or white as a contrasting color for things like text on a colored
background.
Parameters
----------
rgb : tuple of red, green, blue values
A tuple of values representing red, green and blue components of
the color, as values from 0.0 to 1.0.
References
----------
Understanding Web Contrast Accessibility Guidelines
https://www.w3.org/TR/UNDERSTANDING-WCAG20/visual-audio-contrast-contrast.html#contrast-ratiodef
"""
lumininance = relative_luminance(rgb)
black_contrast = (lumininance + 0.05) / 0.05
white_contrast = 1.05 / (lumininance + 0.05)
return white_contrast > black_contrast