using System.Drawing; using System.IO; using OpenTK.Graphics.OpenGL; using OpenTK.Graphics; using System; namespace RecrownedGTK.Graphics { public class TextureData : IDisposable { private bool disposed; int handle; public TextureWrapMode textureWrapModeWidth, textureWrapModeHeight; public Color4 borderColor; public TextureMinFilter textureMinFilter; public TextureMagFilter textureMagFilter; public TextureData(string path) { byte[] textureData = null; int width; int height; using (FileStream file = new FileStream(path, FileMode.Open)) { using (Bitmap bitmap = new Bitmap(file)) { ImageConverter converter = new ImageConverter(); textureData = (byte[]) converter.ConvertTo(bitmap, typeof(byte[])); width = bitmap.Width; height = bitmap.Height; } } GenerateTexture(textureData, width, height); } public TextureData(byte[] textureData, int width, int height) { textureWrapModeHeight = TextureWrapMode.ClampToBorder; textureWrapModeWidth = TextureWrapMode.ClampToBorder; textureMinFilter = TextureMinFilter.LinearMipmapLinear; textureMagFilter = TextureMagFilter.Linear; GenerateTexture(textureData, width, height); } private void GenerateTexture(byte[] textureData, int width, int height) { if (handle != 0) throw new InvalidOperationException("This texture data already holds a texture."); handle = GL.GenTexture(); Use(); GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, width, height, 0, PixelFormat.Rgba, PixelType.UnsignedByte, textureData); GL.GenerateMipmap(GenerateMipmapTarget.Texture2D); } internal void Use() { GL.BindTexture(TextureTarget.Texture2D, handle); } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing = false) { if (disposed) return; if (disposing) { } GL.BindTexture(TextureTarget.Texture2D, 0); GL.DeleteTexture(handle); disposed = true; } ~TextureData() { Dispose(false); } } }