HCY Adjuster Keys and Floating Swatch Preview

https://github.com/mypaint/mypaint/pull/853

Changed the color adjuster step-size to change based on how fast you press the buttons. You can get very gradual gradients by waiting a bit more between each adjustment. It can take some practice to get used to it:

This has been marked a TODO item for a long time, so I took a stab at it. We have the HCY wheel and the HCY component sliders, but the real-time adjusters are currently HSV, while HCY might be more useful for most artists.

HCY gives you a much more useful and natural way to shift your brush color properites. I think it follows the intent of the traditional artist more closely. According to Wikipedia “Colors of the same hue and lightness, but of different saturation, are called tones.” So when we adjust saturation (C) with HCY, it seems we are getting tones. This is pretty cool, as it doesn’t seem possible to get tones from HSV adjusters. Likewise, with HCY, we can get tints and shades by adjusting the Lightness (Y), which is also not possible with HSV (rather, you can only get shades). In the demo below I failed to show that with HCY the Y scale goes from White to Black (all tints and shades), whereas HSV lightness is much more narrow (only Shades)

Left column is HCY, Right column is HSV
Hue Shift
Chroma/Saturation shift
Luma/Value shift

I’m also experimenting with splashing the new adjusted color up on the screen as a color swatch. This could make it easier to choose colors since the new color will appear wherever you want, so you can see it in context with the colors on the canvas:

Here’s a better demo that tries to show how useful it can be to splash the adjusted color onto the canvas as an overlay:

Here’s a couple examples of how handy the color swatch splash can be in conjunction with the dynamic time-based step size on the adjusters. I didn’t get a perfect match, but I was able to hone in on the colors of these objects pretty quickly, and if you notice, the light source is to the left so there is a gradient as well.


I’ve sorta switched gears and moving towards using CIECAM for adjuster keys and channel-picking, which gives us the same ideas with using HCY as far as equal luminance, etc, but it is extremely accurate and lets us do some other cool things like account for our light source (D65, D50, A, etc).

From top to bottom we have RGB, HSV, HCY, and CIECAM (JCh).
image

By changing the light source from D65 (left) to “Illuminant A”, (right), you can do some spiffy real-time gradients. These are both pure blue hue, but desaturated and lightened as they go down. This illustrates what happens when your light source is a very warm light.

Well that was a pack of lies. The hue shift there into the violet was the result of clipping values that exceeded 1.0. Ultimately moving to a data model that allows scene-referred float rgb values will be ideal (w/ opencolorio to manage the displaying of that data). For now I’ve implemented gamut mapping (within ciecam color model) using a scipy optimizer to keep colors within display-referred range. Here’s what it SHOULD look like to to go from blue—>achromatic (warm light source). I didn’t bother making the steps blended, but you get the idea: