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