add --shp and --png commands to util

This commit is contained in:
Chris Forbes
2011-05-01 14:43:59 +12:00
parent 9d7ac73410
commit 7923f7d83a
5 changed files with 80 additions and 1 deletions

View File

@@ -24,7 +24,8 @@ namespace OpenRA.FileFormats.Graphics
{ {
public static Bitmap Load(string filename) public static Bitmap Load(string filename)
{ {
return Load(File.OpenRead(filename)); using (var s = File.OpenRead(filename))
return Load(s);
} }
public static Bitmap Load(Stream s) public static Bitmap Load(Stream s)

View File

@@ -174,5 +174,11 @@ namespace OpenRA.FileFormats
{ {
return GetEnumerator(); return GetEnumerator();
} }
public static ShpReader Load(string filename)
{
using (var s = File.OpenRead(filename))
return new ShpReader(s);
}
} }
} }

View File

@@ -15,6 +15,11 @@ using System.Windows.Forms;
using ICSharpCode.SharpZipLib; using ICSharpCode.SharpZipLib;
using ICSharpCode.SharpZipLib.Zip; using ICSharpCode.SharpZipLib.Zip;
using OpenRA.GameRules; using OpenRA.GameRules;
using OpenRA.FileFormats.Graphics;
using System.Drawing;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
using OpenRA.FileFormats;
namespace OpenRA.Utility namespace OpenRA.Utility
{ {
@@ -145,5 +150,67 @@ namespace OpenRA.Utility
public static void AuthenticateAndExtractZip(string[] args) { AuthenticateAndExecute("--extract-zip-inner", args); } public static void AuthenticateAndExtractZip(string[] args) { AuthenticateAndExecute("--extract-zip-inner", args); }
public static void AuthenticateAndInstallRAPackages(string[] args) { AuthenticateAndExecute( "--install-ra-packages-inner", args ); } public static void AuthenticateAndInstallRAPackages(string[] args) { AuthenticateAndExecute( "--install-ra-packages-inner", args ); }
public static void AuthenticateAndInstallCncPackages(string[] args) { AuthenticateAndExecute( "--install-cnc-packages-inner", args ); } public static void AuthenticateAndInstallCncPackages(string[] args) { AuthenticateAndExecute( "--install-cnc-packages-inner", args ); }
public static void ConvertPngToShp(string[] args)
{
var src = args[1];
var dest = Path.ChangeExtension(src, ".shp");
var width = int.Parse(args[2]);
var srcImage = PngLoader.Load(src);
if (srcImage.Width % width != 0)
throw new InvalidOperationException("Bogus width; not a whole number of frames");
using (var destStream = File.Create(dest))
ShpWriter.Write(destStream, width, srcImage.Height,
srcImage.ToFrames(width));
}
static IEnumerable<byte[]> ToFrames(this Bitmap bitmap, int width)
{
for (var x = 0; x < bitmap.Width; x += width)
{
var data = bitmap.LockBits(new Rectangle(x, 0, width, bitmap.Height), ImageLockMode.ReadOnly,
PixelFormat.Format8bppIndexed);
var bytes = new byte[width * bitmap.Height];
for (var i = 0; i < bitmap.Height; i++)
Marshal.Copy(new IntPtr(data.Scan0.ToInt64() + i * data.Stride),
bytes, i * width, width);
bitmap.UnlockBits(data);
yield return bytes;
}
}
public static void ConvertShpToPng(string[] args)
{
var src = args[1];
var dest = Path.ChangeExtension(src, ".png");
var srcImage = ShpReader.Load(src);
using (var bitmap = new Bitmap(srcImage.ImageCount * srcImage.Width, srcImage.Height, PixelFormat.Format8bppIndexed))
{
var x = 0;
foreach (var frame in srcImage)
{
var data = bitmap.LockBits(new Rectangle(x, 0, srcImage.Width, srcImage.Height), ImageLockMode.WriteOnly,
PixelFormat.Format8bppIndexed);
for (var i = 0; i < bitmap.Height; i++)
Marshal.Copy(frame.Image, i * srcImage.Width,
new IntPtr(data.Scan0.ToInt64() + i * data.Stride), srcImage.Width);
Marshal.Copy(frame.Image, 0, data.Scan0, frame.Image.Length);
x += srcImage.Width;
}
bitmap.Save(dest);
}
}
} }
} }

View File

@@ -36,6 +36,7 @@
<Reference Include="System.Core"> <Reference Include="System.Core">
<RequiredTargetFramework>3.5</RequiredTargetFramework> <RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference> </Reference>
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" /> <Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml.Linq"> <Reference Include="System.Xml.Linq">
<RequiredTargetFramework>3.5</RequiredTargetFramework> <RequiredTargetFramework>3.5</RequiredTargetFramework>

View File

@@ -44,6 +44,8 @@ namespace OpenRA.Utility
{ "--install-ra-packages", Command.AuthenticateAndInstallRAPackages }, { "--install-ra-packages", Command.AuthenticateAndInstallRAPackages },
{ "--install-cnc-packages", Command.AuthenticateAndInstallCncPackages }, { "--install-cnc-packages", Command.AuthenticateAndInstallCncPackages },
{ "--extract-zip", Command.AuthenticateAndExtractZip }, { "--extract-zip", Command.AuthenticateAndExtractZip },
{ "--shp", Command.ConvertPngToShp },
{ "--png", Command.ConvertShpToPng },
}; };
if (args.Length == 0) { PrintUsage(); return; } if (args.Length == 0) { PrintUsage(); return; }
@@ -99,6 +101,8 @@ namespace OpenRA.Utility
Console.WriteLine(" --install-ra-packages PATH Install required packages for RA from CD to PATH"); Console.WriteLine(" --install-ra-packages PATH Install required packages for RA from CD to PATH");
Console.WriteLine(" --install-cnc-packages PATH Install required packages for C&C from CD to PATH"); Console.WriteLine(" --install-cnc-packages PATH Install required packages for C&C from CD to PATH");
Console.WriteLine(" --settings-value SUPPORTDIR KEY Get value of KEY in SUPPORTDIR/settings.yaml"); Console.WriteLine(" --settings-value SUPPORTDIR KEY Get value of KEY in SUPPORTDIR/settings.yaml");
Console.WriteLine(" --shp PNGFILE FRAMEWIDTH Convert a PNG containing one or more frames to a SHP");
Console.WriteLine(" --png SHPFILE Convert a SHP to a PNG containing all of its frames");
} }
static T WithDefault<T>(T def, Func<T> f) static T WithDefault<T>(T def, Func<T> f)