Add a dedicated FromColor function, as I found using the ColorModel cumbersome.

This commit is contained in:
Amy G. Dalin 2025-02-17 01:23:46 -05:00
parent 0414ffd8b9
commit 721c13c4c6

View File

@ -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 (