| // 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) } |