Selaa lähdekoodia

Implement Clip studio paint color set saving and loading

Equbuxu 3 vuotta sitten
vanhempi
commit
c4f136fb71

+ 2 - 0
PixiEditor/Helpers/Extensions/ServiceCollectionHelpers.cs

@@ -3,6 +3,7 @@ using PixiEditor.Models.Controllers;
 using PixiEditor.Models.Controllers.Shortcuts;
 using PixiEditor.Models.DataProviders;
 using PixiEditor.Models.IO;
+using PixiEditor.Models.IO.ClsFile;
 using PixiEditor.Models.IO.JascPalFile;
 using PixiEditor.Models.Services;
 using PixiEditor.Models.Tools;
@@ -58,6 +59,7 @@ namespace PixiEditor.Helpers.Extensions
                 .AddSingleton<Tool, ZoomTool>()
                 // Palette Parsers
                 .AddSingleton<PaletteFileParser, JascFileParser>()
+                .AddSingleton<PaletteFileParser, ClsFileParser>()
                 // Palette data sources
                 .AddSingleton<PaletteListDataSource, LocalPalettesFetcher>()
                 // Other

+ 56 - 0
PixiEditor/Models/IO/ClsFile/ClsFileParser.cs

@@ -0,0 +1,56 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Threading.Tasks;
+using CLSEncoderDecoder;
+using SkiaSharp;
+
+namespace PixiEditor.Models.IO.ClsFile;
+
+public class ClsFileParser : PaletteFileParser
+{
+    public override string FileName { get; } = "Clip Studio Paint Color Set";
+
+    public override string[] SupportedFileExtensions { get; } = { ".cls" };
+    
+    public override Task<PaletteFileData> Parse(string path)
+    {
+        return Task.Run(() =>
+        {
+            ClsColorSet set;
+            try
+            {
+                set = ClsColorSet.Load(path);
+            }
+            catch (Exception e)
+            {
+                throw new FormatException("The provided file is invalid", e);
+            }
+            PaletteFileData data = new(
+                set.Utf8Name,
+                set.Colors
+                    .Where(static color => color.Alpha > 0)
+                    .Select(static color => new SKColor(color.Red, color.Green, color.Blue, 255))
+                    .ToArray()
+            );
+            return data;
+        });
+    }
+
+    public override Task Save(string path, PaletteFileData data)
+    {   
+        string name = data.Title;
+        List<ClsColor> colors = data.Colors.Select(color => new ClsColor(color.Red, color.Green, color.Blue, color.Alpha)).ToList();
+        return Task.Run(() =>
+        {
+            if (name.Length == 0)
+                name = Path.GetFileNameWithoutExtension(path);
+            if (name.Length > 64)
+                name = name.Substring(0, 64);
+            ClsColorSet set = new(colors, name); 
+            set.Save(path);
+        });
+    }
+
+}

+ 1 - 0
PixiEditor/PixiEditor.csproj

@@ -194,6 +194,7 @@
 		</None>
 	</ItemGroup>
 	<ItemGroup>
+		<PackageReference Include="CLSEncoderDecoder" Version="1.0.0" />
 		<PackageReference Include="Dirkster.AvalonDock" Version="4.70.1" />
 		<PackageReference Include="ByteSize" Version="2.1.1" />
 		<PackageReference Include="DiscordRichPresence" Version="1.0.175" />