87 lines
2.4 KiB
C#
87 lines
2.4 KiB
C#
using System.Collections.Generic;
|
|
|
|
namespace Palettizer
|
|
{
|
|
public class Palette
|
|
{
|
|
public Dictionary<Color, byte> ColorToGrayscaleMap { get; }
|
|
public byte GrayscaleIndex { get; set; }
|
|
public List<byte[]> AlternateColorRows { get; }
|
|
|
|
public int Width { get => ColorToGrayscaleMap.Count; }
|
|
public int Height { get => AlternateColorRows.Count + 1; }
|
|
|
|
public Palette()
|
|
{
|
|
ColorToGrayscaleMap = new Dictionary<Color, byte>();
|
|
GrayscaleIndex = 0;
|
|
AlternateColorRows = new List<byte[]>();
|
|
}
|
|
|
|
public void AddColor(Color color, byte grayscaleIndex)
|
|
{
|
|
ColorToGrayscaleMap.Add(color, grayscaleIndex);
|
|
}
|
|
|
|
public void AddAlternateColorRow(Color[] colors)
|
|
{
|
|
var byteArray = new byte[ColorToGrayscaleMap.Count * 4];
|
|
|
|
foreach (var color in colors)
|
|
{
|
|
if (ColorToGrayscaleMap.ContainsKey(color))
|
|
{
|
|
var grayscaleIndex = ColorToGrayscaleMap[color];
|
|
|
|
byteArray[grayscaleIndex] = color.R;
|
|
byteArray[grayscaleIndex + 1] = color.G;
|
|
byteArray[grayscaleIndex + 2] = color.B;
|
|
byteArray[grayscaleIndex + 3] = color.A;
|
|
}
|
|
else
|
|
{
|
|
System.Console.WriteLine($"Color {color.ToString()} doesn't exist in the grayscale palette!! Bailing!!!");
|
|
return;
|
|
}
|
|
}
|
|
|
|
AlternateColorRows.Add(byteArray);
|
|
}
|
|
|
|
public byte[] CreateIndexedPaletteBitmap()
|
|
{
|
|
var paletteBitmap = new byte[ColorToGrayscaleMap.Count * 4 * (AlternateColorRows.Count + 1)];
|
|
|
|
var index = 0;
|
|
foreach (KeyValuePair<Color, byte> kv in ColorToGrayscaleMap)
|
|
{
|
|
var color = kv.Key;
|
|
var grayscale = kv.Value;
|
|
|
|
paletteBitmap[index] = grayscale;
|
|
paletteBitmap[index + 1] = grayscale;
|
|
paletteBitmap[index + 2] = grayscale;
|
|
paletteBitmap[index + 3] = 255;
|
|
|
|
var alternateIndex = 1;
|
|
foreach (var alternateColorRow in AlternateColorRows)
|
|
{
|
|
for (var j = 0; j < ColorToGrayscaleMap.Count * 4; j += 4)
|
|
{
|
|
paletteBitmap[index + (ColorToGrayscaleMap.Count * alternateIndex)] = alternateColorRow[j];
|
|
paletteBitmap[index + 1 + (ColorToGrayscaleMap.Count * alternateIndex)] = alternateColorRow[j + 1];
|
|
paletteBitmap[index + 2 + (ColorToGrayscaleMap.Count * alternateIndex)] = alternateColorRow[j + 2];
|
|
paletteBitmap[index + 3 + (ColorToGrayscaleMap.Count * alternateIndex)] = alternateColorRow[j + 3];
|
|
}
|
|
|
|
alternateIndex += 1;
|
|
}
|
|
|
|
index += 4;
|
|
}
|
|
|
|
return paletteBitmap;
|
|
}
|
|
}
|
|
}
|