mirror of https://github.com/SixLabors/ImageSharp
Browse Source
Split PixelBlendMode into PixelColorBlendingMode and PixelAlphaCompositionModepull/682/head
committed by
GitHub
20 changed files with 664 additions and 391 deletions
@ -0,0 +1,56 @@ |
|||||
|
// Copyright (c) Six Labors and contributors.
|
||||
|
// Licensed under the Apache License, Version 2.0.
|
||||
|
|
||||
|
namespace SixLabors.ImageSharp.PixelFormats |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// Enumerates the various color blending modes.
|
||||
|
/// </summary>
|
||||
|
public enum PixelColorBlendingMode |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// Default blending mode, also known as "Normal" or "Alpha Blending"
|
||||
|
/// </summary>
|
||||
|
Normal = 0, |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Blends the 2 values by multiplication.
|
||||
|
/// </summary>
|
||||
|
Multiply, |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Blends the 2 values by addition.
|
||||
|
/// </summary>
|
||||
|
Add, |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Blends the 2 values by subtraction.
|
||||
|
/// </summary>
|
||||
|
Subtract, |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Multiplies the complements of the backdrop and source values, then complements the result.
|
||||
|
/// </summary>
|
||||
|
Screen, |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Selects the minimum of the backdrop and source values.
|
||||
|
/// </summary>
|
||||
|
Darken, |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Selects the max of the backdrop and source values.
|
||||
|
/// </summary>
|
||||
|
Lighten, |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Multiplies or screens the values, depending on the backdrop vector values.
|
||||
|
/// </summary>
|
||||
|
Overlay, |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Multiplies or screens the colors, depending on the source value.
|
||||
|
/// </summary>
|
||||
|
HardLight, |
||||
|
} |
||||
|
} |
||||
@ -1,50 +1,217 @@ |
|||||
// Copyright (c) Six Labors and contributors.
|
// Copyright (c) Six Labors and contributors.
|
||||
// Licensed under the Apache License, Version 2.0.
|
// Licensed under the Apache License, Version 2.0.
|
||||
|
|
||||
using SixLabors.ImageSharp.PixelFormats.PixelBlenders; |
using SixLabors.ImageSharp.PixelFormats.PixelBlenders; |
||||
|
|
||||
namespace SixLabors.ImageSharp.PixelFormats |
namespace SixLabors.ImageSharp.PixelFormats |
||||
{ |
{ |
||||
/// <content>
|
/// <content>
|
||||
/// Provides access to pixel blenders
|
/// Provides access to pixel blenders
|
||||
/// </content>
|
/// </content>
|
||||
public partial class PixelOperations<TPixel> |
public partial class PixelOperations<TPixel> |
||||
where TPixel : struct, IPixel<TPixel> |
where TPixel : struct, IPixel<TPixel> |
||||
{ |
{ |
||||
/// <summary>
|
/// <summary>
|
||||
/// Find an instance of the pixel blender.
|
/// Find an instance of the pixel blender.
|
||||
/// </summary>
|
/// </summary>
|
||||
/// <param name="mode">The blending mode to apply</param>
|
/// <param name="options">the blending and composition to apply</param>
|
||||
/// <returns>A <see cref="PixelBlender{TPixel}"/>.</returns>
|
/// <returns>A <see cref="PixelBlender{TPixel}"/>.</returns>
|
||||
internal virtual PixelBlender<TPixel> GetPixelBlender(PixelBlenderMode mode) |
internal PixelBlender<TPixel> GetPixelBlender(GraphicsOptions options) |
||||
{ |
{ |
||||
switch (mode) |
return this.GetPixelBlender(options.ColorBlendingMode, options.AlphaCompositionMode); |
||||
{ |
} |
||||
case PixelBlenderMode.Multiply: return DefaultPixelBlenders<TPixel>.MultiplySrcOver.Instance; |
|
||||
case PixelBlenderMode.Add: return DefaultPixelBlenders<TPixel>.AddSrcOver.Instance; |
/// <summary>
|
||||
case PixelBlenderMode.Subtract: return DefaultPixelBlenders<TPixel>.SubtractSrcOver.Instance; |
/// Find an instance of the pixel blender.
|
||||
case PixelBlenderMode.Screen: return DefaultPixelBlenders<TPixel>.ScreenSrcOver.Instance; |
/// </summary>
|
||||
case PixelBlenderMode.Darken: return DefaultPixelBlenders<TPixel>.DarkenSrcOver.Instance; |
/// <param name="colorMode">The color blending mode to apply</param>
|
||||
case PixelBlenderMode.Lighten: return DefaultPixelBlenders<TPixel>.LightenSrcOver.Instance; |
/// <param name="alphaMode">The alpha composition mode to apply</param>
|
||||
case PixelBlenderMode.Overlay: return DefaultPixelBlenders<TPixel>.OverlaySrcOver.Instance; |
/// <returns>A <see cref="PixelBlender{TPixel}"/>.</returns>
|
||||
case PixelBlenderMode.HardLight: return DefaultPixelBlenders<TPixel>.HardLightSrcOver.Instance; |
internal virtual PixelBlender<TPixel> GetPixelBlender(PixelColorBlendingMode colorMode, PixelAlphaCompositionMode alphaMode) |
||||
case PixelBlenderMode.Src: return DefaultPixelBlenders<TPixel>.NormalSrc.Instance; |
{ |
||||
case PixelBlenderMode.Atop: return DefaultPixelBlenders<TPixel>.NormalSrcAtop.Instance; |
switch (alphaMode) |
||||
case PixelBlenderMode.Over: return DefaultPixelBlenders<TPixel>.NormalSrcOver.Instance; |
{ |
||||
case PixelBlenderMode.In: return DefaultPixelBlenders<TPixel>.NormalSrcIn.Instance; |
case PixelAlphaCompositionMode.Clear: |
||||
case PixelBlenderMode.Out: return DefaultPixelBlenders<TPixel>.NormalSrcOut.Instance; |
switch (colorMode) |
||||
case PixelBlenderMode.Dest: return DefaultPixelBlenders<TPixel>.NormalDest.Instance; |
{ |
||||
case PixelBlenderMode.DestAtop: return DefaultPixelBlenders<TPixel>.NormalDestAtop.Instance; |
case PixelColorBlendingMode.Multiply: return DefaultPixelBlenders<TPixel>.MultiplyClear.Instance; |
||||
case PixelBlenderMode.DestOver: return DefaultPixelBlenders<TPixel>.NormalDestOver.Instance; |
case PixelColorBlendingMode.Add: return DefaultPixelBlenders<TPixel>.AddClear.Instance; |
||||
case PixelBlenderMode.DestIn: return DefaultPixelBlenders<TPixel>.NormalDestIn.Instance; |
case PixelColorBlendingMode.Subtract: return DefaultPixelBlenders<TPixel>.SubtractClear.Instance; |
||||
case PixelBlenderMode.DestOut: return DefaultPixelBlenders<TPixel>.NormalDestOut.Instance; |
case PixelColorBlendingMode.Screen: return DefaultPixelBlenders<TPixel>.ScreenClear.Instance; |
||||
case PixelBlenderMode.Clear: return DefaultPixelBlenders<TPixel>.NormalClear.Instance; |
case PixelColorBlendingMode.Darken: return DefaultPixelBlenders<TPixel>.DarkenClear.Instance; |
||||
case PixelBlenderMode.Xor: return DefaultPixelBlenders<TPixel>.NormalXor.Instance; |
case PixelColorBlendingMode.Lighten: return DefaultPixelBlenders<TPixel>.LightenClear.Instance; |
||||
|
case PixelColorBlendingMode.Overlay: return DefaultPixelBlenders<TPixel>.OverlayClear.Instance; |
||||
case PixelBlenderMode.Normal: |
case PixelColorBlendingMode.HardLight: return DefaultPixelBlenders<TPixel>.HardLightClear.Instance; |
||||
default: |
case PixelColorBlendingMode.Normal: |
||||
return DefaultPixelBlenders<TPixel>.NormalSrcOver.Instance; |
default: return DefaultPixelBlenders<TPixel>.NormalClear.Instance; |
||||
} |
} |
||||
} |
|
||||
} |
case PixelAlphaCompositionMode.Xor: |
||||
|
switch (colorMode) |
||||
|
{ |
||||
|
case PixelColorBlendingMode.Multiply: return DefaultPixelBlenders<TPixel>.MultiplyXor.Instance; |
||||
|
case PixelColorBlendingMode.Add: return DefaultPixelBlenders<TPixel>.AddXor.Instance; |
||||
|
case PixelColorBlendingMode.Subtract: return DefaultPixelBlenders<TPixel>.SubtractXor.Instance; |
||||
|
case PixelColorBlendingMode.Screen: return DefaultPixelBlenders<TPixel>.ScreenXor.Instance; |
||||
|
case PixelColorBlendingMode.Darken: return DefaultPixelBlenders<TPixel>.DarkenXor.Instance; |
||||
|
case PixelColorBlendingMode.Lighten: return DefaultPixelBlenders<TPixel>.LightenXor.Instance; |
||||
|
case PixelColorBlendingMode.Overlay: return DefaultPixelBlenders<TPixel>.OverlayXor.Instance; |
||||
|
case PixelColorBlendingMode.HardLight: return DefaultPixelBlenders<TPixel>.HardLightXor.Instance; |
||||
|
case PixelColorBlendingMode.Normal: |
||||
|
default: return DefaultPixelBlenders<TPixel>.NormalXor.Instance; |
||||
|
} |
||||
|
|
||||
|
case PixelAlphaCompositionMode.Src: |
||||
|
switch (colorMode) |
||||
|
{ |
||||
|
case PixelColorBlendingMode.Multiply: return DefaultPixelBlenders<TPixel>.MultiplySrc.Instance; |
||||
|
case PixelColorBlendingMode.Add: return DefaultPixelBlenders<TPixel>.AddSrc.Instance; |
||||
|
case PixelColorBlendingMode.Subtract: return DefaultPixelBlenders<TPixel>.SubtractSrc.Instance; |
||||
|
case PixelColorBlendingMode.Screen: return DefaultPixelBlenders<TPixel>.ScreenSrc.Instance; |
||||
|
case PixelColorBlendingMode.Darken: return DefaultPixelBlenders<TPixel>.DarkenSrc.Instance; |
||||
|
case PixelColorBlendingMode.Lighten: return DefaultPixelBlenders<TPixel>.LightenSrc.Instance; |
||||
|
case PixelColorBlendingMode.Overlay: return DefaultPixelBlenders<TPixel>.OverlaySrc.Instance; |
||||
|
case PixelColorBlendingMode.HardLight: return DefaultPixelBlenders<TPixel>.HardLightSrc.Instance; |
||||
|
case PixelColorBlendingMode.Normal: |
||||
|
default: return DefaultPixelBlenders<TPixel>.NormalSrc.Instance; |
||||
|
} |
||||
|
|
||||
|
case PixelAlphaCompositionMode.SrcAtop: |
||||
|
switch (colorMode) |
||||
|
{ |
||||
|
case PixelColorBlendingMode.Multiply: return DefaultPixelBlenders<TPixel>.MultiplySrcAtop.Instance; |
||||
|
case PixelColorBlendingMode.Add: return DefaultPixelBlenders<TPixel>.AddSrcAtop.Instance; |
||||
|
case PixelColorBlendingMode.Subtract: return DefaultPixelBlenders<TPixel>.SubtractSrcAtop.Instance; |
||||
|
case PixelColorBlendingMode.Screen: return DefaultPixelBlenders<TPixel>.ScreenSrcAtop.Instance; |
||||
|
case PixelColorBlendingMode.Darken: return DefaultPixelBlenders<TPixel>.DarkenSrcAtop.Instance; |
||||
|
case PixelColorBlendingMode.Lighten: return DefaultPixelBlenders<TPixel>.LightenSrcAtop.Instance; |
||||
|
case PixelColorBlendingMode.Overlay: return DefaultPixelBlenders<TPixel>.OverlaySrcAtop.Instance; |
||||
|
case PixelColorBlendingMode.HardLight: return DefaultPixelBlenders<TPixel>.HardLightSrcAtop.Instance; |
||||
|
case PixelColorBlendingMode.Normal: |
||||
|
default: return DefaultPixelBlenders<TPixel>.NormalSrcAtop.Instance; |
||||
|
} |
||||
|
|
||||
|
case PixelAlphaCompositionMode.SrcIn: |
||||
|
switch (colorMode) |
||||
|
{ |
||||
|
case PixelColorBlendingMode.Multiply: return DefaultPixelBlenders<TPixel>.MultiplySrcIn.Instance; |
||||
|
case PixelColorBlendingMode.Add: return DefaultPixelBlenders<TPixel>.AddSrcIn.Instance; |
||||
|
case PixelColorBlendingMode.Subtract: return DefaultPixelBlenders<TPixel>.SubtractSrcIn.Instance; |
||||
|
case PixelColorBlendingMode.Screen: return DefaultPixelBlenders<TPixel>.ScreenSrcIn.Instance; |
||||
|
case PixelColorBlendingMode.Darken: return DefaultPixelBlenders<TPixel>.DarkenSrcIn.Instance; |
||||
|
case PixelColorBlendingMode.Lighten: return DefaultPixelBlenders<TPixel>.LightenSrcIn.Instance; |
||||
|
case PixelColorBlendingMode.Overlay: return DefaultPixelBlenders<TPixel>.OverlaySrcIn.Instance; |
||||
|
case PixelColorBlendingMode.HardLight: return DefaultPixelBlenders<TPixel>.HardLightSrcIn.Instance; |
||||
|
case PixelColorBlendingMode.Normal: |
||||
|
default: return DefaultPixelBlenders<TPixel>.NormalSrcIn.Instance; |
||||
|
} |
||||
|
|
||||
|
case PixelAlphaCompositionMode.SrcOut: |
||||
|
switch (colorMode) |
||||
|
{ |
||||
|
case PixelColorBlendingMode.Multiply: return DefaultPixelBlenders<TPixel>.MultiplySrcOut.Instance; |
||||
|
case PixelColorBlendingMode.Add: return DefaultPixelBlenders<TPixel>.AddSrcOut.Instance; |
||||
|
case PixelColorBlendingMode.Subtract: return DefaultPixelBlenders<TPixel>.SubtractSrcOut.Instance; |
||||
|
case PixelColorBlendingMode.Screen: return DefaultPixelBlenders<TPixel>.ScreenSrcOut.Instance; |
||||
|
case PixelColorBlendingMode.Darken: return DefaultPixelBlenders<TPixel>.DarkenSrcOut.Instance; |
||||
|
case PixelColorBlendingMode.Lighten: return DefaultPixelBlenders<TPixel>.LightenSrcOut.Instance; |
||||
|
case PixelColorBlendingMode.Overlay: return DefaultPixelBlenders<TPixel>.OverlaySrcOut.Instance; |
||||
|
case PixelColorBlendingMode.HardLight: return DefaultPixelBlenders<TPixel>.HardLightSrcOut.Instance; |
||||
|
case PixelColorBlendingMode.Normal: |
||||
|
default: return DefaultPixelBlenders<TPixel>.NormalSrcOut.Instance; |
||||
|
} |
||||
|
|
||||
|
case PixelAlphaCompositionMode.Dest: |
||||
|
switch (colorMode) |
||||
|
{ |
||||
|
case PixelColorBlendingMode.Multiply: return DefaultPixelBlenders<TPixel>.MultiplyDest.Instance; |
||||
|
case PixelColorBlendingMode.Add: return DefaultPixelBlenders<TPixel>.AddDest.Instance; |
||||
|
case PixelColorBlendingMode.Subtract: return DefaultPixelBlenders<TPixel>.SubtractDest.Instance; |
||||
|
case PixelColorBlendingMode.Screen: return DefaultPixelBlenders<TPixel>.ScreenDest.Instance; |
||||
|
case PixelColorBlendingMode.Darken: return DefaultPixelBlenders<TPixel>.DarkenDest.Instance; |
||||
|
case PixelColorBlendingMode.Lighten: return DefaultPixelBlenders<TPixel>.LightenDest.Instance; |
||||
|
case PixelColorBlendingMode.Overlay: return DefaultPixelBlenders<TPixel>.OverlayDest.Instance; |
||||
|
case PixelColorBlendingMode.HardLight: return DefaultPixelBlenders<TPixel>.HardLightDest.Instance; |
||||
|
case PixelColorBlendingMode.Normal: |
||||
|
default: return DefaultPixelBlenders<TPixel>.NormalDest.Instance; |
||||
|
} |
||||
|
|
||||
|
case PixelAlphaCompositionMode.DestAtop: |
||||
|
switch (colorMode) |
||||
|
{ |
||||
|
case PixelColorBlendingMode.Multiply: return DefaultPixelBlenders<TPixel>.MultiplyDestAtop.Instance; |
||||
|
case PixelColorBlendingMode.Add: return DefaultPixelBlenders<TPixel>.AddDestAtop.Instance; |
||||
|
case PixelColorBlendingMode.Subtract: return DefaultPixelBlenders<TPixel>.SubtractDestAtop.Instance; |
||||
|
case PixelColorBlendingMode.Screen: return DefaultPixelBlenders<TPixel>.ScreenDestAtop.Instance; |
||||
|
case PixelColorBlendingMode.Darken: return DefaultPixelBlenders<TPixel>.DarkenDestAtop.Instance; |
||||
|
case PixelColorBlendingMode.Lighten: return DefaultPixelBlenders<TPixel>.LightenDestAtop.Instance; |
||||
|
case PixelColorBlendingMode.Overlay: return DefaultPixelBlenders<TPixel>.OverlayDestAtop.Instance; |
||||
|
case PixelColorBlendingMode.HardLight: return DefaultPixelBlenders<TPixel>.HardLightDestAtop.Instance; |
||||
|
case PixelColorBlendingMode.Normal: |
||||
|
default: return DefaultPixelBlenders<TPixel>.NormalDestAtop.Instance; |
||||
|
} |
||||
|
|
||||
|
case PixelAlphaCompositionMode.DestIn: |
||||
|
switch (colorMode) |
||||
|
{ |
||||
|
case PixelColorBlendingMode.Multiply: return DefaultPixelBlenders<TPixel>.MultiplyDestIn.Instance; |
||||
|
case PixelColorBlendingMode.Add: return DefaultPixelBlenders<TPixel>.AddDestIn.Instance; |
||||
|
case PixelColorBlendingMode.Subtract: return DefaultPixelBlenders<TPixel>.SubtractDestIn.Instance; |
||||
|
case PixelColorBlendingMode.Screen: return DefaultPixelBlenders<TPixel>.ScreenDestIn.Instance; |
||||
|
case PixelColorBlendingMode.Darken: return DefaultPixelBlenders<TPixel>.DarkenDestIn.Instance; |
||||
|
case PixelColorBlendingMode.Lighten: return DefaultPixelBlenders<TPixel>.LightenDestIn.Instance; |
||||
|
case PixelColorBlendingMode.Overlay: return DefaultPixelBlenders<TPixel>.OverlayDestIn.Instance; |
||||
|
case PixelColorBlendingMode.HardLight: return DefaultPixelBlenders<TPixel>.HardLightDestIn.Instance; |
||||
|
case PixelColorBlendingMode.Normal: |
||||
|
default: return DefaultPixelBlenders<TPixel>.NormalDestIn.Instance; |
||||
|
} |
||||
|
|
||||
|
case PixelAlphaCompositionMode.DestOut: |
||||
|
switch (colorMode) |
||||
|
{ |
||||
|
case PixelColorBlendingMode.Multiply: return DefaultPixelBlenders<TPixel>.MultiplyDestOut.Instance; |
||||
|
case PixelColorBlendingMode.Add: return DefaultPixelBlenders<TPixel>.AddDestOut.Instance; |
||||
|
case PixelColorBlendingMode.Subtract: return DefaultPixelBlenders<TPixel>.SubtractDestOut.Instance; |
||||
|
case PixelColorBlendingMode.Screen: return DefaultPixelBlenders<TPixel>.ScreenDestOut.Instance; |
||||
|
case PixelColorBlendingMode.Darken: return DefaultPixelBlenders<TPixel>.DarkenDestOut.Instance; |
||||
|
case PixelColorBlendingMode.Lighten: return DefaultPixelBlenders<TPixel>.LightenDestOut.Instance; |
||||
|
case PixelColorBlendingMode.Overlay: return DefaultPixelBlenders<TPixel>.OverlayDestOut.Instance; |
||||
|
case PixelColorBlendingMode.HardLight: return DefaultPixelBlenders<TPixel>.HardLightDestOut.Instance; |
||||
|
case PixelColorBlendingMode.Normal: |
||||
|
default: return DefaultPixelBlenders<TPixel>.NormalDestOut.Instance; |
||||
|
} |
||||
|
|
||||
|
case PixelAlphaCompositionMode.DestOver: |
||||
|
switch (colorMode) |
||||
|
{ |
||||
|
case PixelColorBlendingMode.Multiply: return DefaultPixelBlenders<TPixel>.MultiplyDestOver.Instance; |
||||
|
case PixelColorBlendingMode.Add: return DefaultPixelBlenders<TPixel>.AddDestOver.Instance; |
||||
|
case PixelColorBlendingMode.Subtract: return DefaultPixelBlenders<TPixel>.SubtractDestOver.Instance; |
||||
|
case PixelColorBlendingMode.Screen: return DefaultPixelBlenders<TPixel>.ScreenDestOver.Instance; |
||||
|
case PixelColorBlendingMode.Darken: return DefaultPixelBlenders<TPixel>.DarkenDestOver.Instance; |
||||
|
case PixelColorBlendingMode.Lighten: return DefaultPixelBlenders<TPixel>.LightenDestOver.Instance; |
||||
|
case PixelColorBlendingMode.Overlay: return DefaultPixelBlenders<TPixel>.OverlayDestOver.Instance; |
||||
|
case PixelColorBlendingMode.HardLight: return DefaultPixelBlenders<TPixel>.HardLightDestOver.Instance; |
||||
|
case PixelColorBlendingMode.Normal: |
||||
|
default: return DefaultPixelBlenders<TPixel>.NormalDestOver.Instance; |
||||
|
} |
||||
|
|
||||
|
case PixelAlphaCompositionMode.SrcOver: |
||||
|
default: |
||||
|
switch (colorMode) |
||||
|
{ |
||||
|
case PixelColorBlendingMode.Multiply: return DefaultPixelBlenders<TPixel>.MultiplySrcOver.Instance; |
||||
|
case PixelColorBlendingMode.Add: return DefaultPixelBlenders<TPixel>.AddSrcOver.Instance; |
||||
|
case PixelColorBlendingMode.Subtract: return DefaultPixelBlenders<TPixel>.SubtractSrcOver.Instance; |
||||
|
case PixelColorBlendingMode.Screen: return DefaultPixelBlenders<TPixel>.ScreenSrcOver.Instance; |
||||
|
case PixelColorBlendingMode.Darken: return DefaultPixelBlenders<TPixel>.DarkenSrcOver.Instance; |
||||
|
case PixelColorBlendingMode.Lighten: return DefaultPixelBlenders<TPixel>.LightenSrcOver.Instance; |
||||
|
case PixelColorBlendingMode.Overlay: return DefaultPixelBlenders<TPixel>.OverlaySrcOver.Instance; |
||||
|
case PixelColorBlendingMode.HardLight: return DefaultPixelBlenders<TPixel>.HardLightSrcOver.Instance; |
||||
|
case PixelColorBlendingMode.Normal: |
||||
|
default: return DefaultPixelBlenders<TPixel>.NormalSrcOver.Instance; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
} |
} |
||||
@ -1,47 +1,56 @@ |
|||||
// Copyright (c) Six Labors and contributors.
|
// Copyright (c) Six Labors and contributors.
|
||||
// Licensed under the Apache License, Version 2.0.
|
// Licensed under the Apache License, Version 2.0.
|
||||
|
|
||||
namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelBlenders |
namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelBlenders |
||||
{ |
{ |
||||
using SixLabors.ImageSharp.PixelFormats; |
using SixLabors.ImageSharp.PixelFormats; |
||||
using SixLabors.ImageSharp.Processing; |
using SixLabors.ImageSharp.Processing; |
||||
|
|
||||
using Xunit; |
using Xunit; |
||||
|
|
||||
public class PorterDuffCompositorTests |
public class PorterDuffCompositorTests |
||||
{ |
{ |
||||
// TODO: Add other modes to compare.
|
// TODO: Add other modes to compare.
|
||||
public static readonly TheoryData<PixelBlenderMode> CompositingOperators = |
public static readonly TheoryData<PixelAlphaCompositionMode> CompositingOperators = |
||||
new TheoryData<PixelBlenderMode> |
new TheoryData<PixelAlphaCompositionMode> |
||||
{ |
{ |
||||
PixelBlenderMode.Src, |
PixelAlphaCompositionMode.Src, |
||||
PixelBlenderMode.Atop, |
PixelAlphaCompositionMode.SrcAtop, |
||||
PixelBlenderMode.Over, |
PixelAlphaCompositionMode.SrcOver, |
||||
PixelBlenderMode.In, |
PixelAlphaCompositionMode.SrcIn, |
||||
PixelBlenderMode.Out, |
PixelAlphaCompositionMode.SrcOut, |
||||
PixelBlenderMode.Dest, |
PixelAlphaCompositionMode.Dest, |
||||
PixelBlenderMode.DestAtop, |
PixelAlphaCompositionMode.DestAtop, |
||||
PixelBlenderMode.DestOver, |
PixelAlphaCompositionMode.DestOver, |
||||
PixelBlenderMode.DestIn, |
PixelAlphaCompositionMode.DestIn, |
||||
PixelBlenderMode.DestOut, |
PixelAlphaCompositionMode.DestOut, |
||||
PixelBlenderMode.Clear, |
PixelAlphaCompositionMode.Clear, |
||||
PixelBlenderMode.Xor |
PixelAlphaCompositionMode.Xor |
||||
}; |
}; |
||||
|
|
||||
[Theory] |
[Theory] |
||||
[WithFile(TestImages.Png.PDDest, nameof(CompositingOperators), PixelTypes.Rgba32)] |
[WithFile(TestImages.Png.PDDest, nameof(CompositingOperators), PixelTypes.Rgba32)] |
||||
public void PorterDuffOutputIsCorrect(TestImageProvider<Rgba32> provider, PixelBlenderMode mode) |
public void PorterDuffOutputIsCorrect(TestImageProvider<Rgba32> provider, PixelAlphaCompositionMode mode) |
||||
{ |
{ |
||||
var srcFile = TestFile.Create(TestImages.Png.PDSrc); |
var srcFile = TestFile.Create(TestImages.Png.PDSrc); |
||||
using (Image<Rgba32> src = srcFile.CreateImage()) |
using (Image<Rgba32> src = srcFile.CreateImage()) |
||||
using (Image<Rgba32> dest = provider.GetImage()) |
using (Image<Rgba32> dest = provider.GetImage()) |
||||
{ |
{ |
||||
using (Image<Rgba32> res = dest.Clone(x => x.DrawImage(new GraphicsOptions { BlenderMode = mode }, src))) |
GraphicsOptions options = new GraphicsOptions |
||||
{ |
{ |
||||
res.DebugSave(provider, mode.ToString()); |
AlphaCompositionMode = mode |
||||
res.CompareToReferenceOutput(provider, mode.ToString()); |
}; |
||||
} |
|
||||
} |
using (Image<Rgba32> res = dest.Clone(x => x.DrawImage(src, options))) |
||||
} |
{ |
||||
} |
string combinedMode = mode.ToString(); |
||||
|
|
||||
|
if (combinedMode != "Src" && combinedMode.StartsWith("Src")) combinedMode = combinedMode.Substring(3); |
||||
|
|
||||
|
res.DebugSave(provider, combinedMode); |
||||
|
res.CompareToReferenceOutput(provider, combinedMode); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
} |
} |
||||
@ -1 +1 @@ |
|||||
Subproject commit 825220cdc4e9d1b4b3b474c63139e18e1cdb800e |
Subproject commit 6a43d335f216d6325a6a9fd8d35942ade12b7c7b |
||||
Loading…
Reference in new issue