Support 32 bit png sprites.
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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++)
|
||||||
|
|||||||
Reference in New Issue
Block a user