Browse Source

Added hex file parser

Krzysztof Krysiński 2 years ago
parent
commit
3632a3535e

+ 4 - 0
src/PixiEditor.DrawingApi.Core/ColorsImpl/Color.cs

@@ -209,6 +209,10 @@ namespace PixiEditor.DrawingApi.Core.ColorsImpl
       }
     }
 
+    /// <summary>
+    ///     Returns hex string representation of the color.
+    /// </summary>
+    /// <returns>Color string in format: AARRGGBB</returns>
     public string? ToHex()
     {
         return this == Empty ? null : $"{this._colorValue:X8}";

+ 1 - 0
src/PixiEditor/Helpers/Extensions/ServiceCollectionHelpers.cs

@@ -64,6 +64,7 @@ internal static class ServiceCollectionHelpers
         .AddSingleton<PaletteFileParser, ClsFileParser>()
         .AddSingleton<PaletteFileParser, PngPaletteParser>()
         .AddSingleton<PaletteFileParser, PaintNetTxtParser>()
+        .AddSingleton<PaletteFileParser, HexPaletteParser>()
         // Palette data sources
         .AddSingleton<PaletteListDataSource, LocalPalettesFetcher>();
 }

+ 66 - 0
src/PixiEditor/Models/IO/PaletteParsers/HexPaletteParser.cs

@@ -0,0 +1,66 @@
+using System.Globalization;
+using System.IO;
+using System.Text;
+using PixiEditor.DrawingApi.Core.ColorsImpl;
+
+namespace PixiEditor.Models.IO.PaletteParsers;
+
+internal class HexPaletteParser : PaletteFileParser
+{
+    public override string FileName { get; } = "Hex Palette";
+    public override string[] SupportedFileExtensions { get; } = { ".hex" };
+    public override async Task<PaletteFileData> Parse(string path)
+    {
+        try
+        {
+            return await ParseFile(path);
+        }
+        catch
+        {
+            return PaletteFileData.Corrupted;
+        }
+    }
+
+    private async Task<PaletteFileData> ParseFile(string path)
+    {
+        var lines = await ReadTextLines(path);
+        string name = Path.GetFileNameWithoutExtension(path);
+
+        List<Color> colors = new();
+        foreach (var colorLine in lines)
+        {
+            if (colorLine.Length < 6)
+                continue;
+
+            byte r = byte.Parse(colorLine.Substring(0, 2), NumberStyles.HexNumber);
+            byte g = byte.Parse(colorLine.Substring(2, 2), NumberStyles.HexNumber);
+            byte b = byte.Parse(colorLine.Substring(4, 2), NumberStyles.HexNumber);
+            var color = new Color(r, g, b, 255); // alpha is ignored in PixiEditor
+            if (colors.Contains(color)) continue;
+
+            colors.Add(color);
+        }
+
+        return new PaletteFileData(name, colors.ToArray());
+    }
+
+    public override async Task<bool> Save(string path, PaletteFileData data)
+    {
+        StringBuilder sb = new();
+        foreach (var color in data.Colors)
+        {
+            string hex = $"{color.R:X}{color.G:X}{color.B:X}";
+            sb.AppendLine(hex);
+        }
+
+        try
+        {
+            await File.WriteAllTextAsync(path, sb.ToString());
+            return true;
+        }
+        catch
+        {
+            return false;
+        }
+    }
+}

+ 1 - 1
src/PixiEditor/Models/IO/PaletteParsers/PaintNetTxtParser.cs

@@ -43,7 +43,7 @@ internal class PaintNetTxtParser : PaletteFileParser
             byte r = byte.Parse(colorLine.Substring(2, 2), NumberStyles.HexNumber);
             byte g = byte.Parse(colorLine.Substring(4, 2), NumberStyles.HexNumber);
             byte b = byte.Parse(colorLine.Substring(6, 2), NumberStyles.HexNumber);
-            var color = new Color(r, g, b, a);
+            var color = new Color(r, g, b, 255); // alpha is ignored in PixiEditor
             if(colors.Contains(color)) continue;
 
             colors.Add(color);