using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;
namespace PalLib;
/// PAL файл: indexed texture с lookup таблицей, подписью Ipol и индексами.
/// Имя PAL файла.
/// [0x0000..0x0400] 256 цветов lookup (1024 байта).
/// [0x0404..0x10404] 256x256 индексов в lookup.
public record class PalFile(string FileName, byte[] Palette, byte[] Indices)
{
public void SaveAsPng(string outputPath)
{
const int width = 256;
const int height = 256;
var rgbaBytes = new byte[width * height * 4];
for (int i = 0; i < Indices.Length; i++)
{
var index = Indices[i];
// PAL, вероятно, связан с DirectX, поэтому порядок каналов похож на BGRA.
var b = Palette[index * 4 + 0];
var g = Palette[index * 4 + 1];
var r = Palette[index * 4 + 2];
var a = Palette[index * 4 + 3]; // Альфа или padding; ниже пока используется непрозрачность.
rgbaBytes[i * 4 + 0] = r;
rgbaBytes[i * 4 + 1] = g;
rgbaBytes[i * 4 + 2] = b;
rgbaBytes[i * 4 + 3] = 255;
}
using var image = Image.LoadPixelData(rgbaBytes, width, height);
image.SaveAsPng(outputPath);
}
}