BlendingTests.cs 2.8 KB

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