// NewBitmapTexture downloads the provided raw data to OpenGL and returns a BitmapTexture instance.
func NewBitmapTexture(gl opengl.OpenGl, width, height int, pixelData []byte) *BitmapTexture {
	textureWidth := powerOfTwo(width)
	textureHeight := powerOfTwo(height)
	tex := &BitmapTexture{
		gl:     gl,
		width:  float32(width),
		height: float32(height),
		handle: gl.GenTextures(1)[0]}
	tex.u = tex.width / float32(textureWidth)
	tex.v = tex.height / float32(textureHeight)

	// The texture has to be blown up to use RGBA from the start;
	// OpenGL 3.2 doesn't know ALPHA format, Open GL ES 2.0 (WebGL) doesn't know RED or R8.
	rgbaData := make([]byte, textureWidth*textureHeight*BytesPerRgba)
	for y := 0; y < height; y++ {
		inStart := y * width
		outOffset := y * textureWidth * BytesPerRgba
		for x := 0; x < width; x++ {
			value := pixelData[inStart+x]
			rgbaData[outOffset+0] = value
			rgbaData[outOffset+1] = value
			rgbaData[outOffset+2] = value
			rgbaData[outOffset+3] = value
			outOffset += BytesPerRgba
		}
	}

	gl.BindTexture(opengl.TEXTURE_2D, tex.handle)
	gl.TexImage2D(opengl.TEXTURE_2D, 0, opengl.RGBA, int32(textureWidth), int32(textureHeight),
		0, opengl.RGBA, opengl.UNSIGNED_BYTE, rgbaData)
	gl.TexParameteri(opengl.TEXTURE_2D, opengl.TEXTURE_MAG_FILTER, opengl.NEAREST)
	gl.TexParameteri(opengl.TEXTURE_2D, opengl.TEXTURE_MIN_FILTER, opengl.NEAREST)
	gl.GenerateMipmap(opengl.TEXTURE_2D)
	gl.BindTexture(opengl.TEXTURE_2D, 0)

	return tex
}