Remove System.Bitmap from ITexture.

This commit is contained in:
Paul Chote
2018-12-22 09:34:54 +00:00
parent 84e965835b
commit b1e87e4f60
5 changed files with 9 additions and 78 deletions

View File

@@ -57,7 +57,6 @@ namespace OpenRA
{ {
IVertexBuffer<Vertex> CreateVertexBuffer(int size); IVertexBuffer<Vertex> CreateVertexBuffer(int size);
ITexture CreateTexture(); ITexture CreateTexture();
ITexture CreateTexture(Bitmap bitmap);
IFrameBuffer CreateFrameBuffer(Size s); IFrameBuffer CreateFrameBuffer(Size s);
IShader CreateShader(string name); IShader CreateShader(string name);
void EnableScissor(int left, int top, int width, int height); void EnableScissor(int left, int top, int width, int height);
@@ -97,7 +96,6 @@ namespace OpenRA
public interface ITexture : IDisposable public interface ITexture : IDisposable
{ {
void SetData(Bitmap bitmap);
void SetData(uint[,] colors); void SetData(uint[,] colors);
void SetData(byte[] colors, int width, int height); void SetData(byte[] colors, int width, int height);
byte[] GetData(); byte[] GetData();

View File

@@ -27,23 +27,14 @@ namespace OpenRA.Mods.Common.Widgets
{ {
base.Initialize(args); base.Initialize(args);
using (var hueBitmap = new Bitmap(256, 256)) var hueSheet = new Sheet(SheetType.BGRA, new Size(256, 1));
{ hueSprite = new Sprite(hueSheet, new Rectangle(0, 0, 256, 1), TextureChannel.RGBA);
var hueSheet = new Sheet(SheetType.BGRA, new Size(256, 256));
hueSprite = new Sprite(hueSheet, new Rectangle(0, 0, 256, 1), TextureChannel.RGBA);
var bitmapData = hueBitmap.LockBits(hueBitmap.Bounds(), var hueData = new uint[1, 256];
ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb); for (var x = 0; x < 256; x++)
unsafe hueData[0, x] = (uint)HSLColor.FromHSV(x / 255f, 1, 1).RGB.ToArgb();
{
var c = (int*)bitmapData.Scan0;
for (var h = 0; h < 256; h++)
*(c + h) = HSLColor.FromHSV(h / 255f, 1, 1).RGB.ToArgb();
}
hueBitmap.UnlockBits(bitmapData); hueSheet.GetTexture().SetData(hueData);
hueSheet.GetTexture().SetData(hueBitmap);
}
} }
public override void Draw() public override void Draw()

View File

@@ -57,12 +57,6 @@ namespace OpenRA.Platforms.Default
return new Texture(); return new Texture();
} }
public ITexture CreateTexture(Bitmap bitmap)
{
VerifyThreadAffinity();
return new Texture(bitmap);
}
public IFrameBuffer CreateFrameBuffer(Size s) public IFrameBuffer CreateFrameBuffer(Size s)
{ {
VerifyThreadAffinity(); VerifyThreadAffinity();

View File

@@ -11,7 +11,6 @@
using System; using System;
using System.Drawing; using System.Drawing;
using System.Drawing.Imaging;
using System.IO; using System.IO;
namespace OpenRA.Platforms.Default namespace OpenRA.Platforms.Default
@@ -50,13 +49,6 @@ namespace OpenRA.Platforms.Default
OpenGL.CheckGLError(); OpenGL.CheckGLError();
} }
public Texture(Bitmap bitmap)
{
OpenGL.glGenTextures(1, out texture);
OpenGL.CheckGLError();
SetData(bitmap);
}
void PrepareTexture() void PrepareTexture()
{ {
OpenGL.CheckGLError(); 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() public byte[] GetData()
{ {
VerifyThreadAffinity(); VerifyThreadAffinity();

View File

@@ -43,7 +43,6 @@ namespace OpenRA.Platforms.Default
Action doPresent; Action doPresent;
Func<string> getGLVersion; Func<string> getGLVersion;
Func<ITexture> getCreateTexture; Func<ITexture> getCreateTexture;
Func<object, ITexture> getCreateTextureBitmap;
Func<Bitmap> getTakeScreenshot; Func<Bitmap> getTakeScreenshot;
Func<object, IFrameBuffer> getCreateFrameBuffer; Func<object, IFrameBuffer> getCreateFrameBuffer;
Func<object, IShader> getCreateShader; Func<object, IShader> getCreateShader;
@@ -87,7 +86,6 @@ namespace OpenRA.Platforms.Default
doPresent = () => context.Present(); doPresent = () => context.Present();
getGLVersion = () => context.GLVersion; getGLVersion = () => context.GLVersion;
getCreateTexture = () => new ThreadedTexture(this, (ITextureInternal)context.CreateTexture()); getCreateTexture = () => new ThreadedTexture(this, (ITextureInternal)context.CreateTexture());
getCreateTextureBitmap = bitmap => new ThreadedTexture(this, (ITextureInternal)context.CreateTexture((Bitmap)bitmap));
getTakeScreenshot = () => context.TakeScreenshot(); getTakeScreenshot = () => context.TakeScreenshot();
getCreateFrameBuffer = s => new ThreadedFrameBuffer(this, context.CreateFrameBuffer((Size)s, (ITextureInternal)CreateTexture())); getCreateFrameBuffer = s => new ThreadedFrameBuffer(this, context.CreateFrameBuffer((Size)s, (ITextureInternal)CreateTexture()));
getCreateShader = name => new ThreadedShader(this, context.CreateShader((string)name)); getCreateShader = name => new ThreadedShader(this, context.CreateShader((string)name));
@@ -399,11 +397,6 @@ namespace OpenRA.Platforms.Default
return Send(getCreateTexture); return Send(getCreateTexture);
} }
public ITexture CreateTexture(Bitmap bitmap)
{
return Send(getCreateTextureBitmap, bitmap);
}
public IVertexBuffer<Vertex> CreateVertexBuffer(int length) public IVertexBuffer<Vertex> CreateVertexBuffer(int length)
{ {
return Send(getCreateVertexBuffer, length); return Send(getCreateVertexBuffer, length);
@@ -549,8 +542,7 @@ namespace OpenRA.Platforms.Default
readonly Action<object> setEmpty; readonly Action<object> setEmpty;
readonly Func<byte[]> getData; readonly Func<byte[]> getData;
readonly Func<object, object> setData1; readonly Func<object, object> setData1;
readonly Func<object, object> setData2; readonly Action<object> setData2;
readonly Action<object> setData3;
readonly Action dispose; readonly Action dispose;
public ThreadedTexture(ThreadedGraphicsContext device, ITextureInternal texture) public ThreadedTexture(ThreadedGraphicsContext device, ITextureInternal texture)
@@ -563,8 +555,7 @@ namespace OpenRA.Platforms.Default
setEmpty = tuple => { var t = (Tuple<int, int>)tuple; texture.SetEmpty(t.Item1, t.Item2); }; setEmpty = tuple => { var t = (Tuple<int, int>)tuple; texture.SetEmpty(t.Item1, t.Item2); };
getData = () => texture.GetData(); getData = () => texture.GetData();
setData1 = colors => { texture.SetData((uint[,])colors); return null; }; setData1 = colors => { texture.SetData((uint[,])colors); return null; };
setData2 = bitmap => { texture.SetData((Bitmap)bitmap); return null; }; setData2 = tuple => { var t = (Tuple<byte[], int, int>)tuple; texture.SetData(t.Item1, t.Item2, t.Item3); };
setData3 = tuple => { var t = (Tuple<byte[], int, int>)tuple; texture.SetData(t.Item1, t.Item2, t.Item3); };
dispose = texture.Dispose; dispose = texture.Dispose;
} }
@@ -613,19 +604,13 @@ namespace OpenRA.Platforms.Default
device.Send(setData1, colors); 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) public void SetData(byte[] colors, int width, int height)
{ {
// This creates some garbage for the GC to clean up, // 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. // but allows us post a message instead of blocking the message queue by sending it.
var temp = new byte[colors.Length]; var temp = new byte[colors.Length];
Array.Copy(colors, temp, temp.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() public void Dispose()