Add a dedicated FromColor function, as I found using the ColorModel cumbersome.
This commit is contained in:
		
							
								
								
									
										41
									
								
								oklab.go
									
									
									
									
									
								
							
							
						
						
									
										41
									
								
								oklab.go
									
									
									
									
									
								
							| @ -106,6 +106,29 @@ func FromRGBA(r, g, b, a uint32) Color { | |||||||
| 	return FromNRGBA(r, g, b, a) | 	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 { | func cube(v float64) float64 { | ||||||
| 	return v * v * v | 	return v * v * v | ||||||
| } | } | ||||||
| @ -158,23 +181,7 @@ type NRGBAColor interface { | |||||||
| } | } | ||||||
|  |  | ||||||
| func okLabModel(c color.Color) color.Color { | func okLabModel(c color.Color) color.Color { | ||||||
| 	switch c := c.(type) { | 	return FromColor(c) | ||||||
| 	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()) |  | ||||||
| 	} |  | ||||||
| } | } | ||||||
|  |  | ||||||
| var ( | var ( | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user