BlendingTests.cs 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. using ChunkyImageLib.DataHolders;
  2. using Drawie.Backend.Core;
  3. using Drawie.Backend.Core.ColorsImpl;
  4. using Drawie.Backend.Core.Surfaces;
  5. using Drawie.Backend.Core.Surfaces.ImageData;
  6. using Drawie.Numerics;
  7. using PixiEditor.ChangeableDocument.Changeables.Graph;
  8. using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes;
  9. using PixiEditor.ChangeableDocument.Rendering;
  10. using BlendMode = PixiEditor.ChangeableDocument.Enums.BlendMode;
  11. namespace PixiEditor.Tests;
  12. public class BlendingTests : PixiEditorTest
  13. {
  14. [Theory]
  15. [InlineData(BlendMode.Normal, "#ffffff")]
  16. [InlineData(BlendMode.Erase, "#000000")]
  17. [InlineData(BlendMode.Darken, "#ff0000")]
  18. [InlineData(BlendMode.Multiply, "#ff0000")]
  19. [InlineData(BlendMode.ColorBurn, "#ff0000")]
  20. [InlineData(BlendMode.Lighten, "#ffffff")]
  21. [InlineData(BlendMode.Screen, "#ffffff")]
  22. [InlineData(BlendMode.ColorDodge, "#ff0000")]
  23. [InlineData(BlendMode.LinearDodge, "#ffffff")]
  24. [InlineData(BlendMode.Overlay, "#ff0000")]
  25. [InlineData(BlendMode.SoftLight, "#ff0000")]
  26. [InlineData(BlendMode.HardLight, "#ffffff")]
  27. [InlineData(BlendMode.Difference, "#00ffff")]
  28. [InlineData(BlendMode.Exclusion, "#00ffff")]
  29. [InlineData(BlendMode.Hue, "#949494")]
  30. [InlineData(BlendMode.Saturation, "#949494")]
  31. [InlineData(BlendMode.Luminosity, "#ffffff")]
  32. [InlineData(BlendMode.Color, "#949494")]
  33. public void TestThatBlendingWhiteOverRedBetweenTwoLayersInLinearSrgbWorksCorrectly(
  34. BlendMode blendMode,
  35. string? expectedColor)
  36. {
  37. NodeGraph graph = new NodeGraph();
  38. var firstImageLayer = new ImageLayerNode(new VecI(1, 1), ColorSpace.CreateSrgbLinear());
  39. var firstImg = firstImageLayer.GetLayerImageAtFrame(0);
  40. firstImg.EnqueueDrawPixel(VecI.Zero, new Color(255, 0, 0, 255), Drawie.Backend.Core.Surfaces.BlendMode.Src);
  41. firstImg.CommitChanges();
  42. var secondImageLayer = new ImageLayerNode(new VecI(1, 1), ColorSpace.CreateSrgbLinear());
  43. var secondImg = secondImageLayer.GetLayerImageAtFrame(0);
  44. secondImg.EnqueueDrawPixel(VecI.Zero, new Color(255, 255, 255, 255), Drawie.Backend.Core.Surfaces.BlendMode.Src);
  45. secondImg.CommitChanges();
  46. var outputNode = new OutputNode();
  47. graph.AddNode(firstImageLayer);
  48. graph.AddNode(secondImageLayer);
  49. graph.AddNode(outputNode);
  50. firstImageLayer.Output.ConnectTo(secondImageLayer.Background);
  51. secondImageLayer.Output.ConnectTo(outputNode.Input);
  52. secondImageLayer.BlendMode.NonOverridenValue = blendMode;
  53. Surface output = Surface.ForProcessing(VecI.One, ColorSpace.CreateSrgbLinear());
  54. graph.Execute(new RenderContext(output.DrawingSurface, 0, ChunkResolution.Full, VecI.One, VecI.One, ColorSpace.CreateSrgbLinear(), SamplingOptions.Default, 1));
  55. Color result = output.GetSrgbPixel(VecI.Zero);
  56. Assert.Equal(expectedColor, result.ToRgbHex());
  57. }
  58. }