Improve HD sheet creation
This commit is contained in:
@@ -25,6 +25,12 @@ namespace OpenRA.FileFormats
|
|||||||
{
|
{
|
||||||
public class Png
|
public class Png
|
||||||
{
|
{
|
||||||
|
public enum Compression : byte
|
||||||
|
{
|
||||||
|
BEST_COMPRESSION = Deflater.BEST_COMPRESSION,
|
||||||
|
BEST_SPEED = Deflater.BEST_SPEED,
|
||||||
|
}
|
||||||
|
|
||||||
static readonly byte[] Signature = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];
|
static readonly byte[] Signature = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];
|
||||||
|
|
||||||
public int Width { get; }
|
public int Width { get; }
|
||||||
@@ -256,14 +262,27 @@ namespace OpenRA.FileFormats
|
|||||||
// Convert to big endian
|
// Convert to big endian
|
||||||
Data = new byte[data.Length];
|
Data = new byte[data.Length];
|
||||||
var stride = PixelStride;
|
var stride = PixelStride;
|
||||||
for (var i = 0; i < width * height; i++)
|
var elements = width * height * stride;
|
||||||
|
var src = data.AsSpan();
|
||||||
|
var dst = Data.AsSpan();
|
||||||
|
if (type == SpriteFrameType.Bgra32)
|
||||||
{
|
{
|
||||||
Data[stride * i] = data[stride * i + 2];
|
for (var i = 0; i < elements; i += 4)
|
||||||
Data[stride * i + 1] = data[stride * i + 1];
|
{
|
||||||
Data[stride * i + 2] = data[stride * i + 0];
|
dst[i + 0] = src[i + 2];
|
||||||
|
dst[i + 1] = src[i + 1];
|
||||||
if (type == SpriteFrameType.Bgra32)
|
dst[i + 2] = src[i + 0];
|
||||||
Data[stride * i + 3] = data[stride * i + 3];
|
dst[i + 3] = src[i + 3];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (var i = 0; i < elements; i += 3)
|
||||||
|
{
|
||||||
|
dst[i + 0] = src[i + 2];
|
||||||
|
dst[i + 1] = src[i + 1];
|
||||||
|
dst[i + 2] = src[i + 0];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@@ -303,7 +322,7 @@ namespace OpenRA.FileFormats
|
|||||||
throw new InvalidDataException("Unknown pixel format");
|
throw new InvalidDataException("Unknown pixel format");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void WritePngChunk(Stream output, string type, Stream input)
|
static void WritePngChunk(MemoryStream output, string type, MemoryStream input)
|
||||||
{
|
{
|
||||||
input.Position = 0;
|
input.Position = 0;
|
||||||
|
|
||||||
@@ -320,7 +339,7 @@ namespace OpenRA.FileFormats
|
|||||||
output.Write(IPAddress.NetworkToHostOrder((int)crc32.Value));
|
output.Write(IPAddress.NetworkToHostOrder((int)crc32.Value));
|
||||||
}
|
}
|
||||||
|
|
||||||
public byte[] Save()
|
public byte[] Save(Compression compression = Compression.BEST_COMPRESSION)
|
||||||
{
|
{
|
||||||
using (var output = new MemoryStream())
|
using (var output = new MemoryStream())
|
||||||
{
|
{
|
||||||
@@ -372,7 +391,7 @@ namespace OpenRA.FileFormats
|
|||||||
|
|
||||||
using (var data = new MemoryStream())
|
using (var data = new MemoryStream())
|
||||||
{
|
{
|
||||||
using (var compressed = new DeflaterOutputStream(data, new Deflater(Deflater.BEST_COMPRESSION)))
|
using (var compressed = new DeflaterOutputStream(data, new Deflater((int)compression)))
|
||||||
{
|
{
|
||||||
var rowStride = Width * PixelStride;
|
var rowStride = Width * PixelStride;
|
||||||
for (var y = 0; y < Height; y++)
|
for (var y = 0; y < Height; y++)
|
||||||
@@ -404,9 +423,9 @@ namespace OpenRA.FileFormats
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Save(string path)
|
public void Save(string path, Compression compression = Compression.BEST_COMPRESSION)
|
||||||
{
|
{
|
||||||
File.WriteAllBytes(path, Save());
|
File.WriteAllBytes(path, Save(compression));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
|
using OpenRA.FileFormats;
|
||||||
using OpenRA.FileSystem;
|
using OpenRA.FileSystem;
|
||||||
using OpenRA.Graphics;
|
using OpenRA.Graphics;
|
||||||
|
|
||||||
@@ -56,14 +57,14 @@ namespace OpenRA.Mods.Common.UtilityCommands
|
|||||||
{
|
{
|
||||||
var max = s == sb.Current ? (int)sb.CurrentChannel + 1 : 4;
|
var max = s == sb.Current ? (int)sb.CurrentChannel + 1 : 4;
|
||||||
for (var i = 0; i < max; i++)
|
for (var i = 0; i < max; i++)
|
||||||
s.AsPng((TextureChannel)ChannelMasks[i], palette).Save($"{count}.{i}.png");
|
s.AsPng((TextureChannel)ChannelMasks[i], palette).Save($"{count}.{i}.png", Png.Compression.BEST_SPEED);
|
||||||
|
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
|
|
||||||
sb = sequences.SpriteCache.SheetBuilders[SheetType.BGRA];
|
sb = sequences.SpriteCache.SheetBuilders[SheetType.BGRA];
|
||||||
foreach (var s in sb.AllSheets)
|
foreach (var s in sb.AllSheets)
|
||||||
s.AsPng().Save($"{count++}.png");
|
s.AsPng().Save($"{count++}.png", Png.Compression.BEST_SPEED);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user