From ce78944a9ed35a774e71d94e5529cbd6f3636db7 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Sat, 18 Sep 2010 13:30:12 +1200 Subject: [PATCH] more editor hax --- OpenRA.Editor/Form1.cs | 123 +--------------------------- OpenRA.Editor/OpenRA.Editor.csproj | 1 + OpenRA.Editor/RenderUtils.cs | 126 +++++++++++++++++++++++++++++ 3 files changed, 131 insertions(+), 119 deletions(-) create mode 100644 OpenRA.Editor/RenderUtils.cs diff --git a/OpenRA.Editor/Form1.cs b/OpenRA.Editor/Form1.cs index 9eb05eab50..6501ab2548 100644 --- a/OpenRA.Editor/Form1.cs +++ b/OpenRA.Editor/Form1.cs @@ -86,6 +86,7 @@ namespace OpenRA.Editor MakeDirty(); } + // this code is insanely stupid, and mostly my fault -- chrisf void PrepareMapResources(Manifest manifest, Map map) { Rules.LoadRules(manifest, map); @@ -102,7 +103,7 @@ namespace OpenRA.Editor { try { - var bitmap = RenderTemplate(tileset, (ushort)t.Key, palette); + var bitmap = RenderUtils.RenderTemplate(tileset, (ushort)t.Key, palette); var ibox = new PictureBox { Image = bitmap, @@ -134,7 +135,7 @@ namespace OpenRA.Editor { var info = Rules.Info[a]; if (!info.Traits.Contains()) continue; - var template = RenderActor(info, tileset, palette); + var template = RenderUtils.RenderActor(info, tileset, palette); var ibox = new PictureBox { Image = template.Bitmap, @@ -166,7 +167,7 @@ namespace OpenRA.Editor { try { - var template = RenderResourceType(a, tileset.Extensions, palette); + var template = RenderUtils.RenderResourceType(a, tileset.Extensions, palette); var ibox = new PictureBox { Image = template.Bitmap, @@ -202,122 +203,6 @@ namespace OpenRA.Editor pmMiniMap.Image = Minimap.AddStaticResources(surface1.Map, Minimap.TerrainBitmap(surface1.Map, true)); } - static Bitmap RenderTemplate(TileSet ts, ushort n, Palette p) - { - var template = ts.Templates[n]; - var tile = ts.Tiles[n]; - - var bitmap = new Bitmap(ts.TileSize * template.Size.X, ts.TileSize * template.Size.Y); - var data = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), - ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb); - - unsafe - { - int* q = (int*)data.Scan0.ToPointer(); - var stride = data.Stride >> 2; - - for (var u = 0; u < template.Size.X; u++) - for (var v = 0; v < template.Size.Y; v++) - if (tile.TileBitmapBytes[u + v * template.Size.X] != null) - { - var rawImage = tile.TileBitmapBytes[u + v * template.Size.X]; - for (var i = 0; i < ts.TileSize; i++) - for (var j = 0; j < ts.TileSize; j++) - q[(v * ts.TileSize + j) * stride + u * ts.TileSize + i] = p.GetColor(rawImage[i + ts.TileSize * j]).ToArgb(); - } - else - { - for (var i = 0; i < ts.TileSize; i++) - for (var j = 0; j < ts.TileSize; j++) - q[(v * ts.TileSize + j) * stride + u * ts.TileSize + i] = Color.Transparent.ToArgb(); - } - } - - bitmap.UnlockBits(data); - return bitmap; - } - - static Bitmap RenderShp(ShpReader shp, Palette p) - { - var frame = shp[0]; - - var bitmap = new Bitmap(shp.Width, shp.Height); - var data = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), - ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb); - - unsafe - { - int* q = (int*)data.Scan0.ToPointer(); - var stride2 = data.Stride >> 2; - - for (var i = 0; i < shp.Width; i++) - for (var j = 0; j < shp.Height; j++) - q[j * stride2 + i] = p.GetColor(frame.Image[i + shp.Width * j]).ToArgb(); - } - - bitmap.UnlockBits(data); - return bitmap; - } - - static ActorTemplate RenderActor(ActorInfo info, TileSet tileset, Palette p) - { - var ri = info.Traits.Get(); - string image = null; - if (ri.OverrideTheater != null) - for (int i = 0; i < ri.OverrideTheater.Length; i++) - if (ri.OverrideTheater[i] == tileset.Id) - image = ri.OverrideImage[i]; - - image = image ?? ri.Image ?? info.Name; - using (var s = FileSystem.OpenWithExts(image, tileset.Extensions)) - { - var shp = new ShpReader(s); - var bitmap = RenderShp(shp, p); - - try - { - using (var s2 = FileSystem.OpenWithExts(image + "2", tileset.Extensions)) - { - var shp2 = new ShpReader(s2); - var roofBitmap = RenderShp(shp2, p); - - using (var g = System.Drawing.Graphics.FromImage(bitmap)) - g.DrawImage(roofBitmap, 0, 0); - } - } - catch { } - - return new ActorTemplate { Bitmap = bitmap, Info = info, Centered = !info.Traits.Contains() }; - } - } - - static ResourceTemplate RenderResourceType(ResourceTypeInfo info, string[] exts, Palette p) - { - var image = info.SpriteNames[0]; - using (var s = FileSystem.OpenWithExts(image, exts)) - { - var shp = new ShpReader(s); - var frame = shp[shp.ImageCount - 1]; - - var bitmap = new Bitmap(shp.Width, shp.Height); - var data = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), - ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb); - - unsafe - { - int* q = (int*)data.Scan0.ToPointer(); - var stride = data.Stride >> 2; - - for (var i = 0; i < shp.Width; i++) - for (var j = 0; j < shp.Height; j++) - q[j * stride + i] = p.GetColor(frame.Image[i + shp.Width * j]).ToArgb(); - } - - bitmap.UnlockBits(data); - return new ResourceTemplate { Bitmap = bitmap, Info = info, Value = shp.ImageCount - 1 }; - } - } - void ResizeClicked(object sender, EventArgs e) { using (var rd = new ResizeDialog()) diff --git a/OpenRA.Editor/OpenRA.Editor.csproj b/OpenRA.Editor/OpenRA.Editor.csproj index 7727e8e305..a6b94efb4b 100644 --- a/OpenRA.Editor/OpenRA.Editor.csproj +++ b/OpenRA.Editor/OpenRA.Editor.csproj @@ -125,6 +125,7 @@ Settings.settings True + Form diff --git a/OpenRA.Editor/RenderUtils.cs b/OpenRA.Editor/RenderUtils.cs new file mode 100644 index 0000000000..bc950a90f7 --- /dev/null +++ b/OpenRA.Editor/RenderUtils.cs @@ -0,0 +1,126 @@ +using System.Drawing; +using System.Drawing.Imaging; +using OpenRA.FileFormats; +using OpenRA.Traits; + +namespace OpenRA.Editor +{ + static class RenderUtils + { + public static Bitmap RenderTemplate(TileSet ts, ushort n, Palette p) + { + var template = ts.Templates[n]; + var tile = ts.Tiles[n]; + + var bitmap = new Bitmap(ts.TileSize * template.Size.X, ts.TileSize * template.Size.Y); + var data = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), + ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb); + + unsafe + { + int* q = (int*)data.Scan0.ToPointer(); + var stride = data.Stride >> 2; + + for (var u = 0; u < template.Size.X; u++) + for (var v = 0; v < template.Size.Y; v++) + if (tile.TileBitmapBytes[u + v * template.Size.X] != null) + { + var rawImage = tile.TileBitmapBytes[u + v * template.Size.X]; + for (var i = 0; i < ts.TileSize; i++) + for (var j = 0; j < ts.TileSize; j++) + q[(v * ts.TileSize + j) * stride + u * ts.TileSize + i] = p.GetColor(rawImage[i + ts.TileSize * j]).ToArgb(); + } + else + { + for (var i = 0; i < ts.TileSize; i++) + for (var j = 0; j < ts.TileSize; j++) + q[(v * ts.TileSize + j) * stride + u * ts.TileSize + i] = Color.Transparent.ToArgb(); + } + } + + bitmap.UnlockBits(data); + return bitmap; + } + + static Bitmap RenderShp(ShpReader shp, Palette p) + { + var frame = shp[0]; + + var bitmap = new Bitmap(shp.Width, shp.Height); + var data = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), + ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb); + + unsafe + { + int* q = (int*)data.Scan0.ToPointer(); + var stride2 = data.Stride >> 2; + + for (var i = 0; i < shp.Width; i++) + for (var j = 0; j < shp.Height; j++) + q[j * stride2 + i] = p.GetColor(frame.Image[i + shp.Width * j]).ToArgb(); + } + + bitmap.UnlockBits(data); + return bitmap; + } + + public static ActorTemplate RenderActor(ActorInfo info, TileSet tileset, Palette p) + { + var ri = info.Traits.Get(); + string image = null; + if (ri.OverrideTheater != null) + for (int i = 0; i < ri.OverrideTheater.Length; i++) + if (ri.OverrideTheater[i] == tileset.Id) + image = ri.OverrideImage[i]; + + image = image ?? ri.Image ?? info.Name; + using (var s = FileSystem.OpenWithExts(image, tileset.Extensions)) + { + var shp = new ShpReader(s); + var bitmap = RenderShp(shp, p); + + try + { + using (var s2 = FileSystem.OpenWithExts(image + "2", tileset.Extensions)) + { + var shp2 = new ShpReader(s2); + var roofBitmap = RenderShp(shp2, p); + + using (var g = System.Drawing.Graphics.FromImage(bitmap)) + g.DrawImage(roofBitmap, 0, 0); + } + } + catch { } + + return new ActorTemplate { Bitmap = bitmap, Info = info, Centered = !info.Traits.Contains() }; + } + } + + public static ResourceTemplate RenderResourceType(ResourceTypeInfo info, string[] exts, Palette p) + { + var image = info.SpriteNames[0]; + using (var s = FileSystem.OpenWithExts(image, exts)) + { + var shp = new ShpReader(s); + var frame = shp[shp.ImageCount - 1]; + + var bitmap = new Bitmap(shp.Width, shp.Height); + var data = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), + ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb); + + unsafe + { + int* q = (int*)data.Scan0.ToPointer(); + var stride = data.Stride >> 2; + + for (var i = 0; i < shp.Width; i++) + for (var j = 0; j < shp.Height; j++) + q[j * stride + i] = p.GetColor(frame.Image[i + shp.Width * j]).ToArgb(); + } + + bitmap.UnlockBits(data); + return new ResourceTemplate { Bitmap = bitmap, Info = info, Value = shp.ImageCount - 1 }; + } + } + } +}