diff --git a/OpenRA.Mods.Common/UtilityCommands/DebugChromeRegions.cs b/OpenRA.Mods.Common/UtilityCommands/DebugChromeRegions.cs new file mode 100644 index 0000000000..f073bac42d --- /dev/null +++ b/OpenRA.Mods.Common/UtilityCommands/DebugChromeRegions.cs @@ -0,0 +1,140 @@ +#region Copyright & License Information +/* + * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. For more + * information, see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using OpenRA.Graphics; +using OpenRA.Primitives; + +namespace OpenRA.Mods.Common.UtilityCommands +{ + class DebugChromeRegions : IUtilityCommand + { + string IUtilityCommand.Name { get { return "--debug-chrome-regions"; } } + + bool IUtilityCommand.ValidateArguments(string[] args) + { + return args.Length == 3; + } + + [Desc("IMAGE", "ZOOM", "Write a html page showing mapped chrome images.")] + void IUtilityCommand.Run(Utility utility, string[] args) + { + // HACK: The engine code assumes that Game.modData is set. + var modData = Game.ModData = utility.ModData; + + ChromeProvider.Initialize(modData); + + var image = args[1]; + var zoom = args[2]; + + var regions = new List(); + foreach (var c in ChromeProvider.Collections) + { + if (c.Value.Image != image) + continue; + + var pr = c.Value.PanelRegion; + if (pr != null && pr.Length == 8) + { + var sides = new[] + { + Pair.New(PanelSides.Top | PanelSides.Left, new Rectangle(pr[0], pr[1], pr[2], pr[3])), + Pair.New(PanelSides.Top, new Rectangle(pr[0] + pr[2], pr[1], pr[4], pr[3])), + Pair.New(PanelSides.Top | PanelSides.Right, new Rectangle(pr[0] + pr[2] + pr[4], pr[1], pr[6], pr[3])), + Pair.New(PanelSides.Left, new Rectangle(pr[0], pr[1] + pr[3], pr[2], pr[5])), + Pair.New(PanelSides.Center, new Rectangle(pr[0] + pr[2], pr[1] + pr[3], pr[4], pr[5])), + Pair.New(PanelSides.Right, new Rectangle(pr[0] + pr[2] + pr[4], pr[1] + pr[3], pr[6], pr[5])), + Pair.New(PanelSides.Bottom | PanelSides.Left, new Rectangle(pr[0], pr[1] + pr[3] + pr[5], pr[2], pr[7])), + Pair.New(PanelSides.Bottom, new Rectangle(pr[0] + pr[2], pr[1] + pr[3] + pr[5], pr[4], pr[7])), + Pair.New(PanelSides.Bottom | PanelSides.Right, new Rectangle(pr[0] + pr[2] + pr[4], pr[1] + pr[3] + pr[5], pr[6], pr[7])) + }; + + foreach (var s in sides) + { + var r = s.Second; + if (c.Value.PanelSides.HasSide(s.First)) + regions.Add("[\"{0}.<{1}>\",{2},{3},{4},{5}]".F(c.Key, s.First, r.X, r.Y, r.Width, r.Height)); + } + } + + foreach (var kv in c.Value.Regions) + { + var r = kv.Value; + regions.Add("[\"{0}\",{1},{2},{3},{4}]".F(c.Key + "." + kv.Key, r.X, r.Y, r.Width, r.Height)); + } + } + + var output = HtmlTemplate.JoinWith("\n").F(zoom, Convert.ToBase64String(modData.ModFiles.Open(image).ReadAllBytes()), "[" + regions.JoinWith(",") + "]"); + var outputPath = Path.ChangeExtension(image, ".html"); + File.WriteAllLines(outputPath, new[] { output }); + Console.WriteLine("Saved {0}", outputPath); + } + + static readonly string[] HtmlTemplate = + { + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + }; + } +}