Support 32 bit png sprites.

This commit is contained in:
Paul Chote
2019-08-05 22:40:25 +01:00
committed by abcdefg30
parent 1111ce4754
commit 522861e484
2 changed files with 14 additions and 7 deletions

View File

@@ -34,6 +34,7 @@ namespace OpenRA.Mods.Common.SpriteLoaders
{ {
class PngSheetFrame : ISpriteFrame class PngSheetFrame : ISpriteFrame
{ {
public SpriteFrameType Type { get; set; }
public Size Size { get; set; } public Size Size { get; set; }
public Size FrameSize { get; set; } public Size FrameSize { get; set; }
public float2 Offset { get; set; } public float2 Offset { get; set; }
@@ -50,10 +51,6 @@ namespace OpenRA.Mods.Common.SpriteLoaders
var png = new Png(s); var png = new Png(s);
// Only supports paletted images
if (png.Palette == null)
return false;
List<Rectangle> frameRegions; List<Rectangle> frameRegions;
List<float2> frameOffsets; List<float2> frameOffsets;
@@ -69,24 +66,29 @@ namespace OpenRA.Mods.Common.SpriteLoaders
{ {
var frameStart = frameRegions[i].X + frameRegions[i].Y * png.Width; var frameStart = frameRegions[i].X + frameRegions[i].Y * png.Width;
var frameSize = new Size(frameRegions[i].Width, frameRegions[i].Height); var frameSize = new Size(frameRegions[i].Width, frameRegions[i].Height);
var pixelLength = png.Palette == null ? 4 : 1;
frames[i] = new PngSheetFrame() frames[i] = new PngSheetFrame()
{ {
Size = frameSize, Size = frameSize,
FrameSize = frameSize, FrameSize = frameSize,
Offset = frameOffsets[i], Offset = frameOffsets[i],
Data = new byte[frameRegions[i].Width * frameRegions[i].Height] Data = new byte[frameRegions[i].Width * frameRegions[i].Height * pixelLength],
Type = png.Palette == null ? SpriteFrameType.BGRA : SpriteFrameType.Indexed
}; };
for (var y = 0; y < frames[i].Size.Height; y++) for (var y = 0; y < frames[i].Size.Height; y++)
Array.Copy(png.Data, frameStart + y * png.Width, frames[i].Data, y * frames[i].Size.Width, frames[i].Size.Width); Array.Copy(png.Data, (frameStart + y * png.Width) * pixelLength, frames[i].Data, y * frames[i].Size.Width * pixelLength, frames[i].Size.Width * pixelLength);
} }
metadata = new TypeDictionary metadata = new TypeDictionary
{ {
new PngSheetMetadata(png.EmbeddedData), new PngSheetMetadata(png.EmbeddedData),
new EmbeddedSpritePalette(png.Palette.Select(x => (uint)x.ToArgb()).ToArray())
}; };
if (png.Palette != null)
metadata.Add(new EmbeddedSpritePalette(png.Palette.Select(x => (uint)x.ToArgb()).ToArray()));
return true; return true;
} }

View File

@@ -9,6 +9,7 @@
*/ */
#endregion #endregion
using System;
using System.Collections.Generic; using System.Collections.Generic;
using OpenRA.FileFormats; using OpenRA.FileFormats;
using OpenRA.FileSystem; using OpenRA.FileSystem;
@@ -47,6 +48,10 @@ namespace OpenRA.Mods.Common.Traits
ImmutablePalette IProvidesCursorPaletteInfo.ReadPalette(IReadOnlyFileSystem fileSystem) ImmutablePalette IProvidesCursorPaletteInfo.ReadPalette(IReadOnlyFileSystem fileSystem)
{ {
var png = new Png(fileSystem.Open(Filename)); var png = new Png(fileSystem.Open(Filename));
if (png.Palette == null)
throw new InvalidOperationException("Unable to load palette `{0}` from non-paletted png `{1}`".F(Name, Filename));
var colors = new uint[Palette.Size]; var colors = new uint[Palette.Size];
for (var i = 0; i < png.Palette.Length; i++) for (var i = 0; i < png.Palette.Length; i++)