Remove System.Bitmap from ITexture.
This commit is contained in:
@@ -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();
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
Reference in New Issue
Block a user