Added some optimizations and tests for Colors

This commit is contained in:
DarthAffe committed 2022-07-17 11:52:29 +02:00
1 parent ead342388b
commit 10ec33c938
7 files changed
+377 -9

No files matched your search

@@ -0,0 +1,85 @@
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace RGB.NET.Core.Tests.Sampler;
[TestClass]
public class AverageColorSamplerTest
{
#region Methods
[TestMethod]
public void WhiteTest()
{
Span<Core.Color> data = new Core.Color[16 * 16];
data.Fill(new Core.Color(1f, 1f, 1f, 1f));
Core.Color[] result = new Core.Color[1];
SamplerInfo<Core.Color> info = new(2, 3, data[..6]);
new AverageColorSampler().Sample(info, result);
Assert.AreEqual(new Core.Color(1f, 1f, 1f, 1f), result[0]);
info = new SamplerInfo<Core.Color>(16, 16, data);
new AverageColorSampler().Sample(info, result);
Assert.AreEqual(new Core.Color(1f, 1f, 1f, 1f), result[0]);
}
[TestMethod]
public void BlackTest()
{
Span<Core.Color> data = new Core.Color[16 * 16];
data.Fill(new Core.Color(1f, 0f, 0f, 0f));
Core.Color[] result = new Core.Color[1];
SamplerInfo<Core.Color> info = new(2, 3, data[..6]);
new AverageColorSampler().Sample(info, result);
Assert.AreEqual(new Core.Color(1f, 0f, 0f, 0f), result[0]);
info = new SamplerInfo<Core.Color>(16, 16, data);
new AverageColorSampler().Sample(info, result);
Assert.AreEqual(new Core.Color(1f, 0f, 0f, 0f), result[0]);
}
[TestMethod]
public void GrayTest()
{
Span<Core.Color> data = new Core.Color[16 * 16];
for (int i = 0; i < data.Length; i++)
data[i] = (i % 2) == 0 ? new Core.Color(1f, 0f, 0f, 0f) : new Core.Color(1f, 1f, 1f, 1f);
Core.Color[] result = new Core.Color[1];
SamplerInfo<Core.Color> info = new(2, 3, data[..6]);
new AverageColorSampler().Sample(info, result);
Assert.AreEqual(new Core.Color(1f, 0.5f, 0.5f, 0.5f), result[0]);
info = new SamplerInfo<Core.Color>(16, 16, data);
new AverageColorSampler().Sample(info, result);
Assert.AreEqual(new Core.Color(1f, 0.5f, 0.5f, 0.5f), result[0]);
}
[TestMethod]
public void MixedTest()
{
Core.Color[] data = new Core.Color[16 * 16];
for (int i = 0; i < data.Length; i++)
data[i] = (i % 5) switch
{
0 => new Core.Color(1f, 1f, 0f, 0f),
1 => new Core.Color(1f, 0f, 0.75f, 0f),
2 => new Core.Color(0.5f, 0f, 0f, 0.5f),
3 => new Core.Color(0f, 1f, 1f, 1f),
_ => new Core.Color(0f, 0f, 0f, 0f),
};
Core.Color[] result = new Core.Color[1];
SamplerInfo<Core.Color> info = new(2, 3, data[..6]);
new AverageColorSampler().Sample(info, result);
Assert.AreEqual(new Core.Color(0.5833333f, 0.5f, 0.291666657f, 0.25f), result[0]);
info = new SamplerInfo<Core.Color>(16, 16, data);
new AverageColorSampler().Sample(info, result);
Assert.AreEqual(new Core.Color(0.5019531f, 0.40234375f, 0.3486328f, 0.298828125f), result[0]);
}
#endregion
}
@@ -0,0 +1,20 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.10.0" />
<PackageReference Include="MSTest.TestAdapter" Version="2.2.5" />
<PackageReference Include="MSTest.TestFramework" Version="2.2.5" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\RGB.NET.Core\RGB.NET.Core.csproj" />
<ProjectReference Include="..\..\RGB.NET.Presets\RGB.NET.Presets.csproj" />
</ItemGroup>
</Project>
@@ -0,0 +1,127 @@
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using RGB.NET.Core;
using RGB.NET.Presets.Textures.Sampler;
namespace RGB.NET.Presets.Tests.Sampler;
[TestClass]
public class AverageByteSamplerTest
{
#region Methods
[TestMethod]
public void WhiteTest()
{
Span<Color> colorData = new Color[16 * 16];
colorData.Fill(new Color(1f, 1f, 1f, 1f));
byte[] result = new byte[4];
Span<byte> data = new byte[colorData.Length * 4];
int index = 0;
for (int i = 0; i < colorData.Length; i++)
{
data[index++] = colorData[i].GetA();
data[index++] = colorData[i].GetR();
data[index++] = colorData[i].GetG();
data[index++] = colorData[i].GetB();
}
SamplerInfo<byte> info = new(2, 3, data[..(6 * 4)]);
new AverageByteSampler().Sample(info, result);
Assert.AreEqual(new Color(1f, 1f, 1f, 1f), new Color(result[0], result[1], result[2], result[3]));
info = new SamplerInfo<byte>(16, 16, data);
new AverageByteSampler().Sample(info, result);
Assert.AreEqual(new Color(1f, 1f, 1f, 1f), new Color(result[0], result[1], result[2], result[3]));
}
[TestMethod]
public void BlackTest()
{
Span<Color> colorData = new Color[16 * 16];
colorData.Fill(new Color(1f, 0f, 0f, 0f));
byte[] result = new byte[4];
Span<byte> data = new byte[colorData.Length * 4];
int index = 0;
for (int i = 0; i < colorData.Length; i++)
{
data[index++] = colorData[i].GetA();
data[index++] = colorData[i].GetR();
data[index++] = colorData[i].GetG();
data[index++] = colorData[i].GetB();
}
SamplerInfo<byte> info = new(2, 3, data[..(6 * 4)]);
new AverageByteSampler().Sample(info, result);
Assert.AreEqual(new Color(1f, 0f, 0f, 0f), new Color(result[0], result[1], result[2], result[3]));
info = new SamplerInfo<byte>(16, 16, data);
new AverageByteSampler().Sample(info, result);
Assert.AreEqual(new Color(1f, 0f, 0f, 0f), new Color(result[0], result[1], result[2], result[3]));
}
[TestMethod]
public void GrayTest()
{
Span<Color> colorData = new Color[16 * 16];
for (int i = 0; i < colorData.Length; i++)
colorData[i] = (i % 2) == 0 ? new Color(1f, 0f, 0f, 0f) : new Color(1f, 1f, 1f, 1f);
byte[] result = new byte[4];
Span<byte> data = new byte[colorData.Length * 4];
int index = 0;
for (int i = 0; i < colorData.Length; i++)
{
data[index++] = colorData[i].GetA();
data[index++] = colorData[i].GetR();
data[index++] = colorData[i].GetG();
data[index++] = colorData[i].GetB();
}
SamplerInfo<byte> info = new(2, 3, data[..(6 * 4)]);
new AverageByteSampler().Sample(info, result);
Assert.AreEqual(new Color(1f, 0.5f, 0.5f, 0.5f), new Color(result[0], result[1], result[2], result[3]));
info = new SamplerInfo<byte>(16, 16, data);
new AverageByteSampler().Sample(info, result);
Assert.AreEqual(new Color(1f, 0.5f, 0.5f, 0.5f), new Color(result[0], result[1], result[2], result[3]));
}
[TestMethod]
public void MixedTest()
{
Color[] colorData = new Color[16 * 16];
for (int i = 0; i < colorData.Length; i++)
colorData[i] = (i % 5) switch
{
0 => new Color(1f, 1f, 0f, 0f),
1 => new Color(1f, 0f, 0.75f, 0f),
2 => new Color(0.5f, 0f, 0f, 0.5f),
3 => new Color(0f, 1f, 1f, 1f),
_ => new Color(0f, 0f, 0f, 0f),
};
byte[] result = new byte[4];
Span<byte> data = new byte[colorData.Length * 4];
int index = 0;
for (int i = 0; i < colorData.Length; i++)
{
data[index++] = colorData[i].GetA();
data[index++] = colorData[i].GetR();
data[index++] = colorData[i].GetG();
data[index++] = colorData[i].GetB();
}
SamplerInfo<byte> info = new(2, 3, data[..(6 * 4)]);
new AverageByteSampler().Sample(info, result);
Assert.AreEqual(new Color(149, 128, 74, 64), new Color(result[0], result[1], result[2], result[3]));
info = new SamplerInfo<byte>(16, 16, data);
new AverageByteSampler().Sample(info, result);
Assert.AreEqual(new Color(128, 103, 89, 76), new Color(result[0], result[1], result[2], result[3]));
}
#endregion
}
@@ -0,0 +1,127 @@
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using RGB.NET.Core;
using RGB.NET.Presets.Textures.Sampler;
namespace RGB.NET.Presets.Tests.Sampler;
[TestClass]
public class AverageFloatSamplerTest
{
#region Methods
[TestMethod]
public void WhiteTest()
{
Span<Color> colorData = new Color[16 * 16];
colorData.Fill(new Color(1f, 1f, 1f, 1f));
float[] result = new float[4];
Span<float> data = new float[colorData.Length * 4];
int index = 0;
for (int i = 0; i < colorData.Length; i++)
{
data[index++] = colorData[i].A;
data[index++] = colorData[i].R;
data[index++] = colorData[i].G;
data[index++] = colorData[i].B;
}
SamplerInfo<float> info = new(2, 3, data[..(6 * 4)]);
new AverageFloatSampler().Sample(info, result);
Assert.AreEqual(new Color(1f, 1f, 1f, 1f), new Color(result[0], result[1], result[2], result[3]));
info = new SamplerInfo<float>(16, 16, data);
new AverageFloatSampler().Sample(info, result);
Assert.AreEqual(new Color(1f, 1f, 1f, 1f), new Color(result[0], result[1], result[2], result[3]));
}
[TestMethod]
public void BlackTest()
{
Span<Color> colorData = new Color[16 * 16];
colorData.Fill(new Color(1f, 0f, 0f, 0f));
float[] result = new float[4];
Span<float> data = new float[colorData.Length * 4];
int index = 0;
for (int i = 0; i < colorData.Length; i++)
{
data[index++] = colorData[i].A;
data[index++] = colorData[i].R;
data[index++] = colorData[i].G;
data[index++] = colorData[i].B;
}
SamplerInfo<float> info = new(2, 3, data[..(6 * 4)]);
new AverageFloatSampler().Sample(info, result);
Assert.AreEqual(new Color(1f, 0f, 0f, 0f), new Color(result[0], result[1], result[2], result[3]));
info = new SamplerInfo<float>(16, 16, data);
new AverageFloatSampler().Sample(info, result);
Assert.AreEqual(new Color(1f, 0f, 0f, 0f), new Color(result[0], result[1], result[2], result[3]));
}
[TestMethod]
public void GrayTest()
{
Span<Color> colorData = new Color[16 * 16];
for (int i = 0; i < colorData.Length; i++)
colorData[i] = (i % 2) == 0 ? new Color(1f, 0f, 0f, 0f) : new Color(1f, 1f, 1f, 1f);
float[] result = new float[4];
Span<float> data = new float[colorData.Length * 4];
int index = 0;
for (int i = 0; i < colorData.Length; i++)
{
data[index++] = colorData[i].A;
data[index++] = colorData[i].R;
data[index++] = colorData[i].G;
data[index++] = colorData[i].B;
}
SamplerInfo<float> info = new(2, 3, data[..(6 * 4)]);
new AverageFloatSampler().Sample(info, result);
Assert.AreEqual(new Color(1f, 0.5f, 0.5f, 0.5f), new Color(result[0], result[1], result[2], result[3]));
info = new SamplerInfo<float>(16, 16, data);
new AverageFloatSampler().Sample(info, result);
Assert.AreEqual(new Color(1f, 0.5f, 0.5f, 0.5f), new Color(result[0], result[1], result[2], result[3]));
}
[TestMethod]
public void MixedTest()
{
Color[] colorData = new Color[16 * 16];
for (int i = 0; i < colorData.Length; i++)
colorData[i] = (i % 5) switch
{
0 => new Color(1f, 1f, 0f, 0f),
1 => new Color(1f, 0f, 0.75f, 0f),
2 => new Color(0.5f, 0f, 0f, 0.5f),
3 => new Color(0f, 1f, 1f, 1f),
_ => new Color(0f, 0f, 0f, 0f),
};
float[] result = new float[4];
Span<float> data = new float[colorData.Length * 4];
int index = 0;
for (int i = 0; i < colorData.Length; i++)
{
data[index++] = colorData[i].A;
data[index++] = colorData[i].R;
data[index++] = colorData[i].G;
data[index++] = colorData[i].B;
}
SamplerInfo<float> info = new(2, 3, data[..(6 * 4)]);
new AverageFloatSampler().Sample(info, result);
Assert.AreEqual(new Color(0.5833333f, 0.5f, 0.291666657f, 0.25f), new Color(result[0], result[1], result[2], result[3]));
info = new SamplerInfo<float>(16, 16, data);
new AverageFloatSampler().Sample(info, result);
Assert.AreEqual(new Color(0.5019531f, 0.40234375f, 0.3486328f, 0.298828125f), new Color(result[0], result[1], result[2], result[3]));
}
#endregion
}