recrownedgtk/RecrownedAthenaeum.ConsoleTools/TextureAtlasTools/TexturePackerCommand.cs

86 lines
4.0 KiB
C#

using RecrownedAthenaeum.Tools.CommandProcessor;
using RecrownedAthenaeum.Tools.TextureAtlas;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
namespace RecrownedAthenaeum.Tools.TextureAtlasTools
{
class TexturePackerCommand : EngineCommand
{
TexturePacker texturePacker;
public TexturePackerCommand() : base("texturepacker") { }
public override string Help(string argument)
{
switch (argument)
{
case null:
return "Packs a given directory composed of png and jpg files into an atlas. Can also add 9patch properties. Possible arguments are \"-i\", \"-o\", and \"-9p\". Refer to \"help\" for more info.";
case "-i":
return "-i : path for input directory containing the textures. Required.";
case "-o":
return "-o : path for output files. Points to non-existent file. Will create texture and definitions file with name. Required.";
case "-9p":
return "-9p can be used multiple times for defining a 9patch. This parameter requires a name, left patch, right patch, top patch, and bottom patch in the format name,a,b,c,d. Optional.";
default:
return argument + " is not a valid argument. Type \"help texturepacker to see general help and list of arguments.\"";
}
}
public override void Run(string[] arguments)
{
if (arguments == null) throw new ArgumentException("Requires arguments. Type \"help texturepacker\" for more info.");
for (int i = 0; i < arguments.Length; i++)
{
if (arguments[i] == "-i")
{
if (i + 1 >= arguments.Length) throw new ArgumentException("-i is not followed by path for input directory.");
texturePacker = new TexturePacker((arguments[i + 1]));
}
}
if (texturePacker != null)
{
texturePacker.Build();
for (int i = 0; i < arguments.Length; i++)
{
if (arguments[i] == "-9p")
{
if (i + 5 >= arguments.Length) throw new ArgumentException("-9p is not followed by proper specifiers for a 9Patch (format: \"-9p textureName,a,b,c,d\" where a, b, c, and d are integers definining the border regions for the 9patch.)");
string[] nPatchArgs = arguments[i + 1].Split(',');
try
{
texturePacker.SetNinePatch(nPatchArgs[0], int.Parse(nPatchArgs[1]), int.Parse(nPatchArgs[2]), int.Parse(nPatchArgs[3]), int.Parse(nPatchArgs[4]));
}
catch (FormatException)
{
throw new ArgumentException("-9p argument parameters must be in the format \"-9p textureName,a,b,c,d\" where a, b, c, and d are integers definining the border regions for the 9patch.");
}
}
}
for (int i = 0; i < arguments.Length; i++)
{
if (arguments[i] == "-o")
{
if (i + 1 >= arguments.Length) throw new ArgumentException("-o is not followed by path for output files. (eg. path/to/file where file is the name for the atlas.)");
texturePacker.Save(Path.GetDirectoryName(arguments[i + 1]), Path.GetFileName(arguments[i + 1]));
return;
}
if (i == arguments.Length - 1)
{
throw new ArgumentException("no -o argument found to specify output.");
}
}
} else
{
throw new ArgumentException("-i not specified.");
}
}
}
}