The RGB->HSV->RGB conversion Color::light() and Color::dark() do is an overkill. I don't think those functions are hot but what they do can be described and implemented in simpler terms.

Created attachment 14683 [details] Simpler implementation

Created attachment 14684 [details] Simpler implementation

Comment on attachment 14684 [details] Simpler implementation Does this really give the same values as before? If so, seems fine. But I was under the impression that scaling value didn't affect the 3 channels equally. I don't think dark() properly handles the case where all three of r, g, and b are zero. So review- because of that. Otherwise, would be r=me.

Comment on attachment 14684 [details] Simpler implementation (In reply to comment #3) > (From update of attachment 14684 [details] [edit]) > Does this really give the same values as before? If so, seems fine. But I was > under the impression that scaling value didn't affect the 3 channels equally. If you look at convertHSVToRGB() you'll see that its result can be expressed as "v times some vector x whose components do not depend on v", so indeed for given h and s components, scaling v affects the 3 channels equally. (IIRC in the HSL space, L doesn't affect all channels equally, since L=1.0 maps to white). > I don't think dark() properly handles the case where all three of r, g, and b > are zero. I verified that in that case (v - 0.33f) / v is -inf and therefore the multiplier is 0, so the result is <0,0,0,alpha>, which is what I would expect.

Comment on attachment 14684 [details] Simpler implementation r=me

Landed in r21798.