Browse Source

better docs, drop PixelExtensions, fix tests

pull/751/head
Anton Firszov 8 years ago
parent
commit
09de1b1cde
  1. 12
      src/ImageSharp/PixelFormats/Utils/PixelConverter.cs
  2. 22
      src/ImageSharp/PixelFormats/Utils/PixelExtensions.cs
  3. 4
      tests/ImageSharp.Tests/Drawing/FillLinearGradientBrushTests.cs
  4. 3
      tests/ImageSharp.Tests/PixelFormats/Alpha8Tests.cs
  5. 3
      tests/ImageSharp.Tests/PixelFormats/Gray16Tests.cs
  6. 5
      tests/ImageSharp.Tests/PixelFormats/Gray8Tests.cs
  7. 3
      tests/ImageSharp.Tests/PixelFormats/Rgb24Tests.cs
  8. 3
      tests/ImageSharp.Tests/PixelFormats/Rgb48Tests.cs
  9. 3
      tests/ImageSharp.Tests/PixelFormats/Rgba1010102Tests.cs
  10. 2
      tests/ImageSharp.Tests/PixelFormats/Rgba64Tests.cs
  11. 4
      tests/ImageSharp.Tests/PixelFormats/Short2Tests.cs
  12. 12
      tests/ImageSharp.Tests/PixelFormats/Short4Tests.cs
  13. 6
      tests/ImageSharp.Tests/PixelFormats/UnPackedPixelTests.cs
  14. 3
      tests/ImageSharp.Tests/Quantization/QuantizedImageTests.cs
  15. 7
      tests/ImageSharp.Tests/TestUtilities/TestUtils.cs
  16. 3
      tests/ImageSharp.Tests/TestUtilities/Tests/TestImageProviderTests.cs

12
src/ImageSharp/PixelFormats/Utils/PixelConverter.cs

