diff --git a/OpenRA.Editor/OpenRA.Editor.csproj b/OpenRA.Editor/OpenRA.Editor.csproj index 694899b568..ad02cc1247 100644 --- a/OpenRA.Editor/OpenRA.Editor.csproj +++ b/OpenRA.Editor/OpenRA.Editor.csproj @@ -21,6 +21,7 @@ DEBUG;TRACE prompt 4 + true pdbonly diff --git a/OpenRA.Editor/Surface.cs b/OpenRA.Editor/Surface.cs index a2b034850d..e014bb0ead 100644 --- a/OpenRA.Editor/Surface.cs +++ b/OpenRA.Editor/Surface.cs @@ -3,6 +3,7 @@ using System.Drawing; using System.Windows.Forms; using OpenRA.FileFormats; using System; +using System.Drawing.Imaging; namespace OpenRA.Editor { @@ -53,6 +54,28 @@ namespace OpenRA.Editor if (e.Button == MouseButtons.Right) Brush = Pair.New((ushort)0, null as Bitmap); + if (e.Button == MouseButtons.Left && Brush.Second != null) + { + // change the bits in the map + var template = TileSet.walk[Brush.First]; + var pos = GetBrushLocation(); + + for( var u = 0; u < template.Size.X; u++ ) + for (var v = 0; v < template.Size.Y; v++) + { + var z = u + v * template.Size.X; + if (template.TerrainType.ContainsKey(z)) + Map.MapTiles[u + pos.X, v + pos.Y] = + new TileReference { type = Brush.First, image = (byte)z, index = (byte)z }; + } + + // invalidate tiles that were involved. + + // todo: do this properly. + foreach (var v in Chunks.Values) v.Dispose(); + Chunks.Clear(); + } + Invalidate(); } @@ -66,19 +89,29 @@ namespace OpenRA.Editor var hx = Math.Min(Map.Width - u * ChunkSize, ChunkSize); var hy = Math.Min(Map.Height - v * ChunkSize, ChunkSize); - for( var i = 0; i < hx; i++ ) - for (var j = 0; j < hy; j++) - { - var tr = Map.MapTiles[u * ChunkSize + i, v * ChunkSize + j]; - var tile = TileSet.tiles[tr.type]; + var data = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), + ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb); - var index = (tr.index < tile.TileBitmapBytes.Count) ? tr.index : 0; - var rawImage = tile.TileBitmapBytes[index]; + unsafe + { + 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++) + { + var tr = Map.MapTiles[u * ChunkSize + i, v * ChunkSize + j]; + var tile = TileSet.tiles[tr.type]; + + var index = (tr.index < tile.TileBitmapBytes.Count) ? tr.index : 0; + var rawImage = tile.TileBitmapBytes[index]; for (var x = 0; x < 24; x++) for (var y = 0; y < 24; y++) - bitmap.SetPixel(i * 24 + x, j * 24 + y, Palette.GetColor(rawImage[x + 24 * y])); - } + p[ (j * 24 + y) * stride + i * 24 + x ] = Palette.GetColor(rawImage[x + 24 * y]).ToArgb(); + } + } + bitmap.UnlockBits(data); return bitmap; }