Browse Source

Added blending tests

Krzysztof Krysiński 4 months ago
parent
commit
9a717d1374

+ 1 - 1
src/Drawie

@@ -1 +1 @@
-Subproject commit 2aaeb9ebb6f2d3b5824721e8ace0765eb58305ca
+Subproject commit cfad269e5518054b43fba83a51d602dfa778c290

+ 66 - 0
tests/PixiEditor.Tests/BlendingTests.cs

@@ -0,0 +1,66 @@
+using ChunkyImageLib.DataHolders;
+using Drawie.Backend.Core;
+using Drawie.Backend.Core.ColorsImpl;
+using Drawie.Backend.Core.Surfaces.ImageData;
+using Drawie.Numerics;
+using PixiEditor.ChangeableDocument.Changeables.Graph;
+using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes;
+using PixiEditor.ChangeableDocument.Enums;
+using PixiEditor.ChangeableDocument.Rendering;
+
+namespace PixiEditor.Tests;
+
+public class BlendingTests : PixiEditorTest
+{
+    [Theory]
+    [InlineData(BlendMode.Normal, "#ffffff")]
+    [InlineData(BlendMode.Erase, "#000000")]
+    [InlineData(BlendMode.Darken, "#ff0000")]
+    [InlineData(BlendMode.Multiply, "#ff0000")]
+    [InlineData(BlendMode.ColorBurn, "#ff0000")]
+    [InlineData(BlendMode.Lighten, "#ffffff")]
+    [InlineData(BlendMode.Screen, "#ffffff")]
+    [InlineData(BlendMode.ColorDodge, "#ff0000")]
+    [InlineData(BlendMode.LinearDodge, "#ffffff")]
+    [InlineData(BlendMode.Overlay, "#ff0000")]
+    [InlineData(BlendMode.SoftLight, "#ff0000")]
+    [InlineData(BlendMode.HardLight, "#ffffff")]
+    [InlineData(BlendMode.Difference, "#00ffff")]
+    [InlineData(BlendMode.Exclusion, "#00ffff")]
+    [InlineData(BlendMode.Hue, "#949494")]
+    [InlineData(BlendMode.Saturation, "#949494")]
+    [InlineData(BlendMode.Luminosity, "#ffffff")]
+    [InlineData(BlendMode.Color, "#949494")]
+    public void TestThatBlendingWhiteOverRedBetweenTwoLayersInLinearSrgbWorksCorrectly(
+        BlendMode blendMode,
+        string? expectedColor)
+    {
+        NodeGraph graph = new NodeGraph();
+        var firstImageLayer = new ImageLayerNode(new VecI(1, 1), ColorSpace.CreateSrgbLinear());
+
+        var firstImg = firstImageLayer.GetLayerImageAtFrame(0);
+        firstImg.EnqueueDrawPixel(VecI.Zero, new Color(255, 0, 0, 255), Drawie.Backend.Core.Surfaces.BlendMode.Src);
+        firstImg.CommitChanges();
+
+        var secondImageLayer = new ImageLayerNode(new VecI(1, 1), ColorSpace.CreateSrgbLinear());
+        var secondImg = secondImageLayer.GetLayerImageAtFrame(0);
+        secondImg.EnqueueDrawPixel(VecI.Zero, new Color(255, 255, 255, 255), Drawie.Backend.Core.Surfaces.BlendMode.Src);
+        secondImg.CommitChanges();
+
+        var outputNode = new OutputNode();
+        graph.AddNode(firstImageLayer);
+        graph.AddNode(secondImageLayer);
+        graph.AddNode(outputNode);
+
+        firstImageLayer.Output.ConnectTo(secondImageLayer.Background);
+        secondImageLayer.Output.ConnectTo(outputNode.Input);
+
+        secondImageLayer.BlendMode.NonOverridenValue = blendMode;
+
+        Surface output = Surface.ForProcessing(VecI.One, ColorSpace.CreateSrgbLinear());
+        graph.Execute(new RenderContext(output.DrawingSurface, 0, ChunkResolution.Full, VecI.One, ColorSpace.CreateSrgbLinear(), 1));
+
+        Color result = output.GetSrgbPixel(VecI.Zero);
+        Assert.Equal(expectedColor, result.ToRgbHex());
+    }
+}

+ 1 - 12
tests/PixiEditor.Tests/EditableVectorPathTests.cs

@@ -7,19 +7,8 @@ using PixiEditor.Views.Overlays.PathOverlay;
 
 
 namespace PixiEditor.Tests;
 namespace PixiEditor.Tests;
 
 
-public class EditableVectorPathTests
+public class EditableVectorPathTests : PixiEditorTest
 {
 {
-    public EditableVectorPathTests()
-    {
-        if (DrawingBackendApi.HasBackend)
-        {
-            return;
-        }
-        
-        SkiaDrawingBackend skiaDrawingBackend = new SkiaDrawingBackend();
-        DrawingBackendApi.SetupBackend(skiaDrawingBackend, new DrawieRenderingDispatcher());
-    }
-
     [Fact]
     [Fact]
     public void TestThatRectVectorShapeReturnsCorrectSubShapes()
     public void TestThatRectVectorShapeReturnsCorrectSubShapes()
     {
     {

+ 19 - 0
tests/PixiEditor.Tests/PixiEditorTest.cs

@@ -0,0 +1,19 @@
+using Drawie.Backend.Core.Bridge;
+using Drawie.Skia;
+using DrawiEngine;
+
+namespace PixiEditor.Tests;
+
+public class PixiEditorTest
+{
+    public PixiEditorTest()
+    {
+        if (DrawingBackendApi.HasBackend)
+        {
+            return;
+        }
+
+        SkiaDrawingBackend skiaDrawingBackend = new SkiaDrawingBackend();
+        DrawingBackendApi.SetupBackend(skiaDrawingBackend, new DrawieRenderingDispatcher());
+    }
+}