diff --git a/main.go b/main.go index 709da74..ab60858 100644 --- a/main.go +++ b/main.go @@ -126,20 +126,20 @@ func (c *RGB) to_hsv() *HSV { h = 0.0 if min != v { if v == r { - h = math.Mod((g - b) / C, 6.0) + h = math.Mod((g-b)/C, 6.0) } if v == g { - h = (b - r) / C + 2.0 + h = (b-r)/C + 2.0 } if v == b { - h = (r - g) / C + 4.0 + h = (r-g)/C + 4.0 } h *= 60.0 if h < 0.0 { h += 360.0 } } - return f2hsv(h, s, v) + return f2hsv(h, s, v) } func (c *HSV) to_rgb() *RGB { @@ -189,10 +189,18 @@ func (c *RGB) brighterOrDarkerThan(ref RGB, delta uint8) string { } func (c *RGB) darkerThan(ref RGB, delta uint8) string { - /* XXX FIXME: THIS IS NOT CORRECT. The original implementation does darkening in HSV space. - * cf. https://github.com/DiceBear/avatars/blob/master/packages/avatars/src/color.ts - */ - return fmt.Sprintf("#%02x%02x%02x", sub255(c.r, delta), sub255(c.g, delta), sub255(c.b, delta)) + primary := c.to_hsv() + secondary := ref.to_hsv() + delta_f := float64(delta) * 1.0 / 255.0 + if primary.v <= secondary.v-delta_f { + return fmt.Sprintf("#%02x%02x%02x", c.r, c.g, c.b) + } + primary.v = secondary.v - delta_f + if primary.v < 0 { + primary.v = 0 + } + c = primary.to_rgb() + return fmt.Sprintf("#%02x%02x%02x", c.r, c.g, c.b) } func (c RGB) withAlpha(alpha float64) string {