diff --git a/src/ImageSharp/PixelFormats/PixelBlenders/PorterDuffFunctions.cs b/src/ImageSharp/PixelFormats/PixelBlenders/PorterDuffFunctions.cs index 8b6fbcfb90..c84cd9a7b1 100644 --- a/src/ImageSharp/PixelFormats/PixelBlenders/PorterDuffFunctions.cs +++ b/src/ImageSharp/PixelFormats/PixelBlenders/PorterDuffFunctions.cs @@ -214,17 +214,24 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders public static Vector4 In(Vector4 dst, Vector4 src, Vector4 blend) { - blend.W = dst.W * src.W; + float alpha = dst.W * src.W; - return blend; + Vector4 color = src * alpha; // premultiply + color /= MathF.Max(alpha, Constants.Epsilon); // unpremultiply + color.W = alpha; + + return color; } public static Vector4 Out(Vector4 dst, Vector4 src) { - // calculate final alpha - src.W = (1 - dst.W) * src.W; + float alpha = (1 - dst.W) * src.W; - return src; + Vector4 color = src * alpha; // premultiply + color /= MathF.Max(alpha, Constants.Epsilon); // unpremultiply + color.W = alpha; + + return color; } public static Vector4 Xor(Vector4 dst, Vector4 src)