Browse Source

#718: extend IPixel interface and implement it everywhere, ...

AND add unit tests
AND fix Gray16 implementation (constructor takes ushort, not byte)
AND fix Gray8 and Gray16 Pack (do not scale by sum)
af/merge-core
Peter Amrehn 8 years ago
parent
commit
4c80b16f31
  1. 16
      src/ImageSharp/PixelFormats/Alpha8.cs
  2. 30
      src/ImageSharp/PixelFormats/Argb32.cs
  3. 27
      src/ImageSharp/PixelFormats/Bgr24.cs
  4. 16
      src/ImageSharp/PixelFormats/Bgr565.cs
  5. 29
      src/ImageSharp/PixelFormats/Bgra32.cs
  6. 16
      src/ImageSharp/PixelFormats/Bgra4444.cs
  7. 16
      src/ImageSharp/PixelFormats/Bgra5551.cs
  8. 16
      src/ImageSharp/PixelFormats/Byte4.cs
  9. 33
      src/ImageSharp/PixelFormats/Gray16.cs
  10. 3
      src/ImageSharp/PixelFormats/Gray8.cs
  11. 16
      src/ImageSharp/PixelFormats/HalfSingle.cs
  12. 16
      src/ImageSharp/PixelFormats/HalfVector2.cs
  13. 16
      src/ImageSharp/PixelFormats/HalfVector4.cs
  14. 24
      src/ImageSharp/PixelFormats/IPixel.cs
  15. 16
      src/ImageSharp/PixelFormats/NormalizedByte2.cs
  16. 16
      src/ImageSharp/PixelFormats/NormalizedByte4.cs
  17. 16
      src/ImageSharp/PixelFormats/NormalizedShort2.cs
  18. 16
      src/ImageSharp/PixelFormats/NormalizedShort4.cs
  19. 16
      src/ImageSharp/PixelFormats/Rg32.cs
  20. 27
      src/ImageSharp/PixelFormats/Rgb24.cs
  21. 33
      src/ImageSharp/PixelFormats/Rgb48.cs
  22. 16
      src/ImageSharp/PixelFormats/Rgba1010102.cs
  23. 35
      src/ImageSharp/PixelFormats/Rgba32.cs
  24. 29
      src/ImageSharp/PixelFormats/Rgba64.cs
  25. 16
      src/ImageSharp/PixelFormats/RgbaVector.cs
  26. 16
      src/ImageSharp/PixelFormats/Short2.cs
  27. 16
      src/ImageSharp/PixelFormats/Short4.cs
  28. 211
      tests/ImageSharp.Tests/PixelFormats/Gray16Tests.cs

16
src/ImageSharp/PixelFormats/Alpha8.cs

@ -168,6 +168,22 @@ namespace SixLabors.ImageSharp.PixelFormats
dest.B = 0;
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromGray8(Gray8 source) => this.PackedValue = 255;
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToGray8(ref Gray8 dest) => dest.PackedValue = 0;
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromGray16(Gray16 source) => this.PackedValue = 255;
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToGray16(ref Gray16 dest) => dest.PackedValue = 0;
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromRgba64(Rgba64 source) => this.PackFromScaledVector4(source.ToScaledVector4());

30
src/ImageSharp/PixelFormats/Argb32.cs

