New year, more Palette!
For those who aren’t familiar with it, Palette is a Rust library for working with colors, including color conversion and color management. Its features range from common tasks, like color blending or converting HSL to RGB, to more advanced topics. It leverages Rust’s type system, by encoding color space information as type parameters, to be able to prevent mistakes and to keep it open to extension and customization.
alloc Cargo feature has been added for the parts that make user of allocating types (i.e.
Vec<T>). This used to be part of the
std feature, but separating it makes it possible to use these types without requiring the whole
std library. Those who already have
std enabled will get both, so there’s no need to do anything in that case. The parts that still require
Error trait implementations.
std will also provide floating point operations, but
libm can be used instead.
More Color Difference Traits
This version adds the
DeltaE trait (not to be confused with
Ciede2000), which represents the “default” ΔE color distance formula for a color space. This is the formula that is specified in the specification or research paper that introduced the color space, and is usually an alias for
EuclideanDistance. There may be better options, but this is the “original” for those that have one.
In addition to
DeltaE, two other traits are added. These are
ImprovedCiede2000, representing modified versions of
Ciede2000, according to Power functions improving the performance of color-difference formulas by Huang et al. These add a power function, fine tuned for each formula, to make their results better on average. It’s a more costly option, but may be worth it for the increased accuracy.
It was previously possible to parse a hexadecimal string as
Rgb<_, u8>. Now it’s also possible to parse it with an alpha channel, thanks to rafaelbeckel.
let rgba_from_hex: Srgba<u8> = "#f034e652".parse().unwrap(); // #RRGGBBAA
This also supports the shorter
#RGBA format and the
# is optional on both cases.
The documentation had been updated with some more introductory info, quick links at the top of the main page, and a number of small usage examples for
Rgb. The hope is that this will be helpful for those who are new to the library and make it easier to get started with the most common parts. More color types will get similar examples later, but this is a start.
A typo in the documentation for the
Stimulus trait was also kindly fixed by MultisampledNight.
There were a couple of cases where conversion from
Okhsl could return
NaN values. Particularly if the
b is something other than
0.0. This has been fixed and only actual numbers should be returned now.
NaN values are usually considered bugs, so any reports of them are appreciated.
The internals of the crate have been refactored to reduce some repetition, with the help of macros. Palette has been using macros for this for quite a while, since a lot of the traits have very similar implementations across the color types, but it was time for another round of macrofication. It’s nice to be able to delete around 2000 lines.
As part of this, the equality check for
Hwb has been changed to always take the hue into account. This brings it in line with all the other hue based color spaces, which should have been done long ago.
Hwb is an odd color space, compared to the rest, so it didn’t fit into most of the earlier macros. Nowadays, it’s joined by
Okhwb, and the incentive to add macros for both of them was higher. This mistake was found while unifying their implementations.
This shouldn’t affect anyone, unless you happen to rely on
Hwb for color comparison. In that case, it’s strongly recommended to use a color space without hue, to consider the traits from the
color_difference module, or to implement your own equality check.
I want to give a big thank you to everyone who contributed or took part in discussions. Your help is always appreciated!
Thank you for reading!