diff --git a/OpenRA.Game/Graphics/PlatformInterfaces.cs b/OpenRA.Game/Graphics/PlatformInterfaces.cs index bb035af768..370f258155 100644 --- a/OpenRA.Game/Graphics/PlatformInterfaces.cs +++ b/OpenRA.Game/Graphics/PlatformInterfaces.cs @@ -57,7 +57,6 @@ namespace OpenRA { IVertexBuffer CreateVertexBuffer(int size); ITexture CreateTexture(); - ITexture CreateTexture(Bitmap bitmap); IFrameBuffer CreateFrameBuffer(Size s); IShader CreateShader(string name); void EnableScissor(int left, int top, int width, int height); @@ -97,7 +96,6 @@ namespace OpenRA public interface ITexture : IDisposable { - void SetData(Bitmap bitmap); void SetData(uint[,] colors); void SetData(byte[] colors, int width, int height); byte[] GetData(); diff --git a/OpenRA.Mods.Common/Widgets/HueSliderWidget.cs b/OpenRA.Mods.Common/Widgets/HueSliderWidget.cs index 14193da1f7..30fa25ac15 100644 --- a/OpenRA.Mods.Common/Widgets/HueSliderWidget.cs +++ b/OpenRA.Mods.Common/Widgets/HueSliderWidget.cs @@ -27,23 +27,14 @@ namespace OpenRA.Mods.Common.Widgets { base.Initialize(args); - using (var hueBitmap = new Bitmap(256, 256)) - { - var hueSheet = new Sheet(SheetType.BGRA, new Size(256, 256)); - hueSprite = new Sprite(hueSheet, new Rectangle(0, 0, 256, 1), TextureChannel.RGBA); + var hueSheet = new Sheet(SheetType.BGRA, new Size(256, 1)); + hueSprite = new Sprite(hueSheet, new Rectangle(0, 0, 256, 1), TextureChannel.RGBA); - var bitmapData = hueBitmap.LockBits(hueBitmap.Bounds(), - ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb); - unsafe - { - var c = (int*)bitmapData.Scan0; - for (var h = 0; h < 256; h++) - *(c + h) = HSLColor.FromHSV(h / 255f, 1, 1).RGB.ToArgb(); - } + var hueData = new uint[1, 256]; + for (var x = 0; x < 256; x++) + hueData[0, x] = (uint)HSLColor.FromHSV(x / 255f, 1, 1).RGB.ToArgb(); - hueBitmap.UnlockBits(bitmapData); - hueSheet.GetTexture().SetData(hueBitmap); - } + hueSheet.GetTexture().SetData(hueData); } public override void Draw() diff --git a/OpenRA.Platforms.Default/Sdl2GraphicsContext.cs b/OpenRA.Platforms.Default/Sdl2GraphicsContext.cs index c1b2565e1d..063c4d333e 100644 --- a/OpenRA.Platforms.Default/Sdl2GraphicsContext.cs +++ b/OpenRA.Platforms.Default/Sdl2GraphicsContext.cs @@ -57,12 +57,6 @@ namespace OpenRA.Platforms.Default return new Texture(); } - public ITexture CreateTexture(Bitmap bitmap) - { - VerifyThreadAffinity(); - return new Texture(bitmap); - } - public IFrameBuffer CreateFrameBuffer(Size s) { VerifyThreadAffinity(); diff --git a/OpenRA.Platforms.Default/Texture.cs b/OpenRA.Platforms.Default/Texture.cs index 36a03d307e..808b559aac 100644 --- a/OpenRA.Platforms.Default/Texture.cs +++ b/OpenRA.Platforms.Default/Texture.cs @@ -11,7 +11,6 @@ using System; using System.Drawing; -using System.Drawing.Imaging; using System.IO; namespace OpenRA.Platforms.Default @@ -50,13 +49,6 @@ namespace OpenRA.Platforms.Default OpenGL.CheckGLError(); } - public Texture(Bitmap bitmap) - { - OpenGL.glGenTextures(1, out texture); - OpenGL.CheckGLError(); - SetData(bitmap); - } - void PrepareTexture() { OpenGL.CheckGLError(); @@ -124,35 +116,6 @@ namespace OpenRA.Platforms.Default } } - public void SetData(Bitmap bitmap) - { - VerifyThreadAffinity(); - var allocatedBitmap = false; - if (!Exts.IsPowerOf2(bitmap.Width) || !Exts.IsPowerOf2(bitmap.Height)) - { - bitmap = new Bitmap(bitmap, bitmap.Size.NextPowerOf2()); - allocatedBitmap = true; - } - - try - { - Size = new Size(bitmap.Width, bitmap.Height); - var bits = bitmap.LockBits(bitmap.Bounds(), - ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); - - PrepareTexture(); - OpenGL.glTexImage2D(OpenGL.GL_TEXTURE_2D, 0, OpenGL.GL_RGBA8, bits.Width, bits.Height, - 0, OpenGL.GL_BGRA, OpenGL.GL_UNSIGNED_BYTE, bits.Scan0); // TODO: weird strides - OpenGL.CheckGLError(); - bitmap.UnlockBits(bits); - } - finally - { - if (allocatedBitmap) - bitmap.Dispose(); - } - } - public byte[] GetData() { VerifyThreadAffinity(); diff --git a/OpenRA.Platforms.Default/ThreadedGraphicsContext.cs b/OpenRA.Platforms.Default/ThreadedGraphicsContext.cs index 80f91103ba..17535f2c34 100644 --- a/OpenRA.Platforms.Default/ThreadedGraphicsContext.cs +++ b/OpenRA.Platforms.Default/ThreadedGraphicsContext.cs @@ -43,7 +43,6 @@ namespace OpenRA.Platforms.Default Action doPresent; Func getGLVersion; Func getCreateTexture; - Func getCreateTextureBitmap; Func getTakeScreenshot; Func getCreateFrameBuffer; Func getCreateShader; @@ -87,7 +86,6 @@ namespace OpenRA.Platforms.Default doPresent = () => context.Present(); getGLVersion = () => context.GLVersion; getCreateTexture = () => new ThreadedTexture(this, (ITextureInternal)context.CreateTexture()); - getCreateTextureBitmap = bitmap => new ThreadedTexture(this, (ITextureInternal)context.CreateTexture((Bitmap)bitmap)); getTakeScreenshot = () => context.TakeScreenshot(); getCreateFrameBuffer = s => new ThreadedFrameBuffer(this, context.CreateFrameBuffer((Size)s, (ITextureInternal)CreateTexture())); getCreateShader = name => new ThreadedShader(this, context.CreateShader((string)name)); @@ -399,11 +397,6 @@ namespace OpenRA.Platforms.Default return Send(getCreateTexture); } - public ITexture CreateTexture(Bitmap bitmap) - { - return Send(getCreateTextureBitmap, bitmap); - } - public IVertexBuffer CreateVertexBuffer(int length) { return Send(getCreateVertexBuffer, length); @@ -549,8 +542,7 @@ namespace OpenRA.Platforms.Default readonly Action setEmpty; readonly Func getData; readonly Func setData1; - readonly Func setData2; - readonly Action setData3; + readonly Action setData2; readonly Action dispose; public ThreadedTexture(ThreadedGraphicsContext device, ITextureInternal texture) @@ -563,8 +555,7 @@ namespace OpenRA.Platforms.Default setEmpty = tuple => { var t = (Tuple)tuple; texture.SetEmpty(t.Item1, t.Item2); }; getData = () => texture.GetData(); setData1 = colors => { texture.SetData((uint[,])colors); return null; }; - setData2 = bitmap => { texture.SetData((Bitmap)bitmap); return null; }; - setData3 = tuple => { var t = (Tuple)tuple; texture.SetData(t.Item1, t.Item2, t.Item3); }; + setData2 = tuple => { var t = (Tuple)tuple; texture.SetData(t.Item1, t.Item2, t.Item3); }; dispose = texture.Dispose; } @@ -613,19 +604,13 @@ namespace OpenRA.Platforms.Default device.Send(setData1, colors); } - public void SetData(Bitmap bitmap) - { - // We can't return until we are finished with the data, so we must Send here. - device.Send(setData2, bitmap); - } - public void SetData(byte[] colors, int width, int height) { // This creates some garbage for the GC to clean up, // but allows us post a message instead of blocking the message queue by sending it. var temp = new byte[colors.Length]; Array.Copy(colors, temp, temp.Length); - device.Post(setData3, Tuple.Create(temp, width, height)); + device.Post(setData2, Tuple.Create(temp, width, height)); } public void Dispose()