From 831fd9fb3b732dd2e992616cf0b58349a417c9a3 Mon Sep 17 00:00:00 2001 From: windyfairy Date: Fri, 15 Nov 2019 14:31:52 +0900 Subject: [PATCH] Add (broken) support for paletted formats --- gitadora-textool/Program.cs | 59 ++++++++++++++++++++++++++++++++----- 1 file changed, 52 insertions(+), 7 deletions(-) diff --git a/gitadora-textool/Program.cs b/gitadora-textool/Program.cs index d8bb021..f794a31 100644 --- a/gitadora-textool/Program.cs +++ b/gitadora-textool/Program.cs @@ -65,7 +65,7 @@ namespace gitadora_textool var endianCheck2 = reader.ReadInt32(); var requiresEndianFix = endianCheck2 == 0x00010100; - reader.BaseStream.Seek(0x0c, SeekOrigin.Begin); + reader.BaseStream.Seek(0x0c, SeekOrigin.Begin); var dataSize = ReadInt32(reader, requiresEndianFix) - 0x40; var width = ReadInt16(reader, requiresEndianFix); @@ -82,6 +82,7 @@ namespace gitadora_textool BGRA_16BIT_FORMAT 0x0D BGR_FORMAT 0x0E BGRA_FORMAT 0x10 + BGR_4BIT_FORMAT 0x11 BGR_8BIT_FORMAT 0x12 DXT1_FORMAT 0x16 DXT3_FORMAT 0x18 @@ -93,6 +94,8 @@ namespace gitadora_textool reader.BaseStream.Seek(0x40, SeekOrigin.Begin); var bitmapData = reader.ReadBytes(dataSize); + var paletteEntries = new List(); + var pixelFormat = PixelFormat.Undefined; if (dataFormat == 0x01) { @@ -142,10 +145,41 @@ namespace gitadora_textool // BGRA_FORMAT pixelFormat = PixelFormat.Format32bppArgb; } + else if (dataFormat == 0x11) + { + // BGR_4BIT_FORMAT + var bitmapDataOnly = new byte[width * height / 2]; + Buffer.BlockCopy(bitmapData, 0, bitmapDataOnly, 0, bitmapDataOnly.Length); + + var paletteData = new byte[bitmapData.Length - bitmapDataOnly.Length - 0x14]; // Skip palette header + Buffer.BlockCopy(bitmapData, bitmapDataOnly.Length + 0x14, paletteData, 0, paletteData.Length); + + bitmapData = bitmapDataOnly; + + pixelFormat = PixelFormat.Format4bppIndexed; + + for (int i = 0; i < paletteData.Length / 4; i++) + { + paletteEntries.Add(Color.FromArgb(paletteData[i + 3], paletteData[i], paletteData[i + 1], paletteData[i + 2])); + } + } else if (dataFormat == 0x12) { // BGR_8BIT_FORMAT - throw new Exception("Found BGR_8BIT_FORMAT"); + var bitmapDataOnly = new byte[width * height]; + Buffer.BlockCopy(bitmapData, 0, bitmapDataOnly, 0, bitmapDataOnly.Length); + + var paletteData = new byte[bitmapData.Length - bitmapDataOnly.Length - 0x14]; // Skip palette header + Buffer.BlockCopy(bitmapData, bitmapDataOnly.Length + 0x14, paletteData, 0, paletteData.Length); + + bitmapData = bitmapDataOnly; + + pixelFormat = PixelFormat.Format8bppIndexed; + + for (int i = 0; i < paletteData.Length / 4; i++) + { + paletteEntries.Add(Color.FromArgb(paletteData[i + 3], paletteData[i], paletteData[i + 1], paletteData[i + 2])); + } } else if (dataFormat == 0x16) { @@ -167,7 +201,7 @@ namespace gitadora_textool } else { - throw new Exception("Found unknown pixel format"); + throw new Exception(String.Format("Found unknown pixel format: {0:x2}", dataFormat)); } for (int i = 0; i < bitmapData.Length;) @@ -290,11 +324,22 @@ namespace gitadora_textool { ColorPalette palette = b.Palette; Color[] entries = palette.Entries; - for (int i = 0; i < 256; i++) - { - Color c = Color.FromArgb((byte)i, (byte)i, (byte)i); - entries[i] = c; + + if (paletteEntries.Count == 0) + { + for (int i = 0; i < 256; i++) + { + Color c = Color.FromArgb((byte)i, (byte)i, (byte)i); + entries[i] = c; + } + } else + { + for (int i = 0; i < paletteEntries.Count; i++) + { + entries[i] = paletteEntries[i]; + } } + b.Palette = palette; }