blob: 1ebb3a21b03699ac1bfb3563e866648f4fe33466 [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) }