|
@@ -0,0 +1,88 @@
|
|
|
|
|
+using Avalonia.Headless.XUnit;
|
|
|
|
|
+using Drawie.Backend.Core.ColorsImpl;
|
|
|
|
|
+using Drawie.Backend.Core.Surfaces.ImageData;
|
|
|
|
|
+using Drawie.Numerics;
|
|
|
|
|
+using PixiEditor.ChangeableDocument.Changes.Drawing.FloodFill;
|
|
|
|
|
+using PixiEditor.ChangeableDocument.Enums;
|
|
|
|
|
+using PixiEditor.Tests;
|
|
|
|
|
+using PixiEditor.ViewModels.Document;
|
|
|
|
|
+
|
|
|
|
|
+namespace PixiEditor.Backend.Tests;
|
|
|
|
|
+
|
|
|
|
|
+public class FloodFillTests : FullPixiEditorTest
|
|
|
|
|
+{
|
|
|
|
|
+ [AvaloniaTheory]
|
|
|
|
|
+ [InlineData(0, 64)]
|
|
|
|
|
+ [InlineData(130, 64)]
|
|
|
|
|
+ [InlineData(255, 64)]
|
|
|
|
|
+ [InlineData(0, 512)]
|
|
|
|
|
+ [InlineData(130, 512)]
|
|
|
|
|
+ [InlineData(255, 512)]
|
|
|
|
|
+ [InlineData(0, 2048)]
|
|
|
|
|
+ [InlineData(130, 2048)]
|
|
|
|
|
+ [InlineData(255, 2048)]
|
|
|
|
|
+ public void TestThatFloodFillHelperFinishesLinearCs(byte alpha, int imgSize)
|
|
|
|
|
+ {
|
|
|
|
|
+ var doc = DocumentViewModel.Build(b => b.WithSize(imgSize, imgSize)
|
|
|
|
|
+ .WithGraph(g =>
|
|
|
|
|
+ g.WithImageLayerNode(
|
|
|
|
|
+ "layer", new VecI(imgSize), ColorSpace.CreateSrgbLinear(), out var id)
|
|
|
|
|
+ .WithOutputNode(id, "Output")));
|
|
|
|
|
+
|
|
|
|
|
+ var color = Color.FromHsv(0f, 59.3f, 82.6f, alpha);
|
|
|
|
|
+
|
|
|
|
|
+ var dict = FloodFillHelper.FloodFill([doc.NodeGraph.StructureTree.Members[0].Id],
|
|
|
|
|
+ doc.AccessInternalReadOnlyDocument(),
|
|
|
|
|
+ null, VecI.Zero, color, 0, 0, false, FloodFillMode.Replace);
|
|
|
|
|
+
|
|
|
|
|
+ Assert.NotNull(dict);
|
|
|
|
|
+ foreach (var kvp in dict)
|
|
|
|
|
+ {
|
|
|
|
|
+ Assert.NotNull(kvp.Value);
|
|
|
|
|
+ var srgbPixel = kvp.Value.Surface.GetSrgbPixel(VecI.Zero);
|
|
|
|
|
+ if (alpha == 0)
|
|
|
|
|
+ Assert.Equal(Color.FromRgba(0, 0, 0, 0), srgbPixel);
|
|
|
|
|
+ else
|
|
|
|
|
+ Assert.Equal(color, srgbPixel);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ [AvaloniaTheory]
|
|
|
|
|
+ [InlineData(0, 64)]
|
|
|
|
|
+ [InlineData(130, 64)]
|
|
|
|
|
+ [InlineData(255, 64)]
|
|
|
|
|
+ [InlineData(0, 512)]
|
|
|
|
|
+ [InlineData(130, 512)]
|
|
|
|
|
+ [InlineData(255, 512)]
|
|
|
|
|
+ [InlineData(0, 2048)]
|
|
|
|
|
+ [InlineData(130, 2048)]
|
|
|
|
|
+ [InlineData(255, 2048)]
|
|
|
|
|
+ public void TestThatFloodFillHelperFinishesSrgbCs(byte alpha, int imgSize)
|
|
|
|
|
+ {
|
|
|
|
|
+ var doc = DocumentViewModel.Build(b => b.WithSize(imgSize, imgSize)
|
|
|
|
|
+ .WithGraph(g =>
|
|
|
|
|
+ g.WithImageLayerNode(
|
|
|
|
|
+ "layer", new VecI(imgSize), ColorSpace.CreateSrgb(), out var id).WithOutputNode(id, "Output")));
|
|
|
|
|
+
|
|
|
|
|
+ FloodFillHelper.FloodFill([doc.NodeGraph.StructureTree.Members[0].Id], doc.AccessInternalReadOnlyDocument(),
|
|
|
|
|
+ null, VecI.Zero,
|
|
|
|
|
+ Color.FromHsv(0f, 59.3f, 82.6f, alpha), 0, 0, false, FloodFillMode.Replace);
|
|
|
|
|
+
|
|
|
|
|
+ var color = Color.FromHsv(0f, 59.3f, 82.6f, alpha);
|
|
|
|
|
+
|
|
|
|
|
+ var dict = FloodFillHelper.FloodFill([doc.NodeGraph.StructureTree.Members[0].Id],
|
|
|
|
|
+ doc.AccessInternalReadOnlyDocument(),
|
|
|
|
|
+ null, VecI.Zero, color, 0, 0, false, FloodFillMode.Replace);
|
|
|
|
|
+
|
|
|
|
|
+ Assert.NotNull(dict);
|
|
|
|
|
+ foreach (var kvp in dict)
|
|
|
|
|
+ {
|
|
|
|
|
+ Assert.NotNull(kvp.Value);
|
|
|
|
|
+ var srgbPixel = kvp.Value.Surface.GetSrgbPixel(VecI.Zero);
|
|
|
|
|
+ if (alpha == 0)
|
|
|
|
|
+ Assert.Equal(Color.FromRgba(0, 0, 0, 0), srgbPixel);
|
|
|
|
|
+ else
|
|
|
|
|
+ Assert.Equal(color, srgbPixel);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|