Browse Source

removed a redundant opacity.Clamp(0,1) in the innermost level of pixel blenders. Pixel blenders are performance critical, so every tiny performance improvement counts.

pull/686/head
Vicente Penades 8 years ago
parent
commit
5306eaf841
  1. 432
      src/ImageSharp/PixelFormats/PixelBlenders/DefaultPixelBlenders.Generated.cs
  2. 4
      src/ImageSharp/PixelFormats/PixelBlenders/DefaultPixelBlenders.Generated.tt
  3. 297
      src/ImageSharp/PixelFormats/PixelBlenders/PorterDuffFunctions.Generated.cs
  4. 33
      src/ImageSharp/PixelFormats/PixelBlenders/PorterDuffFunctions.Generated.tt
  5. 38
      src/ImageSharp/PixelFormats/PixelBlender{TPixel}.cs

432
src/ImageSharp/PixelFormats/PixelBlenders/DefaultPixelBlenders.Generated.cs

File diff suppressed because it is too large

4
src/ImageSharp/PixelFormats/PixelBlenders/DefaultPixelBlenders.Generated.tt

@ -80,7 +80,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
/// <inheritdoc /> /// <inheritdoc />
public override TPixel Blend(TPixel background, TPixel source, float amount) public override TPixel Blend(TPixel background, TPixel source, float amount)
{ {
return PorterDuffFunctions.<#=blender_composer#>(background, source, amount); return PorterDuffFunctions.<#=blender_composer#>(background, source, amount.Clamp(0,1));
} }
/// <inheritdoc /> /// <inheritdoc />
@ -88,7 +88,7 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
{ {
for (int i = 0; i < destination.Length; i++) for (int i = 0; i < destination.Length; i++)
{ {
destination[i] = PorterDuffFunctions.<#=blender_composer#>(background[i], source[i], amount); destination[i] = PorterDuffFunctions.<#=blender_composer#>(background[i], source[i], amount.Clamp(0,1));
} }
} }

297
src/ImageSharp/PixelFormats/PixelBlenders/PorterDuffFunctions.Generated.cs