@ -12,7 +12,9 @@ namespace SixLabors.ImageSharp.PixelFormats.Utils
/// <remarks> /// <remarks>
/// Implementations are based on ideas in: /// Implementations are based on ideas in:
/// https://github.com/dotnet/coreclr/blob/master/src/System.Private.CoreLib/shared/System/Buffers/Binary/Reader.cs#L84 /// https://github.com/dotnet/coreclr/blob/master/src/System.Private.CoreLib/shared/System/Buffers/Binary/Reader.cs#L84
/// The JIT should be able to detect and optimize ROL and ROR patterns. /// The JIT can detect and optimize rotation idioms ROTL (Rotate Left)
/// and ROTR (Rotate Right) emitting efficient CPU instructions:
/// https://github.com/dotnet/coreclr/pull/1830
/// </remarks> /// </remarks>
internal static class PixelConverter internal static class PixelConverter
{ {
@ -25,7 +27,7 @@ namespace SixLabors.ImageSharp.PixelFormats.Utils
public static uint ToArgb32(uint packedRgba) public static uint ToArgb32(uint packedRgba)
{ {
// packedRgba = [aa bb gg rr] // packedRgba = [aa bb gg rr]
// ROL(8, packedRgba) = [bb gg rr aa] // ROTL(8, packedRgba) = [bb gg rr aa]
return (packedRgba << 8) | (packedRgba >> 24); return (packedRgba << 8) | (packedRgba >> 24);
} }
@ -38,7 +40,7 @@ namespace SixLabors.ImageSharp.PixelFormats.Utils
// packedRgba = [aa bb gg rr] // packedRgba = [aa bb gg rr]
// tmp1 = [aa 00 gg 00] // tmp1 = [aa 00 gg 00]
// tmp2 = [00 bb 00 rr] // tmp2 = [00 bb 00 rr]
// tmp3=ROL(16, tmp2) = [00 rr 00 bb] // tmp3=ROTL(16, tmp2) = [00 rr 00 bb]
// tmp1 + tmp3 = [aa rr gg bb] // tmp1 + tmp3 = [aa rr gg bb]
uint tmp1 = packedRgba & 0xFF00FF00; uint tmp1 = packedRgba & 0xFF00FF00;
uint tmp2 = packedRgba & 0x00FF00FF; uint tmp2 = packedRgba & 0x00FF00FF;
@ -56,7 +58,7 @@ namespace SixLabors.ImageSharp.PixelFormats.Utils
public static uint ToRgba32(uint packedArgb) public static uint ToRgba32(uint packedArgb)
{ {
// packedArgb = [bb gg rr aa] // packedArgb = [bb gg rr aa]
// ROR(8, packedArgb) = [aa bb gg rr] // ROTR(8, packedArgb) = [aa bb gg rr]
return (packedArgb >> 8) | (packedArgb << 24); return (packedArgb >> 8) | (packedArgb << 24);
} }
@ -94,7 +96,7 @@ namespace SixLabors.ImageSharp.PixelFormats.Utils
// packedRgba = [aa rr gg bb] // packedRgba = [aa rr gg bb]
// tmp1 = [aa 00 gg 00] // tmp1 = [aa 00 gg 00]
// tmp2 = [00 rr 00 bb] // tmp2 = [00 rr 00 bb]
// tmp3=ROL(16, tmp2) = [00 bb 00 rr] // tmp3=ROTL(16, tmp2) = [00 bb 00 rr]
// tmp1 + tmp3 = [aa bb gg rr] // tmp1 + tmp3 = [aa bb gg rr]
uint tmp1 = packedBgra & 0xFF00FF00; uint tmp1 = packedBgra & 0xFF00FF00;
uint tmp2 = packedBgra & 0x00FF00FF; uint tmp2 = packedBgra & 0x00FF00FF;

22
src/ImageSharp/PixelFormats/Utils/PixelExtensions.cs

@ -1,22 +0,0 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
namespace SixLabors.ImageSharp.PixelFormats.Utils
{
/// <summary>
/// Low-performance extension methods to help conversion syntax, suitable for testing purposes.
/// </summary>
internal static class PixelExtensions
{
/// <summary>
/// Returns the result of <see cref="IPixel.ToRgba32"/> as a new <see cref="Rgba32"/> instance.
/// </summary>
public static Rgba32 ToRgba32<TPixel>(this TPixel pixel)
where TPixel : struct, IPixel<TPixel>
{
Rgba32 result = default;
pixel.ToRgba32(ref result);
return result;
}
}
}

4
tests/ImageSharp.Tests/Drawing/FillLinearGradientBrushTests.cs

@ -328,7 +328,9 @@ namespace SixLabors.ImageSharp.Tests.Drawing
TPixel color = colors[stopColorCodes[i % colors.Length]]; TPixel color = colors[stopColorCodes[i % colors.Length]];
float position = stopPositions[i]; float position = stopPositions[i];
colorStops[i] = new ColorStop<TPixel>(position, color); colorStops[i] = new ColorStop<TPixel>(position, color);
coloringVariant.AppendFormat(CultureInfo.InvariantCulture, "{0}@{1};", color.ToRgba32().ToHex(), position); Rgba32 rgba = default;
color.ToRgba32(ref rgba);
coloringVariant.AppendFormat(CultureInfo.InvariantCulture, "{0}@{1};", rgba.ToHex(), position);
} }
FormattableString variant = $"({startX},{startY})_TO_({endX},{endY})__[{coloringVariant}]"; FormattableString variant = $"({startX},{startY})_TO_({endX},{endY})__[{coloringVariant}]";

3
tests/ImageSharp.Tests/PixelFormats/Alpha8Tests.cs

@ -90,7 +90,8 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats
var input = new Alpha8(128); var input = new Alpha8(128);
var expected = new Rgba32(0, 0, 0, 128); var expected = new Rgba32(0, 0, 0, 128);
var actual = input.ToRgba32(); Rgba32 actual = default;
input.ToRgba32(ref actual);
Assert.Equal(expected, actual); Assert.Equal(expected, actual);
} }
} }

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

