/// <summary> /// Applies the gamma-correction to the given color. /// </summary> /// <param name="color">The color to correct.</param> public void ApplyTo(CorsairColor color) { if (Math.Abs(R - 1f) > float.Epsilon) { color.R = ColorHelper.GetIntColorFromFloat((float)Math.Pow(color.GetFloatR(), 1.0 / R)); } if (Math.Abs(G - 1f) > float.Epsilon) { color.G = ColorHelper.GetIntColorFromFloat((float)Math.Pow(color.GetFloatG(), 1.0 / G)); } if (Math.Abs(B - 1f) > float.Epsilon) { color.B = ColorHelper.GetIntColorFromFloat((float)Math.Pow(color.GetFloatB(), 1.0 / B)); } }
/// <summary> /// Blends two colors. /// </summary> /// <param name="bg">The background-color.</param> /// <param name="fg">The foreground-color</param> /// <returns>The resulting color.</returns> public static CorsairColor Blend(this CorsairColor bg, CorsairColor fg) { // ReSharper disable once ConvertIfStatementToSwitchStatement if (fg.A == 255) { return(fg); } if (fg.A == 0) { return(bg); } float resultA = (1f - (1f - fg.GetFloatA()) * (1f - bg.GetFloatA())); float resultR = (fg.GetFloatR() * fg.GetFloatA() / resultA + bg.GetFloatR() * bg.GetFloatA() * (1f - fg.GetFloatA()) / resultA); float resultG = (fg.GetFloatG() * fg.GetFloatA() / resultA + bg.GetFloatG() * bg.GetFloatA() * (1f - fg.GetFloatA()) / resultA); float resultB = (fg.GetFloatB() * fg.GetFloatA() / resultA + bg.GetFloatB() * bg.GetFloatA() * (1f - fg.GetFloatA()) / resultA); return(CreateColorFromFloat(resultA, resultR, resultG, resultB)); }