From 721c13c4c6d68fffc2b798161bb2c9fe6fbc26c7 Mon Sep 17 00:00:00 2001 From: "Amy G. Dalin" Date: Mon, 17 Feb 2025 01:23:46 -0500 Subject: [PATCH] Add a dedicated FromColor function, as I found using the ColorModel cumbersome. --- oklab.go | 41 ++++++++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/oklab.go b/oklab.go index 8f47fc9..e17f9e0 100644 --- a/oklab.go +++ b/oklab.go @@ -106,6 +106,29 @@ func FromRGBA(r, g, b, a uint32) Color { return FromNRGBA(r, g, b, a) } +// FromColor converts an arbitrary color type to an OKLab [Color], with special handling +// for [color.NRGBA], [color.NRGBA64], and anything implementing the [NRGBAColor] interface +// to preserve transparent colors. +func FromColor(c color.Color) Color { + switch c := c.(type) { + case Color: + return c + + // Special handling for [color.NRGBA] and [color.NRGBA64] + case color.NRGBA: + return FromNRGBA(uint32(c.R)*0x101, uint32(c.G)*0x101, uint32(c.B)*0x101, uint32(c.A)*0x101) + + case color.NRGBA64: + return FromNRGBA(uint32(c.R), uint32(c.G), uint32(c.B), uint32(c.A)) + + case NRGBAColor: + return FromNRGBA(c.NRGBA()) + + default: + return FromRGBA(c.RGBA()) + } +} + func cube(v float64) float64 { return v * v * v } @@ -158,23 +181,7 @@ type NRGBAColor interface { } func okLabModel(c color.Color) color.Color { - switch c := c.(type) { - case Color: - return c - - // Special handling for color.NRGBA and color.NRGBA64 - case color.NRGBA: - return FromNRGBA(uint32(c.R)*0x101, uint32(c.G)*0x101, uint32(c.B)*0x101, uint32(c.A)*0x101) - - case color.NRGBA64: - return FromNRGBA(uint32(c.R), uint32(c.G), uint32(c.B), uint32(c.A)) - - case NRGBAColor: - return FromNRGBA(c.NRGBA()) - - default: - return FromRGBA(c.RGBA()) - } + return FromColor(c) } var (