using System.Runtime.InteropServices; using Engine.Graphics.Pixel; using SixLabors.ImageSharp; using SixLabors.ImageSharp.Formats; using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing; namespace Engine.Resource.Loader; public class ImageLoader : IResourceLoader { public object Load(string parPath, IResourceStreamProvider parStreamProvider) { using var stream = parStreamProvider.GetStream(parPath); return Load(stream); } internal static Asset.Image Load(Stream parStream) { var sharpImage = SixLabors.ImageSharp.Image.Load(parStream); if (sharpImage == null) { throw new InvalidOperationException($"Failed to load image from stream"); } sharpImage.Mutate(parImageContext => parImageContext.Flip(FlipMode.Vertical)); var image = new Asset.Image(sharpImage.Width, sharpImage.Height); var span = MemoryMarshal.CreateSpan(ref MemoryMarshal.GetArrayDataReference(image.Pixels), image.Pixels.Length * Marshal.SizeOf()); sharpImage.CopyPixelDataTo(span); return image; } }