Skip to content

Commit

Permalink
Add --debug-chrome-regions utility command.
Browse files Browse the repository at this point in the history
  • Loading branch information
pchote authored and reaperrr committed Feb 22, 2020
1 parent 01f5ecb commit 9646363
Showing 1 changed file with 140 additions and 0 deletions.
140 changes: 140 additions & 0 deletions 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<string>();
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 =
{
"<!DOCTYPE html>",
"<html>",
"<head>",
"<meta charset=\"utf-8\"/>",
"</head>",
"<body>",
"<canvas id=\"canvas\" style=\"cursor: crosshair;\"></canvas>",
"<script>",
"var zoom = {0};",
"var chromeImage = \"data:image/png;base64,{1}\";",
"var chromeRegions = {2}",
"function setup() {{",
" var c = document.getElementById(\"canvas\");",
" var ctx = c.getContext(\"2d\");",
" var image = new Image;",
" image.onload = function() {{",
" c.width = zoom*image.width;",
" c.height = zoom*image.height;",
" ctx.fillStyle = \"#dddddd\";",
" for (var j = 0; j < ctx.canvas.height / 4; j++)",
" for (var i = j % 2; i < ctx.canvas.width / 4; i += 2)",
" ctx.fillRect(4 * i, 4 * j, 4, 4);",
" ctx.drawImage(image, 0, 0, c.width, c.height);",
" ctx.strokeStyle = \"#ffff00\";",
" ctx.lineWidth = 1;",
" for (var i = 0; i < chromeRegions.length; i++) {{",
" var r = chromeRegions[i];",
" ctx.strokeRect(zoom*r[1], zoom*r[2], zoom*r[3], zoom*r[4]);",
" }}",
" }};",
" var mouseover = undefined;",
" c.addEventListener('mousemove', e => {{",
" var cr = c.getBoundingClientRect();",
" var x = (e.clientX - cr.left) / (cr.right - cr.left) * c.width / zoom;",
" var y = (e.clientY - cr.top) / (cr.bottom - cr.top) * c.height / zoom;",
" var lastover = mouseover;",
" mouseover = undefined;",
" for (var i = 0; i < chromeRegions.length; i++) {{",
" var r = chromeRegions[i];",
" if (x >= r[1] && x < r[1] + r[3] && y >= r[2] && y < r[2] + r[4])",
" mouseover = r[0];",
" }}",
" if (lastover != mouseover && mouseover)",
" console.log(mouseover);",
" }});",
" image.src = chromeImage;",
"}}",
"window.onload = setup;",
"</script>",
"</body>",
"</html>",
};
}
}

0 comments on commit 9646363

Please sign in to comment.