cosmic::cosmic_theme::palette

Module rgb

source
Expand description

Types for the RGB color space, including spaces and standards.

§Linear And Non-linear RGB

Colors in images are often “gamma corrected”, or converted using some non-linear transfer function into a format like sRGB before being stored or displayed. This is done as a compression method and to prevent banding; it’s also a bit of a legacy from the ages of the CRT monitors, where the output from the electron gun was non-linear. The problem is that these formats are non-linear color spaces, which means that many operations that you may want to perform on colors (addition, subtraction, multiplication, linear interpolation, etc.) will work unexpectedly when performed in such a non-linear color space. Thus, the compression has to be reverted to restore linearity and ensure that many operations on the colors behave as expected.

But, even when colors are ‘linear’, there is yet more to explore.

The most common way that colors are defined, especially for computer storage, is in terms of so-called tristimulus values, meaning that all colors can be represented as a vector of three values. The reason colors can generally be stored as only a three-dimensional vector, and not an N-dimensional one, where N is some number of possible wavelengths of light, is because our eyes contain only three types of cones. Each of these cones has its own sensitivity curve in response to the wavelengths of visible light, giving us three “dimensions” of sensitivity to color. These cones are often called the L, M, and S (for long, medium, and short) cones, and their sensitivity curves roughly position them as most sensitive to “red”, “green”, and “blue” parts of the spectrum. As such, we can choose only three values to represent any possible color that a human is able to see. An interesting consequence of this is that humans can see two different objects which are emitting completely different actual light spectra as the exact same perceptual color so long as those wavelengths, when transformed by the sensitivity curves of our cones, end up resulting in the same L, M, and S values sent to our brains.

A color space (which simply refers to a set of standards by which we map a set of arbitrary values to real-world colors) which uses tristimulus values is often defined in terms of

  1. Its primaries
  2. Its reference white or white point

The primaries together represent the total gamut (i.e. displayable range of colors) of that color space. The white point defines a concrete tristimulus value that corresponds to a real, physical white reflecting object being lit by a known light source and observed by the ‘standard observer’ (i.e. a standardized model of human color perception).

The informal “RGB” color space is such a tristimulus color space, since it is defined by three values, but it is underspecified since we don’t know which primaries are being used (i.e. how exactly are the canonical “red”, “green”, and “blue” defined?), nor its white point. In most cases, when people talk about “RGB” or “Linear RGB” colors, what they are actually talking about is the “Linear sRGB” color space, which uses the primaries and white point defined in the sRGB standard, but which does not have the (non-linear) sRGB transfer function applied.

Palette takes these details into account and encodes them as type parameters, with sRGB as the default. The goal is to make it easy to use colors correctly and still allow advanced users a high degree of flexibility.

Modules§

  • Channel orders for packed RGBA types.

Structs§

Enums§

  • Error type for parsing a string of hexadecimal characters to an Rgb color.

Traits§

  • Represents the red, green and blue primaries of an RGB space.
  • A set of primaries and a white point.
  • An RGB space and a transfer function.

Type Aliases§