diff options
author | Nigel Tao <nigeltao@golang.org> | 2010-06-16 12:36:07 +1000 |
---|---|---|
committer | Nigel Tao <nigeltao@golang.org> | 2010-06-16 12:36:07 +1000 |
commit | ef94456c9bf7a350dc3fa761cf149c35904653c6 (patch) | |
tree | f5179d42e8e664605796716f1c9ad09dff425a6f /src | |
parent | 7a83d6000e6eb6dff5426b6b55ab9533d8880be0 (diff) | |
download | golang-ef94456c9bf7a350dc3fa761cf149c35904653c6.tar.gz |
image: add an Alpha16 type, for completeness.
R=rsc
CC=golang-dev, rog
http://codereview.appspot.com/1707042
Diffstat (limited to 'src')
-rw-r--r-- | src/pkg/image/color.go | 21 | ||||
-rw-r--r-- | src/pkg/image/image.go | 48 |
2 files changed, 69 insertions, 0 deletions
diff --git a/src/pkg/image/color.go b/src/pkg/image/color.go index c17ffc389..8a865a8a0 100644 --- a/src/pkg/image/color.go +++ b/src/pkg/image/color.go @@ -93,6 +93,16 @@ func (c AlphaColor) RGBA() (r, g, b, a uint32) { return a, a, a, a } +// An Alpha16Color represents a 16-bit alpha. +type Alpha16Color struct { + A uint16 +} + +func (c Alpha16Color) RGBA() (r, g, b, a uint32) { + a = uint32(c.A) + return a, a, a, a +} + // A ColorModel can convert foreign Colors, with a possible loss of precision, // to a Color from its own color model. type ColorModel interface { @@ -169,6 +179,14 @@ func toAlphaColor(c Color) Color { return AlphaColor{uint8(a >> 8)} } +func toAlpha16Color(c Color) Color { + if _, ok := c.(Alpha16Color); ok { + return c + } + _, _, _, a := c.RGBA() + return Alpha16Color{uint16(a)} +} + // The ColorModel associated with RGBAColor. var RGBAColorModel ColorModel = ColorModelFunc(toRGBAColor) @@ -183,3 +201,6 @@ var NRGBA64ColorModel ColorModel = ColorModelFunc(toNRGBA64Color) // The ColorModel associated with AlphaColor. var AlphaColorModel ColorModel = ColorModelFunc(toAlphaColor) + +// The ColorModel associated with Alpha16Color. +var Alpha16ColorModel ColorModel = ColorModelFunc(toAlpha16Color) diff --git a/src/pkg/image/image.go b/src/pkg/image/image.go index ba2c986a4..decf1ce43 100644 --- a/src/pkg/image/image.go +++ b/src/pkg/image/image.go @@ -255,6 +255,54 @@ func NewAlpha(w, h int) *Alpha { return &Alpha{pix} } +// An Alpha16 is an in-memory image backed by a 2-D slice of Alpha16Color values. +type Alpha16 struct { + // The Pixel field's indices are y first, then x, so that At(x, y) == Pixel[y][x]. + Pixel [][]Alpha16Color +} + +func (p *Alpha16) ColorModel() ColorModel { return Alpha16ColorModel } + +func (p *Alpha16) Width() int { + if len(p.Pixel) == 0 { + return 0 + } + return len(p.Pixel[0]) +} + +func (p *Alpha16) Height() int { return len(p.Pixel) } + +func (p *Alpha16) At(x, y int) Color { return p.Pixel[y][x] } + +func (p *Alpha16) Set(x, y int, c Color) { p.Pixel[y][x] = toAlpha16Color(c).(Alpha16Color) } + +// Opaque scans the entire image and returns whether or not it is fully opaque. +func (p *Alpha16) Opaque() bool { + h := len(p.Pixel) + if h > 0 { + w := len(p.Pixel[0]) + for y := 0; y < h; y++ { + pix := p.Pixel[y] + for x := 0; x < w; x++ { + if pix[x].A != 0xffff { + return false + } + } + } + } + return true +} + +// NewAlpha16 returns a new Alpha16 with the given width and height. +func NewAlpha16(w, h int) *Alpha16 { + buf := make([]Alpha16Color, w*h) + pix := make([][]Alpha16Color, h) + for y := range pix { + pix[y] = buf[w*y : w*(y+1)] + } + return &Alpha16{pix} +} + // A PalettedColorModel represents a fixed palette of colors. type PalettedColorModel []Color |