Browse Source

Fixed color matrix not getting serialized

CPKreuz 1 year ago
parent
commit
0297d2b3b6

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

@@ -119,6 +119,7 @@ internal static class ServiceCollectionHelpers
             .AddSingleton<SerializationFactory, VecDSerializationFactory>()
             .AddSingleton<SerializationFactory, VecDSerializationFactory>()
             .AddSingleton<SerializationFactory, VecISerializationFactory>()
             .AddSingleton<SerializationFactory, VecISerializationFactory>()
             .AddSingleton<SerializationFactory, ColorSerializationFactory>()
             .AddSingleton<SerializationFactory, ColorSerializationFactory>()
+            .AddSingleton<SerializationFactory, ColorMatrixFactory>()
             // Palette Parsers
             // Palette Parsers
             .AddSingleton<IPalettesProvider, PaletteProvider>()
             .AddSingleton<IPalettesProvider, PaletteProvider>()
             .AddSingleton<PaletteFileParser, JascFileParser>()
             .AddSingleton<PaletteFileParser, JascFileParser>()

+ 36 - 0
src/PixiEditor.AvaloniaUI/Models/Serialization/Factories/ColorMatrixFactory.cs

@@ -0,0 +1,36 @@
+using System.Runtime.CompilerServices;
+using PixiEditor.Numerics;
+
+namespace PixiEditor.AvaloniaUI.Models.Serialization.Factories;
+
+// TODO: Might wanna write that for the 4x5 matrix too
+public class ColorMatrixFactory : SerializationFactory<byte[], ColorMatrix>
+{
+    public override string DeserializationId { get; } = "PixiEditor.ColorMatrix";
+    
+    public override byte[] Serialize(ColorMatrix original)
+    {
+        var members = original.ToArray();
+        var bytes = new byte[ColorMatrix.Width * ColorMatrix.Height * sizeof(float)];
+
+        Buffer.BlockCopy(members, 0, bytes, 0, bytes.Length);
+
+        return bytes;
+    }
+
+    public override bool TryDeserialize(object serialized, out ColorMatrix original)
+    {
+        if (serialized is not byte[] bytes)
+        {
+            original = default;
+            return false;
+        }
+
+        var members = new float[ColorMatrix.Width * ColorMatrix.Height];
+        
+        Buffer.BlockCopy(bytes, 0, members, 0, bytes.Length);
+        original = ColorMatrix.CreateFromMembers(members);
+
+        return true;
+    }
+}

+ 39 - 1
src/PixiEditor.Numerics/ColorMatrix.cs

@@ -233,7 +233,15 @@ public record struct ColorMatrix
         (M41, M42, M43, M44, M45) = row4;
         (M41, M42, M43, M44, M45) = row4;
     }
     }
 
 
-    [System.Runtime.CompilerServices.CompilerGenerated]
+    public float[] ToArray()
+    {
+        var buffer = new float[Width * Height];
+
+        TryGetMembers(buffer);
+        
+        return buffer;
+    }
+
     public bool TryGetMembers(Span<float> members)
     public bool TryGetMembers(Span<float> members)
     {
     {
         if (members.Length < 20)
         if (members.Length < 20)
@@ -261,6 +269,36 @@ public record struct ColorMatrix
         return true;
         return true;
     }
     }
 
 
+    public static ColorMatrix CreateFromMembers(ReadOnlySpan<float> members)
+    {
+        if (members.Length < 20)
+            throw new IndexOutOfRangeException($"{nameof(members)} must have at least 20 elements. Actual length was {members.Length}");
+
+        var m11 = members[0];
+        var m12 = members[1];
+        var m13 = members[2];
+        var m14 = members[3];
+        var m15 = members[4];
+        var m21 = members[5];
+        var m22 = members[6];
+        var m23 = members[7];
+        var m24 = members[8];
+        var m25 = members[9];
+        var m31 = members[10];
+        var m32 = members[11];
+        var m33 = members[12];
+        var m34 = members[13];
+        var m35 = members[14];
+        var m41 = members[15];
+        var m42 = members[16];
+        var m43 = members[17];
+        var m44 = members[18];
+        var m45 = members[19];
+
+        return new ColorMatrix(m11, m12, m13, m14, m15, m21, m22, m23, m24, m25, m31, m32, m33, m34, m35, m41, m42, m43,
+            m44, m45);
+    }
+
     public bool TryGetRow(int row, Span<float> members)
     public bool TryGetRow(int row, Span<float> members)
     {
     {
         if (row < 0 || row >= 4)
         if (row < 0 || row >= 4)