Move ShpTD sprite loading into Mods.Common.

This commit is contained in:
Paul Chote
2014-10-05 15:25:39 +13:00
parent 9cf8328979
commit d658643b73
11 changed files with 78 additions and 59 deletions

View File

@@ -15,7 +15,7 @@ using OpenRA.FileFormats;
namespace OpenRA.Graphics
{
// TODO: Most of this should be moved into the format parsers themselves.
public enum SpriteType { Unknown, ShpTD, ShpTS, ShpD2, TmpTD, TmpRA, TmpTS, R8 }
public enum SpriteType { Unknown, ShpTS, ShpD2, TmpTD, TmpRA, TmpTS, R8 }
public static class SpriteSource
{
static bool IsTmpRA(Stream s)
@@ -103,42 +103,6 @@ namespace OpenRA.Graphics
return type < 4;
}
static bool IsShpTD(Stream s)
{
var start = s.Position;
// First word is the image count
var imageCount = s.ReadUInt16();
if (imageCount == 0)
{
s.Position = start;
return false;
}
// Last offset should point to the end of file
var finalOffset = start + 14 + 8 * imageCount;
if (finalOffset > s.Length)
{
s.Position = start;
return false;
}
s.Position = finalOffset;
var eof = s.ReadUInt32();
if (eof != s.Length)
{
s.Position = start;
return false;
}
// Check the format flag on the first frame
s.Position = start + 17;
var b = s.ReadUInt8();
s.Position = start;
return b == 0x20 || b == 0x40 || b == 0x80;
}
static bool IsShpD2(Stream s)
{
var start = s.Position;
@@ -198,9 +162,6 @@ namespace OpenRA.Graphics
public static SpriteType DetectSpriteType(Stream s)
{
if (IsShpTD(s))
return SpriteType.ShpTD;
if (IsShpTS(s))
return SpriteType.ShpTS;
@@ -227,8 +188,6 @@ namespace OpenRA.Graphics
var type = DetectSpriteType(s);
switch (type)
{
case SpriteType.ShpTD:
return new ShpReader(s);
case SpriteType.ShpTS:
return new ShpTSReader(s);
case SpriteType.R8:

View File

@@ -279,7 +279,6 @@
<Compile Include="FileFormats\PngLoader.cs" />
<Compile Include="FileFormats\R8Reader.cs" />
<Compile Include="FileFormats\ShpD2Reader.cs" />
<Compile Include="FileFormats\ShpReader.cs" />
<Compile Include="FileFormats\ShpTSReader.cs" />
<Compile Include="FileFormats\TmpRAReader.cs" />
<Compile Include="FileFormats\TmpTDReader.cs" />

View File

@@ -113,6 +113,7 @@
<Compile Include="World\ResourceClaim.cs" />
<Compile Include="World\ResourceClaimLayer.cs" />
<Compile Include="World\SmudgeLayer.cs" />
<Compile Include="SpriteLoaders\ShpTDLoader.cs" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup>

View File

@@ -13,11 +13,63 @@ using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using OpenRA.FileFormats;
using OpenRA.Graphics;
namespace OpenRA.FileFormats
namespace OpenRA.Mods.Common.SpriteLoaders
{
public class ShpReader : ISpriteSource
public class ShpTDLoader : ISpriteLoader
{
static bool IsShpTD(Stream s)
{
var start = s.Position;
// First word is the image count
var imageCount = s.ReadUInt16();
if (imageCount == 0)
{
s.Position = start;
return false;
}
// Last offset should point to the end of file
var finalOffset = start + 14 + 8 * imageCount;
if (finalOffset > s.Length)
{
s.Position = start;
return false;
}
s.Position = finalOffset;
var eof = s.ReadUInt32();
if (eof != s.Length)
{
s.Position = start;
return false;
}
// Check the format flag on the first frame
s.Position = start + 17;
var b = s.ReadUInt8();
s.Position = start;
return b == 0x20 || b == 0x40 || b == 0x80;
}
public bool TryParseSprite(Stream s, out ISpriteFrame[] frames)
{
if (!IsShpTD(s))
{
frames = null;
return false;
}
frames = new ShpTDSprite(s).Frames.ToArray();
return true;
}
}
public class ShpTDSprite
{
enum Format { Format20 = 0x20, Format40 = 0x40, Format80 = 0x80 }
@@ -36,12 +88,12 @@ namespace OpenRA.FileFormats
public Format RefFormat;
public ImageHeader RefImage;
ShpReader reader;
ShpTDSprite reader;
// Used by ShpWriter
public ImageHeader() { }
public ImageHeader(Stream stream, ShpReader reader)
public ImageHeader(Stream stream, ShpTDSprite reader)
{
this.reader = reader;
var data = stream.ReadUInt32();
@@ -69,7 +121,7 @@ namespace OpenRA.FileFormats
readonly long shpBytesFileOffset;
readonly byte[] shpBytes;
public ShpReader(Stream stream)
public ShpTDSprite(Stream stream)
{
imageCount = stream.ReadUInt16();
stream.Position += 4;
@@ -149,12 +201,6 @@ namespace OpenRA.FileFormats
return imageData;
}
public static ShpReader Load(string filename)
{
using (var s = File.OpenRead(filename))
return new ShpReader(s);
}
public static void Write(Stream s, Size size, IEnumerable<byte[]> frames)
{
var compressedFrames = frames.Select(f => Format80.Encode(f)).ToArray();

View File

@@ -17,6 +17,7 @@ using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using OpenRA.FileFormats;
using OpenRA.Mods.Common.SpriteLoaders;
namespace OpenRA.Mods.Common.UtilityCommands
{
@@ -36,7 +37,7 @@ namespace OpenRA.Mods.Common.UtilityCommands
throw new InvalidOperationException("All frames must be the same size");
using (var destStream = File.Create(dest))
ShpReader.Write(destStream, size, frames.Select(f => ToBytes(f)));
ShpTDSprite.Write(destStream, size, frames.Select(f => ToBytes(f)));
Console.WriteLine(dest + " saved.");
}

View File

@@ -18,6 +18,7 @@ using OpenRA.Traits;
using OpenRA.Graphics;
using OpenRA.FileFormats;
using OpenRA.FileSystem;
using OpenRA.Mods.Common.SpriteLoaders;
namespace OpenRA.Mods.Common.UtilityCommands
{
@@ -65,11 +66,13 @@ namespace OpenRA.Mods.Common.UtilityCommands
.Where(a => !remap.ContainsValue(a))
.MinBy(a => ColorDistance(destPalette[a], srcPalette[i]));
var srcImage = ShpReader.Load(args[3]);
using (var s = File.OpenRead(args[3]))
using (var destStream = File.Create(args[4]))
ShpReader.Write(destStream, srcImage.Size,
{
var srcImage = new ShpTDSprite(s);
ShpTDSprite.Write(destStream, srcImage.Size,
srcImage.Frames.Select(im => im.Data.Select(px => (byte)remap[px]).ToArray()));
}
}
static int ColorDistance(uint a, uint b)

View File

@@ -210,3 +210,5 @@ Missions:
mods/cnc/missions.yaml
SupportsMapsFrom: cnc
SpriteFormats: ShpTD

View File

@@ -188,3 +188,5 @@ LuaScripts:
mods/common/lua/facing.lua
SupportsMapsFrom: d2k
SpriteFormats: ShpTD

View File

@@ -49,4 +49,6 @@ Fonts:
Font:FreeSansBold.ttf
Size:10
LobbyDefaults:
LobbyDefaults:
SpriteFormats: ShpTD

View File

@@ -207,3 +207,5 @@ Missions:
mods/ra/missions.yaml
SupportsMapsFrom: ra
SpriteFormats: ShpTD

View File

@@ -229,3 +229,5 @@ LuaScripts:
mods/common/lua/facing.lua
SupportsMapsFrom: ts
SpriteFormats: ShpTD