@ -19,7 +19,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 NormalSrc(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 NormalSrc(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return source; return source;
@ -28,7 +29,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 NormalSrcAtop(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 NormalSrcAtop(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Atop(backdrop, source, Normal(backdrop, source)); return Atop(backdrop, source, Normal(backdrop, source));
@ -37,7 +39,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 NormalSrcOver(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 NormalSrcOver(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Over(backdrop, source, Normal(backdrop, source)); return Over(backdrop, source, Normal(backdrop, source));
@ -46,7 +49,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 NormalSrcIn(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 NormalSrcIn(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return In(backdrop, source, Normal(backdrop, source)); return In(backdrop, source, Normal(backdrop, source));
@ -55,7 +59,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 NormalSrcOut(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 NormalSrcOut(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Out(backdrop, source); return Out(backdrop, source);
@ -70,7 +75,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 NormalDestAtop(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 NormalDestAtop(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Atop(source, backdrop, Normal(source, backdrop)); return Atop(source, backdrop, Normal(source, backdrop));
@ -79,7 +85,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 NormalDestOver(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 NormalDestOver(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Over(source, backdrop, Normal(source, backdrop)); return Over(source, backdrop, Normal(source, backdrop));
@ -88,7 +95,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 NormalDestIn(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 NormalDestIn(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return In(source, backdrop, Normal(source, backdrop)); return In(source, backdrop, Normal(source, backdrop));
@ -97,7 +105,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 NormalDestOut(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 NormalDestOut(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Out(source, backdrop); return Out(source, backdrop);
@ -106,7 +115,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 NormalXor(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 NormalXor(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Xor(backdrop, source); return Xor(backdrop, source);
@ -115,7 +125,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 NormalClear(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 NormalClear(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Clear(backdrop, source); return Clear(backdrop, source);
@ -256,7 +267,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 MultiplySrc(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 MultiplySrc(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return source; return source;
@ -265,7 +277,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 MultiplySrcAtop(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 MultiplySrcAtop(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Atop(backdrop, source, Multiply(backdrop, source)); return Atop(backdrop, source, Multiply(backdrop, source));
@ -274,7 +287,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 MultiplySrcOver(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 MultiplySrcOver(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Over(backdrop, source, Multiply(backdrop, source)); return Over(backdrop, source, Multiply(backdrop, source));
@ -283,7 +297,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 MultiplySrcIn(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 MultiplySrcIn(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return In(backdrop, source, Multiply(backdrop, source)); return In(backdrop, source, Multiply(backdrop, source));
@ -292,7 +307,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 MultiplySrcOut(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 MultiplySrcOut(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Out(backdrop, source); return Out(backdrop, source);
@ -307,7 +323,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 MultiplyDestAtop(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 MultiplyDestAtop(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Atop(source, backdrop, Multiply(source, backdrop)); return Atop(source, backdrop, Multiply(source, backdrop));
@ -316,7 +333,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 MultiplyDestOver(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 MultiplyDestOver(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Over(source, backdrop, Multiply(source, backdrop)); return Over(source, backdrop, Multiply(source, backdrop));
@ -325,7 +343,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 MultiplyDestIn(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 MultiplyDestIn(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return In(source, backdrop, Multiply(source, backdrop)); return In(source, backdrop, Multiply(source, backdrop));
@ -334,7 +353,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 MultiplyDestOut(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 MultiplyDestOut(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Out(source, backdrop); return Out(source, backdrop);
@ -343,7 +363,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 MultiplyXor(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 MultiplyXor(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Xor(backdrop, source); return Xor(backdrop, source);
@ -352,7 +373,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 MultiplyClear(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 MultiplyClear(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Clear(backdrop, source); return Clear(backdrop, source);
@ -493,7 +515,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 AddSrc(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 AddSrc(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return source; return source;
@ -502,7 +525,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 AddSrcAtop(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 AddSrcAtop(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Atop(backdrop, source, Add(backdrop, source)); return Atop(backdrop, source, Add(backdrop, source));
@ -511,7 +535,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 AddSrcOver(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 AddSrcOver(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Over(backdrop, source, Add(backdrop, source)); return Over(backdrop, source, Add(backdrop, source));
@ -520,7 +545,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 AddSrcIn(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 AddSrcIn(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return In(backdrop, source, Add(backdrop, source)); return In(backdrop, source, Add(backdrop, source));
@ -529,7 +555,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 AddSrcOut(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 AddSrcOut(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Out(backdrop, source); return Out(backdrop, source);
@ -544,7 +571,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 AddDestAtop(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 AddDestAtop(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Atop(source, backdrop, Add(source, backdrop)); return Atop(source, backdrop, Add(source, backdrop));
@ -553,7 +581,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 AddDestOver(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 AddDestOver(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Over(source, backdrop, Add(source, backdrop)); return Over(source, backdrop, Add(source, backdrop));
@ -562,7 +591,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 AddDestIn(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 AddDestIn(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return In(source, backdrop, Add(source, backdrop)); return In(source, backdrop, Add(source, backdrop));
@ -571,7 +601,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 AddDestOut(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 AddDestOut(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Out(source, backdrop); return Out(source, backdrop);
@ -580,7 +611,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 AddXor(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 AddXor(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Xor(backdrop, source); return Xor(backdrop, source);
@ -589,7 +621,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 AddClear(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 AddClear(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Clear(backdrop, source); return Clear(backdrop, source);
@ -730,7 +763,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 SubtractSrc(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 SubtractSrc(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return source; return source;
@ -739,7 +773,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 SubtractSrcAtop(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 SubtractSrcAtop(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Atop(backdrop, source, Subtract(backdrop, source)); return Atop(backdrop, source, Subtract(backdrop, source));
@ -748,7 +783,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 SubtractSrcOver(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 SubtractSrcOver(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Over(backdrop, source, Subtract(backdrop, source)); return Over(backdrop, source, Subtract(backdrop, source));
@ -757,7 +793,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 SubtractSrcIn(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 SubtractSrcIn(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return In(backdrop, source, Subtract(backdrop, source)); return In(backdrop, source, Subtract(backdrop, source));
@ -766,7 +803,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 SubtractSrcOut(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 SubtractSrcOut(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Out(backdrop, source); return Out(backdrop, source);
@ -781,7 +819,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 SubtractDestAtop(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 SubtractDestAtop(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Atop(source, backdrop, Subtract(source, backdrop)); return Atop(source, backdrop, Subtract(source, backdrop));
@ -790,7 +829,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 SubtractDestOver(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 SubtractDestOver(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Over(source, backdrop, Subtract(source, backdrop)); return Over(source, backdrop, Subtract(source, backdrop));
@ -799,7 +839,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 SubtractDestIn(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 SubtractDestIn(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return In(source, backdrop, Subtract(source, backdrop)); return In(source, backdrop, Subtract(source, backdrop));
@ -808,7 +849,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 SubtractDestOut(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 SubtractDestOut(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Out(source, backdrop); return Out(source, backdrop);
@ -817,7 +859,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 SubtractXor(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 SubtractXor(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Xor(backdrop, source); return Xor(backdrop, source);
@ -826,7 +869,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 SubtractClear(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 SubtractClear(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Clear(backdrop, source); return Clear(backdrop, source);
@ -967,7 +1011,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 ScreenSrc(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 ScreenSrc(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return source; return source;
@ -976,7 +1021,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 ScreenSrcAtop(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 ScreenSrcAtop(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Atop(backdrop, source, Screen(backdrop, source)); return Atop(backdrop, source, Screen(backdrop, source));
@ -985,7 +1031,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 ScreenSrcOver(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 ScreenSrcOver(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Over(backdrop, source, Screen(backdrop, source)); return Over(backdrop, source, Screen(backdrop, source));
@ -994,7 +1041,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 ScreenSrcIn(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 ScreenSrcIn(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return In(backdrop, source, Screen(backdrop, source)); return In(backdrop, source, Screen(backdrop, source));
@ -1003,7 +1051,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 ScreenSrcOut(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 ScreenSrcOut(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Out(backdrop, source); return Out(backdrop, source);
@ -1018,7 +1067,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 ScreenDestAtop(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 ScreenDestAtop(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Atop(source, backdrop, Screen(source, backdrop)); return Atop(source, backdrop, Screen(source, backdrop));
@ -1027,7 +1077,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 ScreenDestOver(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 ScreenDestOver(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Over(source, backdrop, Screen(source, backdrop)); return Over(source, backdrop, Screen(source, backdrop));
@ -1036,7 +1087,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 ScreenDestIn(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 ScreenDestIn(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return In(source, backdrop, Screen(source, backdrop)); return In(source, backdrop, Screen(source, backdrop));
@ -1045,7 +1097,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 ScreenDestOut(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 ScreenDestOut(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Out(source, backdrop); return Out(source, backdrop);
@ -1054,7 +1107,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 ScreenXor(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 ScreenXor(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Xor(backdrop, source); return Xor(backdrop, source);
@ -1063,7 +1117,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 ScreenClear(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 ScreenClear(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Clear(backdrop, source); return Clear(backdrop, source);
@ -1204,7 +1259,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 DarkenSrc(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 DarkenSrc(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return source; return source;
@ -1213,7 +1269,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 DarkenSrcAtop(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 DarkenSrcAtop(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Atop(backdrop, source, Darken(backdrop, source)); return Atop(backdrop, source, Darken(backdrop, source));
@ -1222,7 +1279,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 DarkenSrcOver(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 DarkenSrcOver(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Over(backdrop, source, Darken(backdrop, source)); return Over(backdrop, source, Darken(backdrop, source));
@ -1231,7 +1289,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 DarkenSrcIn(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 DarkenSrcIn(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return In(backdrop, source, Darken(backdrop, source)); return In(backdrop, source, Darken(backdrop, source));
@ -1240,7 +1299,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 DarkenSrcOut(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 DarkenSrcOut(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Out(backdrop, source); return Out(backdrop, source);
@ -1255,7 +1315,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 DarkenDestAtop(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 DarkenDestAtop(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Atop(source, backdrop, Darken(source, backdrop)); return Atop(source, backdrop, Darken(source, backdrop));
@ -1264,7 +1325,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 DarkenDestOver(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 DarkenDestOver(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Over(source, backdrop, Darken(source, backdrop)); return Over(source, backdrop, Darken(source, backdrop));
@ -1273,7 +1335,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 DarkenDestIn(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 DarkenDestIn(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return In(source, backdrop, Darken(source, backdrop)); return In(source, backdrop, Darken(source, backdrop));
@ -1282,7 +1345,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 DarkenDestOut(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 DarkenDestOut(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Out(source, backdrop); return Out(source, backdrop);
@ -1291,7 +1355,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 DarkenXor(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 DarkenXor(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Xor(backdrop, source); return Xor(backdrop, source);
@ -1300,7 +1365,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 DarkenClear(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 DarkenClear(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Clear(backdrop, source); return Clear(backdrop, source);
@ -1441,7 +1507,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 LightenSrc(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 LightenSrc(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return source; return source;
@ -1450,7 +1517,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 LightenSrcAtop(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 LightenSrcAtop(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Atop(backdrop, source, Lighten(backdrop, source)); return Atop(backdrop, source, Lighten(backdrop, source));
@ -1459,7 +1527,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 LightenSrcOver(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 LightenSrcOver(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Over(backdrop, source, Lighten(backdrop, source)); return Over(backdrop, source, Lighten(backdrop, source));
@ -1468,7 +1537,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 LightenSrcIn(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 LightenSrcIn(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return In(backdrop, source, Lighten(backdrop, source)); return In(backdrop, source, Lighten(backdrop, source));
@ -1477,7 +1547,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 LightenSrcOut(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 LightenSrcOut(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Out(backdrop, source); return Out(backdrop, source);
@ -1492,7 +1563,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 LightenDestAtop(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 LightenDestAtop(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Atop(source, backdrop, Lighten(source, backdrop)); return Atop(source, backdrop, Lighten(source, backdrop));
@ -1501,7 +1573,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 LightenDestOver(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 LightenDestOver(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Over(source, backdrop, Lighten(source, backdrop)); return Over(source, backdrop, Lighten(source, backdrop));
@ -1510,7 +1583,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 LightenDestIn(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 LightenDestIn(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return In(source, backdrop, Lighten(source, backdrop)); return In(source, backdrop, Lighten(source, backdrop));
@ -1519,7 +1593,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 LightenDestOut(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 LightenDestOut(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Out(source, backdrop); return Out(source, backdrop);
@ -1528,7 +1603,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 LightenXor(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 LightenXor(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Xor(backdrop, source); return Xor(backdrop, source);
@ -1537,7 +1613,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 LightenClear(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 LightenClear(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Clear(backdrop, source); return Clear(backdrop, source);
@ -1678,7 +1755,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 OverlaySrc(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 OverlaySrc(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return source; return source;
@ -1687,7 +1765,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 OverlaySrcAtop(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 OverlaySrcAtop(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Atop(backdrop, source, Overlay(backdrop, source)); return Atop(backdrop, source, Overlay(backdrop, source));
@ -1696,7 +1775,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 OverlaySrcOver(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 OverlaySrcOver(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Over(backdrop, source, Overlay(backdrop, source)); return Over(backdrop, source, Overlay(backdrop, source));
@ -1705,7 +1785,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 OverlaySrcIn(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 OverlaySrcIn(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return In(backdrop, source, Overlay(backdrop, source)); return In(backdrop, source, Overlay(backdrop, source));
@ -1714,7 +1795,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 OverlaySrcOut(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 OverlaySrcOut(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Out(backdrop, source); return Out(backdrop, source);
@ -1729,7 +1811,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 OverlayDestAtop(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 OverlayDestAtop(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Atop(source, backdrop, Overlay(source, backdrop)); return Atop(source, backdrop, Overlay(source, backdrop));
@ -1738,7 +1821,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 OverlayDestOver(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 OverlayDestOver(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Over(source, backdrop, Overlay(source, backdrop)); return Over(source, backdrop, Overlay(source, backdrop));
@ -1747,7 +1831,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 OverlayDestIn(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 OverlayDestIn(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return In(source, backdrop, Overlay(source, backdrop)); return In(source, backdrop, Overlay(source, backdrop));
@ -1756,7 +1841,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 OverlayDestOut(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 OverlayDestOut(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Out(source, backdrop); return Out(source, backdrop);
@ -1765,7 +1851,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 OverlayXor(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 OverlayXor(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Xor(backdrop, source); return Xor(backdrop, source);
@ -1774,7 +1861,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 OverlayClear(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 OverlayClear(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Clear(backdrop, source); return Clear(backdrop, source);
@ -1915,7 +2003,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 HardLightSrc(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 HardLightSrc(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return source; return source;
@ -1924,7 +2013,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 HardLightSrcAtop(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 HardLightSrcAtop(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Atop(backdrop, source, HardLight(backdrop, source)); return Atop(backdrop, source, HardLight(backdrop, source));
@ -1933,7 +2023,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 HardLightSrcOver(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 HardLightSrcOver(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Over(backdrop, source, HardLight(backdrop, source)); return Over(backdrop, source, HardLight(backdrop, source));
@ -1942,7 +2033,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 HardLightSrcIn(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 HardLightSrcIn(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return In(backdrop, source, HardLight(backdrop, source)); return In(backdrop, source, HardLight(backdrop, source));
@ -1951,7 +2043,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 HardLightSrcOut(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 HardLightSrcOut(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Out(backdrop, source); return Out(backdrop, source);
@ -1966,7 +2059,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 HardLightDestAtop(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 HardLightDestAtop(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Atop(source, backdrop, HardLight(source, backdrop)); return Atop(source, backdrop, HardLight(source, backdrop));
@ -1975,7 +2069,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 HardLightDestOver(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 HardLightDestOver(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Over(source, backdrop, HardLight(source, backdrop)); return Over(source, backdrop, HardLight(source, backdrop));
@ -1984,7 +2079,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 HardLightDestIn(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 HardLightDestIn(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return In(source, backdrop, HardLight(source, backdrop)); return In(source, backdrop, HardLight(source, backdrop));
@ -1993,7 +2089,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 HardLightDestOut(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 HardLightDestOut(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Out(source, backdrop); return Out(source, backdrop);
@ -2002,7 +2099,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 HardLightXor(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 HardLightXor(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Xor(backdrop, source); return Xor(backdrop, source);
@ -2011,7 +2109,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 HardLightClear(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 HardLightClear(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Clear(backdrop, source); return Clear(backdrop, source);

33
src/ImageSharp/PixelFormats/PixelBlenders/PorterDuffFunctions.Generated.tt

@ -27,7 +27,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 <#=blender#>Src(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 <#=blender#>Src(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return source; return source;
@ -36,7 +37,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 <#=blender#>SrcAtop(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 <#=blender#>SrcAtop(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Atop(backdrop, source, <#=blender#>(backdrop, source)); return Atop(backdrop, source, <#=blender#>(backdrop, source));
@ -45,7 +47,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 <#=blender#>SrcOver(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 <#=blender#>SrcOver(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Over(backdrop, source, <#=blender#>(backdrop, source)); return Over(backdrop, source, <#=blender#>(backdrop, source));
@ -54,7 +57,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 <#=blender#>SrcIn(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 <#=blender#>SrcIn(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return In(backdrop, source, <#=blender#>(backdrop, source)); return In(backdrop, source, <#=blender#>(backdrop, source));
@ -63,7 +67,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 <#=blender#>SrcOut(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 <#=blender#>SrcOut(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Out(backdrop, source); return Out(backdrop, source);
@ -78,7 +83,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 <#=blender#>DestAtop(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 <#=blender#>DestAtop(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Atop(source, backdrop, <#=blender#>(source, backdrop)); return Atop(source, backdrop, <#=blender#>(source, backdrop));
@ -87,7 +93,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 <#=blender#>DestOver(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 <#=blender#>DestOver(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Over(source, backdrop, <#=blender#>(source, backdrop)); return Over(source, backdrop, <#=blender#>(source, backdrop));
@ -96,7 +103,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 <#=blender#>DestIn(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 <#=blender#>DestIn(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return In(source, backdrop, <#=blender#>(source, backdrop)); return In(source, backdrop, <#=blender#>(source, backdrop));
@ -105,7 +113,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 <#=blender#>DestOut(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 <#=blender#>DestOut(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Out(source, backdrop); return Out(source, backdrop);
@ -114,7 +123,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 <#=blender#>Xor(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 <#=blender#>Xor(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Xor(backdrop, source); return Xor(backdrop, source);
@ -123,7 +133,8 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Vector4 <#=blender#>Clear(Vector4 backdrop, Vector4 source, float opacity) public static Vector4 <#=blender#>Clear(Vector4 backdrop, Vector4 source, float opacity)
{ {
opacity = opacity.Clamp(0, 1); DebugGuard.MustBeBetweenOrEqualTo(opacity, 0, 1, nameof(opacity));
source.W *= opacity; source.W *= opacity;
return Clear(backdrop, source); return Clear(backdrop, source);

38
src/ImageSharp/PixelFormats/PixelBlender{TPixel}.cs

@ -55,7 +55,6 @@ namespace SixLabors.ImageSharp.PixelFormats
/// <summary> /// <summary>
/// Blends 2 rows together /// Blends 2 rows together
/// </summary> /// </summary>
/// <typeparam name="TPixelSrc">the pixel format of the source span</typeparam>
/// <param name="memoryManager">memory manager to use internally</param> /// <param name="memoryManager">memory manager to use internally</param>
/// <param name="destination">the destination span</param> /// <param name="destination">the destination span</param>
/// <param name="background">the background span</param> /// <param name="background">the background span</param>
@ -64,26 +63,9 @@ namespace SixLabors.ImageSharp.PixelFormats
/// A span with values between 0 and 1 indicating the weight of the second source vector. /// A span with values between 0 and 1 indicating the weight of the second source vector.
/// At amount = 0, "from" is returned, at amount = 1, "to" is returned. /// At amount = 0, "from" is returned, at amount = 1, "to" is returned.
/// </param> /// </param>
public void Blend<TPixelSrc>(MemoryAllocator memoryManager, Span<TPixel> destination, ReadOnlySpan<TPixel> background, ReadOnlySpan<TPixelSrc> source, ReadOnlySpan<float> amount) public void Blend(MemoryAllocator memoryManager, Span<TPixel> destination, ReadOnlySpan<TPixel> background, ReadOnlySpan<TPixel> source, ReadOnlySpan<float> amount)
where TPixelSrc : struct, IPixel<TPixelSrc>
{ {
Guard.MustBeGreaterThanOrEqualTo(background.Length, destination.Length, nameof(background.Length)); this.Blend<TPixel>(memoryManager, destination, background, source, amount);
Guard.MustBeGreaterThanOrEqualTo(source.Length, destination.Length, nameof(source.Length));
Guard.MustBeGreaterThanOrEqualTo(amount.Length, destination.Length, nameof(amount.Length));
using (IMemoryOwner<Vector4> buffer = memoryManager.Allocate<Vector4>(destination.Length * 3))
{
Span<Vector4> destinationSpan = buffer.Slice(0, destination.Length);
Span<Vector4> backgroundSpan = buffer.Slice(destination.Length, destination.Length);
Span<Vector4> sourceSpan = buffer.Slice(destination.Length * 2, destination.Length);
PixelOperations<TPixel>.Instance.ToVector4(background, backgroundSpan, destination.Length);
PixelOperations<TPixelSrc>.Instance.ToVector4(source, sourceSpan, destination.Length);
this.BlendFunction(destinationSpan, backgroundSpan, sourceSpan, amount);
PixelOperations<TPixel>.Instance.PackFromVector4(destinationSpan, destination, destination.Length);
}
} }
/// <summary> /// <summary>
@ -95,15 +77,15 @@ namespace SixLabors.ImageSharp.PixelFormats
/// <param name="background">the background span</param> /// <param name="background">the background span</param>
/// <param name="source">the source span</param> /// <param name="source">the source span</param>
/// <param name="amount"> /// <param name="amount">
/// A value between 0 and 1 indicating the weight of the second source vector. /// A span with values between 0 and 1 indicating the weight of the second source vector.
/// At amount = 0, "from" is returned, at amount = 1, "to" is returned. /// At amount = 0, "from" is returned, at amount = 1, "to" is returned.
/// </param> /// </param>
public void Blend<TPixelSrc>(MemoryAllocator memoryManager, Span<TPixel> destination, ReadOnlySpan<TPixel> background, ReadOnlySpan<TPixelSrc> source, float amount) public void Blend<TPixelSrc>(MemoryAllocator memoryManager, Span<TPixel> destination, ReadOnlySpan<TPixel> background, ReadOnlySpan<TPixelSrc> source, ReadOnlySpan<float> amount)
where TPixelSrc : struct, IPixel<TPixelSrc> where TPixelSrc : struct, IPixel<TPixelSrc>
{ {
Guard.MustBeGreaterThanOrEqualTo(background.Length, destination.Length, nameof(background.Length)); Guard.MustBeGreaterThanOrEqualTo(background.Length, destination.Length, nameof(background.Length));
Guard.MustBeGreaterThanOrEqualTo(source.Length, destination.Length, nameof(source.Length)); Guard.MustBeGreaterThanOrEqualTo(source.Length, destination.Length, nameof(source.Length));
Guard.MustBeBetweenOrEqualTo(amount, 0, 1, nameof(amount)); Guard.MustBeGreaterThanOrEqualTo(amount.Length, destination.Length, nameof(amount.Length));
using (IMemoryOwner<Vector4> buffer = memoryManager.Allocate<Vector4>(destination.Length * 3)) using (IMemoryOwner<Vector4> buffer = memoryManager.Allocate<Vector4>(destination.Length * 3))
{ {
@ -123,19 +105,21 @@ namespace SixLabors.ImageSharp.PixelFormats
/// <summary> /// <summary>
/// Blends 2 rows together /// Blends 2 rows together
/// </summary> /// </summary>
/// <typeparam name="TPixelSrc">the pixel format of the source span</typeparam>
/// <param name="memoryManager">memory manager to use internally</param> /// <param name="memoryManager">memory manager to use internally</param>
/// <param name="destination">the destination span</param> /// <param name="destination">the destination span</param>
/// <param name="background">the background span</param> /// <param name="background">the background span</param>
/// <param name="source">the source span</param> /// <param name="source">the source span</param>
/// <param name="amount"> /// <param name="amount">
/// A span with values between 0 and 1 indicating the weight of the second source vector. /// A value between 0 and 1 indicating the weight of the second source vector.
/// At amount = 0, "from" is returned, at amount = 1, "to" is returned. /// At amount = 0, "from" is returned, at amount = 1, "to" is returned.
/// </param> /// </param>
public void Blend(MemoryAllocator memoryManager, Span<TPixel> destination, ReadOnlySpan<TPixel> background, ReadOnlySpan<TPixel> source, ReadOnlySpan<float> amount) public void Blend<TPixelSrc>(MemoryAllocator memoryManager, Span<TPixel> destination, ReadOnlySpan<TPixel> background, ReadOnlySpan<TPixelSrc> source, float amount)
where TPixelSrc : struct, IPixel<TPixelSrc>
{ {
Guard.MustBeGreaterThanOrEqualTo(background.Length, destination.Length, nameof(background.Length)); Guard.MustBeGreaterThanOrEqualTo(background.Length, destination.Length, nameof(background.Length));
Guard.MustBeGreaterThanOrEqualTo(source.Length, destination.Length, nameof(source.Length)); Guard.MustBeGreaterThanOrEqualTo(source.Length, destination.Length, nameof(source.Length));
Guard.MustBeGreaterThanOrEqualTo(amount.Length, destination.Length, nameof(amount.Length)); Guard.MustBeBetweenOrEqualTo(amount, 0, 1, nameof(amount));
using (IMemoryOwner<Vector4> buffer = memoryManager.Allocate<Vector4>(destination.Length * 3)) using (IMemoryOwner<Vector4> buffer = memoryManager.Allocate<Vector4>(destination.Length * 3))
{ {
@ -144,7 +128,7 @@ namespace SixLabors.ImageSharp.PixelFormats
Span<Vector4> sourceSpan = buffer.Slice(destination.Length * 2, destination.Length); Span<Vector4> sourceSpan = buffer.Slice(destination.Length * 2, destination.Length);
PixelOperations<TPixel>.Instance.ToVector4(background, backgroundSpan, destination.Length); PixelOperations<TPixel>.Instance.ToVector4(background, backgroundSpan, destination.Length);
PixelOperations<TPixel>.Instance.ToVector4(source, sourceSpan, destination.Length); PixelOperations<TPixelSrc>.Instance.ToVector4(source, sourceSpan, destination.Length);
this.BlendFunction(destinationSpan, backgroundSpan, sourceSpan, amount); this.BlendFunction(destinationSpan, backgroundSpan, sourceSpan, amount);

Loading…
Cancel
Save