@ -117,7 +117,8 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats
var gray = new Gray16(input); var gray = new Gray16(input);
// Act // Act
var actual = gray.ToRgba32(); Rgba32 actual = default;
gray.ToRgba32(ref actual);
// Assert // Assert
Assert.Equal(expected, actual.R); Assert.Equal(expected, actual.R);

5
tests/ImageSharp.Tests/PixelFormats/Gray8Tests.cs

@ -115,10 +115,11 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats
var gray = new Gray8(input); var gray = new Gray8(input);
// Act // Act
var actual = gray.ToRgba32(); Rgba32 actual = default;
gray.ToRgba32(ref actual);
// Assert // Assert
Assert.Equal(input, actual.R); Assert.Equal(input, actual.R);
Assert.Equal(input, actual.G); Assert.Equal(input, actual.G);
Assert.Equal(input, actual.B); Assert.Equal(input, actual.B);
Assert.Equal(byte.MaxValue, actual.A); Assert.Equal(byte.MaxValue, actual.A);

3
tests/ImageSharp.Tests/PixelFormats/Rgb24Tests.cs

@ -104,7 +104,8 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats
public void ToRgba32() public void ToRgba32()
{ {
var rgb = new Rgb24(1, 2, 3); var rgb = new Rgb24(1, 2, 3);
var rgba = rgb.ToRgba32(); Rgba32 rgba = default;
rgb.ToRgba32(ref rgba);
Assert.Equal(new Rgba32(1, 2, 3, 255), rgba); Assert.Equal(new Rgba32(1, 2, 3, 255), rgba);
} }

3
tests/ImageSharp.Tests/PixelFormats/Rgb48Tests.cs

@ -52,7 +52,8 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats
var expected = new Rgba32(20, 38, 76, 255); var expected = new Rgba32(20, 38, 76, 255);
// act // act
var actual = rgba48.ToRgba32(); Rgba32 actual = default;
rgba48.ToRgba32(ref actual);
// assert // assert
Assert.Equal(expected, actual); Assert.Equal(expected, actual);

3
tests/ImageSharp.Tests/PixelFormats/Rgba1010102Tests.cs

@ -79,7 +79,8 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats
var expected = new Rgba32(25, 0, 128, 0); var expected = new Rgba32(25, 0, 128, 0);
// act // act
var actual = rgba.ToRgba32(); Rgba32 actual = default;
rgba.ToRgba32(ref actual);
// assert // assert
Assert.Equal(expected, actual); Assert.Equal(expected, actual);

2
tests/ImageSharp.Tests/PixelFormats/Rgba64Tests.cs

@ -86,7 +86,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats
var expected = new Rgba32(20, 38, 76, 115); var expected = new Rgba32(20, 38, 76, 115);
// act // act
actual = rgba64.ToRgba32(); rgba64.ToRgba32(ref actual);
// assert // assert
Assert.Equal(expected, actual); Assert.Equal(expected, actual);

4
tests/ImageSharp.Tests/PixelFormats/Short2Tests.cs

@ -88,7 +88,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats
var expected = new Rgba32(128, 127, 0, 255); var expected = new Rgba32(128, 127, 0, 255);
// act // act
actual = short2.ToRgba32(); short2.ToRgba32(ref actual);
// assert // assert
Assert.Equal(expected, actual); Assert.Equal(expected, actual);
@ -104,7 +104,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats
// act // act
short2.FromRgba32(expected); short2.FromRgba32(expected);
actual = short2.ToRgba32(); short2.ToRgba32(ref actual);
// assert // assert
Assert.Equal(expected, actual); Assert.Equal(expected, actual);

12
tests/ImageSharp.Tests/PixelFormats/Short4Tests.cs