@ -1,6 +1,7 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System;
using System.Numerics;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
@ -289,6 +290,35 @@ namespace SixLabors.ImageSharp.PixelFormats
dest.A = this.A;
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromGray8(Gray8 source)
{
this.A = 255;
this.R = source.PackedValue;
this.G = source.PackedValue;
this.B = source.PackedValue;
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToGray8(ref Gray8 dest) => dest.PackFromScaledVector4(this.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromGray16(Gray16 source)
{
var val = (byte)(((source.PackedValue * 255) + 32895) >> 16);
this.R = val;
this.G = val;
this.B = val;
this.A = 255;
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToGray16(ref Gray16 dest) => dest.PackFromScaledVector4(this.ToScaledVector4());
/// <summary>
/// Converts the pixel to <see cref="Rgba32"/> format.
/// </summary>

27
src/ImageSharp/PixelFormats/Bgr24.cs

@ -172,6 +172,33 @@ namespace SixLabors.ImageSharp.PixelFormats
dest.A = byte.MaxValue;
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromGray8(Gray8 source)
{
this.R = source.PackedValue;
this.G = source.PackedValue;
this.B = source.PackedValue;
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToGray8(ref Gray8 dest) => dest.PackFromScaledVector4(this.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromGray16(Gray16 source)
{
var val = (byte)(((source.PackedValue * 255) + 32895) >> 16);
this.R = val;
this.G = val;
this.B = val;
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToGray16(ref Gray16 dest) => dest.PackFromScaledVector4(this.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromRgb48(Rgb48 source)

16
src/ImageSharp/PixelFormats/Bgr565.cs

@ -187,6 +187,22 @@ namespace SixLabors.ImageSharp.PixelFormats
dest.A = (byte)MathF.Round(vector.W);
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromGray8(Gray8 source) => this.PackFromScaledVector4(source.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToGray8(ref Gray8 dest) => dest.PackFromScaledVector4(this.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromGray16(Gray16 source) => this.PackFromScaledVector4(source.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToGray16(ref Gray16 dest) => dest.PackFromScaledVector4(this.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromRgb48(Rgb48 source) => this.PackFromScaledVector4(source.ToScaledVector4());

29
src/ImageSharp/PixelFormats/Bgra32.cs

@ -215,6 +215,35 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToBgra32(ref Bgra32 dest) => dest = this;
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromGray8(Gray8 source)
{
this.R = source.PackedValue;
this.R = source.PackedValue;
this.R = source.PackedValue;
this.A = byte.MaxValue;
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToGray8(ref Gray8 dest) => dest.PackFromScaledVector4(this.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromGray16(Gray16 source)
{
var val = (byte)(((source.PackedValue * 255) + 32895) >> 16);
this.R = val;
this.G = val;
this.B = val;
this.A = byte.MaxValue;
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToGray16(ref Gray16 dest) => dest.PackFromScaledVector4(this.ToScaledVector4());
/// <summary>
/// Converts the pixel to <see cref="Rgba32"/> format.
/// </summary>

16
src/ImageSharp/PixelFormats/Bgra4444.cs

@ -178,6 +178,22 @@ namespace SixLabors.ImageSharp.PixelFormats
dest.A = (byte)vector.W;
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromGray8(Gray8 source) => this.PackFromScaledVector4(source.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToGray8(ref Gray8 dest) => dest.PackFromScaledVector4(this.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromGray16(Gray16 source) => this.PackFromScaledVector4(source.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToGray16(ref Gray16 dest) => dest.PackFromScaledVector4(this.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromRgb48(Rgb48 source) => this.PackFromScaledVector4(source.ToScaledVector4());

16
src/ImageSharp/PixelFormats/Bgra5551.cs

@ -178,6 +178,22 @@ namespace SixLabors.ImageSharp.PixelFormats
dest.A = (byte)vector.W;
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromGray8(Gray8 source) => this.PackFromScaledVector4(source.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToGray8(ref Gray8 dest) => dest.PackFromScaledVector4(this.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromGray16(Gray16 source) => this.PackFromScaledVector4(source.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToGray16(ref Gray16 dest) => dest.PackFromScaledVector4(this.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromRgb48(Rgb48 source) => this.PackFromScaledVector4(source.ToScaledVector4());

16
src/ImageSharp/PixelFormats/Byte4.cs

@ -179,6 +179,22 @@ namespace SixLabors.ImageSharp.PixelFormats
dest.A = (byte)vector.W;
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromGray8(Gray8 source) => this.PackFromScaledVector4(source.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToGray8(ref Gray8 dest) => dest.PackFromScaledVector4(this.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromGray16(Gray16 source) => this.PackFromScaledVector4(source.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToGray16(ref Gray16 dest) => dest.PackFromScaledVector4(this.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromRgb48(Rgb48 source) => this.PackFromScaledVector4(source.ToScaledVector4());

33
src/ImageSharp/PixelFormats/Gray16.cs

@ -34,7 +34,7 @@ namespace SixLabors.ImageSharp.PixelFormats
/// Initializes a new instance of the <see cref="Gray16"/> struct.
/// </summary>
/// <param name="gray">The gray component</param>
public Gray16(byte gray)
public Gray16(ushort gray)
{
this.PackedValue = gray;
}
@ -185,6 +185,34 @@ namespace SixLabors.ImageSharp.PixelFormats
dest.A = 255;
}
/// <inheritdoc />
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromGray8(Gray8 source)
{
this.PackedValue = (ushort)(source.PackedValue * 255);
}
/// <inheritdoc />
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToGray8(ref Gray8 dest)
{
dest.PackedValue = (byte)(((this.PackedValue * 255) + 32895) >> 16);
}
/// <inheritdoc />
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromGray16(Gray16 source)
{
this.PackedValue = source.PackedValue;
}
/// <inheritdoc />
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToGray16(ref Gray16 dest)
{
dest.PackedValue = this.PackedValue;
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromRgb48(Rgb48 source) =>
@ -252,9 +280,8 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static ushort Pack(float r, float g, float b)
{
float sum = r + g + b;
float val = (r * Rx) + (g * Gx) + (b * Bx);
return (ushort)Math.Round(val * 65535f / sum); // TODO: if this is correct, Rx, Gx, Bx consts could be scaled by 65535f directly!
return (ushort)Math.Round(val * 65535f);
}
/// <summary>

3
src/ImageSharp/PixelFormats/Gray8.cs

@ -257,9 +257,8 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static byte Pack(float r, float g, float b)
{
float sum = r + g + b;
float val = (r * Rx) + (g * Gx) + (b * Bx);
return (byte)Math.Round(val * 255 / sum); // TODO: if this is correct, Rx, Gx, Bx consts could be scaled by 255 directly!
return (byte)Math.Round(val * 255);
}
}
}

16
src/ImageSharp/PixelFormats/HalfSingle.cs

@ -192,6 +192,22 @@ namespace SixLabors.ImageSharp.PixelFormats
dest.A = (byte)vector.W;
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromGray8(Gray8 source) => this.PackFromScaledVector4(source.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToGray8(ref Gray8 dest) => dest.PackFromScaledVector4(this.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromGray16(Gray16 source) => this.PackFromScaledVector4(source.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToGray16(ref Gray16 dest) => dest.PackFromScaledVector4(this.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromRgb48(Rgb48 source) => this.PackFromScaledVector4(source.ToScaledVector4());

16
src/ImageSharp/PixelFormats/HalfVector2.cs

@ -207,6 +207,22 @@ namespace SixLabors.ImageSharp.PixelFormats
dest.A = 255;
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromGray8(Gray8 source) => this.PackFromScaledVector4(source.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToGray8(ref Gray8 dest) => dest.PackFromScaledVector4(this.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromGray16(Gray16 source) => this.PackFromScaledVector4(source.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToGray16(ref Gray16 dest) => dest.PackFromScaledVector4(this.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromRgb48(Rgb48 source) => this.PackFromScaledVector4(source.ToScaledVector4());

16
src/ImageSharp/PixelFormats/HalfVector4.cs

@ -200,6 +200,22 @@ namespace SixLabors.ImageSharp.PixelFormats
dest.A = (byte)vector.W;
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromGray8(Gray8 source) => this.PackFromScaledVector4(source.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToGray8(ref Gray8 dest) => dest.PackFromScaledVector4(this.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromGray16(Gray16 source) => this.PackFromScaledVector4(source.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToGray16(ref Gray16 dest) => dest.PackFromScaledVector4(this.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromRgb48(Rgb48 source) => this.PackFromScaledVector4(source.ToScaledVector4());

24
src/ImageSharp/PixelFormats/IPixel.cs

@ -126,5 +126,29 @@ namespace SixLabors.ImageSharp.PixelFormats
/// </summary>
/// <param name="dest">The destination pixel to write to</param>
void ToBgra32(ref Bgra32 dest);
/// <summary>
/// Packs the Pixel from an <see cref="Gray8"/> value.
/// </summary>
/// <param name="source">The <see cref="Gray8"/> value.</param>
void PackFromGray8(Gray8 source);
/// <summary>
/// Converts the pixel to <see cref="Gray8"/> format.
/// </summary>
/// <param name="dest">The destination pixel to write to.</param>
void ToGray8(ref Gray8 dest);
/// <summary>
/// Packs the Pixel from an <see cref="Gray16"/> value.
/// </summary>
/// <param name="source">The <see cref="Gray16"/> value.</param>
void PackFromGray16(Gray16 source);
/// <summary>
/// Converts the pixel tgo <see cref="Gray16"/> value.
/// </summary>
/// <param name="dest">The destination pixel to write to.</param>
void ToGray16(ref Gray16 dest);
}
}

16
src/ImageSharp/PixelFormats/NormalizedByte2.cs

@ -226,6 +226,22 @@ namespace SixLabors.ImageSharp.PixelFormats
dest.A = 255;
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromGray8(Gray8 source) => this.PackFromScaledVector4(source.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToGray8(ref Gray8 dest) => dest.PackFromScaledVector4(this.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromGray16(Gray16 source) => this.PackFromScaledVector4(source.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToGray16(ref Gray16 dest) => dest.PackFromScaledVector4(this.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromRgb48(Rgb48 source) => this.PackFromScaledVector4(source.ToScaledVector4());

16
src/ImageSharp/PixelFormats/NormalizedByte4.cs

@ -219,6 +219,22 @@ namespace SixLabors.ImageSharp.PixelFormats
dest.A = (byte)vector.W;
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromGray8(Gray8 source) => this.PackFromScaledVector4(source.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToGray8(ref Gray8 dest) => dest.PackFromScaledVector4(this.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromGray16(Gray16 source) => this.PackFromScaledVector4(source.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToGray16(ref Gray16 dest) => dest.PackFromScaledVector4(this.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromRgb48(Rgb48 source) => this.PackFromScaledVector4(source.ToScaledVector4());

16
src/ImageSharp/PixelFormats/NormalizedShort2.cs

@ -213,6 +213,22 @@ namespace SixLabors.ImageSharp.PixelFormats
dest.A = 255;
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromGray8(Gray8 source) => this.PackFromScaledVector4(source.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToGray8(ref Gray8 dest) => dest.PackFromScaledVector4(this.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromGray16(Gray16 source) => this.PackFromScaledVector4(this.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToGray16(ref Gray16 dest) => dest.PackFromScaledVector4(this.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromRgb48(Rgb48 source) => this.PackFromScaledVector4(source.ToScaledVector4());

16
src/ImageSharp/PixelFormats/NormalizedShort4.cs

@ -221,6 +221,22 @@ namespace SixLabors.ImageSharp.PixelFormats
dest.A = (byte)MathF.Round(vector.W);
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromGray8(Gray8 source) => this.PackFromScaledVector4(source.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToGray8(ref Gray8 dest) => dest.PackFromScaledVector4(this.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromGray16(Gray16 source) => this.PackFromScaledVector4(source.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToGray16(ref Gray16 dest) => dest.PackFromScaledVector4(this.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromRgb48(Rgb48 source) => this.PackFromScaledVector4(source.ToScaledVector4());

16
src/ImageSharp/PixelFormats/Rg32.cs

@ -191,6 +191,22 @@ namespace SixLabors.ImageSharp.PixelFormats
dest.A = (byte)vector.W;
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromGray8(Gray8 source) => this.PackFromScaledVector4(source.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToGray8(ref Gray8 dest) => dest.PackFromScaledVector4(this.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromGray16(Gray16 source) => this.PackFromScaledVector4(source.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToGray16(ref Gray16 dest) => dest.PackFromScaledVector4(this.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromRgb48(Rgb48 source) => this.PackFromScaledVector4(source.ToScaledVector4());

27
src/ImageSharp/PixelFormats/Rgb24.cs

@ -166,6 +166,33 @@ namespace SixLabors.ImageSharp.PixelFormats
dest.A = byte.MaxValue;
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromGray8(Gray8 source)
{
this.R = source.PackedValue;
this.G = source.PackedValue;
this.B = source.PackedValue;
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToGray8(ref Gray8 dest) => dest.PackFromScaledVector4(this.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromGray16(Gray16 source)
{
var val = (byte)(((source.PackedValue * 255) + 32895) >> 16);
this.R = val;
this.G = val;
this.B = val;
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToGray16(ref Gray16 dest) => dest.PackFromScaledVector4(this.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromRgb48(Rgb48 source)

33
src/ImageSharp/PixelFormats/Rgb48.cs

@ -210,6 +210,39 @@ namespace SixLabors.ImageSharp.PixelFormats
dest.A = 255;
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromGray8(Gray8 source)
{
var val = (ushort)(source.PackedValue * 255);
this.R = val;
this.G = val;
this.B = val;
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToGray8(ref Gray8 dest)
{
dest.PackFromRgb48(this);
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromGray16(Gray16 source)
{
this.R = source.PackedValue;
this.G = source.PackedValue;
this.B = source.PackedValue;
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToGray16(ref Gray16 dest)
{
dest.PackFromRgb48(this);
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromRgb48(Rgb48 source) => this = source;

16
src/ImageSharp/PixelFormats/Rgba1010102.cs

@ -185,6 +185,22 @@ namespace SixLabors.ImageSharp.PixelFormats
dest.A = (byte)MathF.Round(vector.W);
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromGray8(Gray8 source) => this.PackFromScaledVector4(source.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToGray8(ref Gray8 dest) => dest.PackFromScaledVector4(this.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromGray16(Gray16 source) => this.PackFromScaledVector4(source.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToGray16(ref Gray16 dest) => dest.PackFromScaledVector4(this.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromRgb48(Rgb48 source) => this.PackFromScaledVector4(source.ToScaledVector4());

35
src/ImageSharp/PixelFormats/Rgba32.cs

@ -336,6 +336,41 @@ namespace SixLabors.ImageSharp.PixelFormats
dest.A = this.A;
}
/// <inheritdoc />
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromGray8(Gray8 source)
{
this.R = source.PackedValue;
this.G = source.PackedValue;
this.B = source.PackedValue;
this.A = 0;
}
/// <inheritdoc />
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToGray8(ref Gray8 dest)
{
dest.PackFromRgba32(this);
}
/// <inheritdoc />
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromGray16(Gray16 source)
{
var val = (byte)(((source.PackedValue * 255) + 32895) >> 16);
this.R = val;
this.G = val;
this.B = val;
this.A = 0;
}
/// <inheritdoc />
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToGray16(ref Gray16 dest)
{
dest.PackFromRgba32(this);
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromScaledVector4(Vector4 vector)

29
src/ImageSharp/PixelFormats/Rgba64.cs

@ -274,6 +274,35 @@ namespace SixLabors.ImageSharp.PixelFormats
dest.A = (byte)(((this.A * 255) + 32895) >> 16);
}
/// <inheritdoc />
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromGray8(Gray8 source)
{
ushort x = (ushort)(source.PackedValue * 255);
this.R = x;
this.G = x;
this.B = x;
this.A = ushort.MaxValue;
}
/// <inheritdoc />
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToGray8(ref Gray8 dest) => dest.PackFromScaledVector4(this.ToScaledVector4());
/// <inheritdoc />
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromGray16(Gray16 source)
{
this.R = source.PackedValue;
this.G = source.PackedValue;
this.B = source.PackedValue;
this.A = ushort.MaxValue;
}
/// <inheritdoc />
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToGray16(ref Gray16 dest) => dest.PackFromScaledVector4(this.ToScaledVector4());
/// <inheritdoc />
public override bool Equals(object obj)
{

16
src/ImageSharp/PixelFormats/RgbaVector.cs

@ -298,6 +298,22 @@ namespace SixLabors.ImageSharp.PixelFormats
dest.A = (byte)MathF.Round(vector.W);
}
/// <inheritdoc />
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromGray8(Gray8 source) => this.PackFromScaledVector4(source.ToScaledVector4());
/// <inheritdoc />
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToGray8(ref Gray8 dest) => dest.PackFromScaledVector4(this.ToScaledVector4());
/// <inheritdoc />
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromGray16(Gray16 source) => this.PackFromScaledVector4(source.ToScaledVector4());
/// <inheritdoc />
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToGray16(ref Gray16 dest) => dest.PackFromScaledVector4(this.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromRgb48(Rgb48 source) => this.PackFromScaledVector4(source.ToScaledVector4());

16
src/ImageSharp/PixelFormats/Short2.cs

@ -207,6 +207,22 @@ namespace SixLabors.ImageSharp.PixelFormats
dest.A = 255;
}
/// <inheritdoc />
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromGray8(Gray8 source) => this.PackFromScaledVector4(source.ToScaledVector4());
/// <inheritdoc />
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToGray8(ref Gray8 dest) => dest.PackFromScaledVector4(this.ToScaledVector4());
/// <inheritdoc />
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromGray16(Gray16 source) => this.PackFromScaledVector4(source.ToScaledVector4());
/// <inheritdoc />
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToGray16(ref Gray16 dest) => dest.PackFromScaledVector4(this.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromRgb48(Rgb48 source) => this.PackFromScaledVector4(source.ToScaledVector4());

16
src/ImageSharp/PixelFormats/Short4.cs

@ -213,6 +213,22 @@ namespace SixLabors.ImageSharp.PixelFormats
dest.A = (byte)MathF.Round(vector.W);
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToGray8(ref Gray8 dest) => dest.PackFromVector4(this.ToVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToGray16(ref Gray16 dest) => dest.PackFromVector4(this.ToVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromGray8(Gray8 source) => this.PackFromScaledVector4(source.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromGray16(Gray16 source) => this.PackFromScaledVector4(source.ToScaledVector4());
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromRgb48(Rgb48 source) => this.PackFromScaledVector4(source.ToScaledVector4());

211
tests/ImageSharp.Tests/PixelFormats/Gray16Tests.cs

@ -0,0 +1,211 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System.Numerics;
using SixLabors.ImageSharp.PixelFormats;
using Xunit;
namespace SixLabors.ImageSharp.Tests.PixelFormats
{
public class Gray16Tests
{
[Theory]
[InlineData(0)]
[InlineData(65535)]
[InlineData(32767)]
[InlineData(42)]
public void Gray16_PackedValue_EqualsInput(ushort input)
{
Assert.Equal(input, new Gray16(input).PackedValue);
}
[Theory]
[InlineData(0)]
[InlineData(65535)]
[InlineData(32767)]
public void Gray16_ToVector4(ushort input)
{
// arrange
var gray = new Gray16(input);
// act
var actual = gray.ToVector4();
// assert
Assert.Equal(input, actual.X);
Assert.Equal(input, actual.Y);
Assert.Equal(input, actual.Z);
Assert.Equal(1, actual.W);
}
[Theory]
[InlineData(0)]
[InlineData(65535)]
[InlineData(32767)]
public void Gray16_ToScaledVector4(ushort input)
{
// arrange
var gray = new Gray16(input);
// act
var actual = gray.ToScaledVector4();
// assert
float scaledInput = input / 65535f;
Assert.Equal(scaledInput, actual.X);
Assert.Equal(scaledInput, actual.Y);
Assert.Equal(scaledInput, actual.Z);
Assert.Equal(1, actual.W);
}
[Fact]
public void Gray16_PackFromScaledVector4()
{
// arrange
Gray16 gray = default;
int expected = 32767;
Vector4 scaled = new Gray16((ushort)expected).ToScaledVector4();
// act
gray.PackFromScaledVector4(scaled);
ushort actual = gray.PackedValue;
// assert
Assert.Equal(expected, actual);
}
[Fact]
public void Gray16_PackFromScaledVector4_ToRgb24()
{
// arrange
Rgb24 actual = default;
Gray16 gray = default;
var expected = new Rgb24(128, 128, 128);
Vector4 scaled = new Gray16(32768).ToScaledVector4();
// act
gray.PackFromScaledVector4(scaled);
gray.ToRgb24(ref actual);
// assert
Assert.Equal(expected, actual);
}
[Fact]
public void Gray16_PackFromScaledVector4_ToRgba32()
{
// arrange
Rgba32 actual = default;
Gray16 gray = default;
var expected = new Rgba32(128, 128, 128, 255);
Vector4 scaled = new Gray16(32768).ToScaledVector4();
// act
gray.PackFromScaledVector4(scaled);
gray.ToRgba32(ref actual);
// assert
Assert.Equal(expected, actual);
}
[Fact]
public void Gray16_PackFromScaledVector4_ToBgr24()
{
// arrange
Bgr24 actual = default;
Gray16 gray = default;
var expected = new Bgr24(128, 128, 128);
Vector4 scaled = new Gray16(32768).ToScaledVector4();
// act
gray.PackFromScaledVector4(scaled);
gray.ToBgr24(ref actual);
// assert
Assert.Equal(expected, actual);
}
[Fact]
public void Gray16_PackFromScaledVector4_ToBgra32()
{
// arrange
Bgra32 actual = default;
Gray16 gray = default;
var expected = new Bgra32(128,128,128);
Vector4 scaled = new Gray16(32768).ToScaledVector4();
// act
gray.PackFromScaledVector4(scaled);
gray.ToBgra32(ref actual);
// assert
Assert.Equal(expected, actual);
}
[Fact]
public void Gray16_PackFromScaledVector4_ToArgb32()
{
// arrange
Gray16 gray = default;
Argb32 actual = default;
var expected = new Argb32(128, 128, 128);
Vector4 scaled = new Gray16(32768).ToScaledVector4();
// act
gray.PackFromScaledVector4(scaled);
gray.ToArgb32(ref actual);
// assert
Assert.Equal(expected, actual);
}
[Fact]
public void Gray16_PackFromScaledVector4_ToRgba64()
{
// arrange
Gray16 gray = default;
Rgba64 actual = default;
var expected = new Rgba64(65535, 65535, 65535, 65535);
Vector4 scaled = new Gray16(65535).ToScaledVector4();
// act
gray.PackFromScaledVector4(scaled);
gray.ToRgba64(ref actual);
// assert
Assert.Equal(expected, actual);
}
[Fact]
public void Gray16_PackFromRgb48_ToRgb48()
{
// arrange
var gray = default(Gray16);
var actual = default(Rgb48);
var expected = new Rgb48(0, 0, 0);
// act
gray.PackFromRgb48(expected);
gray.ToRgb48(ref actual);
// assert
Assert.Equal(expected, actual);
}
[Fact]
public void Gray16_PackFromRgba64_ToRgba64()
{
// arrange
var gray = default(Gray16);
var actual = default(Rgba64);
var expected = new Rgba64(0, 0, 0, 65535);
// act
gray.PackFromRgba64(expected);
gray.ToRgba64(ref actual);
// assert
Assert.Equal(expected, actual);
}
}
}
Loading…
Cancel
Save