]> Cypherpunks repositories - gostls13.git/commitdiff
New image.A type, to represent anti-aliased font glyphs.
authorNigel Tao <nigeltao@golang.org>
Tue, 2 Feb 2010 07:38:04 +0000 (18:38 +1100)
committerNigel Tao <nigeltao@golang.org>
Tue, 2 Feb 2010 07:38:04 +0000 (18:38 +1100)
R=r, rsc
CC=golang-dev
https://golang.org/cl/199052

src/pkg/image/color.go
src/pkg/image/image.go

index 8594ac538bc6f6b19c1483c73830955be8a608a8..31ba59280f4a98da8122a2ecfabb90585430bd3c 100644 (file)
@@ -100,6 +100,18 @@ func (c NRGBA64Color) RGBA() (r, g, b, a uint32) {
        return
 }
 
+// An AlphaColor represents an 8-bit alpha.
+type AlphaColor struct {
+       A uint8
+}
+
+func (c AlphaColor) RGBA() (r, g, b, a uint32) {
+       a = uint32(c.A)
+       a |= a << 8
+       a |= a << 16
+       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 {
@@ -176,6 +188,14 @@ func toNRGBA64Color(c Color) Color {
        return NRGBA64Color{uint16(r), uint16(g), uint16(b), uint16(a)}
 }
 
+func toAlphaColor(c Color) Color {
+       if _, ok := c.(AlphaColor); ok { // no-op conversion
+               return c
+       }
+       _, _, _, a := c.RGBA()
+       return AlphaColor{uint8(a >> 24)}
+}
+
 // The ColorModel associated with RGBAColor.
 var RGBAColorModel ColorModel = ColorModelFunc(toRGBAColor)
 
@@ -187,3 +207,6 @@ var NRGBAColorModel ColorModel = ColorModelFunc(toNRGBAColor)
 
 // The ColorModel associated with NRGBA64Color.
 var NRGBA64ColorModel ColorModel = ColorModelFunc(toNRGBA64Color)
+
+// The ColorModel associated with AlphaColor.
+var AlphaColorModel ColorModel = ColorModelFunc(toAlphaColor)
index b350944187a39ca87a566cd90661b4b97f481e56..5c98f64d76ca041a25cf7d1a4f334cadbf305472 100644 (file)
@@ -135,6 +135,36 @@ func NewNRGBA64(w, h int) *NRGBA64 {
        return &NRGBA64{pixel}
 }
 
+// An Alpha is an in-memory image backed by a 2-D slice of AlphaColor values.
+type Alpha struct {
+       // The Pixel field's indices are y first, then x, so that At(x, y) == Pixel[y][x].
+       Pixel [][]AlphaColor
+}
+
+func (p *Alpha) ColorModel() ColorModel { return AlphaColorModel }
+
+func (p *Alpha) Width() int {
+       if len(p.Pixel) == 0 {
+               return 0
+       }
+       return len(p.Pixel[0])
+}
+
+func (p *Alpha) Height() int { return len(p.Pixel) }
+
+func (p *Alpha) At(x, y int) Color { return p.Pixel[y][x] }
+
+func (p *Alpha) Set(x, y int, c Color) { p.Pixel[y][x] = toAlphaColor(c).(AlphaColor) }
+
+// NewAlpha returns a new Alpha with the given width and height.
+func NewAlpha(w, h int) *Alpha {
+       pixel := make([][]AlphaColor, h)
+       for y := 0; y < h; y++ {
+               pixel[y] = make([]AlphaColor, w)
+       }
+       return &Alpha{pixel}
+}
+
 // A PalettedColorModel represents a fixed palette of colors.
 type PalettedColorModel []Color