diff --git a/OpenRA.Editor/BrushTool.cs b/OpenRA.Editor/BrushTool.cs index 9028eccc5a..5139eac0eb 100644 --- a/OpenRA.Editor/BrushTool.cs +++ b/OpenRA.Editor/BrushTool.cs @@ -63,8 +63,8 @@ namespace OpenRA.Editor public void Preview(Surface surface, SGraphics g) { g.DrawImage(brushTemplate.Bitmap, - surface.TileSetRenderer.TileSize.Width * surface.GetBrushLocation().X * surface.Zoom + surface.GetOffset().X, - surface.TileSetRenderer.TileSize.Height * surface.GetBrushLocation().Y * surface.Zoom + surface.GetOffset().Y, + surface.TileSetRenderer.TileSize * surface.GetBrushLocation().X * surface.Zoom + surface.GetOffset().X, + surface.TileSetRenderer.TileSize * surface.GetBrushLocation().Y * surface.Zoom + surface.GetOffset().Y, brushTemplate.Bitmap.Width * surface.Zoom, brushTemplate.Bitmap.Height * surface.Zoom); } diff --git a/OpenRA.Editor/Surface.cs b/OpenRA.Editor/Surface.cs index 5f6f907458..d5c235a99c 100644 --- a/OpenRA.Editor/Surface.cs +++ b/OpenRA.Editor/Surface.cs @@ -257,7 +257,7 @@ namespace OpenRA.Editor Bitmap RenderChunk(int u, int v) { - var bitmap = new Bitmap(ChunkSize * TileSetRenderer.TileSize.Width, ChunkSize * TileSetRenderer.TileSize.Height); + var bitmap = new Bitmap(ChunkSize * TileSetRenderer.TileSize, ChunkSize * TileSetRenderer.TileSize); var data = bitmap.LockBits(bitmap.Bounds(), ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb); @@ -274,9 +274,9 @@ namespace OpenRA.Editor var tile = TileSetRenderer.Data(tr.Type); var index = (tr.Index < tile.Count) ? tr.Index : (byte)0; var rawImage = tile[index]; - for (var x = 0; x < TileSetRenderer.TileSize.Width; x++) - for (var y = 0; y < TileSetRenderer.TileSize.Height; y++) - p[(j * TileSetRenderer.TileSize.Width + y) * stride + i * TileSetRenderer.TileSize.Width + x] = Palette.GetColor(rawImage[x + TileSetRenderer.TileSize.Width * y]).ToArgb(); + for (var x = 0; x < TileSetRenderer.TileSize; x++) + for (var y = 0; y < TileSetRenderer.TileSize; y++) + p[(j * TileSetRenderer.TileSize + y) * stride + i * TileSetRenderer.TileSize + x] = Palette.GetColor(rawImage[x + TileSetRenderer.TileSize * y]).ToArgb(); if (Map.MapResources.Value[u * ChunkSize + i, v * ChunkSize + j].Type != 0) { @@ -287,12 +287,12 @@ namespace OpenRA.Editor int* q = (int*)srcdata.Scan0.ToPointer(); var srcstride = srcdata.Stride >> 2; - for (var x = 0; x < TileSetRenderer.TileSize.Width; x++) - for (var y = 0; y < TileSetRenderer.TileSize.Height; y++) + for (var x = 0; x < TileSetRenderer.TileSize; x++) + for (var y = 0; y < TileSetRenderer.TileSize; y++) { var c = q[y * srcstride + x]; if ((c & 0xff000000) != 0) /* quick & dirty, i cbf doing real alpha */ - p[(j * TileSetRenderer.TileSize.Width + y) * stride + i * TileSetRenderer.TileSize.Width + x] = c; + p[(j * TileSetRenderer.TileSize + y) * stride + i * TileSetRenderer.TileSize + x] = c; } resourceImage.UnlockBits(srcdata); @@ -320,15 +320,15 @@ namespace OpenRA.Editor { var vX = (int)Math.Floor((mousePos.X - Offset.X) / Zoom); var vY = (int)Math.Floor((mousePos.Y - Offset.Y) / Zoom); - return new CPos(vX / TileSetRenderer.TileSize.Width, vY / TileSetRenderer.TileSize.Height); + return new CPos(vX / TileSetRenderer.TileSize, vY / TileSetRenderer.TileSize); } public CPos GetBrushLocationBR() { var vX = (int)Math.Floor((mousePos.X - Offset.X) / Zoom); var vY = (int)Math.Floor((mousePos.Y - Offset.Y) / Zoom); - return new CPos((vX + TileSetRenderer.TileSize.Width - 1) / TileSetRenderer.TileSize.Width, - (vY + TileSetRenderer.TileSize.Height - 1) / TileSetRenderer.TileSize.Height); + return new CPos((vX + TileSetRenderer.TileSize - 1) / TileSetRenderer.TileSize, + (vY + TileSetRenderer.TileSize - 1) / TileSetRenderer.TileSize); } public void DrawActor(SGraphics g, CPos p, ActorTemplate t, ColorPalette cp) @@ -342,11 +342,11 @@ namespace OpenRA.Editor float2 GetDrawPosition(CPos location, Bitmap bmp, bool centered) { - float offsetX = centered ? bmp.Width / 2 - TileSetRenderer.TileSize.Width / 2 : 0; - float drawX = TileSetRenderer.TileSize.Width * location.X * Zoom + Offset.X - offsetX; + float offsetX = centered ? bmp.Width / 2 - TileSetRenderer.TileSize / 2 : 0; + float drawX = TileSetRenderer.TileSize * location.X * Zoom + Offset.X - offsetX; - float offsetY = centered ? bmp.Height / 2 - TileSetRenderer.TileSize.Height / 2 : 0; - float drawY = TileSetRenderer.TileSize.Height * location.Y * Zoom + Offset.Y - offsetY; + float offsetY = centered ? bmp.Height / 2 - TileSetRenderer.TileSize / 2 : 0; + float drawY = TileSetRenderer.TileSize * location.Y * Zoom + Offset.Y - offsetY; return new float2(drawX, drawY); } @@ -414,24 +414,24 @@ namespace OpenRA.Editor var bmp = Chunks[x]; - var drawX = TileSetRenderer.TileSize.Width * (float)ChunkSize * (float)x.X * Zoom + Offset.X; - var drawY = TileSetRenderer.TileSize.Height * (float)ChunkSize * (float)x.Y * Zoom + Offset.Y; + var drawX = TileSetRenderer.TileSize * (float)ChunkSize * (float)x.X * Zoom + Offset.X; + var drawY = TileSetRenderer.TileSize * (float)ChunkSize * (float)x.Y * Zoom + Offset.Y; RectangleF sourceRect = new RectangleF(0, 0, bmp.Width, bmp.Height); RectangleF destRect = new RectangleF(drawX, drawY, bmp.Width * Zoom, bmp.Height * Zoom); e.Graphics.DrawImage(bmp, destRect, sourceRect, GraphicsUnit.Pixel); } e.Graphics.DrawRectangle(CordonPen, - Map.Bounds.Left * TileSetRenderer.TileSize.Width * Zoom + Offset.X, - Map.Bounds.Top * TileSetRenderer.TileSize.Height * Zoom + Offset.Y, - Map.Bounds.Width * TileSetRenderer.TileSize.Width * Zoom, - Map.Bounds.Height * TileSetRenderer.TileSize.Height * Zoom); + Map.Bounds.Left * TileSetRenderer.TileSize * Zoom + Offset.X, + Map.Bounds.Top * TileSetRenderer.TileSize * Zoom + Offset.Y, + Map.Bounds.Width * TileSetRenderer.TileSize * Zoom, + Map.Bounds.Height * TileSetRenderer.TileSize * Zoom); e.Graphics.DrawRectangle(SelectionPen, - (SelectionStart.X * TileSetRenderer.TileSize.Width * Zoom) + Offset.X, - (SelectionStart.Y * TileSetRenderer.TileSize.Height * Zoom) + Offset.Y, - (SelectionEnd - SelectionStart).X * TileSetRenderer.TileSize.Width * Zoom, - (SelectionEnd - SelectionStart).Y * TileSetRenderer.TileSize.Height * Zoom); + (SelectionStart.X * TileSetRenderer.TileSize * Zoom) + Offset.X, + (SelectionStart.Y * TileSetRenderer.TileSize * Zoom) + Offset.Y, + (SelectionEnd - SelectionStart).X * TileSetRenderer.TileSize * Zoom, + (SelectionEnd - SelectionStart).Y * TileSetRenderer.TileSize * Zoom); if (IsPaste) { @@ -440,10 +440,10 @@ namespace OpenRA.Editor var height = Math.Abs((SelectionStart - SelectionEnd).Y); e.Graphics.DrawRectangle(PastePen, - (loc.X * TileSetRenderer.TileSize.Width * Zoom) + Offset.X, - (loc.Y * TileSetRenderer.TileSize.Height * Zoom) + Offset.Y, - width * (TileSetRenderer.TileSize.Width * Zoom), - height * (TileSetRenderer.TileSize.Height * Zoom)); + (loc.X * TileSetRenderer.TileSize * Zoom) + Offset.X, + (loc.Y * TileSetRenderer.TileSize * Zoom) + Offset.Y, + width * (TileSetRenderer.TileSize * Zoom), + height * (TileSetRenderer.TileSize * Zoom)); } foreach (var ar in Map.Actors.Value) @@ -459,8 +459,8 @@ namespace OpenRA.Editor foreach (var ar in Map.Actors.Value) if (!ar.Key.StartsWith("Actor")) // if it has a custom name e.Graphics.DrawStringContrast(Font, ar.Key, - (int)(ar.Value.Location().X * TileSetRenderer.TileSize.Width * Zoom + Offset.X), - (int)(ar.Value.Location().Y * TileSetRenderer.TileSize.Height * Zoom + Offset.Y), + (int)(ar.Value.Location().X * TileSetRenderer.TileSize * Zoom + Offset.X), + (int)(ar.Value.Location().Y * TileSetRenderer.TileSize * Zoom + Offset.Y), Brushes.White, Brushes.Black); @@ -470,7 +470,7 @@ namespace OpenRA.Editor { if (i % 8 == 0) { - PointF point = new PointF(i * TileSetRenderer.TileSize.Width * Zoom + Offset.X, (Map.Bounds.Top - 8) * TileSetRenderer.TileSize.Height * Zoom + Offset.Y); + PointF point = new PointF(i * TileSetRenderer.TileSize * Zoom + Offset.X, (Map.Bounds.Top - 8) * TileSetRenderer.TileSize * Zoom + Offset.Y); e.Graphics.DrawString((i - Map.Bounds.Left).ToString(), MarkerFont, TextBrush, point); } } @@ -479,7 +479,7 @@ namespace OpenRA.Editor { if (i % 8 == 0) { - PointF point = new PointF((Map.Bounds.Left - 8) * TileSetRenderer.TileSize.Width * Zoom + Offset.X, i * TileSetRenderer.TileSize.Height * Zoom + Offset.Y); + PointF point = new PointF((Map.Bounds.Left - 8) * TileSetRenderer.TileSize * Zoom + Offset.X, i * TileSetRenderer.TileSize * Zoom + Offset.Y); e.Graphics.DrawString((i - Map.Bounds.Left).ToString(), MarkerFont, TextBrush, point); } } diff --git a/OpenRA.Editor/TileSetRenderer.cs b/OpenRA.Editor/TileSetRenderer.cs index ef85c96bd9..0468a71d30 100644 --- a/OpenRA.Editor/TileSetRenderer.cs +++ b/OpenRA.Editor/TileSetRenderer.cs @@ -8,6 +8,7 @@ */ #endregion +using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; @@ -21,7 +22,27 @@ namespace OpenRA.Editor { public TileSet TileSet; Dictionary> templates; - public Size TileSize; + public readonly int TileSize; + + // Extract a square tile that the editor can render + byte[] ExtractSquareTile(ISpriteFrame frame) + { + var data = new byte[TileSize * TileSize]; + + // Invalid tile size: return blank tile + if (frame.Size.Width < TileSize || frame.Size.Height < TileSize) + return data; + + var frameData = frame.Data; + var xOffset = (frame.Size.Width - TileSize) / 2; + var yOffset = (frame.Size.Height - TileSize) / 2; + + for (var y = 0; y < TileSize; y++) + for (var x = 0; x < TileSize; x++) + data[y * TileSize + x] = frameData[(yOffset + y) * frame.Size.Width + x + xOffset]; + + return data; + } List LoadTemplate(string filename, string[] exts, Dictionary sourceCache, int[] frames) { @@ -42,18 +63,18 @@ namespace OpenRA.Editor var ret = new List(); var srcFrames = source.Frames.ToArray(); foreach (var i in frames) - ret.Add(srcFrames[i].Data); + ret.Add(ExtractSquareTile(srcFrames[i])); return ret; } - return source.Frames.Select(f => f.Data).ToList(); + return source.Frames.Select(f => ExtractSquareTile(f)).ToList(); } public TileSetRenderer(TileSet tileset, Size tileSize) { this.TileSet = tileset; - this.TileSize = tileSize; + this.TileSize = Math.Min(tileSize.Width, tileSize.Height); templates = new Dictionary>(); var sourceCache = new Dictionary(); @@ -66,7 +87,7 @@ namespace OpenRA.Editor var template = TileSet.Templates[id]; var templateData = templates[id]; - var bitmap = new Bitmap(TileSize.Width * template.Size.X, TileSize.Height * template.Size.Y, + var bitmap = new Bitmap(TileSize * template.Size.X, TileSize * template.Size.Y, PixelFormat.Format8bppIndexed); bitmap.Palette = p.AsSystemPalette(); @@ -86,15 +107,15 @@ namespace OpenRA.Editor var rawImage = templateData[u + v * template.Size.X]; if (rawImage != null && rawImage.Length > 0) { - for (var i = 0; i < TileSize.Width; i++) - for (var j = 0; j < TileSize.Height; j++) - q[(v * TileSize.Width + j) * stride + u * TileSize.Width + i] = rawImage[i + TileSize.Width * j]; + for (var i = 0; i < TileSize; i++) + for (var j = 0; j < TileSize; j++) + q[(v * TileSize + j) * stride + u * TileSize + i] = rawImage[i + TileSize * j]; } else { - for (var i = 0; i < TileSize.Width; i++) - for (var j = 0; j < TileSize.Height; j++) - q[(v * TileSize.Width + j) * stride + u * TileSize.Width + i] = 0; + for (var i = 0; i < TileSize; i++) + for (var j = 0; j < TileSize; j++) + q[(v * TileSize + j) * stride + u * TileSize + i] = 0; } } }