From 17a283f034091724276ca0f0169ebcddf7fa90c9 Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Tue, 22 Nov 2016 23:58:07 +1100 Subject: [PATCH] Fix hardlight and overlay --- src/ImageSharp/Colors/Color.cs | 2 +- src/ImageSharp/Colors/ColorTransforms.cs | 36 ++++++++++++++---------- 2 files changed, 22 insertions(+), 16 deletions(-) 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))); + } } }