// 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 av
import (
"image";
)
// Native Client image format:
// a single linear array of 32-bit ARGB as packed uint32s.
// An Image represents a Native Client frame buffer.
// The pixels in the image can be accessed as a single
// linear slice or as a two-dimensional slice of slices.
// Image implements image.Image.
type Image struct {
Linear []Color;
Pixel [][]Color;
}
var _ image.Image = (*Image)(nil)
func (m *Image) ColorModel() image.ColorModel { return ColorModel }
func (m *Image) Width() int {
if len(m.Pixel) == 0 {
return 0
}
return len(m.Pixel[0]);
}
func (m *Image) Height() int { return len(m.Pixel) }
func (m *Image) At(x, y int) image.Color { return m.Pixel[y][x] }
func (m *Image) Set(x, y int, color image.Color) {
if c, ok := color.(Color); ok {
m.Pixel[y][x] = c
}
m.Pixel[y][x] = makeColor(color.RGBA());
}
func newImage(dx, dy int, linear []Color) *Image {
if linear == nil {
linear = make([]Color, dx*dy)
}
pix := make([][]Color, dy);
for i := range pix {
pix[i] = linear[dx*i : dx*(i+1)]
}
return &Image{linear, pix};
}
// A Color represents a Native Client color value,
// a 32-bit R, G, B, A value packed as 0xAARRGGBB.
type Color uint32
func (p Color) RGBA() (r, g, b, a uint32) {
x := uint32(p);
a = x >> 24;
a |= a << 8;
a |= a << 16;
r = (x >> 16) & 0xFF;
r |= r << 8;
r |= r << 16;
g = (x >> 8) & 0xFF;
g |= g << 8;
g |= g << 16;
b = x & 0xFF;
b |= b << 8;
b |= b << 16;
return;
}
func makeColor(r, g, b, a uint32) Color {
return Color(a>>24<<24 | r>>24<<16 | g>>24<<8 | b>>24)
}
func toColor(color image.Color) image.Color {
if c, ok := color.(Color); ok {
return c
}
return makeColor(color.RGBA());
}
// ColorModel is the color model corresponding to the Native Client Color.
var ColorModel = image.ColorModelFunc(toColor)
|