mirror of https://github.com/SixLabors/ImageSharp
1 changed files with 287 additions and 0 deletions
@ -0,0 +1,287 @@ |
|||||
|
// Copyright (c) Six Labors and contributors.
|
||||
|
// Licensed under the Apache License, Version 2.0.
|
||||
|
|
||||
|
using System.Numerics; |
||||
|
|
||||
|
using SixLabors.ImageSharp.PixelFormats; |
||||
|
using Xunit; |
||||
|
|
||||
|
// ReSharper disable InconsistentNaming
|
||||
|
namespace SixLabors.ImageSharp.Tests.PixelFormats |
||||
|
{ |
||||
|
public class La16Tests |
||||
|
{ |
||||
|
public static readonly TheoryData<byte> LuminanceData |
||||
|
= new TheoryData<byte> |
||||
|
{ |
||||
|
0, |
||||
|
1, |
||||
|
2, |
||||
|
3, |
||||
|
5, |
||||
|
13, |
||||
|
31, |
||||
|
71, |
||||
|
73, |
||||
|
79, |
||||
|
83, |
||||
|
109, |
||||
|
127, |
||||
|
128, |
||||
|
131, |
||||
|
199, |
||||
|
250, |
||||
|
251, |
||||
|
254, |
||||
|
255 |
||||
|
}; |
||||
|
|
||||
|
[Theory] |
||||
|
[InlineData(0, 0)] |
||||
|
[InlineData(255, 65535)] |
||||
|
[InlineData(10, 2570)] |
||||
|
[InlineData(42, 10794)] |
||||
|
public void La16_PackedValue_EqualsPackedInput(byte input, ushort packed) |
||||
|
=> Assert.Equal(packed, new La16(input, input).PackedValue); |
||||
|
|
||||
|
[Fact] |
||||
|
public void AreEqual() |
||||
|
{ |
||||
|
var color1 = new La16(100, 50); |
||||
|
var color2 = new La16(100, 50); |
||||
|
|
||||
|
Assert.Equal(color1, color2); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public void AreNotEqual() |
||||
|
{ |
||||
|
var color1 = new La16(100, 50); |
||||
|
var color2 = new La16(200, 50); |
||||
|
|
||||
|
Assert.NotEqual(color1, color2); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public void La16_FromScaledVector4() |
||||
|
{ |
||||
|
// Arrange
|
||||
|
La16 gray = default; |
||||
|
const ushort expected = 32896; |
||||
|
Vector4 scaled = new La16(128, 128).ToScaledVector4(); |
||||
|
|
||||
|
// Act
|
||||
|
gray.FromScaledVector4(scaled); |
||||
|
ushort actual = gray.PackedValue; |
||||
|
|
||||
|
// Assert
|
||||
|
Assert.Equal(expected, actual); |
||||
|
} |
||||
|
|
||||
|
[Theory] |
||||
|
[MemberData(nameof(LuminanceData))] |
||||
|
public void La16_ToScaledVector4(byte input) |
||||
|
{ |
||||
|
// Arrange
|
||||
|
var gray = new La16(input, input); |
||||
|
|
||||
|
// Act
|
||||
|
Vector4 actual = gray.ToScaledVector4(); |
||||
|
|
||||
|
// Assert
|
||||
|
float scaledInput = input / 255F; |
||||
|
Assert.Equal(scaledInput, actual.X); |
||||
|
Assert.Equal(scaledInput, actual.Y); |
||||
|
Assert.Equal(scaledInput, actual.Z); |
||||
|
Assert.Equal(scaledInput, actual.W); |
||||
|
} |
||||
|
|
||||
|
[Theory] |
||||
|
[MemberData(nameof(LuminanceData))] |
||||
|
public void La16_FromVector4(byte luminance) |
||||
|
{ |
||||
|
// Arrange
|
||||
|
La16 gray = default; |
||||
|
var vector = new La16(luminance, luminance).ToVector4(); |
||||
|
|
||||
|
// Act
|
||||
|
gray.FromVector4(vector); |
||||
|
byte actualL = gray.L; |
||||
|
byte actualA = gray.A; |
||||
|
|
||||
|
// Assert
|
||||
|
Assert.Equal(luminance, actualL); |
||||
|
Assert.Equal(luminance, actualA); |
||||
|
} |
||||
|
|
||||
|
[Theory] |
||||
|
[MemberData(nameof(LuminanceData))] |
||||
|
public void La16_ToVector4(byte input) |
||||
|
{ |
||||
|
// Arrange
|
||||
|
var gray = new La16(input, input); |
||||
|
|
||||
|
// Act
|
||||
|
var actual = gray.ToVector4(); |
||||
|
|
||||
|
// Assert
|
||||
|
float scaledInput = input / 255F; |
||||
|
Assert.Equal(scaledInput, actual.X); |
||||
|
Assert.Equal(scaledInput, actual.Y); |
||||
|
Assert.Equal(scaledInput, actual.Z); |
||||
|
Assert.Equal(scaledInput, actual.W); |
||||
|
} |
||||
|
|
||||
|
[Theory] |
||||
|
[MemberData(nameof(LuminanceData))] |
||||
|
public void La16_FromRgba32(byte rgb) |
||||
|
{ |
||||
|
// Arrange
|
||||
|
La16 gray = default; |
||||
|
byte expected = ImageMaths.Get8BitBT709Luminance(rgb, rgb, rgb); |
||||
|
|
||||
|
// Act
|
||||
|
gray.FromRgba32(new Rgba32(rgb, rgb, rgb)); |
||||
|
byte actual = gray.L; |
||||
|
|
||||
|
// Assert
|
||||
|
Assert.Equal(expected, actual); |
||||
|
Assert.Equal(255, gray.A); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
[Theory] |
||||
|
[MemberData(nameof(LuminanceData))] |
||||
|
public void La16_ToRgba32(byte luminance) |
||||
|
{ |
||||
|
// Arrange
|
||||
|
var gray = new La16(luminance, luminance); |
||||
|
|
||||
|
// Act
|
||||
|
Rgba32 actual = default; |
||||
|
gray.ToRgba32(ref actual); |
||||
|
|
||||
|
// Assert
|
||||
|
Assert.Equal(luminance, actual.R); |
||||
|
Assert.Equal(luminance, actual.G); |
||||
|
Assert.Equal(luminance, actual.B); |
||||
|
Assert.Equal(luminance, actual.A); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public void La16_FromBgra5551() |
||||
|
{ |
||||
|
// arrange
|
||||
|
var grey = default(La16); |
||||
|
byte expected = byte.MaxValue; |
||||
|
|
||||
|
// act
|
||||
|
grey.FromBgra5551(new Bgra5551(1.0f, 1.0f, 1.0f, 1.0f)); |
||||
|
|
||||
|
// assert
|
||||
|
Assert.Equal(expected, grey.L); |
||||
|
Assert.Equal(expected, grey.A); |
||||
|
} |
||||
|
|
||||
|
public class Rgba32Compatibility |
||||
|
{ |
||||
|
// ReSharper disable once MemberHidesStaticFromOuterClass
|
||||
|
public static readonly TheoryData<byte> LuminanceData = La16Tests.LuminanceData; |
||||
|
|
||||
|
[Theory] |
||||
|
[MemberData(nameof(LuminanceData))] |
||||
|
public void La16_FromRgba32_IsInverseOf_ToRgba32(byte luminance) |
||||
|
{ |
||||
|
var original = new La16(luminance, luminance); |
||||
|
|
||||
|
Rgba32 rgba = default; |
||||
|
original.ToRgba32(ref rgba); |
||||
|
|
||||
|
La16 mirror = default; |
||||
|
mirror.FromRgba32(rgba); |
||||
|
|
||||
|
Assert.Equal(original, mirror); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
[Theory] |
||||
|
[MemberData(nameof(LuminanceData))] |
||||
|
public void Rgba32_ToLa16_IsInverseOf_La16_ToRgba32(byte luminance) |
||||
|
{ |
||||
|
var original = new La16(luminance, luminance); |
||||
|
|
||||
|
Rgba32 rgba = default; |
||||
|
original.ToRgba32(ref rgba); |
||||
|
|
||||
|
La16 mirror = default; |
||||
|
mirror.FromRgba32(rgba); |
||||
|
|
||||
|
Assert.Equal(original, mirror); |
||||
|
} |
||||
|
|
||||
|
[Theory] |
||||
|
[MemberData(nameof(LuminanceData))] |
||||
|
public void ToVector4_IsRgba32Compatible(byte luminance) |
||||
|
{ |
||||
|
var original = new La16(luminance, luminance); |
||||
|
|
||||
|
Rgba32 rgba = default; |
||||
|
original.ToRgba32(ref rgba); |
||||
|
|
||||
|
var La16Vector = original.ToVector4(); |
||||
|
var rgbaVector = original.ToVector4(); |
||||
|
|
||||
|
Assert.Equal(La16Vector, rgbaVector, new ApproximateFloatComparer(1e-5f)); |
||||
|
} |
||||
|
|
||||
|
[Theory] |
||||
|
[MemberData(nameof(LuminanceData))] |
||||
|
public void FromVector4_IsRgba32Compatible(byte luminance) |
||||
|
{ |
||||
|
var original = new La16(luminance, luminance); |
||||
|
|
||||
|
Rgba32 rgba = default; |
||||
|
original.ToRgba32(ref rgba); |
||||
|
|
||||
|
var rgbaVector = original.ToVector4(); |
||||
|
|
||||
|
La16 mirror = default; |
||||
|
mirror.FromVector4(rgbaVector); |
||||
|
|
||||
|
Assert.Equal(original, mirror); |
||||
|
} |
||||
|
|
||||
|
[Theory] |
||||
|
[MemberData(nameof(LuminanceData))] |
||||
|
public void ToScaledVector4_IsRgba32Compatible(byte luminance) |
||||
|
{ |
||||
|
var original = new La16(luminance, luminance); |
||||
|
|
||||
|
Rgba32 rgba = default; |
||||
|
original.ToRgba32(ref rgba); |
||||
|
|
||||
|
Vector4 La16Vector = original.ToScaledVector4(); |
||||
|
Vector4 rgbaVector = original.ToScaledVector4(); |
||||
|
|
||||
|
Assert.Equal(La16Vector, rgbaVector, new ApproximateFloatComparer(1e-5f)); |
||||
|
} |
||||
|
|
||||
|
[Theory] |
||||
|
[MemberData(nameof(LuminanceData))] |
||||
|
public void FromScaledVector4_IsRgba32Compatible(byte luminance) |
||||
|
{ |
||||
|
var original = new La16(luminance, luminance); |
||||
|
|
||||
|
Rgba32 rgba = default; |
||||
|
original.ToRgba32(ref rgba); |
||||
|
|
||||
|
Vector4 rgbaVector = original.ToScaledVector4(); |
||||
|
|
||||
|
La16 mirror = default; |
||||
|
mirror.FromScaledVector4(rgbaVector); |
||||
|
|
||||
|
Assert.Equal(original, mirror); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue