blob: f0e7597092b2307ef253e7976b66ffb1947d36f0 [file] [log] [blame]
// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package draw
import "image"
// A Color represents a color with 8-bit R, G, B, and A values,
// packed into a uint32—0xRRGGBBAA—so that comparison
// is defined on colors.
// Color implements image.Color.
// Color also implements image.Image: it is a
// 10⁹x10⁹-pixel image of uniform color.
type Color uint32
// Check that Color implements image.Color and image.Image
var _ image.Color = Black
var _ image.Image = Black
var (
Opaque Color = 0xFFFFFFFF
Transparent Color = 0x00000000
Black Color = 0x000000FF
White Color = 0xFFFFFFFF
Red Color = 0xFF0000FF
Green Color = 0x00FF00FF
Blue Color = 0x0000FFFF
Cyan Color = 0x00FFFFFF
Magenta Color = 0xFF00FFFF
Yellow Color = 0xFFFF00FF
PaleYellow Color = 0xFFFFAAFF
DarkYellow Color = 0xEEEE9EFF
DarkGreen Color = 0x448844FF
PaleGreen Color = 0xAAFFAAFF
MedGreen Color = 0x88CC88FF
DarkBlue Color = 0x000055FF
PaleBlueGreen Color = 0xAAFFFFFF
PaleBlue Color = 0x0000BBFF
BlueGreen Color = 0x008888FF
GreyGreen Color = 0x55AAAAFF
PaleGreyGreen Color = 0x9EEEEEFF
YellowGreen Color = 0x99994CFF
MedBlue Color = 0x000099FF
GreyBlue Color = 0x005DBBFF
PaleGreyBlue Color = 0x4993DDFF
PurpleBlue Color = 0x8888CCFF
)
func (c Color) RGBA() (r, g, b, a uint32) {
x := uint32(c)
r, g, b, a = x>>24, (x>>16)&0xFF, (x>>8)&0xFF, x&0xFF
r |= r << 8
r |= r << 16
g |= g << 8
g |= g << 16
b |= b << 8
b |= b << 16
a |= a << 8
a |= a << 16
return
}
// SetAlpha returns the color obtained by changing
// c's alpha value to a and scaling r, g, and b appropriately.
func (c Color) SetAlpha(a uint8) Color {
r, g, b, oa := c>>24, (c>>16)&0xFF, (c>>8)&0xFF, c&0xFF
if oa == 0 {
return 0
}
r = r * Color(a) / oa
if r < 0 {
r = 0
}
if r > 0xFF {
r = 0xFF
}
g = g * Color(a) / oa
if g < 0 {
g = 0
}
if g > 0xFF {
g = 0xFF
}
b = b * Color(a) / oa
if b < 0 {
b = 0
}
if b > 0xFF {
b = 0xFF
}
return r<<24 | g<<16 | b<<8 | Color(a)
}
func (c Color) Width() int { return 1e9 }
func (c Color) Height() int { return 1e9 }
func (c Color) At(x, y int) image.Color { return c }
func toColor(color image.Color) image.Color {
if c, ok := color.(Color); ok {
return c
}
r, g, b, a := color.RGBA()
return Color(r>>24<<24 | g>>24<<16 | b>>24<<8 | a>>24)
}
func (c Color) ColorModel() image.ColorModel { return image.ColorModelFunc(toColor) }