@ -92,7 +92,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats
var expected = new Rgba32(172, 177, 243, 128); var expected = new Rgba32(172, 177, 243, 128);
// act // act
actual = shortValue.ToRgba32(); shortValue.ToRgba32(ref actual);
// assert // assert
Assert.Equal(expected, actual); Assert.Equal(expected, actual);
@ -108,7 +108,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats
// act // act
short4.FromRgba32(expected); short4.FromRgba32(expected);
actual = short4.ToRgba32(); short4.ToRgba32(ref actual);
// assert // assert
Assert.Equal(expected, actual); Assert.Equal(expected, actual);
@ -124,7 +124,9 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats
// act // act
short4.FromBgra32(expected); short4.FromBgra32(expected);
actual.FromRgba32(short4.ToRgba32()); Rgba32 temp = default;
short4.ToRgba32(ref temp);
actual.FromRgba32(temp);
// assert // assert
Assert.Equal(expected, actual); Assert.Equal(expected, actual);
@ -140,7 +142,9 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats
// act // act
short4.FromArgb32(expected); short4.FromArgb32(expected);
actual.FromRgba32(short4.ToRgba32()); Rgba32 temp = default;
short4.ToRgba32(ref temp);
actual.FromRgba32(temp);
// assert // assert
Assert.Equal(expected, actual); Assert.Equal(expected, actual);

6
tests/ImageSharp.Tests/PixelFormats/UnPackedPixelTests.cs

@ -84,8 +84,10 @@ namespace SixLabors.ImageSharp.Tests.Colors
var color = new Rgba32(24, 48, 96, 192); var color = new Rgba32(24, 48, 96, 192);
var colorVector = new RgbaVector(24 / 255F, 48 / 255F, 96 / 255F, 192 / 255F); var colorVector = new RgbaVector(24 / 255F, 48 / 255F, 96 / 255F, 192 / 255F);
var rgba = color.ToRgba32(); Rgba32 rgba = default;
var rgbaVector = colorVector.ToRgba32(); Rgba32 rgbaVector = default;
color.ToRgba32(ref rgba);
colorVector.ToRgba32(ref rgbaVector);
Assert.Equal(rgba, rgbaVector); Assert.Equal(rgba, rgbaVector);
} }

3
tests/ImageSharp.Tests/Quantization/QuantizedImageTests.cs

@ -106,9 +106,10 @@ namespace SixLabors.ImageSharp.Tests
{ {
// Transparent pixels are much more likely to be found at the end of a palette // Transparent pixels are much more likely to be found at the end of a palette
int index = -1; int index = -1;
Rgba32 trans = default;
for (int i = quantized.Palette.Length - 1; i >= 0; i--) for (int i = quantized.Palette.Length - 1; i >= 0; i--)
{ {
var trans = quantized.Palette[i].ToRgba32(); quantized.Palette[i].ToRgba32(ref trans);
if (trans.Equals(default)) if (trans.Equals(default))
{ {

7
tests/ImageSharp.Tests/TestUtilities/TestUtils.cs

@ -80,8 +80,11 @@ namespace SixLabors.ImageSharp.Tests
} }
else else
{ {
rgb1 = ca.ToRgba32().Rgb; Rgba32 rgba = default;
rgb2 = cb.ToRgba32().Rgb; ca.ToRgba32(ref rgba);
rgb1 = rgba.Rgb;
cb.ToRgba32(ref rgba);
rgb2 = rgba.Rgb;
if (!rgb1.Equals(rgb2)) if (!rgb1.Equals(rgb2))
{ {

3
tests/ImageSharp.Tests/TestUtilities/Tests/TestImageProviderTests.cs

@ -275,11 +275,12 @@ namespace SixLabors.ImageSharp.Tests
Assert.Equal(20, img.Height); Assert.Equal(20, img.Height);
Buffer2D<TPixel> pixels = img.GetRootFramePixelBuffer(); Buffer2D<TPixel> pixels = img.GetRootFramePixelBuffer();
Rgba32 rgba = default;
for (int y = 0; y < pixels.Height; y++) for (int y = 0; y < pixels.Height; y++)
{ {
for (int x = 0; x < pixels.Width; x++) for (int x = 0; x < pixels.Width; x++)
{ {
var rgba = pixels[x, y].ToRgba32(); pixels[x, y].ToRgba32(ref rgba);
Assert.Equal(255, rgba.R); Assert.Equal(255, rgba.R);
Assert.Equal(100, rgba.G); Assert.Equal(100, rgba.G);

Loading…
Cancel
Save