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;