package image
type Color interface {
RGBA() (r, g, b, a uint32)
}
type RGBAColor struct {
R, G, B, A uint8
}
func (c RGBAColor) RGBA() (r, g, b, a uint32) {
r = uint32(c.R)
r |= r << 8
g = uint32(c.G)
g |= g << 8
b = uint32(c.B)
b |= b << 8
a = uint32(c.A)
a |= a << 8
return
}
type RGBA64Color struct {
R, G, B, A uint16
}
func (c RGBA64Color) RGBA() (r, g, b, a uint32) {
return uint32(c.R), uint32(c.G), uint32(c.B), uint32(c.A)
}
type NRGBAColor struct {
R, G, B, A uint8
}
func (c NRGBAColor) RGBA() (r, g, b, a uint32) {
r = uint32(c.R)
r |= r << 8
r *= uint32(c.A)
r /= 0xff
g = uint32(c.G)
g |= g << 8
g *= uint32(c.A)
g /= 0xff
b = uint32(c.B)
b |= b << 8
b *= uint32(c.A)
b /= 0xff
a = uint32(c.A)
a |= a << 8
return
}
type NRGBA64Color struct {
R, G, B, A uint16
}
func (c NRGBA64Color) RGBA() (r, g, b, a uint32) {
r = uint32(c.R)
r *= uint32(c.A)
r /= 0xffff
g = uint32(c.G)
g *= uint32(c.A)
g /= 0xffff
b = uint32(c.B)
b *= uint32(c.A)
b /= 0xffff
a = uint32(c.A)
return
}
type AlphaColor struct {
A uint8
}
func (c AlphaColor) RGBA() (r, g, b, a uint32) {
a = uint32(c.A)
a |= a << 8
return a, a, a, a
}
type Alpha16Color struct {
A uint16
}
func (c Alpha16Color) RGBA() (r, g, b, a uint32) {
a = uint32(c.A)
return a, a, a, a
}
type ColorModel interface {
Convert(c Color) Color
}
type ColorModelFunc func(Color) Color
func (f ColorModelFunc) Convert(c Color) Color {
return f(c)
}
func toRGBAColor(c Color) Color {
if _, ok := c.(RGBAColor); ok {
return c
}
r, g, b, a := c.RGBA()
return RGBAColor{uint8(r >> 8), uint8(g >> 8), uint8(b >> 8), uint8(a >> 8)}
}
func toRGBA64Color(c Color) Color {
if _, ok := c.(RGBA64Color); ok {
return c
}
r, g, b, a := c.RGBA()
return RGBA64Color{uint16(r), uint16(g), uint16(b), uint16(a)}
}
func toNRGBAColor(c Color) Color {
if _, ok := c.(NRGBAColor); ok {
return c
}
r, g, b, a := c.RGBA()
if a == 0xffff {
return NRGBAColor{uint8(r >> 8), uint8(g >> 8), uint8(b >> 8), 0xff}
}
if a == 0 {
return NRGBAColor{0, 0, 0, 0}
}
r = (r * 0xffff) / a
g = (g * 0xffff) / a
b = (b * 0xffff) / a
return NRGBAColor{uint8(r >> 8), uint8(g >> 8), uint8(b >> 8), uint8(a >> 8)}
}
func toNRGBA64Color(c Color) Color {
if _, ok := c.(NRGBA64Color); ok {
return c
}
r, g, b, a := c.RGBA()
if a == 0xffff {
return NRGBA64Color{uint16(r), uint16(g), uint16(b), 0xffff}
}
if a == 0 {
return NRGBA64Color{0, 0, 0, 0}
}
r = (r * 0xffff) / a
g = (g * 0xffff) / a
b = (b * 0xffff) / a
return NRGBA64Color{uint16(r), uint16(g), uint16(b), uint16(a)}
}
func toAlphaColor(c Color) Color {
if _, ok := c.(AlphaColor); ok {
return c
}
_, _, _, a := c.RGBA()
return AlphaColor{uint8(a >> 8)}
}
func toAlpha16Color(c Color) Color {
if _, ok := c.(Alpha16Color); ok {
return c
}
_, _, _, a := c.RGBA()
return Alpha16Color{uint16(a)}
}
var RGBAColorModel ColorModel = ColorModelFunc(toRGBAColor)
var RGBA64ColorModel ColorModel = ColorModelFunc(toRGBA64Color)
var NRGBAColorModel ColorModel = ColorModelFunc(toNRGBAColor)
var NRGBA64ColorModel ColorModel = ColorModelFunc(toNRGBA64Color)
var AlphaColorModel ColorModel = ColorModelFunc(toAlphaColor)
var Alpha16ColorModel ColorModel = ColorModelFunc(toAlpha16Color)