Browse Source

Nits - Colorspaces (#880)

* Add missing periods

* Only perform matrix inversion once in CieXyzToLinearRgbConverter

* Eliminate unnessary ToVector3 call

* Seal GammaWorkingSpace

* Address stylecop violation

* Add periods

* Fix colorspace companding
af/merge-core
Jason Nelson 7 years ago
committed by James Jackson-South
parent
commit
c16e443f04
  1. 2
      src/ImageSharp/ColorSpaces/CieXyChromaticityCoordinates.cs
  2. 2
      src/ImageSharp/ColorSpaces/Companding/GammaCompanding.cs
  3. 6
      src/ImageSharp/ColorSpaces/Companding/LCompanding.cs
  4. 13
      src/ImageSharp/ColorSpaces/Companding/Rec2020Companding.cs
  5. 6
      src/ImageSharp/ColorSpaces/Companding/Rec709Companding.cs
  6. 2
      src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverter.CieLch.cs
  7. 2
      src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/CieXyzAndCieXyyConverter.cs
  8. 14
      src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/CieXyzToLinearRgbConverter.cs
  9. 4
      src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/CmykAndRgbConverter.cs
  10. 15
      src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/LinearRgbToRgbConverter.cs
  11. 15
      src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/RgbToLinearRgbConverter.cs
  12. 4
      src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/YCbCrAndRgbConverter.cs
  13. 2
      src/ImageSharp/ColorSpaces/Conversion/Implementation/WorkingSpaces/GammaWorkingSpace.cs
  14. 15
      tests/ImageSharp.Tests/Colorspaces/Companding/CompandingTests.cs

2
src/ImageSharp/ColorSpaces/CieXyChromaticityCoordinates.cs

@ -8,7 +8,7 @@ using System.Runtime.CompilerServices;
namespace SixLabors.ImageSharp.ColorSpaces namespace SixLabors.ImageSharp.ColorSpaces
{ {
/// <summary> /// <summary>
/// Represents the coordinates of CIEXY chromaticity space /// Represents the coordinates of CIEXY chromaticity space.
/// </summary> /// </summary>
public readonly struct CieXyChromaticityCoordinates : IEquatable<CieXyChromaticityCoordinates> public readonly struct CieXyChromaticityCoordinates : IEquatable<CieXyChromaticityCoordinates>
{ {

2
src/ImageSharp/ColorSpaces/Companding/GammaCompanding.cs

@ -7,7 +7,7 @@ using System.Runtime.CompilerServices;
namespace SixLabors.ImageSharp.ColorSpaces.Companding namespace SixLabors.ImageSharp.ColorSpaces.Companding
{ {
/// <summary> /// <summary>
/// Implements gamma companding /// Implements gamma companding.
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// <see href="http://www.brucelindbloom.com/index.html?Eqn_RGB_to_XYZ.html"/> /// <see href="http://www.brucelindbloom.com/index.html?Eqn_RGB_to_XYZ.html"/>

6
src/ImageSharp/ColorSpaces/Companding/LCompanding.cs

@ -8,7 +8,7 @@ using SixLabors.ImageSharp.ColorSpaces.Conversion;
namespace SixLabors.ImageSharp.ColorSpaces.Companding namespace SixLabors.ImageSharp.ColorSpaces.Companding
{ {
/// <summary> /// <summary>
/// Implements L* companding /// Implements L* companding.
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// For more info see: /// For more info see:
@ -24,7 +24,7 @@ namespace SixLabors.ImageSharp.ColorSpaces.Companding
/// <returns>The <see cref="float"/> representing the linear channel value.</returns> /// <returns>The <see cref="float"/> representing the linear channel value.</returns>
[MethodImpl(InliningOptions.ShortMethod)] [MethodImpl(InliningOptions.ShortMethod)]
public static float Expand(float channel) public static float Expand(float channel)
=> channel <= 0.08 ? 100 * channel / CieConstants.Kappa : ImageMaths.Pow3((channel + 0.16F) / 1.16F); => channel <= 0.08F ? (100F * channel) / CieConstants.Kappa : ImageMaths.Pow3((channel + 0.16F) / 1.16F);
/// <summary> /// <summary>
/// Compresses an uncompanded channel (linear) to its nonlinear equivalent. /// Compresses an uncompanded channel (linear) to its nonlinear equivalent.
@ -33,6 +33,6 @@ namespace SixLabors.ImageSharp.ColorSpaces.Companding
/// <returns>The <see cref="float"/> representing the nonlinear channel value.</returns> /// <returns>The <see cref="float"/> representing the nonlinear channel value.</returns>
[MethodImpl(InliningOptions.ShortMethod)] [MethodImpl(InliningOptions.ShortMethod)]
public static float Compress(float channel) public static float Compress(float channel)
=> channel <= CieConstants.Epsilon ? channel * CieConstants.Kappa / 100F : MathF.Pow(1.16F * channel, 0.3333333F) - 0.16F; => channel <= CieConstants.Epsilon ? (channel * CieConstants.Kappa) / 100F : (1.16F * MathF.Pow(channel, 0.3333333F)) - 0.16F;
} }
} }

13
src/ImageSharp/ColorSpaces/Companding/Rec2020Companding.cs

@ -7,14 +7,19 @@ using System.Runtime.CompilerServices;
namespace SixLabors.ImageSharp.ColorSpaces.Companding namespace SixLabors.ImageSharp.ColorSpaces.Companding
{ {
/// <summary> /// <summary>
/// Implements Rec. 2020 companding function (for 12-bits). /// Implements Rec. 2020 companding function.
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// <see href="http://en.wikipedia.org/wiki/Rec._2020"/> /// <see href="http://en.wikipedia.org/wiki/Rec._2020"/>
/// For 10-bits, companding is identical to <see cref="Rec709Companding"/>
/// </remarks> /// </remarks>
public static class Rec2020Companding public static class Rec2020Companding
{ {
private const float Alpha = 1.09929682680944F;
private const float AlphaMinusOne = Alpha - 1F;
private const float Beta = 0.018053968510807F;
private const float InverseBeta = Beta * 4.5F;
private const float Epsilon = 1 / 0.45F;
/// <summary> /// <summary>
/// Expands a companded channel to its linear equivalent with respect to the energy. /// Expands a companded channel to its linear equivalent with respect to the energy.
/// </summary> /// </summary>
@ -22,7 +27,7 @@ namespace SixLabors.ImageSharp.ColorSpaces.Companding
/// <returns>The <see cref="float"/> representing the linear channel value.</returns> /// <returns>The <see cref="float"/> representing the linear channel value.</returns>
[MethodImpl(InliningOptions.ShortMethod)] [MethodImpl(InliningOptions.ShortMethod)]
public static float Expand(float channel) public static float Expand(float channel)
=> channel < 0.08145F ? channel / 4.5F : MathF.Pow((channel + 0.0993F) / 1.0993F, 2.222222F); => channel < InverseBeta ? channel / 4.5F : MathF.Pow((channel + AlphaMinusOne) / Alpha, Epsilon);
/// <summary> /// <summary>
/// Compresses an uncompanded channel (linear) to its nonlinear equivalent. /// Compresses an uncompanded channel (linear) to its nonlinear equivalent.
@ -31,6 +36,6 @@ namespace SixLabors.ImageSharp.ColorSpaces.Companding
/// <returns>The <see cref="float"/> representing the nonlinear channel value.</returns> /// <returns>The <see cref="float"/> representing the nonlinear channel value.</returns>
[MethodImpl(InliningOptions.ShortMethod)] [MethodImpl(InliningOptions.ShortMethod)]
public static float Compress(float channel) public static float Compress(float channel)
=> channel < 0.0181F ? 4500F * channel : (1.0993F * channel) - 0.0993F; => channel < Beta ? 4.5F * channel : (Alpha * MathF.Pow(channel, 0.45F)) - AlphaMinusOne;
} }
} }

6
src/ImageSharp/ColorSpaces/Companding/Rec709Companding.cs

@ -14,6 +14,8 @@ namespace SixLabors.ImageSharp.ColorSpaces.Companding
/// </remarks> /// </remarks>
public static class Rec709Companding public static class Rec709Companding
{ {
private const float Epsilon = 1 / 0.45F;
/// <summary> /// <summary>
/// Expands a companded channel to its linear equivalent with respect to the energy. /// Expands a companded channel to its linear equivalent with respect to the energy.
/// </summary> /// </summary>
@ -21,7 +23,7 @@ namespace SixLabors.ImageSharp.ColorSpaces.Companding
/// <returns>The <see cref="float"/> representing the linear channel value.</returns> /// <returns>The <see cref="float"/> representing the linear channel value.</returns>
[MethodImpl(InliningOptions.ShortMethod)] [MethodImpl(InliningOptions.ShortMethod)]
public static float Expand(float channel) public static float Expand(float channel)
=> channel < 0.081F ? channel / 4.5F : MathF.Pow((channel + 0.099F) / 1.099F, 2.222222F); => channel < 0.081F ? channel / 4.5F : MathF.Pow((channel + 0.099F) / 1.099F, Epsilon);
/// <summary> /// <summary>
/// Compresses an uncompanded channel (linear) to its nonlinear equivalent. /// Compresses an uncompanded channel (linear) to its nonlinear equivalent.
@ -30,6 +32,6 @@ namespace SixLabors.ImageSharp.ColorSpaces.Companding
/// <returns>The <see cref="float"/> representing the nonlinear channel value.</returns> /// <returns>The <see cref="float"/> representing the nonlinear channel value.</returns>
[MethodImpl(InliningOptions.ShortMethod)] [MethodImpl(InliningOptions.ShortMethod)]
public static float Compress(float channel) public static float Compress(float channel)
=> channel < 0.018F ? 4500F * channel : (1.099F * channel) - 0.099F; => channel < 0.018F ? 4.5F * channel : (1.099F * MathF.Pow(channel, 0.45F)) - 0.099F;
} }
} }

2
src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverter.CieLch.cs

@ -26,10 +26,8 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion
/// <returns>The <see cref="CieLch"/></returns> /// <returns>The <see cref="CieLch"/></returns>
public CieLch ToCieLch(in CieLab color) public CieLch ToCieLch(in CieLab color)
{ {
// Adaptation
CieLab adapted = this.Adapt(color); CieLab adapted = this.Adapt(color);
// Conversion
return CieLabToCieLchConverter.Convert(adapted); return CieLabToCieLchConverter.Convert(adapted);
} }

2
src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/CieXyzAndCieXyyConverter.cs

@ -7,7 +7,7 @@ using System.Runtime.CompilerServices;
namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation
{ {
/// <summary> /// <summary>
/// Color converter between CIE XYZ and CIE xyY /// Color converter between CIE XYZ and CIE xyY.
/// <see href="http://www.brucelindbloom.com/"/> for formulas. /// <see href="http://www.brucelindbloom.com/"/> for formulas.
/// </summary> /// </summary>
internal sealed class CieXyzAndCieXyyConverter internal sealed class CieXyzAndCieXyyConverter

14
src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/CieXyzToLinearRgbConverter.cs

@ -28,11 +28,15 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation
public CieXyzToLinearRgbConverter(RgbWorkingSpaceBase workingSpace) public CieXyzToLinearRgbConverter(RgbWorkingSpaceBase workingSpace)
{ {
this.TargetWorkingSpace = workingSpace; this.TargetWorkingSpace = workingSpace;
this.conversionMatrix = GetRgbToCieXyzMatrix(workingSpace);
// Gets the inverted Rgb -> Xyz matrix
Matrix4x4.Invert(GetRgbToCieXyzMatrix(workingSpace), out Matrix4x4 inverted);
this.conversionMatrix = inverted;
} }
/// <summary> /// <summary>
/// Gets the target working space /// Gets the target working space.
/// </summary> /// </summary>
public RgbWorkingSpaceBase TargetWorkingSpace { get; } public RgbWorkingSpaceBase TargetWorkingSpace { get; }
@ -40,12 +44,12 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation
/// Performs the conversion from the <see cref="CieXyz"/> input to an instance of <see cref="LinearRgb"/> type. /// Performs the conversion from the <see cref="CieXyz"/> input to an instance of <see cref="LinearRgb"/> type.
/// </summary> /// </summary>
/// <param name="input">The input color instance.</param> /// <param name="input">The input color instance.</param>
/// <returns>The converted result</returns> /// <returns>The converted result.</returns>
[MethodImpl(InliningOptions.ShortMethod)] [MethodImpl(InliningOptions.ShortMethod)]
public LinearRgb Convert(in CieXyz input) public LinearRgb Convert(in CieXyz input)
{ {
Matrix4x4.Invert(this.conversionMatrix, out Matrix4x4 inverted); var vector = Vector3.Transform(input.ToVector3(), this.conversionMatrix);
var vector = Vector3.Transform(input.ToVector3(), inverted);
return new LinearRgb(vector, this.TargetWorkingSpace); return new LinearRgb(vector, this.TargetWorkingSpace);
} }
} }

4
src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/CmykAndRgbConverter.cs

@ -8,7 +8,7 @@ using System.Runtime.CompilerServices;
namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation
{ {
/// <summary> /// <summary>
/// Color converter between <see cref="Cmyk"/> and <see cref="Rgb"/> /// Color converter between <see cref="Cmyk"/> and <see cref="Rgb"/>.
/// </summary> /// </summary>
internal sealed class CmykAndRgbConverter internal sealed class CmykAndRgbConverter
{ {
@ -28,7 +28,7 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation
/// Performs the conversion from the <see cref="Rgb"/> input to an instance of <see cref="Cmyk"/> type. /// Performs the conversion from the <see cref="Rgb"/> input to an instance of <see cref="Cmyk"/> type.
/// </summary> /// </summary>
/// <param name="input">The input color instance.</param> /// <param name="input">The input color instance.</param>
/// <returns>The converted result</returns> /// <returns>The converted result.</returns>
[MethodImpl(InliningOptions.ShortMethod)] [MethodImpl(InliningOptions.ShortMethod)]
public Cmyk Convert(in Rgb input) public Cmyk Convert(in Rgb input)
{ {

15
src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/LinearRgbToRgbConverter.cs

@ -6,7 +6,7 @@ using System.Runtime.CompilerServices;
namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation
{ {
/// <summary> /// <summary>
/// Color converter between <see cref="LinearRgb"/> and <see cref="Rgb"/> /// Color converter between <see cref="LinearRgb"/> and <see cref="Rgb"/>.
/// </summary> /// </summary>
internal sealed class LinearRgbToRgbConverter internal sealed class LinearRgbToRgbConverter
{ {
@ -14,16 +14,15 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation
/// Performs the conversion from the <see cref="LinearRgb"/> input to an instance of <see cref="Rgb"/> type. /// Performs the conversion from the <see cref="LinearRgb"/> input to an instance of <see cref="Rgb"/> type.
/// </summary> /// </summary>
/// <param name="input">The input color instance.</param> /// <param name="input">The input color instance.</param>
/// <returns>The converted result</returns> /// <returns>The converted result.</returns>
[MethodImpl(InliningOptions.ShortMethod)] [MethodImpl(InliningOptions.ShortMethod)]
public Rgb Convert(in LinearRgb input) public Rgb Convert(in LinearRgb input)
{ {
var vector = input.ToVector3(); return new Rgb(
vector.X = input.WorkingSpace.Compress(vector.X); r: input.WorkingSpace.Compress(input.R),
vector.Y = input.WorkingSpace.Compress(vector.Y); g: input.WorkingSpace.Compress(input.G),
vector.Z = input.WorkingSpace.Compress(vector.Z); b: input.WorkingSpace.Compress(input.B),
workingSpace: input.WorkingSpace);
return new Rgb(vector, input.WorkingSpace);
} }
} }
} }

15
src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/RgbToLinearRgbConverter.cs

@ -6,7 +6,7 @@ using System.Runtime.CompilerServices;
namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation
{ {
/// <summary> /// <summary>
/// Color converter between Rgb and LinearRgb /// Color converter between Rgb and LinearRgb.
/// </summary> /// </summary>
internal class RgbToLinearRgbConverter internal class RgbToLinearRgbConverter
{ {
@ -14,16 +14,15 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation
/// Performs the conversion from the <see cref="Rgb"/> input to an instance of <see cref="LinearRgb"/> type. /// Performs the conversion from the <see cref="Rgb"/> input to an instance of <see cref="LinearRgb"/> type.
/// </summary> /// </summary>
/// <param name="input">The input color instance.</param> /// <param name="input">The input color instance.</param>
/// <returns>The converted result</returns> /// <returns>The converted result.</returns>
[MethodImpl(InliningOptions.ShortMethod)] [MethodImpl(InliningOptions.ShortMethod)]
public LinearRgb Convert(in Rgb input) public LinearRgb Convert(in Rgb input)
{ {
var vector = input.ToVector3(); return new LinearRgb(
vector.X = input.WorkingSpace.Expand(vector.X); r: input.WorkingSpace.Expand(input.R),
vector.Y = input.WorkingSpace.Expand(vector.Y); g: input.WorkingSpace.Expand(input.G),
vector.Z = input.WorkingSpace.Expand(vector.Z); b: input.WorkingSpace.Expand(input.B),
workingSpace: input.WorkingSpace);
return new LinearRgb(vector, input.WorkingSpace);
} }
} }
} }

4
src/ImageSharp/ColorSpaces/Conversion/Implementation/Converters/YCbCrAndRgbConverter.cs

@ -19,7 +19,7 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation
/// Performs the conversion from the <see cref="YCbCr"/> input to an instance of <see cref="Rgb"/> type. /// Performs the conversion from the <see cref="YCbCr"/> input to an instance of <see cref="Rgb"/> type.
/// </summary> /// </summary>
/// <param name="input">The input color instance.</param> /// <param name="input">The input color instance.</param>
/// <returns>The converted result</returns> /// <returns>The converted result.</returns>
[MethodImpl(InliningOptions.ShortMethod)] [MethodImpl(InliningOptions.ShortMethod)]
public Rgb Convert(in YCbCr input) public Rgb Convert(in YCbCr input)
{ {
@ -38,7 +38,7 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation
/// Performs the conversion from the <see cref="Rgb"/> input to an instance of <see cref="YCbCr"/> type. /// Performs the conversion from the <see cref="Rgb"/> input to an instance of <see cref="YCbCr"/> type.
/// </summary> /// </summary>
/// <param name="input">The input color instance.</param> /// <param name="input">The input color instance.</param>
/// <returns>The converted result</returns> /// <returns>The converted result.</returns>
[MethodImpl(InliningOptions.ShortMethod)] [MethodImpl(InliningOptions.ShortMethod)]
public YCbCr Convert(in Rgb input) public YCbCr Convert(in Rgb input)
{ {

2
src/ImageSharp/ColorSpaces/Conversion/Implementation/WorkingSpaces/GammaWorkingSpace.cs

@ -10,7 +10,7 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation
/// <summary> /// <summary>
/// The gamma working space. /// The gamma working space.
/// </summary> /// </summary>
public class GammaWorkingSpace : RgbWorkingSpaceBase public sealed class GammaWorkingSpace : RgbWorkingSpaceBase
{ {
/// <summary> /// <summary>
/// Initializes a new instance of the <see cref="GammaWorkingSpace" /> class. /// Initializes a new instance of the <see cref="GammaWorkingSpace" /> class.

15
tests/ImageSharp.Tests/Colorspaces/Companding/CompandingTests.cs

@ -2,7 +2,6 @@
// Licensed under the Apache License, Version 2.0. // Licensed under the Apache License, Version 2.0.
using System; using System;
using System.Linq;
using System.Numerics; using System.Numerics;
using SixLabors.ImageSharp.ColorSpaces.Companding; using SixLabors.ImageSharp.ColorSpaces.Companding;
using Xunit; using Xunit;
@ -10,9 +9,7 @@ using Xunit;
namespace SixLabors.ImageSharp.Tests.Colorspaces.Companding namespace SixLabors.ImageSharp.Tests.Colorspaces.Companding
{ {
/// <summary> /// <summary>
/// Tests various companding algorithms. Numbers are hand calculated from formulas online. /// Tests various companding algorithms. Expanded numbers are hand calculated from formulas online.
/// TODO: Oddly the formula for converting to/from Rec 2020 and 709 from Wikipedia seems to cause the value to
/// fail a round trip. They're large spaces so this is a surprise. More reading required!!
/// </summary> /// </summary>
public class CompandingTests public class CompandingTests
{ {
@ -24,7 +21,7 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces.Companding
const float input = .667F; const float input = .667F;
float e = Rec2020Companding.Expand(input); float e = Rec2020Companding.Expand(input);
float c = Rec2020Companding.Compress(e); float c = Rec2020Companding.Compress(e);
CompandingIsCorrectImpl(e, c, .4484759F, .3937096F); CompandingIsCorrectImpl(e, c, .4484759F, input);
} }
[Fact] [Fact]
@ -33,7 +30,7 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces.Companding
const float input = .667F; const float input = .667F;
float e = Rec709Companding.Expand(input); float e = Rec709Companding.Expand(input);
float c = Rec709Companding.Compress(e); float c = Rec709Companding.Compress(e);
CompandingIsCorrectImpl(e, c, .4483577F, .3937451F); CompandingIsCorrectImpl(e, c, .4483577F, input);
} }
[Fact] [Fact]
@ -42,7 +39,7 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces.Companding
const float input = .667F; const float input = .667F;
float e = SRgbCompanding.Expand(input); float e = SRgbCompanding.Expand(input);
float c = SRgbCompanding.Compress(e); float c = SRgbCompanding.Compress(e);
CompandingIsCorrectImpl(e, c, .40242353F, .667F); CompandingIsCorrectImpl(e, c, .40242353F, input);
} }
[Theory] [Theory]
@ -98,7 +95,7 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces.Companding
const float input = .667F; const float input = .667F;
float e = GammaCompanding.Expand(input, gamma); float e = GammaCompanding.Expand(input, gamma);
float c = GammaCompanding.Compress(e, gamma); float c = GammaCompanding.Compress(e, gamma);
CompandingIsCorrectImpl(e, c, .41027668F, .667F); CompandingIsCorrectImpl(e, c, .41027668F, input);
} }
[Fact] [Fact]
@ -107,7 +104,7 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces.Companding
const float input = .667F; const float input = .667F;
float e = LCompanding.Expand(input); float e = LCompanding.Expand(input);
float c = LCompanding.Compress(e); float c = LCompanding.Compress(e);
CompandingIsCorrectImpl(e, c, .36236193F, .58908917F); CompandingIsCorrectImpl(e, c, .36236193F, input);
} }
private static void CompandingIsCorrectImpl(float e, float c, float expanded, float compressed) private static void CompandingIsCorrectImpl(float e, float c, float expanded, float compressed)

Loading…
Cancel
Save