diff options
Diffstat (limited to 'libgo/go/image/image.go')
-rw-r--r-- | libgo/go/image/image.go | 144 |
1 files changed, 99 insertions, 45 deletions
diff --git a/libgo/go/image/image.go b/libgo/go/image/image.go index a0dd930..9dd676a 100644 --- a/libgo/go/image/image.go +++ b/libgo/go/image/image.go @@ -61,15 +61,21 @@ func (p *RGBA) At(x, y int) color.Color { if !(Point{x, y}.In(p.Rect)) { return color.RGBA{} } - i := (y-p.Rect.Min.Y)*p.Stride + (x-p.Rect.Min.X)*4 + i := p.PixOffset(x, y) return color.RGBA{p.Pix[i+0], p.Pix[i+1], p.Pix[i+2], p.Pix[i+3]} } +// PixOffset returns the index of the first element of Pix that corresponds to +// the pixel at (x, y). +func (p *RGBA) PixOffset(x, y int) int { + return (y-p.Rect.Min.Y)*p.Stride + (x-p.Rect.Min.X)*4 +} + func (p *RGBA) Set(x, y int, c color.Color) { if !(Point{x, y}.In(p.Rect)) { return } - i := (y-p.Rect.Min.Y)*p.Stride + (x-p.Rect.Min.X)*4 + i := p.PixOffset(x, y) c1 := color.RGBAModel.Convert(c).(color.RGBA) p.Pix[i+0] = c1.R p.Pix[i+1] = c1.G @@ -81,7 +87,7 @@ func (p *RGBA) SetRGBA(x, y int, c color.RGBA) { if !(Point{x, y}.In(p.Rect)) { return } - i := (y-p.Rect.Min.Y)*p.Stride + (x-p.Rect.Min.X)*4 + i := p.PixOffset(x, y) p.Pix[i+0] = c.R p.Pix[i+1] = c.G p.Pix[i+2] = c.B @@ -98,7 +104,7 @@ func (p *RGBA) SubImage(r Rectangle) Image { if r.Empty() { return &RGBA{} } - i := (r.Min.Y-p.Rect.Min.Y)*p.Stride + (r.Min.X-p.Rect.Min.X)*4 + i := p.PixOffset(r.Min.X, r.Min.Y) return &RGBA{ Pix: p.Pix[i:], Stride: p.Stride, @@ -124,7 +130,7 @@ func (p *RGBA) Opaque() bool { return true } -// NewRGBA returns a new RGBA with the given width and height. +// NewRGBA returns a new RGBA with the given bounds. func NewRGBA(r Rectangle) *RGBA { w, h := r.Dx(), r.Dy() buf := make([]uint8, 4*w*h) @@ -150,7 +156,7 @@ func (p *RGBA64) At(x, y int) color.Color { if !(Point{x, y}.In(p.Rect)) { return color.RGBA64{} } - i := (y-p.Rect.Min.Y)*p.Stride + (x-p.Rect.Min.X)*8 + i := p.PixOffset(x, y) return color.RGBA64{ uint16(p.Pix[i+0])<<8 | uint16(p.Pix[i+1]), uint16(p.Pix[i+2])<<8 | uint16(p.Pix[i+3]), @@ -159,11 +165,17 @@ func (p *RGBA64) At(x, y int) color.Color { } } +// PixOffset returns the index of the first element of Pix that corresponds to +// the pixel at (x, y). +func (p *RGBA64) PixOffset(x, y int) int { + return (y-p.Rect.Min.Y)*p.Stride + (x-p.Rect.Min.X)*8 +} + func (p *RGBA64) Set(x, y int, c color.Color) { if !(Point{x, y}.In(p.Rect)) { return } - i := (y-p.Rect.Min.Y)*p.Stride + (x-p.Rect.Min.X)*8 + i := p.PixOffset(x, y) c1 := color.RGBA64Model.Convert(c).(color.RGBA64) p.Pix[i+0] = uint8(c1.R >> 8) p.Pix[i+1] = uint8(c1.R) @@ -179,7 +191,7 @@ func (p *RGBA64) SetRGBA64(x, y int, c color.RGBA64) { if !(Point{x, y}.In(p.Rect)) { return } - i := (y-p.Rect.Min.Y)*p.Stride + (x-p.Rect.Min.X)*8 + i := p.PixOffset(x, y) p.Pix[i+0] = uint8(c.R >> 8) p.Pix[i+1] = uint8(c.R) p.Pix[i+2] = uint8(c.G >> 8) @@ -200,7 +212,7 @@ func (p *RGBA64) SubImage(r Rectangle) Image { if r.Empty() { return &RGBA64{} } - i := (r.Min.Y-p.Rect.Min.Y)*p.Stride + (r.Min.X-p.Rect.Min.X)*8 + i := p.PixOffset(r.Min.X, r.Min.Y) return &RGBA64{ Pix: p.Pix[i:], Stride: p.Stride, @@ -226,7 +238,7 @@ func (p *RGBA64) Opaque() bool { return true } -// NewRGBA64 returns a new RGBA64 with the given width and height. +// NewRGBA64 returns a new RGBA64 with the given bounds. func NewRGBA64(r Rectangle) *RGBA64 { w, h := r.Dx(), r.Dy() pix := make([]uint8, 8*w*h) @@ -252,15 +264,21 @@ func (p *NRGBA) At(x, y int) color.Color { if !(Point{x, y}.In(p.Rect)) { return color.NRGBA{} } - i := (y-p.Rect.Min.Y)*p.Stride + (x-p.Rect.Min.X)*4 + i := p.PixOffset(x, y) return color.NRGBA{p.Pix[i+0], p.Pix[i+1], p.Pix[i+2], p.Pix[i+3]} } +// PixOffset returns the index of the first element of Pix that corresponds to +// the pixel at (x, y). +func (p *NRGBA) PixOffset(x, y int) int { + return (y-p.Rect.Min.Y)*p.Stride + (x-p.Rect.Min.X)*4 +} + func (p *NRGBA) Set(x, y int, c color.Color) { if !(Point{x, y}.In(p.Rect)) { return } - i := (y-p.Rect.Min.Y)*p.Stride + (x-p.Rect.Min.X)*4 + i := p.PixOffset(x, y) c1 := color.NRGBAModel.Convert(c).(color.NRGBA) p.Pix[i+0] = c1.R p.Pix[i+1] = c1.G @@ -272,7 +290,7 @@ func (p *NRGBA) SetNRGBA(x, y int, c color.NRGBA) { if !(Point{x, y}.In(p.Rect)) { return } - i := (y-p.Rect.Min.Y)*p.Stride + (x-p.Rect.Min.X)*4 + i := p.PixOffset(x, y) p.Pix[i+0] = c.R p.Pix[i+1] = c.G p.Pix[i+2] = c.B @@ -289,7 +307,7 @@ func (p *NRGBA) SubImage(r Rectangle) Image { if r.Empty() { return &NRGBA{} } - i := (r.Min.Y-p.Rect.Min.Y)*p.Stride + (r.Min.X-p.Rect.Min.X)*4 + i := p.PixOffset(r.Min.X, r.Min.Y) return &NRGBA{ Pix: p.Pix[i:], Stride: p.Stride, @@ -315,7 +333,7 @@ func (p *NRGBA) Opaque() bool { return true } -// NewNRGBA returns a new NRGBA with the given width and height. +// NewNRGBA returns a new NRGBA with the given bounds. func NewNRGBA(r Rectangle) *NRGBA { w, h := r.Dx(), r.Dy() pix := make([]uint8, 4*w*h) @@ -341,7 +359,7 @@ func (p *NRGBA64) At(x, y int) color.Color { if !(Point{x, y}.In(p.Rect)) { return color.NRGBA64{} } - i := (y-p.Rect.Min.Y)*p.Stride + (x-p.Rect.Min.X)*8 + i := p.PixOffset(x, y) return color.NRGBA64{ uint16(p.Pix[i+0])<<8 | uint16(p.Pix[i+1]), uint16(p.Pix[i+2])<<8 | uint16(p.Pix[i+3]), @@ -350,11 +368,17 @@ func (p *NRGBA64) At(x, y int) color.Color { } } +// PixOffset returns the index of the first element of Pix that corresponds to +// the pixel at (x, y). +func (p *NRGBA64) PixOffset(x, y int) int { + return (y-p.Rect.Min.Y)*p.Stride + (x-p.Rect.Min.X)*8 +} + func (p *NRGBA64) Set(x, y int, c color.Color) { if !(Point{x, y}.In(p.Rect)) { return } - i := (y-p.Rect.Min.Y)*p.Stride + (x-p.Rect.Min.X)*8 + i := p.PixOffset(x, y) c1 := color.NRGBA64Model.Convert(c).(color.NRGBA64) p.Pix[i+0] = uint8(c1.R >> 8) p.Pix[i+1] = uint8(c1.R) @@ -370,7 +394,7 @@ func (p *NRGBA64) SetNRGBA64(x, y int, c color.NRGBA64) { if !(Point{x, y}.In(p.Rect)) { return } - i := (y-p.Rect.Min.Y)*p.Stride + (x-p.Rect.Min.X)*8 + i := p.PixOffset(x, y) p.Pix[i+0] = uint8(c.R >> 8) p.Pix[i+1] = uint8(c.R) p.Pix[i+2] = uint8(c.G >> 8) @@ -391,7 +415,7 @@ func (p *NRGBA64) SubImage(r Rectangle) Image { if r.Empty() { return &NRGBA64{} } - i := (r.Min.Y-p.Rect.Min.Y)*p.Stride + (r.Min.X-p.Rect.Min.X)*8 + i := p.PixOffset(r.Min.X, r.Min.Y) return &NRGBA64{ Pix: p.Pix[i:], Stride: p.Stride, @@ -417,7 +441,7 @@ func (p *NRGBA64) Opaque() bool { return true } -// NewNRGBA64 returns a new NRGBA64 with the given width and height. +// NewNRGBA64 returns a new NRGBA64 with the given bounds. func NewNRGBA64(r Rectangle) *NRGBA64 { w, h := r.Dx(), r.Dy() pix := make([]uint8, 8*w*h) @@ -443,15 +467,21 @@ func (p *Alpha) At(x, y int) color.Color { if !(Point{x, y}.In(p.Rect)) { return color.Alpha{} } - i := (y-p.Rect.Min.Y)*p.Stride + (x - p.Rect.Min.X) + i := p.PixOffset(x, y) return color.Alpha{p.Pix[i]} } +// PixOffset returns the index of the first element of Pix that corresponds to +// the pixel at (x, y). +func (p *Alpha) PixOffset(x, y int) int { + return (y-p.Rect.Min.Y)*p.Stride + (x-p.Rect.Min.X)*1 +} + func (p *Alpha) Set(x, y int, c color.Color) { if !(Point{x, y}.In(p.Rect)) { return } - i := (y-p.Rect.Min.Y)*p.Stride + (x - p.Rect.Min.X) + i := p.PixOffset(x, y) p.Pix[i] = color.AlphaModel.Convert(c).(color.Alpha).A } @@ -459,7 +489,7 @@ func (p *Alpha) SetAlpha(x, y int, c color.Alpha) { if !(Point{x, y}.In(p.Rect)) { return } - i := (y-p.Rect.Min.Y)*p.Stride + (x - p.Rect.Min.X) + i := p.PixOffset(x, y) p.Pix[i] = c.A } @@ -473,7 +503,7 @@ func (p *Alpha) SubImage(r Rectangle) Image { if r.Empty() { return &Alpha{} } - i := (r.Min.Y-p.Rect.Min.Y)*p.Stride + (r.Min.X-p.Rect.Min.X)*1 + i := p.PixOffset(r.Min.X, r.Min.Y) return &Alpha{ Pix: p.Pix[i:], Stride: p.Stride, @@ -499,7 +529,7 @@ func (p *Alpha) Opaque() bool { return true } -// NewAlpha returns a new Alpha with the given width and height. +// NewAlpha returns a new Alpha with the given bounds. func NewAlpha(r Rectangle) *Alpha { w, h := r.Dx(), r.Dy() pix := make([]uint8, 1*w*h) @@ -525,15 +555,21 @@ func (p *Alpha16) At(x, y int) color.Color { if !(Point{x, y}.In(p.Rect)) { return color.Alpha16{} } - i := (y-p.Rect.Min.Y)*p.Stride + (x-p.Rect.Min.X)*2 + i := p.PixOffset(x, y) return color.Alpha16{uint16(p.Pix[i+0])<<8 | uint16(p.Pix[i+1])} } +// PixOffset returns the index of the first element of Pix that corresponds to +// the pixel at (x, y). +func (p *Alpha16) PixOffset(x, y int) int { + return (y-p.Rect.Min.Y)*p.Stride + (x-p.Rect.Min.X)*2 +} + func (p *Alpha16) Set(x, y int, c color.Color) { if !(Point{x, y}.In(p.Rect)) { return } - i := (y-p.Rect.Min.Y)*p.Stride + (x-p.Rect.Min.X)*2 + i := p.PixOffset(x, y) c1 := color.Alpha16Model.Convert(c).(color.Alpha16) p.Pix[i+0] = uint8(c1.A >> 8) p.Pix[i+1] = uint8(c1.A) @@ -543,7 +579,7 @@ func (p *Alpha16) SetAlpha16(x, y int, c color.Alpha16) { if !(Point{x, y}.In(p.Rect)) { return } - i := (y-p.Rect.Min.Y)*p.Stride + (x-p.Rect.Min.X)*2 + i := p.PixOffset(x, y) p.Pix[i+0] = uint8(c.A >> 8) p.Pix[i+1] = uint8(c.A) } @@ -558,7 +594,7 @@ func (p *Alpha16) SubImage(r Rectangle) Image { if r.Empty() { return &Alpha16{} } - i := (r.Min.Y-p.Rect.Min.Y)*p.Stride + (r.Min.X-p.Rect.Min.X)*2 + i := p.PixOffset(r.Min.X, r.Min.Y) return &Alpha16{ Pix: p.Pix[i:], Stride: p.Stride, @@ -584,7 +620,7 @@ func (p *Alpha16) Opaque() bool { return true } -// NewAlpha16 returns a new Alpha16 with the given width and height. +// NewAlpha16 returns a new Alpha16 with the given bounds. func NewAlpha16(r Rectangle) *Alpha16 { w, h := r.Dx(), r.Dy() pix := make([]uint8, 2*w*h) @@ -610,15 +646,21 @@ func (p *Gray) At(x, y int) color.Color { if !(Point{x, y}.In(p.Rect)) { return color.Gray{} } - i := (y-p.Rect.Min.Y)*p.Stride + (x - p.Rect.Min.X) + i := p.PixOffset(x, y) return color.Gray{p.Pix[i]} } +// PixOffset returns the index of the first element of Pix that corresponds to +// the pixel at (x, y). +func (p *Gray) PixOffset(x, y int) int { + return (y-p.Rect.Min.Y)*p.Stride + (x-p.Rect.Min.X)*1 +} + func (p *Gray) Set(x, y int, c color.Color) { if !(Point{x, y}.In(p.Rect)) { return } - i := (y-p.Rect.Min.Y)*p.Stride + (x - p.Rect.Min.X) + i := p.PixOffset(x, y) p.Pix[i] = color.GrayModel.Convert(c).(color.Gray).Y } @@ -626,7 +668,7 @@ func (p *Gray) SetGray(x, y int, c color.Gray) { if !(Point{x, y}.In(p.Rect)) { return } - i := (y-p.Rect.Min.Y)*p.Stride + (x - p.Rect.Min.X) + i := p.PixOffset(x, y) p.Pix[i] = c.Y } @@ -640,7 +682,7 @@ func (p *Gray) SubImage(r Rectangle) Image { if r.Empty() { return &Gray{} } - i := (r.Min.Y-p.Rect.Min.Y)*p.Stride + (r.Min.X-p.Rect.Min.X)*1 + i := p.PixOffset(r.Min.X, r.Min.Y) return &Gray{ Pix: p.Pix[i:], Stride: p.Stride, @@ -653,7 +695,7 @@ func (p *Gray) Opaque() bool { return true } -// NewGray returns a new Gray with the given width and height. +// NewGray returns a new Gray with the given bounds. func NewGray(r Rectangle) *Gray { w, h := r.Dx(), r.Dy() pix := make([]uint8, 1*w*h) @@ -679,15 +721,21 @@ func (p *Gray16) At(x, y int) color.Color { if !(Point{x, y}.In(p.Rect)) { return color.Gray16{} } - i := (y-p.Rect.Min.Y)*p.Stride + (x-p.Rect.Min.X)*2 + i := p.PixOffset(x, y) return color.Gray16{uint16(p.Pix[i+0])<<8 | uint16(p.Pix[i+1])} } +// PixOffset returns the index of the first element of Pix that corresponds to +// the pixel at (x, y). +func (p *Gray16) PixOffset(x, y int) int { + return (y-p.Rect.Min.Y)*p.Stride + (x-p.Rect.Min.X)*2 +} + func (p *Gray16) Set(x, y int, c color.Color) { if !(Point{x, y}.In(p.Rect)) { return } - i := (y-p.Rect.Min.Y)*p.Stride + (x-p.Rect.Min.X)*2 + i := p.PixOffset(x, y) c1 := color.Gray16Model.Convert(c).(color.Gray16) p.Pix[i+0] = uint8(c1.Y >> 8) p.Pix[i+1] = uint8(c1.Y) @@ -697,7 +745,7 @@ func (p *Gray16) SetGray16(x, y int, c color.Gray16) { if !(Point{x, y}.In(p.Rect)) { return } - i := (y-p.Rect.Min.Y)*p.Stride + (x-p.Rect.Min.X)*2 + i := p.PixOffset(x, y) p.Pix[i+0] = uint8(c.Y >> 8) p.Pix[i+1] = uint8(c.Y) } @@ -712,7 +760,7 @@ func (p *Gray16) SubImage(r Rectangle) Image { if r.Empty() { return &Gray16{} } - i := (r.Min.Y-p.Rect.Min.Y)*p.Stride + (r.Min.X-p.Rect.Min.X)*2 + i := p.PixOffset(r.Min.X, r.Min.Y) return &Gray16{ Pix: p.Pix[i:], Stride: p.Stride, @@ -725,7 +773,7 @@ func (p *Gray16) Opaque() bool { return true } -// NewGray16 returns a new Gray16 with the given width and height. +// NewGray16 returns a new Gray16 with the given bounds. func NewGray16(r Rectangle) *Gray16 { w, h := r.Dx(), r.Dy() pix := make([]uint8, 2*w*h) @@ -756,15 +804,21 @@ func (p *Paletted) At(x, y int) color.Color { if !(Point{x, y}.In(p.Rect)) { return p.Palette[0] } - i := (y-p.Rect.Min.Y)*p.Stride + (x - p.Rect.Min.X) + i := p.PixOffset(x, y) return p.Palette[p.Pix[i]] } +// PixOffset returns the index of the first element of Pix that corresponds to +// the pixel at (x, y). +func (p *Paletted) PixOffset(x, y int) int { + return (y-p.Rect.Min.Y)*p.Stride + (x-p.Rect.Min.X)*1 +} + func (p *Paletted) Set(x, y int, c color.Color) { if !(Point{x, y}.In(p.Rect)) { return } - i := (y-p.Rect.Min.Y)*p.Stride + (x - p.Rect.Min.X) + i := p.PixOffset(x, y) p.Pix[i] = uint8(p.Palette.Index(c)) } @@ -772,7 +826,7 @@ func (p *Paletted) ColorIndexAt(x, y int) uint8 { if !(Point{x, y}.In(p.Rect)) { return 0 } - i := (y-p.Rect.Min.Y)*p.Stride + (x - p.Rect.Min.X) + i := p.PixOffset(x, y) return p.Pix[i] } @@ -780,7 +834,7 @@ func (p *Paletted) SetColorIndex(x, y int, index uint8) { if !(Point{x, y}.In(p.Rect)) { return } - i := (y-p.Rect.Min.Y)*p.Stride + (x - p.Rect.Min.X) + i := p.PixOffset(x, y) p.Pix[i] = index } @@ -796,7 +850,7 @@ func (p *Paletted) SubImage(r Rectangle) Image { Palette: p.Palette, } } - i := (r.Min.Y-p.Rect.Min.Y)*p.Stride + (r.Min.X-p.Rect.Min.X)*1 + i := p.PixOffset(r.Min.X, r.Min.Y) return &Paletted{ Pix: p.Pix[i:], Stride: p.Stride, |