diff --git a/Thief Mission Viewer.csproj b/Thief Mission Viewer.csproj index 4bd40ee..ab3aa02 100644 --- a/Thief Mission Viewer.csproj +++ b/Thief Mission Viewer.csproj @@ -8,5 +8,6 @@ + \ No newline at end of file diff --git a/project/code/TMV/TextureLoader.Gif.cs b/project/code/TMV/TextureLoader.Gif.cs new file mode 100644 index 0000000..4322f42 --- /dev/null +++ b/project/code/TMV/TextureLoader.Gif.cs @@ -0,0 +1,29 @@ +using Godot; +using SixLabors.ImageSharp.PixelFormats; + +namespace KeepersCompound.TMV; + +public partial class TextureLoader +{ + // TODO: Replace this with my own implementation lol + // References: + // - https://www.w3.org/Graphics/GIF/spec-gif89a.txt + private static ImageTexture LoadGif(string path) + { + using var gifImage = SixLabors.ImageSharp.Image.Load(path); + + var width = gifImage.Width; + var height = gifImage.Height; + var image = Image.Create(width, height, false, Image.Format.Rgba8); + for (var y = 0; y < height; y++) + { + for (var x = 0; x < width; x++) + { + var pixel = gifImage[x, y].ToVector4(); + image.SetPixel(x, y, new Color(pixel.X, pixel.Y, pixel.Z, pixel.W)); + } + } + + return ImageTexture.CreateFromImage(image); + } +} \ No newline at end of file diff --git a/project/code/TMV/TextureLoader.cs b/project/code/TMV/TextureLoader.cs index b2649ab..b2ef68b 100644 --- a/project/code/TMV/TextureLoader.cs +++ b/project/code/TMV/TextureLoader.cs @@ -98,12 +98,13 @@ public partial class TextureLoader return loaded; } - private static ImageTexture LoadTexture(string path) + public static ImageTexture LoadTexture(string path) { var ext = path.GetExtension().ToLower(); var texture = ext switch { "pcx" => LoadPcx(path), + "gif" => LoadGif(path), _ => ImageTexture.CreateFromImage(Image.LoadFromFile(path)), }; return texture;