Browse Source

Add per-pixel scaled vector packing

af/merge-core
James Jackson-South 8 years ago
parent
commit
05d8915829
  1. 14
      src/ImageSharp/PixelFormats/Alpha8.cs
  2. 18
      src/ImageSharp/PixelFormats/Argb32.cs
  3. 14
      src/ImageSharp/PixelFormats/Bgr24.cs
  4. 14
      src/ImageSharp/PixelFormats/Bgr565.cs
  5. 14
      src/ImageSharp/PixelFormats/Bgra32.cs
  6. 14
      src/ImageSharp/PixelFormats/Bgra4444.cs
  7. 24
      src/ImageSharp/PixelFormats/Bgra5551.cs
  8. 28
      src/ImageSharp/PixelFormats/Byte4.cs
  9. 31
      src/ImageSharp/PixelFormats/HalfSingle.cs
  10. 35
      src/ImageSharp/PixelFormats/HalfVector2.cs
  11. 35
      src/ImageSharp/PixelFormats/HalfVector4.cs
  12. 14
      src/ImageSharp/PixelFormats/IPixel.cs
  13. 33
      src/ImageSharp/PixelFormats/NormalizedByte2.cs
  14. 33
      src/ImageSharp/PixelFormats/NormalizedByte4.cs
  15. 33
      src/ImageSharp/PixelFormats/NormalizedShort2.cs
  16. 33
      src/ImageSharp/PixelFormats/NormalizedShort4.cs
  17. 24
      src/ImageSharp/PixelFormats/Rg32.cs
  18. 14
      src/ImageSharp/PixelFormats/Rgb24.cs
  19. 14
      src/ImageSharp/PixelFormats/Rgba1010102.cs
  20. 16
      src/ImageSharp/PixelFormats/Rgba32.cs
  21. 14
      src/ImageSharp/PixelFormats/Rgba64.cs
  22. 24
      src/ImageSharp/PixelFormats/RgbaVector.cs
  23. 31
      src/ImageSharp/PixelFormats/Short2.cs
  24. 33
      src/ImageSharp/PixelFormats/Short4.cs
  25. 235
      tests/ImageSharp.Tests/PixelFormats/PackedPixelTests.cs

14
src/ImageSharp/PixelFormats/Alpha8.cs

