Converting to EF, need to work on TS
This commit is contained in:
@@ -7,7 +7,6 @@ using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using fxl.codes.kisekae.Entities;
|
||||
using fxl.codes.kisekae.Models;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using SixLabors.ImageSharp;
|
||||
@@ -79,16 +78,16 @@ namespace fxl.codes.kisekae.Services
|
||||
_storage.DeleteFile(file.FileName);
|
||||
}
|
||||
|
||||
public Color[] ParsePalette(PaletteDto palette, out int groups, out int colorsPerGroup)
|
||||
public Color[] ParsePalette(Palette palette, out int groups, out int colorsPerGroup)
|
||||
{
|
||||
groups = 0;
|
||||
colorsPerGroup = 0;
|
||||
|
||||
|
||||
if (palette.Data.Length == 0) return null;
|
||||
if (!palette.Data[..KissHeader.Length].SequenceEqual(KissHeader)) return GetColors(palette.Data);
|
||||
|
||||
|
||||
// Verify palette mark?
|
||||
if (palette.Data[4] != 16) _logger.LogError($"{palette.Filename} is not a valid palette file");
|
||||
if (palette.Data[4] != 16) _logger.LogError($"{palette.FileName} is not a valid palette file");
|
||||
|
||||
var colorDepth = Convert.ToInt32(palette.Data[5]);
|
||||
colorsPerGroup = BitConverter.ToInt16(palette.Data, 8);
|
||||
@@ -97,16 +96,16 @@ namespace fxl.codes.kisekae.Services
|
||||
return GetColors(palette.Data[32..], colorDepth, colorsPerGroup, groups);
|
||||
}
|
||||
|
||||
public void ParseCel(string directory, CelModel cel, IEnumerable<PaletteModel> palettes)
|
||||
public void RenderCel(CelConfig celConfig)
|
||||
{
|
||||
_logger.LogTrace($"Reading cel {cel.FileName} from {directory}");
|
||||
var buffer = ReadToBuffer(directory, cel.FileName);
|
||||
if (buffer.Length == 0) return;
|
||||
_logger.LogTrace($"Reading cel {celConfig.Cel.FileName}");
|
||||
var buffer = celConfig.Cel?.Data?.ToArray();
|
||||
if (buffer == null || buffer.Length == 0) return;
|
||||
|
||||
if (buffer[..KissHeader.Length].SequenceEqual(KissHeader))
|
||||
{
|
||||
// Verify cel mark?
|
||||
if (buffer[4] != 32) _logger.LogError($"{cel.FileName} is not a valid cel file");
|
||||
if (buffer[4] != 32) _logger.LogError($"{celConfig.Cel.FileName} is not a valid cel file");
|
||||
|
||||
var pixelBits = Convert.ToInt32(buffer[5]);
|
||||
var width = BitConverter.ToInt16(buffer, 8);
|
||||
@@ -114,33 +113,24 @@ namespace fxl.codes.kisekae.Services
|
||||
var xOffset = BitConverter.ToInt16(buffer, 12);
|
||||
var yOffset = BitConverter.ToInt16(buffer, 14);
|
||||
|
||||
cel.ImageByPalette = GetCelImages(buffer[32..], palettes.ToArray(), width, height, pixelBits);
|
||||
cel.Offset = new Coordinate(xOffset, yOffset);
|
||||
cel.Height = height;
|
||||
cel.Width = width;
|
||||
celConfig.Cel.OffsetX = xOffset;
|
||||
celConfig.Cel.OffsetY = yOffset;
|
||||
celConfig.Cel.Height = height;
|
||||
celConfig.Cel.Width = width;
|
||||
|
||||
celConfig.Render = GetCelImage(buffer[32..], celConfig.Palette, width, height, pixelBits);
|
||||
}
|
||||
else
|
||||
{
|
||||
var width = BitConverter.ToInt16(buffer, 0);
|
||||
var height = BitConverter.ToInt16(buffer, 2);
|
||||
|
||||
cel.ImageByPalette = GetCelImages(buffer[4..], palettes.ToArray(), width, height);
|
||||
cel.Height = height;
|
||||
cel.Width = width;
|
||||
celConfig.Cel.Height = height;
|
||||
celConfig.Cel.Width = width;
|
||||
celConfig.Render = GetCelImage(buffer[4..], celConfig.Palette, width, height);
|
||||
}
|
||||
}
|
||||
|
||||
private byte[] ReadToBuffer(string directory, string filename)
|
||||
{
|
||||
using var stream = _storage.OpenFile(Path.Combine(directory, filename), FileMode.Open);
|
||||
if (!stream.CanRead) throw new InvalidDataException();
|
||||
|
||||
var buffer = new byte[stream.Length];
|
||||
stream.Read(buffer, 0, buffer.Length);
|
||||
|
||||
return buffer;
|
||||
}
|
||||
|
||||
private Color[] GetColors(IReadOnlyCollection<byte> bytes, int depth = 12, int colorsPerGroup = 16, int groups = 10)
|
||||
{
|
||||
_logger.LogTrace("Converting byte array to colors");
|
||||
@@ -163,41 +153,38 @@ namespace fxl.codes.kisekae.Services
|
||||
return colors;
|
||||
}
|
||||
|
||||
private Dictionary<int, string> GetCelImages(IReadOnlyCollection<byte> bytes,
|
||||
IReadOnlyList<PaletteModel> palettes,
|
||||
int width,
|
||||
int height,
|
||||
int pixelBits = 4)
|
||||
private Render GetCelImage(IReadOnlyCollection<byte> bytes,
|
||||
Palette palette,
|
||||
int width,
|
||||
int height,
|
||||
int pixelBits = 4)
|
||||
{
|
||||
_logger.LogTrace("Converting byte array to base64 encoded gifs per palette");
|
||||
var dictionary = new Dictionary<int, string>();
|
||||
var values = GetValues(bytes, pixelBits);
|
||||
|
||||
for (var paletteIndex = 0; paletteIndex < palettes.Count; paletteIndex++)
|
||||
using var bitmap = new Image<Rgba32>(width, height);
|
||||
var index = 0;
|
||||
|
||||
for (var row = 0; row < height; row++)
|
||||
{
|
||||
var palette = palettes[paletteIndex];
|
||||
using var bitmap = new Image<Rgba32>(width, height);
|
||||
var index = 0;
|
||||
|
||||
for (var row = 0; row < height; row++)
|
||||
var span = bitmap.GetPixelRowSpan(row);
|
||||
for (var column = 0; column < width; column++)
|
||||
{
|
||||
var span = bitmap.GetPixelRowSpan(row);
|
||||
for (var column = 0; column < width; column++)
|
||||
{
|
||||
var value = values[index];
|
||||
span[column] = value == 0 || value >= palette.Colors.Length ? Transparent : palette.Colors[value];
|
||||
index++;
|
||||
}
|
||||
|
||||
if (width % 2 != 0 && pixelBits == 4) index++;
|
||||
var value = values[index];
|
||||
span[column] = value == 0 || value >= palette.Colors.Count ? Transparent : Color.ParseHex(palette.Colors[value].Hex);
|
||||
index++;
|
||||
}
|
||||
|
||||
using var memory = new MemoryStream();
|
||||
bitmap.SaveAsGif(memory);
|
||||
dictionary.Add(paletteIndex, Convert.ToBase64String(memory.ToArray()));
|
||||
if (width % 2 != 0 && pixelBits == 4) index++;
|
||||
}
|
||||
|
||||
return dictionary;
|
||||
using var memory = new MemoryStream();
|
||||
bitmap.SaveAsGif(memory);
|
||||
|
||||
return new Render
|
||||
{
|
||||
Image = memory.ToArray()
|
||||
};
|
||||
}
|
||||
|
||||
private static int[] GetValues(IReadOnlyCollection<byte> bytes, int bits = 4)
|
||||
|
||||
Reference in New Issue
Block a user