From 4bb5f9f45e3074d117b37da641909b2ee5efe498 Mon Sep 17 00:00:00 2001 From: Vicente Penades Date: Mon, 2 Jul 2018 16:10:51 +0200 Subject: [PATCH] progress on pixel conposer/blender combinations --- .../PorterDuffFunctions.Generated.cs | 4451 ++++++++--------- .../PorterDuffFunctions.Generated.tt | 426 +- .../PixelBlenders/PorterDuffFunctions.cs | 159 +- .../Drawing/SolidFillBlendedShapesTests.cs | 23 +- 4 files changed, 2414 insertions(+), 2645 deletions(-) diff --git a/src/ImageSharp/PixelFormats/PixelBlenders/PorterDuffFunctions.Generated.cs b/src/ImageSharp/PixelFormats/PixelBlenders/PorterDuffFunctions.Generated.cs index 73e1c7f02..b8c3faf4f 100644 --- a/src/ImageSharp/PixelFormats/PixelBlenders/PorterDuffFunctions.Generated.cs +++ b/src/ImageSharp/PixelFormats/PixelBlenders/PorterDuffFunctions.Generated.cs @@ -1,2298 +1,2155 @@ - - - - - - - -// Copyright (c) Six Labors and contributors. -// Licensed under the Apache License, Version 2.0. - -// - -using System; -using System.Numerics; -using System.Runtime.CompilerServices; - -namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders -{ - internal static partial class PorterDuffFunctions - { - - - - - - - - - - - - - - #region Blenders - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 SrcAtop(Vector4 backdrop, Vector4 source, Vector4 xform) - { - // calculate weights - float xw = backdrop.W * source.W; - float bw = backdrop.W - xw; - float sw = source.W - xw; - - // calculate final alpha - float fw = (sw * 0) + (bw * 1) + (xw * 1); - - // calculate final value - xform = ((xform * xw) + (backdrop * bw) + (Vector4.Zero * sw)) / MathF.Max(fw, Constants.Epsilon); - xform.W = fw; - - return xform; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 SrcOver(Vector4 backdrop, Vector4 source, Vector4 xform) - { - // calculate weights - float xw = backdrop.W * source.W; - float bw = backdrop.W - xw; - float sw = source.W - xw; - - // calculate final alpha - float fw = (sw * 1) + (bw * 1) + (xw * 1); - - // calculate final value - xform = ((xform * xw) + (backdrop * bw) + (source * sw)) / MathF.Max(fw, Constants.Epsilon); - xform.W = fw; - - return xform; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Dest(Vector4 backdrop, Vector4 source, Vector4 xform) - { - // calculate weights - float xw = backdrop.W * source.W; - float bw = backdrop.W - xw; - float sw = source.W - xw; - - // calculate final alpha - float fw = (sw * 0) + (bw * 1) + (xw * 1); - - // calculate final value - xform = ((backdrop * xw) + (backdrop * bw) + (Vector4.Zero * sw)) / MathF.Max(fw, Constants.Epsilon); - xform.W = fw; - - return xform; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 DestOut(Vector4 backdrop, Vector4 source, Vector4 xform) - { - // calculate weights - float xw = backdrop.W * source.W; - float bw = backdrop.W - xw; - float sw = source.W - xw; - - // calculate final alpha - float fw = (sw * 0) + (bw * 1) + (xw * 0); - - // calculate final value - xform = ((Vector4.Zero * xw) + (backdrop * bw) + (Vector4.Zero * sw)) / MathF.Max(fw, Constants.Epsilon); - xform.W = fw; - - return xform; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Xor(Vector4 backdrop, Vector4 source, Vector4 xform) - { - // calculate weights - float xw = backdrop.W * source.W; - float bw = backdrop.W - xw; - float sw = source.W - xw; - - // calculate final alpha - float fw = (sw * 1) + (bw * 1) + (xw * 0); - - // calculate final value - xform = ((Vector4.Zero * xw) + (backdrop * bw) + (source * sw)) / MathF.Max(fw, Constants.Epsilon); - xform.W = fw; - - return xform; - } - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Normal_Src(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return Src(backdrop, source, Normal(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Normal_SrcAtop(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return SrcAtop(backdrop, source, Normal(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Normal_SrcOver(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return SrcOver(backdrop, source, Normal(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Normal_SrcIn(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return SrcIn(backdrop, source, Normal(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Normal_SrcOut(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return SrcOut(backdrop, source, Normal(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Normal_Dest(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return Dest(backdrop, source, Normal(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Normal_DestAtop(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return DestAtop(backdrop, source, Normal(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Normal_DestOver(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return DestOver(backdrop, source, Normal(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Normal_DestIn(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return DestIn(backdrop, source, Normal(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Normal_DestOut(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return DestOut(backdrop, source, Normal(backdrop, source)); - } - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Normal_Clear(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return Clear(backdrop, source, source); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Normal_Xor(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return Xor(backdrop, source, source); - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Normal_Src(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Normal_Src(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Normal_SrcAtop(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Normal_SrcAtop(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Normal_SrcOver(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Normal_SrcOver(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Normal_SrcIn(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Normal_SrcIn(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Normal_SrcOut(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Normal_SrcOut(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Normal_Dest(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Normal_Dest(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Normal_DestAtop(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Normal_DestAtop(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Normal_DestOver(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Normal_DestOver(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Normal_DestIn(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Normal_DestIn(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Normal_DestOut(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Normal_DestOut(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Normal_Clear(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Normal_Clear(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Normal_Xor(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Normal_Xor(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Multiply_Src(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return Src(backdrop, source, Multiply(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Multiply_SrcAtop(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return SrcAtop(backdrop, source, Multiply(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Multiply_SrcOver(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return SrcOver(backdrop, source, Multiply(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Multiply_SrcIn(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return SrcIn(backdrop, source, Multiply(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Multiply_SrcOut(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return SrcOut(backdrop, source, Multiply(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Multiply_Dest(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return Dest(backdrop, source, Multiply(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Multiply_DestAtop(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return DestAtop(backdrop, source, Multiply(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Multiply_DestOver(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return DestOver(backdrop, source, Multiply(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Multiply_DestIn(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return DestIn(backdrop, source, Multiply(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Multiply_DestOut(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return DestOut(backdrop, source, Multiply(backdrop, source)); - } - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Multiply_Clear(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return Clear(backdrop, source, source); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Multiply_Xor(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return Xor(backdrop, source, source); - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Multiply_Src(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Multiply_Src(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Multiply_SrcAtop(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Multiply_SrcAtop(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Multiply_SrcOver(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Multiply_SrcOver(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Multiply_SrcIn(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Multiply_SrcIn(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Multiply_SrcOut(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Multiply_SrcOut(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Multiply_Dest(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Multiply_Dest(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Multiply_DestAtop(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Multiply_DestAtop(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Multiply_DestOver(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Multiply_DestOver(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Multiply_DestIn(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Multiply_DestIn(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Multiply_DestOut(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Multiply_DestOut(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Multiply_Clear(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Multiply_Clear(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Multiply_Xor(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Multiply_Xor(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Add_Src(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return Src(backdrop, source, Add(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Add_SrcAtop(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return SrcAtop(backdrop, source, Add(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Add_SrcOver(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return SrcOver(backdrop, source, Add(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Add_SrcIn(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return SrcIn(backdrop, source, Add(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Add_SrcOut(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return SrcOut(backdrop, source, Add(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Add_Dest(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return Dest(backdrop, source, Add(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Add_DestAtop(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return DestAtop(backdrop, source, Add(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Add_DestOver(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return DestOver(backdrop, source, Add(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Add_DestIn(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return DestIn(backdrop, source, Add(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Add_DestOut(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return DestOut(backdrop, source, Add(backdrop, source)); - } - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Add_Clear(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return Clear(backdrop, source, source); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Add_Xor(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return Xor(backdrop, source, source); - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Add_Src(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Add_Src(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Add_SrcAtop(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Add_SrcAtop(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Add_SrcOver(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Add_SrcOver(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Add_SrcIn(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Add_SrcIn(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Add_SrcOut(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Add_SrcOut(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Add_Dest(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Add_Dest(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Add_DestAtop(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Add_DestAtop(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Add_DestOver(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Add_DestOver(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Add_DestIn(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Add_DestIn(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Add_DestOut(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Add_DestOut(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Add_Clear(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Add_Clear(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Add_Xor(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Add_Xor(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Subtract_Src(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return Src(backdrop, source, Subtract(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Subtract_SrcAtop(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return SrcAtop(backdrop, source, Subtract(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Subtract_SrcOver(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return SrcOver(backdrop, source, Subtract(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Subtract_SrcIn(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return SrcIn(backdrop, source, Subtract(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Subtract_SrcOut(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return SrcOut(backdrop, source, Subtract(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Subtract_Dest(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return Dest(backdrop, source, Subtract(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Subtract_DestAtop(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return DestAtop(backdrop, source, Subtract(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Subtract_DestOver(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return DestOver(backdrop, source, Subtract(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Subtract_DestIn(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return DestIn(backdrop, source, Subtract(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Subtract_DestOut(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return DestOut(backdrop, source, Subtract(backdrop, source)); - } - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Subtract_Clear(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return Clear(backdrop, source, source); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Subtract_Xor(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return Xor(backdrop, source, source); - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Subtract_Src(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Subtract_Src(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Subtract_SrcAtop(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Subtract_SrcAtop(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Subtract_SrcOver(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Subtract_SrcOver(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Subtract_SrcIn(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Subtract_SrcIn(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Subtract_SrcOut(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Subtract_SrcOut(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Subtract_Dest(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Subtract_Dest(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Subtract_DestAtop(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Subtract_DestAtop(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Subtract_DestOver(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Subtract_DestOver(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Subtract_DestIn(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Subtract_DestIn(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Subtract_DestOut(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Subtract_DestOut(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Subtract_Clear(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Subtract_Clear(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Subtract_Xor(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Subtract_Xor(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Screen_Src(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return Src(backdrop, source, Screen(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Screen_SrcAtop(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return SrcAtop(backdrop, source, Screen(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Screen_SrcOver(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return SrcOver(backdrop, source, Screen(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Screen_SrcIn(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return SrcIn(backdrop, source, Screen(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Screen_SrcOut(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return SrcOut(backdrop, source, Screen(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Screen_Dest(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return Dest(backdrop, source, Screen(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Screen_DestAtop(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return DestAtop(backdrop, source, Screen(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Screen_DestOver(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return DestOver(backdrop, source, Screen(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Screen_DestIn(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return DestIn(backdrop, source, Screen(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Screen_DestOut(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return DestOut(backdrop, source, Screen(backdrop, source)); - } - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Screen_Clear(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return Clear(backdrop, source, source); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Screen_Xor(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return Xor(backdrop, source, source); - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Screen_Src(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Screen_Src(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Screen_SrcAtop(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Screen_SrcAtop(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Screen_SrcOver(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Screen_SrcOver(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Screen_SrcIn(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Screen_SrcIn(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Screen_SrcOut(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Screen_SrcOut(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Screen_Dest(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Screen_Dest(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Screen_DestAtop(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Screen_DestAtop(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Screen_DestOver(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Screen_DestOver(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Screen_DestIn(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Screen_DestIn(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Screen_DestOut(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Screen_DestOut(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Screen_Clear(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Screen_Clear(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Screen_Xor(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Screen_Xor(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Darken_Src(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return Src(backdrop, source, Darken(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Darken_SrcAtop(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return SrcAtop(backdrop, source, Darken(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Darken_SrcOver(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return SrcOver(backdrop, source, Darken(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Darken_SrcIn(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return SrcIn(backdrop, source, Darken(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Darken_SrcOut(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return SrcOut(backdrop, source, Darken(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Darken_Dest(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return Dest(backdrop, source, Darken(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Darken_DestAtop(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return DestAtop(backdrop, source, Darken(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Darken_DestOver(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return DestOver(backdrop, source, Darken(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Darken_DestIn(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return DestIn(backdrop, source, Darken(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Darken_DestOut(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return DestOut(backdrop, source, Darken(backdrop, source)); - } - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Darken_Clear(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return Clear(backdrop, source, source); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Darken_Xor(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return Xor(backdrop, source, source); - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Darken_Src(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Darken_Src(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Darken_SrcAtop(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Darken_SrcAtop(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Darken_SrcOver(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Darken_SrcOver(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Darken_SrcIn(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Darken_SrcIn(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Darken_SrcOut(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Darken_SrcOut(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Darken_Dest(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Darken_Dest(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Darken_DestAtop(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Darken_DestAtop(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Darken_DestOver(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Darken_DestOver(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Darken_DestIn(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Darken_DestIn(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Darken_DestOut(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Darken_DestOut(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Darken_Clear(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Darken_Clear(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Darken_Xor(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Darken_Xor(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Lighten_Src(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return Src(backdrop, source, Lighten(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Lighten_SrcAtop(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return SrcAtop(backdrop, source, Lighten(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Lighten_SrcOver(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return SrcOver(backdrop, source, Lighten(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Lighten_SrcIn(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return SrcIn(backdrop, source, Lighten(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Lighten_SrcOut(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return SrcOut(backdrop, source, Lighten(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Lighten_Dest(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return Dest(backdrop, source, Lighten(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Lighten_DestAtop(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return DestAtop(backdrop, source, Lighten(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Lighten_DestOver(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return DestOver(backdrop, source, Lighten(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Lighten_DestIn(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return DestIn(backdrop, source, Lighten(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Lighten_DestOut(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return DestOut(backdrop, source, Lighten(backdrop, source)); - } - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Lighten_Clear(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return Clear(backdrop, source, source); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Lighten_Xor(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return Xor(backdrop, source, source); - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Lighten_Src(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Lighten_Src(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Lighten_SrcAtop(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Lighten_SrcAtop(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Lighten_SrcOver(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Lighten_SrcOver(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Lighten_SrcIn(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Lighten_SrcIn(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Lighten_SrcOut(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Lighten_SrcOut(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Lighten_Dest(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Lighten_Dest(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Lighten_DestAtop(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Lighten_DestAtop(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Lighten_DestOver(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Lighten_DestOver(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Lighten_DestIn(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Lighten_DestIn(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Lighten_DestOut(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Lighten_DestOut(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Lighten_Clear(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Lighten_Clear(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Lighten_Xor(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Lighten_Xor(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Overlay_Src(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return Src(backdrop, source, Overlay(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Overlay_SrcAtop(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return SrcAtop(backdrop, source, Overlay(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Overlay_SrcOver(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return SrcOver(backdrop, source, Overlay(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Overlay_SrcIn(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return SrcIn(backdrop, source, Overlay(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Overlay_SrcOut(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return SrcOut(backdrop, source, Overlay(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Overlay_Dest(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return Dest(backdrop, source, Overlay(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Overlay_DestAtop(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return DestAtop(backdrop, source, Overlay(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Overlay_DestOver(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return DestOver(backdrop, source, Overlay(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Overlay_DestIn(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return DestIn(backdrop, source, Overlay(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Overlay_DestOut(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return DestOut(backdrop, source, Overlay(backdrop, source)); - } - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Overlay_Clear(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return Clear(backdrop, source, source); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Overlay_Xor(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return Xor(backdrop, source, source); - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Overlay_Src(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Overlay_Src(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Overlay_SrcAtop(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Overlay_SrcAtop(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Overlay_SrcOver(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Overlay_SrcOver(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Overlay_SrcIn(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Overlay_SrcIn(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Overlay_SrcOut(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Overlay_SrcOut(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Overlay_Dest(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Overlay_Dest(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Overlay_DestAtop(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Overlay_DestAtop(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Overlay_DestOver(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Overlay_DestOver(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Overlay_DestIn(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Overlay_DestIn(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Overlay_DestOut(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Overlay_DestOut(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Overlay_Clear(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Overlay_Clear(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel Overlay_Xor(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(Overlay_Xor(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 HardLight_Src(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return Src(backdrop, source, HardLight(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 HardLight_SrcAtop(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return SrcAtop(backdrop, source, HardLight(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 HardLight_SrcOver(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return SrcOver(backdrop, source, HardLight(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 HardLight_SrcIn(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return SrcIn(backdrop, source, HardLight(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 HardLight_SrcOut(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return SrcOut(backdrop, source, HardLight(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 HardLight_Dest(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return Dest(backdrop, source, HardLight(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 HardLight_DestAtop(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return DestAtop(backdrop, source, HardLight(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 HardLight_DestOver(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return DestOver(backdrop, source, HardLight(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 HardLight_DestIn(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return DestIn(backdrop, source, HardLight(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 HardLight_DestOut(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return DestOut(backdrop, source, HardLight(backdrop, source)); - } - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 HardLight_Clear(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return Clear(backdrop, source, source); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 HardLight_Xor(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return Xor(backdrop, source, source); - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel HardLight_Src(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(HardLight_Src(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel HardLight_SrcAtop(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(HardLight_SrcAtop(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel HardLight_SrcOver(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(HardLight_SrcOver(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel HardLight_SrcIn(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(HardLight_SrcIn(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel HardLight_SrcOut(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(HardLight_SrcOut(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel HardLight_Dest(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(HardLight_Dest(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel HardLight_DestAtop(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(HardLight_DestAtop(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel HardLight_DestOver(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(HardLight_DestOver(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel HardLight_DestIn(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(HardLight_DestIn(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel HardLight_DestOut(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(HardLight_DestOut(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel HardLight_Clear(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(HardLight_Clear(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel HardLight_Xor(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(HardLight_Xor(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - - - - #endregion - } +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. + +// + +using System; +using System.Numerics; +using System.Runtime.CompilerServices; + +namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders +{ + internal static partial class PorterDuffFunctions + { + + + + + #region Blenders + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Normal_Src(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return source; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Normal_SrcAtop(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Atop(backdrop, source, Normal(backdrop, source)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Normal_SrcOver(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Over(backdrop, source, Normal(backdrop, source)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Normal_SrcIn(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return In(backdrop, source, Normal(backdrop, source)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Normal_SrcOut(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Out(backdrop, source); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Normal_Dest(Vector4 backdrop, Vector4 source, float opacity) + { + return backdrop; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Normal_DestAtop(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Atop(source, backdrop, Normal(source, backdrop)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Normal_DestOver(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Over(source, backdrop, Normal(source, backdrop)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Normal_DestIn(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return In(source, backdrop, Normal(source, backdrop)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Normal_DestOut(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Out(source, backdrop); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Normal_Xor(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Xor(backdrop, source); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Normal_Clear(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Clear(backdrop, source); + } + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Normal_Src(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Normal_Src(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Normal_SrcAtop(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Normal_SrcAtop(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Normal_SrcOver(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Normal_SrcOver(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Normal_SrcIn(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Normal_SrcIn(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Normal_SrcOut(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Normal_SrcOut(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Normal_Dest(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Normal_Dest(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Normal_DestAtop(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Normal_DestAtop(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Normal_DestOver(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Normal_DestOver(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Normal_DestIn(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Normal_DestIn(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Normal_DestOut(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Normal_DestOut(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Normal_Clear(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Normal_Clear(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Normal_Xor(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Normal_Xor(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Multiply_Src(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return source; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Multiply_SrcAtop(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Atop(backdrop, source, Multiply(backdrop, source)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Multiply_SrcOver(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Over(backdrop, source, Multiply(backdrop, source)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Multiply_SrcIn(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return In(backdrop, source, Multiply(backdrop, source)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Multiply_SrcOut(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Out(backdrop, source); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Multiply_Dest(Vector4 backdrop, Vector4 source, float opacity) + { + return backdrop; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Multiply_DestAtop(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Atop(source, backdrop, Multiply(source, backdrop)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Multiply_DestOver(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Over(source, backdrop, Multiply(source, backdrop)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Multiply_DestIn(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return In(source, backdrop, Multiply(source, backdrop)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Multiply_DestOut(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Out(source, backdrop); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Multiply_Xor(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Xor(backdrop, source); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Multiply_Clear(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Clear(backdrop, source); + } + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Multiply_Src(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Multiply_Src(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Multiply_SrcAtop(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Multiply_SrcAtop(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Multiply_SrcOver(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Multiply_SrcOver(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Multiply_SrcIn(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Multiply_SrcIn(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Multiply_SrcOut(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Multiply_SrcOut(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Multiply_Dest(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Multiply_Dest(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Multiply_DestAtop(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Multiply_DestAtop(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Multiply_DestOver(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Multiply_DestOver(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Multiply_DestIn(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Multiply_DestIn(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Multiply_DestOut(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Multiply_DestOut(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Multiply_Clear(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Multiply_Clear(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Multiply_Xor(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Multiply_Xor(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Add_Src(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return source; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Add_SrcAtop(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Atop(backdrop, source, Add(backdrop, source)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Add_SrcOver(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Over(backdrop, source, Add(backdrop, source)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Add_SrcIn(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return In(backdrop, source, Add(backdrop, source)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Add_SrcOut(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Out(backdrop, source); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Add_Dest(Vector4 backdrop, Vector4 source, float opacity) + { + return backdrop; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Add_DestAtop(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Atop(source, backdrop, Add(source, backdrop)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Add_DestOver(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Over(source, backdrop, Add(source, backdrop)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Add_DestIn(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return In(source, backdrop, Add(source, backdrop)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Add_DestOut(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Out(source, backdrop); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Add_Xor(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Xor(backdrop, source); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Add_Clear(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Clear(backdrop, source); + } + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Add_Src(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Add_Src(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Add_SrcAtop(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Add_SrcAtop(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Add_SrcOver(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Add_SrcOver(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Add_SrcIn(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Add_SrcIn(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Add_SrcOut(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Add_SrcOut(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Add_Dest(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Add_Dest(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Add_DestAtop(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Add_DestAtop(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Add_DestOver(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Add_DestOver(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Add_DestIn(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Add_DestIn(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Add_DestOut(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Add_DestOut(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Add_Clear(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Add_Clear(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Add_Xor(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Add_Xor(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Subtract_Src(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return source; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Subtract_SrcAtop(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Atop(backdrop, source, Subtract(backdrop, source)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Subtract_SrcOver(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Over(backdrop, source, Subtract(backdrop, source)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Subtract_SrcIn(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return In(backdrop, source, Subtract(backdrop, source)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Subtract_SrcOut(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Out(backdrop, source); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Subtract_Dest(Vector4 backdrop, Vector4 source, float opacity) + { + return backdrop; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Subtract_DestAtop(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Atop(source, backdrop, Subtract(source, backdrop)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Subtract_DestOver(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Over(source, backdrop, Subtract(source, backdrop)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Subtract_DestIn(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return In(source, backdrop, Subtract(source, backdrop)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Subtract_DestOut(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Out(source, backdrop); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Subtract_Xor(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Xor(backdrop, source); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Subtract_Clear(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Clear(backdrop, source); + } + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Subtract_Src(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Subtract_Src(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Subtract_SrcAtop(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Subtract_SrcAtop(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Subtract_SrcOver(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Subtract_SrcOver(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Subtract_SrcIn(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Subtract_SrcIn(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Subtract_SrcOut(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Subtract_SrcOut(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Subtract_Dest(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Subtract_Dest(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Subtract_DestAtop(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Subtract_DestAtop(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Subtract_DestOver(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Subtract_DestOver(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Subtract_DestIn(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Subtract_DestIn(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Subtract_DestOut(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Subtract_DestOut(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Subtract_Clear(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Subtract_Clear(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Subtract_Xor(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Subtract_Xor(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Screen_Src(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return source; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Screen_SrcAtop(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Atop(backdrop, source, Screen(backdrop, source)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Screen_SrcOver(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Over(backdrop, source, Screen(backdrop, source)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Screen_SrcIn(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return In(backdrop, source, Screen(backdrop, source)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Screen_SrcOut(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Out(backdrop, source); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Screen_Dest(Vector4 backdrop, Vector4 source, float opacity) + { + return backdrop; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Screen_DestAtop(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Atop(source, backdrop, Screen(source, backdrop)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Screen_DestOver(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Over(source, backdrop, Screen(source, backdrop)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Screen_DestIn(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return In(source, backdrop, Screen(source, backdrop)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Screen_DestOut(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Out(source, backdrop); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Screen_Xor(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Xor(backdrop, source); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Screen_Clear(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Clear(backdrop, source); + } + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Screen_Src(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Screen_Src(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Screen_SrcAtop(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Screen_SrcAtop(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Screen_SrcOver(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Screen_SrcOver(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Screen_SrcIn(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Screen_SrcIn(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Screen_SrcOut(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Screen_SrcOut(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Screen_Dest(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Screen_Dest(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Screen_DestAtop(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Screen_DestAtop(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Screen_DestOver(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Screen_DestOver(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Screen_DestIn(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Screen_DestIn(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Screen_DestOut(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Screen_DestOut(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Screen_Clear(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Screen_Clear(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Screen_Xor(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Screen_Xor(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Darken_Src(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return source; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Darken_SrcAtop(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Atop(backdrop, source, Darken(backdrop, source)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Darken_SrcOver(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Over(backdrop, source, Darken(backdrop, source)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Darken_SrcIn(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return In(backdrop, source, Darken(backdrop, source)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Darken_SrcOut(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Out(backdrop, source); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Darken_Dest(Vector4 backdrop, Vector4 source, float opacity) + { + return backdrop; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Darken_DestAtop(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Atop(source, backdrop, Darken(source, backdrop)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Darken_DestOver(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Over(source, backdrop, Darken(source, backdrop)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Darken_DestIn(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return In(source, backdrop, Darken(source, backdrop)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Darken_DestOut(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Out(source, backdrop); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Darken_Xor(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Xor(backdrop, source); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Darken_Clear(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Clear(backdrop, source); + } + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Darken_Src(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Darken_Src(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Darken_SrcAtop(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Darken_SrcAtop(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Darken_SrcOver(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Darken_SrcOver(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Darken_SrcIn(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Darken_SrcIn(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Darken_SrcOut(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Darken_SrcOut(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Darken_Dest(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Darken_Dest(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Darken_DestAtop(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Darken_DestAtop(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Darken_DestOver(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Darken_DestOver(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Darken_DestIn(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Darken_DestIn(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Darken_DestOut(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Darken_DestOut(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Darken_Clear(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Darken_Clear(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Darken_Xor(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Darken_Xor(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Lighten_Src(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return source; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Lighten_SrcAtop(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Atop(backdrop, source, Lighten(backdrop, source)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Lighten_SrcOver(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Over(backdrop, source, Lighten(backdrop, source)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Lighten_SrcIn(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return In(backdrop, source, Lighten(backdrop, source)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Lighten_SrcOut(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Out(backdrop, source); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Lighten_Dest(Vector4 backdrop, Vector4 source, float opacity) + { + return backdrop; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Lighten_DestAtop(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Atop(source, backdrop, Lighten(source, backdrop)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Lighten_DestOver(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Over(source, backdrop, Lighten(source, backdrop)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Lighten_DestIn(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return In(source, backdrop, Lighten(source, backdrop)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Lighten_DestOut(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Out(source, backdrop); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Lighten_Xor(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Xor(backdrop, source); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Lighten_Clear(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Clear(backdrop, source); + } + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Lighten_Src(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Lighten_Src(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Lighten_SrcAtop(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Lighten_SrcAtop(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Lighten_SrcOver(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Lighten_SrcOver(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Lighten_SrcIn(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Lighten_SrcIn(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Lighten_SrcOut(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Lighten_SrcOut(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Lighten_Dest(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Lighten_Dest(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Lighten_DestAtop(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Lighten_DestAtop(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Lighten_DestOver(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Lighten_DestOver(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Lighten_DestIn(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Lighten_DestIn(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Lighten_DestOut(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Lighten_DestOut(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Lighten_Clear(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Lighten_Clear(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Lighten_Xor(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Lighten_Xor(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Overlay_Src(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return source; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Overlay_SrcAtop(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Atop(backdrop, source, Overlay(backdrop, source)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Overlay_SrcOver(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Over(backdrop, source, Overlay(backdrop, source)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Overlay_SrcIn(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return In(backdrop, source, Overlay(backdrop, source)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Overlay_SrcOut(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Out(backdrop, source); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Overlay_Dest(Vector4 backdrop, Vector4 source, float opacity) + { + return backdrop; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Overlay_DestAtop(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Atop(source, backdrop, Overlay(source, backdrop)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Overlay_DestOver(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Over(source, backdrop, Overlay(source, backdrop)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Overlay_DestIn(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return In(source, backdrop, Overlay(source, backdrop)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Overlay_DestOut(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Out(source, backdrop); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Overlay_Xor(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Xor(backdrop, source); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 Overlay_Clear(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Clear(backdrop, source); + } + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Overlay_Src(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Overlay_Src(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Overlay_SrcAtop(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Overlay_SrcAtop(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Overlay_SrcOver(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Overlay_SrcOver(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Overlay_SrcIn(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Overlay_SrcIn(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Overlay_SrcOut(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Overlay_SrcOut(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Overlay_Dest(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Overlay_Dest(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Overlay_DestAtop(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Overlay_DestAtop(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Overlay_DestOver(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Overlay_DestOver(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Overlay_DestIn(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Overlay_DestIn(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Overlay_DestOut(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Overlay_DestOut(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Overlay_Clear(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Overlay_Clear(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel Overlay_Xor(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(Overlay_Xor(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 HardLight_Src(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return source; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 HardLight_SrcAtop(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Atop(backdrop, source, HardLight(backdrop, source)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 HardLight_SrcOver(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Over(backdrop, source, HardLight(backdrop, source)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 HardLight_SrcIn(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return In(backdrop, source, HardLight(backdrop, source)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 HardLight_SrcOut(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Out(backdrop, source); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 HardLight_Dest(Vector4 backdrop, Vector4 source, float opacity) + { + return backdrop; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 HardLight_DestAtop(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Atop(source, backdrop, HardLight(source, backdrop)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 HardLight_DestOver(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Over(source, backdrop, HardLight(source, backdrop)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 HardLight_DestIn(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return In(source, backdrop, HardLight(source, backdrop)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 HardLight_DestOut(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Out(source, backdrop); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 HardLight_Xor(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Xor(backdrop, source); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 HardLight_Clear(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Clear(backdrop, source); + } + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel HardLight_Src(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(HardLight_Src(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel HardLight_SrcAtop(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(HardLight_SrcAtop(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel HardLight_SrcOver(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(HardLight_SrcOver(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel HardLight_SrcIn(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(HardLight_SrcIn(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel HardLight_SrcOut(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(HardLight_SrcOut(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel HardLight_Dest(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(HardLight_Dest(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel HardLight_DestAtop(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(HardLight_DestAtop(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel HardLight_DestOver(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(HardLight_DestOver(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel HardLight_DestIn(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(HardLight_DestIn(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel HardLight_DestOut(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(HardLight_DestOut(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel HardLight_Clear(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(HardLight_Clear(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel HardLight_Xor(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(HardLight_Xor(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + + + #endregion + } } \ No newline at end of file diff --git a/src/ImageSharp/PixelFormats/PixelBlenders/PorterDuffFunctions.Generated.tt b/src/ImageSharp/PixelFormats/PixelBlenders/PorterDuffFunctions.Generated.tt index 64608fcfa..3045b1e81 100644 --- a/src/ImageSharp/PixelFormats/PixelBlenders/PorterDuffFunctions.Generated.tt +++ b/src/ImageSharp/PixelFormats/PixelBlenders/PorterDuffFunctions.Generated.tt @@ -1,237 +1,191 @@ -<# -// Copyright (c) Six Labors and contributors. -// Licensed under the Apache License, Version 2.0. -#> -<#@ template debug="false" hostspecific="false" language="C#" #> -<#@ assembly name="System.Core" #> -<#@ import namespace="System.Linq" #> -<#@ import namespace="System.Text" #> -<#@ import namespace="System.Collections.Generic" #> -<#@ output extension=".cs" #> -// Copyright (c) Six Labors and contributors. -// Licensed under the Apache License, Version 2.0. - -// - -using System; -using System.Numerics; -using System.Runtime.CompilerServices; - -namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders -{ - internal static partial class PorterDuffFunctions - { - - -<# void GenerateVectorCompositor(string name, string sourceVar, string destVar, string blendVar) - { - int a_s = sourceVar == "Vector4.Zero" ? 0 : 1; - int a_b = destVar == "Vector4.Zero" ? 0 : 1; - int a_x = blendVar == "Vector4.Zero" ? 0 : 1; -#> - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 <#=name#>(Vector4 backdrop, Vector4 source, Vector4 xform) - { - // calculate weights - float xw = backdrop.W * source.W; - float bw = backdrop.W - xw; - float sw = source.W - xw; - - // calculate final alpha - float fw = (sw * <#=a_s#>) + (bw * <#=a_b#>) + (xw * <#=a_x#>); - - // calculate final value - xform = ((<#=blendVar#> * xw) + (<#=destVar#> * bw) + (<#=sourceVar#> * sw)) / MathF.Max(fw, Constants.Epsilon); - xform.W = fw; - - return xform; - } -<# } #> - - - - - -<# void GeneratePixelBlenders(string blender) { #> - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 <#=blender#>_Src(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return Src(backdrop, source, <#=blender#>(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 <#=blender#>_SrcAtop(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return SrcAtop(backdrop, source, <#=blender#>(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 <#=blender#>_SrcOver(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return SrcOver(backdrop, source, <#=blender#>(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 <#=blender#>_SrcIn(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return SrcIn(backdrop, source, <#=blender#>(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 <#=blender#>_SrcOut(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return SrcOut(backdrop, source, <#=blender#>(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 <#=blender#>_Dest(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return Dest(backdrop, source, <#=blender#>(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 <#=blender#>_DestAtop(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return DestAtop(backdrop, source, <#=blender#>(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 <#=blender#>_DestOver(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return DestOver(backdrop, source, <#=blender#>(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 <#=blender#>_DestIn(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return DestIn(backdrop, source, <#=blender#>(backdrop, source)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 <#=blender#>_DestOut(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return DestOut(backdrop, source, <#=blender#>(backdrop, source)); - } - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 <#=blender#>_Clear(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return Clear(backdrop, source, source); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 <#=blender#>_Xor(Vector4 backdrop, Vector4 source, float opacity) - { - opacity = opacity.Clamp(0, 1); - source.W *= opacity; - - return Xor(backdrop, source, source); - } - -<# } #> - - -<# void GenerateGenericPixelBlender(string blender, string composer) { #> - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static TPixel <#=blender#>_<#=composer#>(TPixel backdrop, TPixel source, float opacity) - where TPixel : struct, IPixel - { - TPixel dest = default; - dest.PackFromVector4(<#=blender#>_<#=composer#>(backdrop.ToVector4(),source.ToVector4(),opacity)); - return dest; - } - -<# } #> - - #region Blenders -<# - -// GenerateVectorCompositor("Src", "source", "Vector4.Zero", "xform"); -GenerateVectorCompositor("SrcAtop", "Vector4.Zero", "backdrop", "xform"); -GenerateVectorCompositor("SrcOver", "source", "backdrop", "xform"); -// GenerateVectorCompositor("SrcIn", "Vector4.Zero", "Vector4.Zero", "xform"); -// GenerateVectorCompositor("SrcOut", "source", "Vector4.Zero", "Vector4.Zero"); -GenerateVectorCompositor("Dest", "Vector4.Zero", "backdrop", "backdrop"); -// GenerateVectorCompositor("DestAtop", "source", "Vector4.Zero", "backdrop"); -// GenerateVectorCompositor("DestOver", "source", "backdrop", "backdrop"); -// GenerateVectorCompositor("DestIn", "Vector4.Zero", "Vector4.Zero", "backdrop"); -GenerateVectorCompositor("DestOut", "Vector4.Zero", "backdrop", "Vector4.Zero"); -// GenerateVectorCompositor("Clear", "Vector4.Zero", "Vector4.Zero", "Vector4.Zero"); -GenerateVectorCompositor("Xor", "source", "backdrop", "Vector4.Zero"); - -string[] composers = new []{ - "Src" , - "SrcAtop" , - "SrcOver" , - "SrcIn" , - "SrcOut" , - "Dest" , - "DestAtop" , - "DestOver" , - "DestIn" , - "DestOut" , - "Clear" , - "Xor" , -}; - -string[] blenders = new []{ - "Normal" , - "Multiply" , - "Add" , - "Subtract" , - "Screen" , - "Darken" , - "Lighten" , - "Overlay" , - "HardLight" -}; - - foreach(var blender in blenders) - { - GeneratePixelBlenders(blender); - - foreach(var composer in composers) - { - GenerateGenericPixelBlender(blender,composer); - } - } - -#> - - #endregion - } +<# +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +#> +<#@ template debug="false" hostspecific="false" language="C#" #> +<#@ assembly name="System.Core" #> +<#@ import namespace="System.Linq" #> +<#@ import namespace="System.Text" #> +<#@ import namespace="System.Collections.Generic" #> +<#@ output extension=".cs" #> +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. + +// + +using System; +using System.Numerics; +using System.Runtime.CompilerServices; + +namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders +{ + internal static partial class PorterDuffFunctions + { + +<# void GeneratePixelBlenders(string blender) { #> + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 <#=blender#>_Src(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return source; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 <#=blender#>_SrcAtop(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Atop(backdrop, source, <#=blender#>(backdrop, source)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 <#=blender#>_SrcOver(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Over(backdrop, source, <#=blender#>(backdrop, source)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 <#=blender#>_SrcIn(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return In(backdrop, source, <#=blender#>(backdrop, source)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 <#=blender#>_SrcOut(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Out(backdrop, source); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 <#=blender#>_Dest(Vector4 backdrop, Vector4 source, float opacity) + { + return backdrop; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 <#=blender#>_DestAtop(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Atop(source, backdrop, <#=blender#>(source, backdrop)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 <#=blender#>_DestOver(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Over(source, backdrop, <#=blender#>(source, backdrop)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 <#=blender#>_DestIn(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return In(source, backdrop, <#=blender#>(source, backdrop)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 <#=blender#>_DestOut(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Out(source, backdrop); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 <#=blender#>_Xor(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Xor(backdrop, source); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Vector4 <#=blender#>_Clear(Vector4 backdrop, Vector4 source, float opacity) + { + opacity = opacity.Clamp(0, 1); + source.W *= opacity; + + return Clear(backdrop, source); + } +<# } #> + + +<# void GenerateGenericPixelBlender(string blender, string composer) { #> + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TPixel <#=blender#>_<#=composer#>(TPixel backdrop, TPixel source, float opacity) + where TPixel : struct, IPixel + { + TPixel dest = default; + dest.PackFromVector4(<#=blender#>_<#=composer#>(backdrop.ToVector4(),source.ToVector4(),opacity)); + return dest; + } + +<# } #> + + #region Blenders +<# + +string[] composers = new []{ + "Src" , + "SrcAtop" , + "SrcOver" , + "SrcIn" , + "SrcOut" , + "Dest" , + "DestAtop" , + "DestOver" , + "DestIn" , + "DestOut" , + "Clear" , + "Xor" , +}; + +string[] blenders = new []{ + "Normal" , + "Multiply" , + "Add" , + "Subtract" , + "Screen" , + "Darken" , + "Lighten" , + "Overlay" , + "HardLight" +}; + + foreach(var blender in blenders) + { + GeneratePixelBlenders(blender); + + foreach(var composer in composers) + { + GenerateGenericPixelBlender(blender,composer); + } + } + +#> + + #endregion + } } \ No newline at end of file diff --git a/src/ImageSharp/PixelFormats/PixelBlenders/PorterDuffFunctions.cs b/src/ImageSharp/PixelFormats/PixelBlenders/PorterDuffFunctions.cs index 573823856..e2c0c85db 100644 --- a/src/ImageSharp/PixelFormats/PixelBlenders/PorterDuffFunctions.cs +++ b/src/ImageSharp/PixelFormats/PixelBlenders/PorterDuffFunctions.cs @@ -179,125 +179,78 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders return xform; } + public static Vector4 Over(Vector4 dst, Vector4 src, Vector4 blend) + { + // calculate weights + float blendW = dst.W * src.W; + float dstW = dst.W - blendW; + float srcW = src.W - blendW; + // calculate final alpha + float alpha = dstW + srcW + blendW; + // calculate final color + Vector4 color = dst * dstW + src * srcW + blend * blendW; + // unpremultiply + color /= MathF.Max(alpha, Constants.Epsilon); + color.W = alpha; + return color; + } + public static Vector4 Atop(Vector4 dst, Vector4 src, Vector4 blend) + { + // calculate weights + float blendW = dst.W * src.W; + float dstW = dst.W - blendW; - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 Src(Vector4 backdrop, Vector4 source, Vector4 xform) - { - // calculate weights - float xw = backdrop.W * source.W; - float bw = backdrop.W - xw; - float sw = source.W - xw; - - // calculate final alpha - float fw = (sw * 1) + (bw * 0) + (xw * 1); - - // calculate final value - xform = ((xform * xw) + (Vector4.Zero * bw) + (source * sw)) / MathF.Max(fw, Constants.Epsilon); - xform.W = fw; - - return Vector4.Lerp(backdrop, xform, source.W); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 SrcIn(Vector4 backdrop, Vector4 source, Vector4 xform) - { - // calculate weights - float xw = backdrop.W * source.W; - - // calculate final value - xform.W = xw; - - return Vector4.Lerp(backdrop, xform, source.W); - } + // calculate final alpha + float alpha = dstW + blendW; + + // calculate final color + Vector4 color = dst * dstW + blend * blendW; + + // unpremultiply + color /= MathF.Max(alpha, Constants.Epsilon); + color.W = alpha; - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 SrcOut(Vector4 backdrop, Vector4 source, Vector4 xform) - { - // calculate weights - float xw = backdrop.W * source.W; - float bw = backdrop.W - xw; - float sw = source.W - xw; - - // calculate final alpha - float fw = sw; - - // calculate final value - xform = source; - xform.W = fw; - - return Vector4.Lerp(backdrop, xform, source.W); + return color; } - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 DestAtop(Vector4 backdrop, Vector4 source, Vector4 xform) - { - // calculate weights - float xw = backdrop.W * source.W; - float bw = backdrop.W - xw; - float sw = source.W - xw; - - // calculate final alpha - float fw = (sw * 1) + (bw * 0) + (xw * 1); - - // calculate final value - xform = ((backdrop * xw) + (Vector4.Zero * bw) + (source * sw)) / MathF.Max(fw, Constants.Epsilon); - xform.W = fw; - - return Vector4.Lerp(backdrop, xform, source.W); + public static Vector4 In(Vector4 dst, Vector4 src, Vector4 blend) + { + blend.W = dst.W * src.W; + + return blend; } - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 DestOver(Vector4 backdrop, Vector4 source, Vector4 xform) - { - // calculate weights - float xw = backdrop.W * source.W; - float bw = backdrop.W - xw; - float sw = source.W - xw; - - // calculate final alpha - float fw = (sw * 1) + (bw * 1) + (xw * 1); - - // calculate final value - xform = ((backdrop * xw) + (backdrop * bw) + (source * sw)) / MathF.Max(fw, Constants.Epsilon); - xform.W = fw; - - return Vector4.Lerp(backdrop, xform, source.W); + public static Vector4 Out(Vector4 dst, Vector4 src) + { + // calculate final alpha + src.W = (1 - dst.W) * src.W; + + return src; } - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Vector4 DestIn(Vector4 backdrop, Vector4 source, Vector4 xform) - { - // calculate weights - float xw = backdrop.W * source.W; - float bw = backdrop.W - xw; - float sw = source.W - xw; - - // calculate final alpha - float fw = (sw * 0) + (bw * 0) + (xw * 1); - - // calculate final value - xform = ((backdrop * xw) + (Vector4.Zero * bw) + (Vector4.Zero * sw)) / MathF.Max(fw, Constants.Epsilon); - xform.W = fw; - - return Vector4.Lerp(backdrop, xform, source.W); + public static Vector4 Xor(Vector4 dst, Vector4 src) + { + float srcW = 1 - dst.W; + float dstW = 1 - src.W; + + float alpha = src.W * srcW + dst.W * dstW; + Vector4 color = src.W * src * srcW + dst.W * dst * dstW; + + // unpremultiply + color /= MathF.Max(alpha, Constants.Epsilon); + color.W = alpha; + + return color; } - /// - /// General composition function for all modes, with a general solution for alpha channel - /// - /// Original Backdrop color - /// Original source color - /// Desired transformed color, without taking Alpha channel in account - /// The final color - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private static Vector4 Clear(Vector4 backdrop, Vector4 source, Vector4 xform) + private static Vector4 Clear(Vector4 backdrop, Vector4 source) { - return Vector4.Lerp(backdrop, Vector4.Zero, xform.W); + return Vector4.Lerp(backdrop, Vector4.Zero, source.W); } #endregion diff --git a/tests/ImageSharp.Tests/Drawing/SolidFillBlendedShapesTests.cs b/tests/ImageSharp.Tests/Drawing/SolidFillBlendedShapesTests.cs index 7d73d1b65..f43428d49 100644 --- a/tests/ImageSharp.Tests/Drawing/SolidFillBlendedShapesTests.cs +++ b/tests/ImageSharp.Tests/Drawing/SolidFillBlendedShapesTests.cs @@ -116,21 +116,26 @@ namespace SixLabors.ImageSharp.Tests.Drawing public void _1DarkBlueRect_2BlendBlackEllipse(TestImageProvider provider, PixelBlenderMode mode) where TPixel : struct, IPixel { - using (Image img = provider.GetImage()) + using(Image dstImg = provider.GetImage(), srcImg = provider.GetImage()) { - int scaleX = (img.Width / 100); - int scaleY = (img.Height / 100); - img.Mutate( + int scaleX = (dstImg.Width / 100); + int scaleY = (dstImg.Height / 100); + + dstImg.Mutate( x => x.Fill( NamedColors.DarkBlue, - new Rectangle(0 * scaleX, 40 * scaleY, 100 * scaleX, 20 * scaleY))); - img.Mutate( + new Rectangle(0 * scaleX, 40 * scaleY, 100 * scaleX, 20 * scaleY))); + + srcImg.Mutate( x => x.Fill( - new GraphicsOptions(true) { BlenderMode = mode }, NamedColors.Black, - new Shapes.EllipsePolygon(40 * scaleX, 50 * scaleY, 50 * scaleX, 50 * scaleY))); + new Shapes.EllipsePolygon(40 * scaleX, 50 * scaleY, 50 * scaleX, 50 * scaleY))); + + dstImg.Mutate( + x => x.DrawImage(new GraphicsOptions(true) { BlenderMode = mode }, srcImg) + ); - VerifyImage(provider, mode, img); + VerifyImage(provider, mode, dstImg); } }