@ -62,6 +62,20 @@ namespace SixLabors.ImageSharp.PixelFormats
/// <inheritdoc />
public PixelOperations<Alpha8> CreatePixelOperations() => new PixelOperations<Alpha8>();
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromScaledVector4(Vector4 vector)
{
this.PackFromVector4(vector);
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public Vector4 ToScaledVector4()
{
return this.ToVector4();
}
/// <inheritdoc />
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromVector4(Vector4 vector)

18
src/ImageSharp/PixelFormats/Argb32.cs

@ -237,6 +237,20 @@ namespace SixLabors.ImageSharp.PixelFormats
/// <inheritdoc />
public PixelOperations<Argb32> CreatePixelOperations() => new PixelOperations<Argb32>();
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromScaledVector4(Vector4 vector)
{
this.PackFromVector4(vector);
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public Vector4 ToScaledVector4()
{
return this.ToVector4();
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public Vector4 ToVector4()
@ -321,7 +335,7 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static uint Pack(float x, float y, float z, float w)
{
Vector4 value = new Vector4(x, y, z, w);
var value = new Vector4(x, y, z, w);
return Pack(ref value);
}
@ -347,7 +361,7 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static uint Pack(ref Vector3 vector)
{
Vector4 value = new Vector4(vector, 1);
var value = new Vector4(vector, 1);
return Pack(ref value);
}

14
src/ImageSharp/PixelFormats/Bgr24.cs

@ -80,6 +80,20 @@ namespace SixLabors.ImageSharp.PixelFormats
this = source.Bgr;
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromScaledVector4(Vector4 vector)
{
this.PackFromVector4(vector);
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public Vector4 ToScaledVector4()
{
return this.ToVector4();
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromVector4(Vector4 vector)

14
src/ImageSharp/PixelFormats/Bgr565.cs

@ -85,6 +85,20 @@ namespace SixLabors.ImageSharp.PixelFormats
(this.PackedValue & 0x1F) * (1F / 31F));
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromScaledVector4(Vector4 vector)
{
this.PackFromVector4(vector);
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public Vector4 ToScaledVector4()
{
return this.ToVector4();
}
/// <inheritdoc />
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromVector4(Vector4 vector)

14
src/ImageSharp/PixelFormats/Bgra32.cs

@ -116,6 +116,20 @@ namespace SixLabors.ImageSharp.PixelFormats
}
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromScaledVector4(Vector4 vector)
{
this.PackFromVector4(vector);
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public Vector4 ToScaledVector4()
{
return this.ToVector4();
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromVector4(Vector4 vector)

14
src/ImageSharp/PixelFormats/Bgra4444.cs

@ -70,6 +70,20 @@ namespace SixLabors.ImageSharp.PixelFormats
/// <inheritdoc />
public PixelOperations<Bgra4444> CreatePixelOperations() => new PixelOperations<Bgra4444>();
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromScaledVector4(Vector4 vector)
{
this.PackFromVector4(vector);
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public Vector4 ToScaledVector4()
{
return this.ToVector4();
}
/// <inheritdoc />
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public Vector4 ToVector4()

24
src/ImageSharp/PixelFormats/Bgra5551.cs

@ -72,6 +72,20 @@ namespace SixLabors.ImageSharp.PixelFormats
/// <inheritdoc />
public PixelOperations<Bgra5551> CreatePixelOperations() => new PixelOperations<Bgra5551>();
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromScaledVector4(Vector4 vector)
{
this.PackFromVector4(vector);
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public Vector4 ToScaledVector4()
{
return this.ToVector4();
}
/// <inheritdoc />
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public Vector4 ToVector4()
@ -101,7 +115,7 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToRgb24(ref Rgb24 dest)
{
Vector4 vector = this.ToScaledVector4();
Vector4 vector = this.ToByteScaledVector4();
dest.R = (byte)vector.X;
dest.G = (byte)vector.Y;
dest.B = (byte)vector.Z;
@ -111,7 +125,7 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToRgba32(ref Rgba32 dest)
{
Vector4 vector = this.ToScaledVector4();
Vector4 vector = this.ToByteScaledVector4();
dest.R = (byte)vector.X;
dest.G = (byte)vector.Y;
dest.B = (byte)vector.Z;
@ -122,7 +136,7 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToBgr24(ref Bgr24 dest)
{
Vector4 vector = this.ToScaledVector4();
Vector4 vector = this.ToByteScaledVector4();
dest.R = (byte)vector.X;
dest.G = (byte)vector.Y;
dest.B = (byte)vector.Z;
@ -132,7 +146,7 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToBgra32(ref Bgra32 dest)
{
Vector4 vector = this.ToScaledVector4();
Vector4 vector = this.ToByteScaledVector4();
dest.R = (byte)vector.X;
dest.G = (byte)vector.Y;
dest.B = (byte)vector.Z;
@ -190,6 +204,6 @@ namespace SixLabors.ImageSharp.PixelFormats
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private Vector4 ToScaledVector4() => this.ToVector4() * 255f;
private Vector4 ToByteScaledVector4() => this.ToVector4() * 255f;
}
}

28
src/ImageSharp/PixelFormats/Byte4.cs

@ -10,7 +10,7 @@ namespace SixLabors.ImageSharp.PixelFormats
/// <summary>
/// Packed pixel type containing four 8-bit unsigned integer values, ranging from 0 to 255.
/// <para>
/// Ranges from &lt;0, 0, 0, 0&gt; to &lt;1, 1, 1, 1&gt; in vector form.
/// Ranges from &lt;0, 0, 0, 0&gt; to &lt;255, 255, 255, 255&gt; in vector form.
/// </para>
/// </summary>
public struct Byte4 : IPixel<Byte4>, IPackedVector<uint>
@ -35,7 +35,7 @@ namespace SixLabors.ImageSharp.PixelFormats
/// <param name="w">The w-component</param>
public Byte4(float x, float y, float z, float w)
{
Vector4 vector = new Vector4(x, y, z, w);
var vector = new Vector4(x, y, z, w);
this.PackedValue = Pack(ref vector);
}
@ -73,6 +73,20 @@ namespace SixLabors.ImageSharp.PixelFormats
/// <inheritdoc />
public PixelOperations<Byte4> CreatePixelOperations() => new PixelOperations<Byte4>();
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromScaledVector4(Vector4 vector)
{
this.PackFromVector4(vector * 255F);
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public Vector4 ToScaledVector4()
{
return this.ToVector4() / 255F;
}
/// <inheritdoc />
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromVector4(Vector4 vector)
@ -95,14 +109,14 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromRgba32(Rgba32 source)
{
this.PackFromVector4(source.ToUnscaledVector4());
this.PackFromVector4(source.ToByteScaledVector4());
}
/// <inheritdoc />
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToRgb24(ref Rgb24 dest)
{
Vector4 vector = this.ToVector4();
var vector = this.ToVector4();
dest.R = (byte)vector.X;
dest.G = (byte)vector.Y;
dest.B = (byte)vector.Z;
@ -112,7 +126,7 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToRgba32(ref Rgba32 dest)
{
Vector4 vector = this.ToVector4();
var vector = this.ToVector4();
dest.R = (byte)vector.X;
dest.G = (byte)vector.Y;
dest.B = (byte)vector.Z;
@ -123,7 +137,7 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToBgr24(ref Bgr24 dest)
{
Vector4 vector = this.ToVector4();
var vector = this.ToVector4();
dest.R = (byte)vector.X;
dest.G = (byte)vector.Y;
dest.B = (byte)vector.Z;
@ -133,7 +147,7 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToBgra32(ref Bgra32 dest)
{
Vector4 vector = this.ToVector4();
var vector = this.ToVector4();
dest.R = (byte)vector.X;
dest.G = (byte)vector.Y;
dest.B = (byte)vector.Z;

31
src/ImageSharp/PixelFormats/HalfSingle.cs

@ -10,7 +10,7 @@ namespace SixLabors.ImageSharp.PixelFormats
/// <summary>
/// Packed pixel type containing a single 16 bit floating point value.
/// <para>
/// Ranges from &lt;0, 0, 0, 1&gt; to &lt;1, 0, 0, 1&gt; in vector form.
/// Ranges from &lt;-1, 0, 0, 1&gt; to &lt;1, 0, 0, 1&gt; in vector form.
/// </para>
/// </summary>
public struct HalfSingle : IPixel<HalfSingle>, IPackedVector<ushort>
@ -86,6 +86,25 @@ namespace SixLabors.ImageSharp.PixelFormats
return HalfTypeHelper.Unpack(this.PackedValue);
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromScaledVector4(Vector4 vector)
{
float scaled = vector.X;
scaled *= 2F;
scaled -= 1F;
this.PackedValue = HalfTypeHelper.Pack(scaled);
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public Vector4 ToScaledVector4()
{
float single = this.ToSingle() + 1F;
single /= 2F;
return new Vector4(single, 0, 0, 1);
}
/// <inheritdoc />
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromVector4(Vector4 vector)
@ -111,7 +130,7 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToRgb24(ref Rgb24 dest)
{
Vector4 vector = this.ToScaledVector4();
Vector4 vector = this.ToByteScaledVector4();
dest.R = (byte)vector.X;
dest.G = (byte)vector.Y;
dest.B = (byte)vector.Z;
@ -121,7 +140,7 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToRgba32(ref Rgba32 dest)
{
Vector4 vector = this.ToScaledVector4();
Vector4 vector = this.ToByteScaledVector4();
dest.R = (byte)vector.X;
dest.G = (byte)vector.Y;
dest.B = (byte)vector.Z;
@ -132,7 +151,7 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToBgr24(ref Bgr24 dest)
{
Vector4 vector = this.ToScaledVector4();
Vector4 vector = this.ToByteScaledVector4();
dest.R = (byte)vector.X;
dest.G = (byte)vector.Y;
dest.B = (byte)vector.Z;
@ -142,7 +161,7 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToBgra32(ref Bgra32 dest)
{
Vector4 vector = this.ToScaledVector4();
Vector4 vector = this.ToByteScaledVector4();
dest.R = (byte)vector.X;
dest.G = (byte)vector.Y;
dest.B = (byte)vector.Z;
@ -176,7 +195,7 @@ namespace SixLabors.ImageSharp.PixelFormats
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private Vector4 ToScaledVector4()
private Vector4 ToByteScaledVector4()
{
var vector = this.ToVector4();
vector *= MaxBytes;

35
src/ImageSharp/PixelFormats/HalfVector2.cs

@ -10,7 +10,7 @@ namespace SixLabors.ImageSharp.PixelFormats
/// <summary>
/// Packed pixel type containing two 16-bit floating-point values.
/// <para>
/// Ranges from &lt;0, 0, 0, 1&gt; to &lt;1, 0, 0, 1&gt; in vector form.
/// Ranges from &lt;-1, -1, 0, 1&gt; to &lt;1, 1, 0, 1&gt; in vector form.
/// </para>
/// </summary>
public struct HalfVector2 : IPixel<HalfVector2>, IPackedVector<uint>
@ -99,6 +99,25 @@ namespace SixLabors.ImageSharp.PixelFormats
return vector;
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromScaledVector4(Vector4 vector)
{
Vector2 scaled = new Vector2(vector.X, vector.Y) * 2F;
scaled -= Vector2.One;
this.PackedValue = Pack(scaled.X, scaled.Y);
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public Vector4 ToScaledVector4()
{
var scaled = this.ToVector2();
scaled += Vector2.One;
scaled /= 2F;
return new Vector4(scaled, 0F, 1F);
}
/// <inheritdoc />
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromVector4(Vector4 vector)
@ -110,7 +129,7 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public Vector4 ToVector4()
{
Vector2 vector = this.ToVector2();
var vector = this.ToVector2();
return new Vector4(vector.X, vector.Y, 0F, 1F);
}
@ -125,7 +144,7 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToRgb24(ref Rgb24 dest)
{
Vector4 vector = this.ToScaledVector4();
Vector4 vector = this.ToByteScaledVector4();
dest.R = (byte)vector.X;
dest.G = (byte)vector.Y;
dest.B = 0;
@ -135,7 +154,7 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToRgba32(ref Rgba32 dest)
{
Vector4 vector = this.ToScaledVector4();
Vector4 vector = this.ToByteScaledVector4();
dest.R = (byte)vector.X;
dest.G = (byte)vector.Y;
dest.B = 0;
@ -146,7 +165,7 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToBgr24(ref Bgr24 dest)
{
Vector4 vector = this.ToScaledVector4();
Vector4 vector = this.ToByteScaledVector4();
dest.R = (byte)vector.X;
dest.G = (byte)vector.Y;
dest.B = 0;
@ -156,7 +175,7 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToBgra32(ref Bgra32 dest)
{
Vector4 vector = this.ToScaledVector4();
Vector4 vector = this.ToByteScaledVector4();
dest.R = (byte)vector.X;
dest.G = (byte)vector.Y;
dest.B = 0;
@ -204,9 +223,9 @@ namespace SixLabors.ImageSharp.PixelFormats
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private Vector4 ToScaledVector4()
private Vector4 ToByteScaledVector4()
{
Vector4 vector = this.ToVector4();
var vector = this.ToVector4();
vector *= MaxBytes;
vector += Half;
vector = Vector4.Clamp(vector, Vector4.Zero, MaxBytes);

35
src/ImageSharp/PixelFormats/HalfVector4.cs

@ -10,7 +10,7 @@ namespace SixLabors.ImageSharp.PixelFormats
/// <summary>
/// Packed pixel type containing four 16-bit floating-point values.
/// <para>
/// Ranges from &lt;0, 0, 0, 0&gt; to &lt;1, 1, 1, 1&gt; in vector form.
/// Ranges from &lt;-1, -1, -1, -1&gt; to &lt;1, 1, 1, 1&gt; in vector form.
/// </para>
/// </summary>
public struct HalfVector4 : IPixel<HalfVector4>, IPackedVector<ulong>
@ -34,7 +34,7 @@ namespace SixLabors.ImageSharp.PixelFormats
/// <param name="w">The w-component.</param>
public HalfVector4(float x, float y, float z, float w)
{
Vector4 vector = new Vector4(x, y, z, w);
var vector = new Vector4(x, y, z, w);
this.PackedValue = Pack(ref vector);
}
@ -89,6 +89,25 @@ namespace SixLabors.ImageSharp.PixelFormats
/// <inheritdoc />
public PixelOperations<HalfVector4> CreatePixelOperations() => new PixelOperations<HalfVector4>();
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromScaledVector4(Vector4 vector)
{
vector *= 2F;
vector -= Vector4.One;
this.PackFromVector4(vector);
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public Vector4 ToScaledVector4()
{
var scaled = this.ToVector4();
scaled += Vector4.One;
scaled /= 2F;
return scaled;
}
/// <inheritdoc />
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromVector4(Vector4 vector)
@ -118,7 +137,7 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToRgb24(ref Rgb24 dest)
{
Vector4 vector = this.ToScaledVector4();
Vector4 vector = this.ToByteScaledVector4();
dest.R = (byte)vector.X;
dest.G = (byte)vector.Y;
dest.B = (byte)vector.Z;
@ -128,7 +147,7 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToRgba32(ref Rgba32 dest)
{
Vector4 vector = this.ToScaledVector4();
Vector4 vector = this.ToByteScaledVector4();
dest.R = (byte)vector.X;
dest.G = (byte)vector.Y;
dest.B = (byte)vector.Z;
@ -139,7 +158,7 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToBgr24(ref Bgr24 dest)
{
Vector4 vector = this.ToScaledVector4();
Vector4 vector = this.ToByteScaledVector4();
dest.R = (byte)vector.X;
dest.G = (byte)vector.Y;
dest.B = (byte)vector.Z;
@ -149,7 +168,7 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToBgra32(ref Bgra32 dest)
{
Vector4 vector = this.ToScaledVector4();
Vector4 vector = this.ToByteScaledVector4();
dest.R = (byte)vector.X;
dest.G = (byte)vector.Y;
dest.B = (byte)vector.Z;
@ -198,9 +217,9 @@ namespace SixLabors.ImageSharp.PixelFormats
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private Vector4 ToScaledVector4()
private Vector4 ToByteScaledVector4()
{
Vector4 vector = this.ToVector4();
var vector = this.ToVector4();
vector *= MaxBytes;
vector += Half;
vector = Vector4.Clamp(vector, Vector4.Zero, MaxBytes);

14
src/ImageSharp/PixelFormats/IPixel.cs

@ -32,6 +32,20 @@ namespace SixLabors.ImageSharp.PixelFormats
/// <param name="vector">The vector to create the packed representation from.</param>
void PackFromVector4(Vector4 vector);
/// <summary>
/// Sets the packed representation from a scaled <see cref="Vector4"/>.
/// </summary>
/// <param name="vector">The vector to create the packed representation from.</param>
void PackFromScaledVector4(Vector4 vector);
/// <summary>
/// Expands the packed representation into a scaled <see cref="Vector4"/>
/// with values clamped between <value>0</value> and <value>1</value>.
/// The vector components are typically expanded in least to greatest significance order.
/// </summary>
/// <returns>The <see cref="Vector4"/>.</returns>
Vector4 ToScaledVector4();
/// <summary>
/// Expands the packed representation into a <see cref="Vector4"/>.
/// The vector components are typically expanded in least to greatest significance order.

33
src/ImageSharp/PixelFormats/NormalizedByte2.cs

@ -104,6 +104,25 @@ namespace SixLabors.ImageSharp.PixelFormats
(sbyte)((this.PackedValue >> 8) & 0xFF) / 127F);
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromScaledVector4(Vector4 vector)
{
Vector2 scaled = new Vector2(vector.X, vector.Y) * 2F;
scaled -= Vector2.One;
this.PackedValue = Pack(scaled.X, scaled.Y);
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public Vector4 ToScaledVector4()
{
var scaled = this.ToVector2();
scaled += Vector2.One;
scaled /= 2F;
return new Vector4(scaled, 0F, 1F);
}
/// <inheritdoc />
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromVector4(Vector4 vector)
@ -122,7 +141,7 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromRgba32(Rgba32 source)
{
Vector4 vector = source.ToUnscaledVector4();
Vector4 vector = source.ToByteScaledVector4();
vector -= Round;
vector -= Half;
vector -= Round;
@ -134,7 +153,7 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToRgb24(ref Rgb24 dest)
{
Vector4 vector = this.ToScaledVector4();
Vector4 vector = this.ToByteScaledVector4();
dest.R = (byte)vector.X;
dest.G = (byte)vector.Y;
dest.B = 0;
@ -144,7 +163,7 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToRgba32(ref Rgba32 dest)
{
Vector4 vector = this.ToScaledVector4();
Vector4 vector = this.ToByteScaledVector4();
dest.R = (byte)vector.X;
dest.G = (byte)vector.Y;
dest.B = 0;
@ -155,7 +174,7 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToBgr24(ref Bgr24 dest)
{
Vector4 vector = this.ToScaledVector4();
Vector4 vector = this.ToByteScaledVector4();
dest.R = (byte)vector.X;
dest.G = (byte)vector.Y;
dest.B = 0;
@ -165,7 +184,7 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToBgra32(ref Bgra32 dest)
{
Vector4 vector = this.ToScaledVector4();
Vector4 vector = this.ToByteScaledVector4();
dest.R = (byte)vector.X;
dest.G = (byte)vector.Y;
dest.B = 0;
@ -214,9 +233,9 @@ namespace SixLabors.ImageSharp.PixelFormats
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private Vector4 ToScaledVector4()
private Vector4 ToByteScaledVector4()
{
Vector4 vector = this.ToVector4();
var vector = this.ToVector4();
vector *= Half;
vector += Round;
vector += Half;

33
src/ImageSharp/PixelFormats/NormalizedByte4.cs

@ -93,6 +93,25 @@ namespace SixLabors.ImageSharp.PixelFormats
/// <inheritdoc />
public PixelOperations<NormalizedByte4> CreatePixelOperations() => new PixelOperations<NormalizedByte4>();
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromScaledVector4(Vector4 vector)
{
vector *= 2F;
vector -= Vector4.One;
this.PackFromVector4(vector);
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public Vector4 ToScaledVector4()
{
var scaled = this.ToVector4();
scaled += Vector4.One;
scaled /= 2F;
return scaled;
}
/// <inheritdoc />
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromVector4(Vector4 vector)
@ -115,7 +134,7 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromRgba32(Rgba32 source)
{
Vector4 vector = source.ToUnscaledVector4();
Vector4 vector = source.ToByteScaledVector4();
vector -= Round;
vector -= Half;
vector -= Round;
@ -127,7 +146,7 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToRgb24(ref Rgb24 dest)
{
Vector4 vector = this.ToScaledVector4();
Vector4 vector = this.ToByteScaledVector4();
dest.R = (byte)vector.X;
dest.G = (byte)vector.Y;
dest.B = (byte)vector.Z;
@ -137,7 +156,7 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToRgba32(ref Rgba32 dest)
{
Vector4 vector = this.ToScaledVector4();
Vector4 vector = this.ToByteScaledVector4();
dest.R = (byte)vector.X;
dest.G = (byte)vector.Y;
dest.B = (byte)vector.Z;
@ -148,7 +167,7 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToBgr24(ref Bgr24 dest)
{
Vector4 vector = this.ToScaledVector4();
Vector4 vector = this.ToByteScaledVector4();
dest.R = (byte)vector.X;
dest.G = (byte)vector.Y;
dest.B = (byte)vector.Z;
@ -158,7 +177,7 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToBgra32(ref Bgra32 dest)
{
Vector4 vector = this.ToScaledVector4();
Vector4 vector = this.ToByteScaledVector4();
dest.R = (byte)vector.X;
dest.G = (byte)vector.Y;
dest.B = (byte)vector.Z;
@ -211,9 +230,9 @@ namespace SixLabors.ImageSharp.PixelFormats
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private Vector4 ToScaledVector4()
private Vector4 ToByteScaledVector4()
{
Vector4 vector = this.ToVector4();
var vector = this.ToVector4();
vector *= Half;
vector += Round;
vector += Half;

33
src/ImageSharp/PixelFormats/NormalizedShort2.cs

@ -91,6 +91,25 @@ namespace SixLabors.ImageSharp.PixelFormats
/// <inheritdoc />
public PixelOperations<NormalizedShort2> CreatePixelOperations() => new PixelOperations<NormalizedShort2>();
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromScaledVector4(Vector4 vector)
{
Vector2 scaled = new Vector2(vector.X, vector.Y) * 2F;
scaled -= Vector2.One;
this.PackedValue = Pack(scaled.X, scaled.Y);
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public Vector4 ToScaledVector4()
{
var scaled = this.ToVector2();
scaled += Vector2.One;
scaled /= 2F;
return new Vector4(scaled, 0F, 1F);
}
/// <inheritdoc />
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromVector4(Vector4 vector)
@ -109,7 +128,7 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromRgba32(Rgba32 source)
{
Vector4 vector = source.ToUnscaledVector4();
Vector4 vector = source.ToByteScaledVector4();
vector -= Round;
vector -= Half;
vector -= Round;
@ -121,7 +140,7 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToRgb24(ref Rgb24 dest)
{
Vector4 vector = this.ToScaledVector4();
Vector4 vector = this.ToByteScaledVector4();
dest.R = (byte)MathF.Round(vector.X);
dest.G = (byte)MathF.Round(vector.Y);
dest.B = 0;
@ -131,7 +150,7 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToRgba32(ref Rgba32 dest)
{
Vector4 vector = this.ToScaledVector4();
Vector4 vector = this.ToByteScaledVector4();
dest.R = (byte)MathF.Round(vector.X);
dest.G = (byte)MathF.Round(vector.Y);
dest.B = 0;
@ -142,7 +161,7 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToBgr24(ref Bgr24 dest)
{
Vector4 vector = this.ToScaledVector4();
Vector4 vector = this.ToByteScaledVector4();
dest.R = (byte)MathF.Round(vector.X);
dest.G = (byte)MathF.Round(vector.Y);
dest.B = 0;
@ -152,7 +171,7 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToBgra32(ref Bgra32 dest)
{
Vector4 vector = this.ToScaledVector4();
Vector4 vector = this.ToByteScaledVector4();
dest.R = (byte)MathF.Round(vector.X);
dest.G = (byte)MathF.Round(vector.Y);
dest.B = 0;
@ -221,9 +240,9 @@ namespace SixLabors.ImageSharp.PixelFormats
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private Vector4 ToScaledVector4()
private Vector4 ToByteScaledVector4()
{
Vector4 vector = this.ToVector4();
var vector = this.ToVector4();
vector *= Half;
vector += Round;
vector += Half;

33
src/ImageSharp/PixelFormats/NormalizedShort4.cs

@ -93,6 +93,25 @@ namespace SixLabors.ImageSharp.PixelFormats
/// <inheritdoc />
public PixelOperations<NormalizedShort4> CreatePixelOperations() => new PixelOperations<NormalizedShort4>();
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromScaledVector4(Vector4 vector)
{
vector *= 2F;
vector -= Vector4.One;
this.PackFromVector4(vector);
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public Vector4 ToScaledVector4()
{
var scaled = this.ToVector4();
scaled += Vector4.One;
scaled /= 2F;
return scaled;
}
/// <inheritdoc />
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromVector4(Vector4 vector)
@ -117,7 +136,7 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromRgba32(Rgba32 source)
{
Vector4 vector = source.ToUnscaledVector4();
Vector4 vector = source.ToByteScaledVector4();
vector -= Round;
vector -= Half;
vector -= Round;
@ -129,7 +148,7 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToRgb24(ref Rgb24 dest)
{
Vector4 vector = this.ToScaledVector4();
Vector4 vector = this.ToByteScaledVector4();
dest.R = (byte)MathF.Round(vector.X);
dest.G = (byte)MathF.Round(vector.Y);
dest.B = (byte)MathF.Round(vector.Z);
@ -139,7 +158,7 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToRgba32(ref Rgba32 dest)
{
Vector4 vector = this.ToScaledVector4();
Vector4 vector = this.ToByteScaledVector4();
dest.R = (byte)MathF.Round(vector.X);
dest.G = (byte)MathF.Round(vector.Y);
dest.B = (byte)MathF.Round(vector.Z);
@ -150,7 +169,7 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToBgr24(ref Bgr24 dest)
{
Vector4 vector = this.ToScaledVector4();
Vector4 vector = this.ToByteScaledVector4();
dest.R = (byte)MathF.Round(vector.X);
dest.G = (byte)MathF.Round(vector.Y);
dest.B = (byte)MathF.Round(vector.Z);
@ -160,7 +179,7 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToBgra32(ref Bgra32 dest)
{
Vector4 vector = this.ToScaledVector4();
Vector4 vector = this.ToByteScaledVector4();
dest.R = (byte)MathF.Round(vector.X);
dest.G = (byte)MathF.Round(vector.Y);
dest.B = (byte)MathF.Round(vector.Z);
@ -217,9 +236,9 @@ namespace SixLabors.ImageSharp.PixelFormats
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private Vector4 ToScaledVector4()
private Vector4 ToByteScaledVector4()
{
Vector4 vector = this.ToVector4();
var vector = this.ToVector4();
vector *= Half;
vector += Round;
vector += Half;

24
src/ImageSharp/PixelFormats/Rg32.cs

@ -89,6 +89,20 @@ namespace SixLabors.ImageSharp.PixelFormats
((this.PackedValue >> 16) & 0xFFFF) / 65535F);
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromScaledVector4(Vector4 vector)
{
this.PackFromVector4(vector);
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public Vector4 ToScaledVector4()
{
return this.ToVector4();
}
/// <inheritdoc />
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromVector4(Vector4 vector)
@ -114,7 +128,7 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToRgb24(ref Rgb24 dest)
{
Vector4 vector = this.ToScaledVector4();
Vector4 vector = this.ToByteScaledVector4();
dest.R = (byte)vector.X;
dest.G = (byte)vector.Y;
dest.B = (byte)vector.Z;
@ -124,7 +138,7 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToRgba32(ref Rgba32 dest)
{
Vector4 vector = this.ToScaledVector4();
Vector4 vector = this.ToByteScaledVector4();
dest.R = (byte)vector.X;
dest.G = (byte)vector.Y;
dest.B = (byte)vector.Z;
@ -135,7 +149,7 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToBgr24(ref Bgr24 dest)
{
Vector4 vector = this.ToScaledVector4();
Vector4 vector = this.ToByteScaledVector4();
dest.R = (byte)vector.X;
dest.G = (byte)vector.Y;
dest.B = (byte)vector.Z;
@ -145,7 +159,7 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToBgra32(ref Bgra32 dest)
{
Vector4 vector = this.ToScaledVector4();
Vector4 vector = this.ToByteScaledVector4();
dest.R = (byte)vector.X;
dest.G = (byte)vector.Y;
dest.B = (byte)vector.Z;
@ -193,6 +207,6 @@ namespace SixLabors.ImageSharp.PixelFormats
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private Vector4 ToScaledVector4() => this.ToVector4() * 255f;
private Vector4 ToByteScaledVector4() => this.ToVector4() * 255F;
}
}

14
src/ImageSharp/PixelFormats/Rgb24.cs

@ -80,6 +80,20 @@ namespace SixLabors.ImageSharp.PixelFormats
this = Unsafe.As<Rgba32, Rgb24>(ref source);
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromScaledVector4(Vector4 vector)
{
this.PackFromVector4(vector);
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public Vector4 ToScaledVector4()
{
return this.ToVector4();
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromVector4(Vector4 vector)

14
src/ImageSharp/PixelFormats/Rgba1010102.cs

@ -79,6 +79,20 @@ namespace SixLabors.ImageSharp.PixelFormats
/// <inheritdoc />
public PixelOperations<Rgba1010102> CreatePixelOperations() => new PixelOperations<Rgba1010102>();
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromScaledVector4(Vector4 vector)
{
this.PackFromVector4(vector);
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public Vector4 ToScaledVector4()
{
return this.ToVector4();
}
/// <inheritdoc />
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public Vector4 ToVector4()

16
src/ImageSharp/PixelFormats/Rgba32.cs

@ -318,6 +318,20 @@ namespace SixLabors.ImageSharp.PixelFormats
dest.A = this.A;
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromScaledVector4(Vector4 vector)
{
this.PackFromVector4(vector);
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public Vector4 ToScaledVector4()
{
return this.ToVector4();
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromVector4(Vector4 vector)
@ -383,7 +397,7 @@ namespace SixLabors.ImageSharp.PixelFormats
/// </summary>
/// <returns>A <see cref="Vector4"/> of values in [0, 255] </returns>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal Vector4 ToUnscaledVector4()
internal Vector4 ToByteScaledVector4()
{
return new Vector4(this.R, this.G, this.B, this.A);
}

14
src/ImageSharp/PixelFormats/Rgba64.cs

@ -78,6 +78,20 @@ namespace SixLabors.ImageSharp.PixelFormats
/// <inheritdoc />
public PixelOperations<Rgba64> CreatePixelOperations() => new PixelOperations<Rgba64>();
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromScaledVector4(Vector4 vector)
{
this.PackFromVector4(vector);
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public Vector4 ToScaledVector4()
{
return this.ToVector4();
}
/// <inheritdoc />
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public Vector4 ToVector4()

24
src/ImageSharp/PixelFormats/RgbaVector.cs

@ -235,7 +235,7 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToRgb24(ref Rgb24 dest)
{
Vector4 vector = this.ToScaledVector4();
Vector4 vector = this.ToByteScaledVector4();
dest.R = (byte)MathF.Round(vector.X);
dest.G = (byte)MathF.Round(vector.Y);
dest.B = (byte)MathF.Round(vector.Z);
@ -245,7 +245,7 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToRgba32(ref Rgba32 dest)
{
Vector4 vector = this.ToScaledVector4();
Vector4 vector = this.ToByteScaledVector4();
dest.R = (byte)MathF.Round(vector.X);
dest.G = (byte)MathF.Round(vector.Y);
dest.B = (byte)MathF.Round(vector.Z);
@ -256,7 +256,7 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToBgr24(ref Bgr24 dest)
{
Vector4 vector = this.ToScaledVector4();
Vector4 vector = this.ToByteScaledVector4();
dest.R = (byte)MathF.Round(vector.X);
dest.G = (byte)MathF.Round(vector.Y);
dest.B = (byte)MathF.Round(vector.Z);
@ -266,13 +266,27 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToBgra32(ref Bgra32 dest)
{
Vector4 vector = this.ToScaledVector4();
Vector4 vector = this.ToByteScaledVector4();
dest.R = (byte)MathF.Round(vector.X);
dest.G = (byte)MathF.Round(vector.Y);
dest.B = (byte)MathF.Round(vector.Z);
dest.A = (byte)MathF.Round(vector.W);
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromScaledVector4(Vector4 vector)
{
this.PackFromVector4(vector);
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public Vector4 ToScaledVector4()
{
return this.ToVector4();
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromVector4(Vector4 vector)
@ -316,6 +330,6 @@ namespace SixLabors.ImageSharp.PixelFormats
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private Vector4 ToScaledVector4() => Vector4.Clamp(this.backingVector, Vector4.Zero, Vector4.One) * MaxBytes;
private Vector4 ToByteScaledVector4() => Vector4.Clamp(this.backingVector, Vector4.Zero, Vector4.One) * MaxBytes;
}
}

31
src/ImageSharp/PixelFormats/Short2.cs

@ -91,6 +91,25 @@ namespace SixLabors.ImageSharp.PixelFormats
/// <inheritdoc />
public PixelOperations<Short2> CreatePixelOperations() => new PixelOperations<Short2>();
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromScaledVector4(Vector4 vector)
{
Vector2 scaled = new Vector2(vector.X, vector.Y) * 65534F;
scaled -= new Vector2(32767F);
this.PackedValue = Pack(scaled.X, scaled.Y);
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public Vector4 ToScaledVector4()
{
var scaled = this.ToVector2();
scaled += new Vector2(32767F);
scaled /= 65534F;
return new Vector4(scaled, 0F, 1F);
}
/// <inheritdoc />
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromVector4(Vector4 vector)
@ -119,7 +138,7 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToRgb24(ref Rgb24 dest)
{
Vector2 vector = this.ToScaledVector2();
Vector2 vector = this.ToByteScaledVector2();
dest.R = (byte)MathF.Round(vector.X);
dest.G = (byte)MathF.Round(vector.Y);
dest.B = 0;
@ -129,7 +148,7 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToRgba32(ref Rgba32 dest)
{
Vector2 vector = this.ToScaledVector2();
Vector2 vector = this.ToByteScaledVector2();
dest.R = (byte)MathF.Round(vector.X);
dest.G = (byte)MathF.Round(vector.Y);
dest.B = 0;
@ -140,7 +159,7 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToBgr24(ref Bgr24 dest)
{
Vector2 vector = this.ToScaledVector2();
Vector2 vector = this.ToByteScaledVector2();
dest.R = (byte)MathF.Round(vector.X);
dest.G = (byte)MathF.Round(vector.Y);
dest.B = 0;
@ -150,7 +169,7 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToBgra32(ref Bgra32 dest)
{
Vector2 vector = this.ToScaledVector2();
Vector2 vector = this.ToByteScaledVector2();
dest.R = (byte)MathF.Round(vector.X);
dest.G = (byte)MathF.Round(vector.Y);
dest.B = 0;
@ -215,9 +234,9 @@ namespace SixLabors.ImageSharp.PixelFormats
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private Vector2 ToScaledVector2()
private Vector2 ToByteScaledVector2()
{
Vector2 vector = this.ToVector2();
var vector = this.ToVector2();
vector /= 65534;
vector *= 255;
vector += Half;

33
src/ImageSharp/PixelFormats/Short4.cs

@ -93,6 +93,25 @@ namespace SixLabors.ImageSharp.PixelFormats
/// <inheritdoc />
public PixelOperations<Short4> CreatePixelOperations() => new PixelOperations<Short4>();
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromScaledVector4(Vector4 vector)
{
vector *= 65534F;
vector -= new Vector4(32767F);
this.PackFromVector4(vector);
}
/// <inheritdoc/>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public Vector4 ToScaledVector4()
{
var scaled = this.ToVector4();
scaled += new Vector4(32767F);
scaled /= 65534F;
return scaled;
}
/// <inheritdoc />
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromVector4(Vector4 vector)
@ -115,7 +134,7 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void PackFromRgba32(Rgba32 source)
{
Vector4 vector = source.ToVector4();
var vector = source.ToVector4();
vector *= 65534;
vector -= new Vector4(32767);
this.PackedValue = Pack(vector.X, vector.Y, vector.Z, vector.W);
@ -125,7 +144,7 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToRgb24(ref Rgb24 dest)
{
Vector4 vector = this.ToScaledVector4();
Vector4 vector = this.ToByteScaledVector4();
dest.R = (byte)MathF.Round(vector.X);
dest.G = (byte)MathF.Round(vector.Y);
dest.B = (byte)MathF.Round(vector.Z);
@ -135,7 +154,7 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToRgba32(ref Rgba32 dest)
{
Vector4 vector = this.ToScaledVector4();
Vector4 vector = this.ToByteScaledVector4();
dest.R = (byte)MathF.Round(vector.X);
dest.G = (byte)MathF.Round(vector.Y);
dest.B = (byte)MathF.Round(vector.Z);
@ -146,7 +165,7 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToBgr24(ref Bgr24 dest)
{
Vector4 vector = this.ToScaledVector4();
Vector4 vector = this.ToByteScaledVector4();
dest.R = (byte)MathF.Round(vector.X);
dest.G = (byte)MathF.Round(vector.Y);
dest.B = (byte)MathF.Round(vector.Z);
@ -156,7 +175,7 @@ namespace SixLabors.ImageSharp.PixelFormats
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void ToBgra32(ref Bgra32 dest)
{
Vector4 vector = this.ToScaledVector4();
Vector4 vector = this.ToByteScaledVector4();
dest.R = (byte)MathF.Round(vector.X);
dest.G = (byte)MathF.Round(vector.Y);
dest.B = (byte)MathF.Round(vector.Z);
@ -222,9 +241,9 @@ namespace SixLabors.ImageSharp.PixelFormats
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private Vector4 ToScaledVector4()
private Vector4 ToByteScaledVector4()
{
Vector4 vector = this.ToVector4();
var vector = this.ToVector4();
vector /= 65534;
vector *= 255;
vector += Half;

235
tests/ImageSharp.Tests/PixelFormats/PackedPixelTests.cs

@ -32,14 +32,26 @@ namespace SixLabors.ImageSharp.Tests.Colors
Assert.Equal(124, new Alpha8(124F / 0xFF).PackedValue);
Assert.Equal(26, new Alpha8(0.1F).PackedValue);
// Test ordering
// Test ToVector4.
var vector = new Alpha8(.5F).ToVector4();
Assert.Equal(0, vector.X);
Assert.Equal(0, vector.Y);
Assert.Equal(0, vector.Z);
Assert.Equal(.5F, vector.W, 2);
// Test ToScaledVector4.
Vector4 scaled = new Alpha8(.5F).ToScaledVector4();
Assert.Equal(0, scaled.X);
Assert.Equal(0, scaled.Y);
Assert.Equal(0, scaled.Z);
Assert.Equal(.5F, scaled.W, 2);
// Test PackFromScaledVector4.
var pixel = default(Alpha8);
pixel.PackFromScaledVector4(scaled);
Assert.Equal(128, pixel.PackedValue);
// Test Rgb conversion
var rgb = default(Rgb24);
var rgba = default(Rgba32);
var bgr = default(Bgr24);
@ -73,6 +85,18 @@ namespace SixLabors.ImageSharp.Tests.Colors
Assert.True(Equal(Vector4.UnitZ, new Argb32(Vector4.UnitZ).ToVector4()));
Assert.True(Equal(Vector4.UnitW, new Argb32(Vector4.UnitW).ToVector4()));
// Test ToScaledVector4.
Vector4 scaled = new Argb32(Vector4.One).ToScaledVector4();
Assert.Equal(1, scaled.X);
Assert.Equal(1, scaled.Y);
Assert.Equal(1, scaled.Z);
Assert.Equal(1, scaled.W);
// Test PackFromScaledVector4.
var pixel = default(Argb32);
pixel.PackFromScaledVector4(scaled);
Assert.Equal(0xFFFFFFFF, pixel.PackedValue);
// Test clamping.
Assert.True(Equal(Vector4.Zero, new Argb32(Vector4.One * -1234.0f).ToVector4()));
Assert.True(Equal(Vector4.One, new Argb32(Vector4.One * +1234.0f).ToVector4()));
@ -90,6 +114,7 @@ namespace SixLabors.ImageSharp.Tests.Colors
var bgr = default(Bgr24);
var bgra = default(Bgra32);
argb.ToRgb24(ref rgb);
Assert.Equal(rgb, new Rgb24(0x1a, 0, 0x80));
@ -117,6 +142,18 @@ namespace SixLabors.ImageSharp.Tests.Colors
Assert.True(Equal(Vector3.UnitY, new Bgr565(Vector3.UnitY).ToVector3()));
Assert.True(Equal(Vector3.UnitZ, new Bgr565(Vector3.UnitZ).ToVector3()));
// Test ToScaledVector4.
Vector4 scaled = new Bgr565(Vector3.One).ToScaledVector4();
Assert.Equal(1, scaled.X);
Assert.Equal(1, scaled.Y);
Assert.Equal(1, scaled.Z);
Assert.Equal(1, scaled.W);
// Test PackFromScaledVector4.
var pixel = default(Bgr565);
pixel.PackFromScaledVector4(scaled);
Assert.Equal(0xFFFF, pixel.PackedValue);
// Test clamping.
Assert.True(Equal(Vector3.Zero, new Bgr565(Vector3.One * -1234F).ToVector3()));
Assert.True(Equal(Vector3.One, new Bgr565(Vector3.One * 1234F).ToVector3()));
@ -165,6 +202,18 @@ namespace SixLabors.ImageSharp.Tests.Colors
Assert.True(Equal(Vector4.UnitZ, new Bgra4444(Vector4.UnitZ).ToVector4()));
Assert.True(Equal(Vector4.UnitW, new Bgra4444(Vector4.UnitW).ToVector4()));
// Test ToScaledVector4.
Vector4 scaled = new Bgra4444(Vector4.One).ToScaledVector4();
Assert.Equal(1, scaled.X);
Assert.Equal(1, scaled.Y);
Assert.Equal(1, scaled.Z);
Assert.Equal(1, scaled.W);
// Test PackFromScaledVector4.
var pixel = default(Bgra4444);
pixel.PackFromScaledVector4(scaled);
Assert.Equal(0xFFFF, pixel.PackedValue);
// Test clamping.
Assert.True(Equal(Vector4.Zero, new Bgra4444(Vector4.One * -1234.0f).ToVector4()));
Assert.True(Equal(Vector4.One, new Bgra4444(Vector4.One * 1234.0f).ToVector4()));
@ -211,6 +260,18 @@ namespace SixLabors.ImageSharp.Tests.Colors
Assert.True(Equal(Vector4.Zero, new Bgra5551(Vector4.Zero).ToVector4()));
Assert.True(Equal(Vector4.One, new Bgra5551(Vector4.One).ToVector4()));
// Test ToScaledVector4.
Vector4 scaled = new Bgra5551(Vector4.One).ToScaledVector4();
Assert.Equal(1, scaled.X);
Assert.Equal(1, scaled.Y);
Assert.Equal(1, scaled.Z);
Assert.Equal(1, scaled.W);
// Test PackFromScaledVector4.
var pixel = default(Bgra5551);
pixel.PackFromScaledVector4(scaled);
Assert.Equal(0xFFFF, pixel.PackedValue);
// Test clamping.
Assert.Equal(Vector4.Zero, new Bgra5551(Vector4.One * -1234.0f).ToVector4());
Assert.Equal(Vector4.One, new Bgra5551(Vector4.One * 1234.0f).ToVector4());
@ -261,6 +322,18 @@ namespace SixLabors.ImageSharp.Tests.Colors
Assert.True(Equal(Vector4.UnitZ * 255, new Byte4(Vector4.UnitZ * 255).ToVector4()));
Assert.True(Equal(Vector4.UnitW * 255, new Byte4(Vector4.UnitW * 255).ToVector4()));
// Test ToScaledVector4.
Vector4 scaled = new Byte4(Vector4.One * 255).ToScaledVector4();
Assert.Equal(1, scaled.X);
Assert.Equal(1, scaled.Y);
Assert.Equal(1, scaled.Z);
Assert.Equal(1, scaled.W);
// Test PackFromScaledVector4.
var pixel = default(Byte4);
pixel.PackFromScaledVector4(scaled);
Assert.Equal(0xFFFFFFFF, pixel.PackedValue);
// Test clamping.
Assert.True(Equal(Vector4.Zero, new Byte4(Vector4.One * -1234.0f).ToVector4()));
Assert.True(Equal(Vector4.One * 255, new Byte4(Vector4.One * 1234.0f).ToVector4()));
@ -318,6 +391,18 @@ namespace SixLabors.ImageSharp.Tests.Colors
float x = .5F;
Assert.True(Equal(new Vector4(x, 0, 0, 1), new HalfSingle(x).ToVector4()));
// Test ToScaledVector4.
Vector4 scaled = new HalfSingle(-1F).ToScaledVector4();
Assert.Equal(0, scaled.X);
Assert.Equal(0, scaled.Y);
Assert.Equal(0, scaled.Z);
Assert.Equal(1, scaled.W);
// Test PackFromScaledVector4.
var pixel = default(HalfSingle);
pixel.PackFromScaledVector4(scaled);
Assert.Equal(48128, pixel.PackedValue);
var rgb = default(Rgb24);
var rgba = default(Rgba32);
var bgr = default(Bgr24);
@ -350,6 +435,18 @@ namespace SixLabors.ImageSharp.Tests.Colors
Assert.True(Equal(Vector2.UnitX, new HalfVector2(Vector2.UnitX).ToVector2()));
Assert.True(Equal(Vector2.UnitY, new HalfVector2(Vector2.UnitY).ToVector2()));
// Test ToScaledVector4.
Vector4 scaled = new HalfVector2(Vector2.One).ToScaledVector4();
Assert.Equal(1F, scaled.X);
Assert.Equal(1F, scaled.Y);
Assert.Equal(0, scaled.Z);
Assert.Equal(1, scaled.W);
// Test PackFromScaledVector4.
var pixel = default(HalfVector2);
pixel.PackFromScaledVector4(scaled);
Assert.Equal(1006648320u, pixel.PackedValue);
// Test ordering
float x = .5F;
float y = .25F;
@ -395,6 +492,18 @@ namespace SixLabors.ImageSharp.Tests.Colors
Assert.True(Equal(Vector4.UnitZ, new HalfVector4(Vector4.UnitZ).ToVector4()));
Assert.True(Equal(Vector4.UnitW, new HalfVector4(Vector4.UnitW).ToVector4()));
// Test ToScaledVector4.
Vector4 scaled = new HalfVector4(-Vector4.One).ToScaledVector4();
Assert.Equal(0, scaled.X);
Assert.Equal(0, scaled.Y);
Assert.Equal(0, scaled.Z);
Assert.Equal(0, scaled.W);
// Test PackFromScaledVector4.
var pixel = default(HalfVector4);
pixel.PackFromScaledVector4(scaled);
Assert.Equal(13547034390470638592uL, pixel.PackedValue);
// Test ordering
float x = .25F;
float y = .5F;
@ -438,6 +547,18 @@ namespace SixLabors.ImageSharp.Tests.Colors
Assert.True(Equal(new Vector4(1, 1, 0, 1), new NormalizedByte2(Vector2.One).ToVector4()));
Assert.True(Equal(new Vector4(0, 0, 0, 1), new NormalizedByte2(Vector2.Zero).ToVector4()));
// Test ToScaledVector4.
Vector4 scaled = new NormalizedByte2(-Vector2.One).ToScaledVector4();
Assert.Equal(0, scaled.X);
Assert.Equal(0, scaled.Y);
Assert.Equal(0, scaled.Z);
Assert.Equal(1F, scaled.W);
// Test PackFromScaledVector4.
var pixel = default(NormalizedByte2);
pixel.PackFromScaledVector4(scaled);
Assert.Equal(0x8181, pixel.PackedValue);
// Test Ordering
float x = 0.1f;
float y = -0.3f;
@ -479,6 +600,18 @@ namespace SixLabors.ImageSharp.Tests.Colors
Assert.True(Equal(Vector4.One, new NormalizedByte4(Vector4.One * 1234.0f).ToVector4()));
Assert.True(Equal(-Vector4.One, new NormalizedByte4(Vector4.One * -1234.0f).ToVector4()));
// Test ToScaledVector4.
Vector4 scaled = new NormalizedByte4(-Vector4.One).ToScaledVector4();
Assert.Equal(0, scaled.X);
Assert.Equal(0, scaled.Y);
Assert.Equal(0, scaled.Z);
Assert.Equal(0, scaled.W);
// Test PackFromScaledVector4.
var pixel = default(NormalizedByte4);
pixel.PackFromScaledVector4(scaled);
Assert.Equal(0x81818181, pixel.PackedValue);
// Test Ordering
float x = 0.1f;
float y = -0.3f;
@ -535,6 +668,18 @@ namespace SixLabors.ImageSharp.Tests.Colors
Assert.True(Equal(new Vector4(1, 1, 0, 1), (new NormalizedShort2(Vector2.One)).ToVector4()));
Assert.True(Equal(new Vector4(0, 0, 0, 1), (new NormalizedShort2(Vector2.Zero)).ToVector4()));
// Test ToScaledVector4.
Vector4 scaled = new NormalizedShort2(-Vector2.One).ToScaledVector4();
Assert.Equal(0, scaled.X);
Assert.Equal(0, scaled.Y);
Assert.Equal(0, scaled.Z);
Assert.Equal(1, scaled.W);
// Test PackFromScaledVector4.
var pixel = default(NormalizedShort2);
pixel.PackFromScaledVector4(scaled);
Assert.Equal(0x80018001, pixel.PackedValue);
// Test Ordering
float x = 0.35f;
float y = -0.2f;
@ -584,6 +729,18 @@ namespace SixLabors.ImageSharp.Tests.Colors
Assert.True(Equal(Vector4.One, new NormalizedShort4(Vector4.One * 1234.0f).ToVector4()));
Assert.True(Equal(-Vector4.One, new NormalizedShort4(Vector4.One * -1234.0f).ToVector4()));
// Test ToScaledVector4.
Vector4 scaled = new NormalizedShort4(Vector4.One).ToScaledVector4();
Assert.Equal(1, scaled.X);
Assert.Equal(1, scaled.Y);
Assert.Equal(1, scaled.Z);
Assert.Equal(1, scaled.W);
// Test PackFromScaledVector4.
var pixel = default(NormalizedShort4);
pixel.PackFromScaledVector4(scaled);
Assert.Equal((ulong)0x7FFF7FFF7FFF7FFF, pixel.PackedValue);
// Test Ordering
float x = 0.1f;
float y = -0.3f;
@ -626,6 +783,18 @@ namespace SixLabors.ImageSharp.Tests.Colors
Assert.True(Equal(Vector2.Zero, new Rg32(Vector2.Zero).ToVector2()));
Assert.True(Equal(Vector2.One, new Rg32(Vector2.One).ToVector2()));
// Test ToScaledVector4.
Vector4 scaled = new Rg32(Vector2.One).ToScaledVector4();
Assert.Equal(1, scaled.X);
Assert.Equal(1, scaled.Y);
Assert.Equal(0, scaled.Z);
Assert.Equal(1, scaled.W);
// Test PackFromScaledVector4.
var pixel = default(Rg32);
pixel.PackFromScaledVector4(scaled);
Assert.Equal(0xFFFFFFFF, pixel.PackedValue);
// Test clamping.
Assert.True(Equal(Vector2.Zero, new Rg32(Vector2.One * -1234.0f).ToVector2()));
Assert.True(Equal(Vector2.One, new Rg32(Vector2.One * 1234.0f).ToVector2()));
@ -668,6 +837,18 @@ namespace SixLabors.ImageSharp.Tests.Colors
Assert.True(Equal(Vector4.Zero, new Rgba1010102(Vector4.Zero).ToVector4()));
Assert.True(Equal(Vector4.One, new Rgba1010102(Vector4.One).ToVector4()));
// Test ToScaledVector4.
Vector4 scaled = new Rgba1010102(Vector4.One).ToScaledVector4();
Assert.Equal(1, scaled.X);
Assert.Equal(1, scaled.Y);
Assert.Equal(1, scaled.Z);
Assert.Equal(1, scaled.W);
// Test PackFromScaledVector4.
var pixel = default(Rgba1010102);
pixel.PackFromScaledVector4(scaled);
Assert.Equal(0xFFFFFFFF, pixel.PackedValue);
// Test clamping.
Assert.True(Equal(Vector4.Zero, new Rgba1010102(Vector4.One * -1234.0f).ToVector4()));
Assert.True(Equal(Vector4.One, new Rgba1010102(Vector4.One * 1234.0f).ToVector4()));
@ -709,7 +890,7 @@ namespace SixLabors.ImageSharp.Tests.Colors
}
[Fact]
public void Color()
public void Rgba32()
{
// Test the limits.
Assert.Equal((uint)0x0, new Rgba32(Vector4.Zero).PackedValue);
@ -723,6 +904,18 @@ namespace SixLabors.ImageSharp.Tests.Colors
Assert.True(Equal(Vector4.UnitZ, new Rgba32(Vector4.UnitZ).ToVector4()));
Assert.True(Equal(Vector4.UnitW, new Rgba32(Vector4.UnitW).ToVector4()));
// Test ToScaledVector4.
Vector4 scaled = new Rgba32(Vector4.One).ToScaledVector4();
Assert.Equal(1, scaled.X);
Assert.Equal(1, scaled.Y);
Assert.Equal(1, scaled.Z);
Assert.Equal(1, scaled.W);
// Test PackFromScaledVector4.
var pixel = default(Rgba32);
pixel.PackFromScaledVector4(scaled);
Assert.Equal(0xFFFFFFFF, pixel.PackedValue);
// Test clamping.
Assert.True(Equal(Vector4.Zero, new Rgba32(Vector4.One * -1234.0f).ToVector4()));
Assert.True(Equal(Vector4.One, new Rgba32(Vector4.One * +1234.0f).ToVector4()));
@ -764,6 +957,18 @@ namespace SixLabors.ImageSharp.Tests.Colors
Assert.True(Equal(Vector4.Zero, new Rgba64(Vector4.Zero).ToVector4()));
Assert.True(Equal(Vector4.One, new Rgba64(Vector4.One).ToVector4()));
// Test ToScaledVector4.
Vector4 scaled = new Rgba64(Vector4.One).ToScaledVector4();
Assert.Equal(1, scaled.X);
Assert.Equal(1, scaled.Y);
Assert.Equal(1, scaled.Z);
Assert.Equal(1, scaled.W);
// Test PackFromScaledVector4.
var pixel = default(Rgba64);
pixel.PackFromScaledVector4(scaled);
Assert.Equal(0xFFFFFFFFFFFFFFFF, pixel.PackedValue);
// Test clamping.
Assert.True(Equal(Vector4.Zero, new Rgba64(Vector4.One * -1234.0f).ToVector4()));
Assert.True(Equal(Vector4.One, new Rgba64(Vector4.One * 1234.0f).ToVector4()));
@ -825,6 +1030,18 @@ namespace SixLabors.ImageSharp.Tests.Colors
Assert.True(Equal(new Vector4(0, 0, 0, 1), (new Short2(Vector2.Zero)).ToVector4()));
Assert.True(Equal(new Vector4(-0x8000, -0x8000, 0, 1), (new Short2(Vector2.One * -0x8000)).ToVector4()));
// Test ToScaledVector4.
Vector4 scaled = new Short2(Vector2.One * 0x7FFF).ToScaledVector4();
Assert.Equal(1, scaled.X);
Assert.Equal(1, scaled.Y);
Assert.Equal(0, scaled.Z);
Assert.Equal(1, scaled.W);
// Test PackFromScaledVector4.
var pixel = default(Short2);
pixel.PackFromScaledVector4(scaled);
Assert.Equal((uint)0x7FFF7FFF, pixel.PackedValue);
// Test ordering
float x = 0x2db1;
float y = 0x361d;
@ -873,6 +1090,18 @@ namespace SixLabors.ImageSharp.Tests.Colors
Assert.Equal(Vector4.UnitZ * 0x7FFF, new Short4(Vector4.UnitZ * 0x7FFF).ToVector4());
Assert.Equal(Vector4.UnitW * 0x7FFF, new Short4(Vector4.UnitW * 0x7FFF).ToVector4());
// Test ToScaledVector4.
Vector4 scaled = new Short4(Vector4.One * 0x7FFF).ToScaledVector4();
Assert.Equal(1, scaled.X);
Assert.Equal(1, scaled.Y);
Assert.Equal(1, scaled.Z);
Assert.Equal(1, scaled.W);
// Test PackFromScaledVector4.
var pixel = default(Short4);
pixel.PackFromScaledVector4(scaled);
Assert.Equal((ulong)0x7FFF7FFF7FFF7FFF, pixel.PackedValue);
// Test clamping.
Assert.Equal(Vector4.One * 0x7FFF, new Short4(Vector4.One * 1234567.0f).ToVector4());
Assert.Equal(Vector4.One * -0x8000, new Short4(Vector4.One * -1234567.0f).ToVector4());

Loading…
Cancel
Save