diff --git a/OpenRA.Editor/Form1.cs b/OpenRA.Editor/Form1.cs index b12540232b..f8ac9c94e8 100644 --- a/OpenRA.Editor/Form1.cs +++ b/OpenRA.Editor/Form1.cs @@ -4,6 +4,7 @@ using System.Drawing; using System.IO; using System.Windows.Forms; using OpenRA.FileFormats; +using System.Drawing.Imaging; namespace OpenRA.Editor { @@ -22,13 +23,13 @@ namespace OpenRA.Editor foreach (var pkg in manifest.Packages) FileSystem.Mount(pkg); // load the map - var map = new Map(new Folder("mods/ra/maps/mjolnir")); + var map = new Map(new Folder("mods/ra/maps/scm01ea")); // we're also going to need a tileset... var tsinfo = fileMapping[Pair.New(mods[0], map.Theater)]; var tileset = new TileSet("tileset.til", "templates.ini", tsinfo.First); - var palette = new Palette( FileSystem.Open( map.Theater.ToLowerInvariant() + ".pal" ), true); + var palette = new Palette(FileSystem.Open(map.Theater.ToLowerInvariant() + ".pal"), true); surface1.TileSet = tileset; surface1.Map = map; @@ -36,7 +37,7 @@ namespace OpenRA.Editor // construct the palette of tiles - foreach( var n in tileset.tiles.Keys ) + foreach (var n in tileset.tiles.Keys) { try { @@ -94,18 +95,27 @@ namespace OpenRA.Editor var tile = ts.tiles[n]; var bitmap = new Bitmap(24 * template.Size.X, 24 * template.Size.Y); + var data = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), + ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb); - for( var u = 0; u < template.Size.X; u++ ) - for( var v = 0; v < template.Size.Y; v++ ) - if (template.TerrainType.ContainsKey(u + v * template.Size.X)) - { - var rawImage = tile.TileBitmapBytes[u + v * template.Size.X]; - for (var i = 0; i < 24; i++) - for (var j = 0; j < 24; j++) - bitmap.SetPixel(u * 24 + i, v * 24 + j, p.GetColor(rawImage[i + 24 * j])); - } + 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 (template.TerrainType.ContainsKey(u + v * template.Size.X)) + { + var rawImage = tile.TileBitmapBytes[u + v * template.Size.X]; + for (var i = 0; i < 24; i++) + for (var j = 0; j < 24; j++) + q[(v * 24 + j) * stride + u * 24 + i] = p.GetColor(rawImage[i + 24 * j]).ToArgb(); + } + } + + bitmap.UnlockBits(data); return bitmap; } } -} +} \ No newline at end of file diff --git a/OpenRA.Editor/Surface.cs b/OpenRA.Editor/Surface.cs index e014bb0ead..20e8350115 100644 --- a/OpenRA.Editor/Surface.cs +++ b/OpenRA.Editor/Surface.cs @@ -27,7 +27,7 @@ namespace OpenRA.Editor UpdateStyles(); } - static readonly Pen RedPen = new Pen(Color.Red); + static readonly Pen CordonPen = new Pen(Color.Red); int2 MousePos; protected override void OnMouseMove(MouseEventArgs e) @@ -86,9 +86,6 @@ namespace OpenRA.Editor var bitmap = new Bitmap(ChunkSize * 24, ChunkSize * 24); bitmap.SetPixel(0, 0, Color.Green); - var hx = Math.Min(Map.Width - u * ChunkSize, ChunkSize); - var hy = Math.Min(Map.Height - v * ChunkSize, ChunkSize); - var data = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb); @@ -97,8 +94,8 @@ namespace OpenRA.Editor int* p = (int*)data.Scan0.ToPointer(); var stride = data.Stride >> 2; - for (var i = 0; i < hx; i++) - for (var j = 0; j < hy; j++) + for (var i = 0; i < ChunkSize; i++) + for (var j = 0; j < ChunkSize; j++) { var tr = Map.MapTiles[u * ChunkSize + i, v * ChunkSize + j]; var tile = TileSet.tiles[tr.type]; @@ -126,14 +123,17 @@ namespace OpenRA.Editor if (Map == null) return; if (TileSet == null) return; - for( var u = Map.TopLeft.X - Map.TopLeft.X % ChunkSize; u < Map.BottomRight.X; u += ChunkSize ) - for (var v = Map.TopLeft.Y - Map.TopLeft.Y % ChunkSize; v < Map.BottomRight.Y; v += ChunkSize) + for( var u = Map.TopLeft.X - Map.TopLeft.X % ChunkSize; u <= Map.BottomRight.X; u += ChunkSize ) + for (var v = Map.TopLeft.Y - Map.TopLeft.Y % ChunkSize; v <= Map.BottomRight.Y; v += ChunkSize) { var x = new int2(u/ChunkSize,v/ChunkSize); if (!Chunks.ContainsKey(x)) Chunks[x] = RenderChunk(u / ChunkSize, v / ChunkSize); e.Graphics.DrawImage(Chunks[x], (24 * ChunkSize * x + Offset).ToPoint()); } + e.Graphics.DrawRectangle(CordonPen, + new Rectangle(Map.XOffset * 24 + Offset.X, Map.YOffset * 24 + Offset.Y, Map.Width * 24, Map.Height * 24)); + if (Brush.Second != null) e.Graphics.DrawImage(Brush.Second, (24 * GetBrushLocation() + Offset).ToPoint()); diff --git a/OpenRA.FileFormats/Session.cs b/OpenRA.FileFormats/Session.cs index ff9254630e..5bd59eceeb 100644 --- a/OpenRA.FileFormats/Session.cs +++ b/OpenRA.FileFormats/Session.cs @@ -86,6 +86,9 @@ namespace OpenRA.FileFormats ShellmapUid = yaml["ShellmapUid"].Value; } - static string[] YamlList(Dictionary ys, string key) { return ys[key].Nodes.Keys.ToArray(); } + static string[] YamlList(Dictionary ys, string key) + { + return ys.ContainsKey(key) ? ys[key].Nodes.Keys.ToArray() : new string[] { }; + } } }