BlendingTests.cs 3.2 KB

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