Converting to EF, need to work on TS

This commit is contained in:
Lani Aung
2021-11-19 23:04:15 -07:00
parent 1fd14ebafd
commit 744fc6bc57
43 changed files with 2159 additions and 542 deletions
+40 -53
View File
@@ -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)