diff --git a/src/ImageSharp/Colors/Color.cs b/src/ImageSharp/Colors/Color.cs
index 090a35d9e..1435377a5 100644
--- a/src/ImageSharp/Colors/Color.cs
+++ b/src/ImageSharp/Colors/Color.cs
@@ -32,7 +32,7 @@ namespace ImageSharp
///
/// The half vector value.
///
- private static readonly Vector4 Half = new Vector4(0.5f);
+ private static readonly Vector4 Half = new Vector4(0.5F);
///
/// The packed value.
diff --git a/src/ImageSharp/Colors/ColorTransforms.cs b/src/ImageSharp/Colors/ColorTransforms.cs
index 42a0ebc50..11d0139be 100644
--- a/src/ImageSharp/Colors/ColorTransforms.cs
+++ b/src/ImageSharp/Colors/ColorTransforms.cs
@@ -2,6 +2,7 @@
// Copyright (c) James Jackson-South and contributors.
// Licensed under the Apache License, Version 2.0.
//
+
namespace ImageSharp
{
using System.Numerics;
@@ -122,21 +123,10 @@ namespace ImageSharp
///
public static Color HardLight(Color backdrop, Color source)
{
- // TODO: Why is this giving me nonsense?
- // https://www.w3.org/TR/compositing-1/#blendinghardlight
- // if(Cs <= 0.5)
- // B(Cb, Cs) = Multiply(Cb, 2 x Cs)
- // else
- // B(Cb, Cs) = Screen(Cb, 2 x Cs -1)
+ Vector4 vb = backdrop.ToVector4();
Vector4 vs = source.ToVector4();
- Vector4 blend = 2F * vs;
- if (vs.X <= 0.5F && vs.Y <= 0.5F && vs.Z <= 0.5F)
- {
- return Multiply(backdrop, new Color(Pack(ref blend)));
- }
-
- blend = (2F * vs) - Vector4.One;
- return Screen(backdrop, new Color(Pack(ref blend)));
+ Vector4 result = new Vector4(BlendOverlay(vs.X, vb.X), BlendOverlay(vs.Y, vb.Y), BlendOverlay(vs.Z, vb.Z), vb.W);
+ return new Color(Pack(ref result));
}
///
@@ -154,7 +144,10 @@ namespace ImageSharp
///
public static Color Overlay(Color backdrop, Color source)
{
- return HardLight(source, backdrop);
+ Vector4 vb = backdrop.ToVector4();
+ Vector4 vs = source.ToVector4();
+ Vector4 result = new Vector4(BlendOverlay(vb.X, vs.X), BlendOverlay(vb.Y, vs.Y), BlendOverlay(vb.Z, vs.Z), vb.W);
+ return new Color(Pack(ref result));
}
///
@@ -173,5 +166,18 @@ namespace ImageSharp
{
return new Color(Vector4.Lerp(from.ToVector4(), to.ToVector4(), amount));
}
+
+ ///
+ /// Multiplies or screens the color component, depending on the component value.
+ ///
+ /// The backdrop component.
+ /// The source component.
+ ///
+ /// The .
+ ///
+ private static float BlendOverlay(float b, float s)
+ {
+ return b <= .5F ? (2F * b * s) : (1F - (2F * (1F - b) * (1F - s)));
+ }
}
}