Browse Source

Fix System.Drawing.Bridge

pull/540/head
James Jackson-South 8 years ago
parent
commit
3440a7decf
  1. 4
      tests/ImageSharp.Tests/Drawing/DrawImageTest.cs
  2. 90
      tests/ImageSharp.Tests/TestUtilities/ReferenceCodecs/SystemDrawingBridge.cs
  3. 2
      tests/ImageSharp.Tests/TestUtilities/Tests/ReferenceCodecTests.cs

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

@ -93,7 +93,7 @@ namespace SixLabors.ImageSharp.Tests
Assert.Equal(Rgba32.White, backgroundPixel);
Assert.Equal(overlayPixel, background[0, 0]);
background.DebugSave(provider, new[] { "Negative" });
background.DebugSave(provider, testOutputDetails: "Negative");
}
}
@ -115,7 +115,7 @@ namespace SixLabors.ImageSharp.Tests
Assert.Equal(Rgba32.White, backgroundPixel);
Assert.Equal(overlayPixel, background[xy, xy]);
background.DebugSave(provider, new[] { "Positive" });
background.DebugSave(provider, testOutputDetails: "Positive");
}
}
}

90
tests/ImageSharp.Tests/TestUtilities/ReferenceCodecs/SystemDrawingBridge.cs

@ -12,72 +12,6 @@ namespace SixLabors.ImageSharp.Tests.TestUtilities.ReferenceCodecs
{
public static class SystemDrawingBridge
{
// TODO: It would be nice to have this method in PixelOperations<T>
private static void ToArgb32<TPixel>(Span<TPixel> source, Span<Argb32> dest)
where TPixel : struct, IPixel<TPixel>
{
int length = source.Length;
Guard.MustBeSizedAtLeast(dest, length, nameof(dest));
using (IBuffer<Rgba32> rgbaBuffer = Configuration.Default.MemoryManager.Allocate<Rgba32>(length))
{
Span<Rgba32> rgbaSpan = rgbaBuffer.Span;
PixelOperations<TPixel>.Instance.ToRgba32(source, rgbaSpan, length);
for (int i = 0; i < length; i++)
{
ref Rgba32 s = ref rgbaSpan[i];
ref Argb32 d = ref dest[i];
d.PackFromRgba32(s);
}
}
}
private static void FromArgb32<TPixel>(Span<Argb32> source, Span<TPixel> dest)
where TPixel : struct, IPixel<TPixel>
{
int length = source.Length;
Guard.MustBeSizedAtLeast(dest, length, nameof(dest));
using (IBuffer<Rgba32> rgbaBuffer = Configuration.Default.MemoryManager.Allocate<Rgba32>(length))
{
Span<Rgba32> rgbaSpan = rgbaBuffer.Span;
PixelOperations<Argb32>.Instance.ToRgba32(source, rgbaSpan, length);
for (int i = 0; i < length; i++)
{
ref Rgba32 s = ref rgbaSpan[i];
ref TPixel d = ref dest[i];
d.PackFromRgba32(s);
}
}
}
private static void FromRgb24<TPixel>(Span<Rgb24> source, Span<TPixel> dest)
where TPixel : struct, IPixel<TPixel>
{
int length = source.Length;
Guard.MustBeSizedAtLeast(dest, length, nameof(dest));
using (IBuffer<Rgb24> rgbBuffer = Configuration.Default.MemoryManager.Allocate<Rgb24>(length))
{
Span<Rgb24> rgbSpan = rgbBuffer.Span;
PixelOperations<Rgb24>.Instance.ToRgb24(source, rgbSpan, length);
for (int i = 0; i < length; i++)
{
ref Rgb24 s = ref rgbSpan[i];
ref TPixel d = ref dest[i];
var rgba = default(Rgba32);
s.ToRgba32(ref rgba);
d.PackFromRgba32(rgba);
}
}
}
internal static unsafe Image<TPixel> FromFromArgb32SystemDrawingBitmap<TPixel>(System.Drawing.Bitmap bmp)
where TPixel : struct, IPixel<TPixel>
{
@ -99,9 +33,9 @@ namespace SixLabors.ImageSharp.Tests.TestUtilities.ReferenceCodecs
var image = new Image<TPixel>(w, h);
using (IBuffer<Argb32> workBuffer = Configuration.Default.MemoryManager.Allocate<Argb32>(w))
using (IBuffer<Bgra32> workBuffer = Configuration.Default.MemoryManager.Allocate<Bgra32>(w))
{
fixed (Argb32* destPtr = &workBuffer.DangerousGetPinnableReference())
fixed (Bgra32* destPtr = &workBuffer.DangerousGetPinnableReference())
{
for (int y = 0; y < h; y++)
{
@ -110,8 +44,7 @@ namespace SixLabors.ImageSharp.Tests.TestUtilities.ReferenceCodecs
byte* sourcePtr = sourcePtrBase + data.Stride * y;
Buffer.MemoryCopy(sourcePtr, destPtr, destRowByteCount, sourceRowByteCount);
FromArgb32(workBuffer.Span, row);
PixelOperations<TPixel>.Instance.PackFromBgra32(workBuffer.Span, row, row.Length);
}
}
}
@ -139,13 +72,13 @@ namespace SixLabors.ImageSharp.Tests.TestUtilities.ReferenceCodecs
byte* sourcePtrBase = (byte*)data.Scan0;
long sourceRowByteCount = data.Stride;
long destRowByteCount = w * sizeof(Rgb24);
long destRowByteCount = w * sizeof(Bgr24);
var image = new Image<TPixel>(w, h);
using (IBuffer<Rgb24> workBuffer = Configuration.Default.MemoryManager.Allocate<Rgb24>(w))
using (IBuffer<Bgr24> workBuffer = Configuration.Default.MemoryManager.Allocate<Bgr24>(w))
{
fixed (Rgb24* destPtr = &workBuffer.DangerousGetPinnableReference())
fixed (Bgr24* destPtr = &workBuffer.DangerousGetPinnableReference())
{
for (int y = 0; y < h; y++)
{
@ -154,8 +87,9 @@ namespace SixLabors.ImageSharp.Tests.TestUtilities.ReferenceCodecs
byte* sourcePtr = sourcePtrBase + data.Stride * y;
Buffer.MemoryCopy(sourcePtr, destPtr, destRowByteCount, sourceRowByteCount);
PixelOperations<TPixel>.Instance.PackFromBgr24(workBuffer.Span, row, row.Length);
FromRgb24(workBuffer.Span, row);
// FromRgb24(workBuffer.Span, row);
}
}
}
@ -175,17 +109,17 @@ namespace SixLabors.ImageSharp.Tests.TestUtilities.ReferenceCodecs
byte* destPtrBase = (byte*)data.Scan0;
long destRowByteCount = data.Stride;
long sourceRowByteCount = w * sizeof(Argb32);
long sourceRowByteCount = w * sizeof(Bgra32);
using (IBuffer<Argb32> workBuffer = image.GetConfiguration().MemoryManager.Allocate<Argb32>(w))
using (IBuffer<Bgra32> workBuffer = image.GetConfiguration().MemoryManager.Allocate<Bgra32>(w))
{
fixed (Argb32* sourcePtr = &workBuffer.DangerousGetPinnableReference())
fixed (Bgra32* sourcePtr = &workBuffer.DangerousGetPinnableReference())
{
for (int y = 0; y < h; y++)
{
Span<TPixel> row = image.Frames.RootFrame.GetPixelRowSpan(y);
ToArgb32(row, workBuffer.Span);
PixelOperations<TPixel>.Instance.ToBgra32(row, workBuffer.Span, row.Length);
byte* destPtr = destPtrBase + data.Stride * y;
Buffer.MemoryCopy(sourcePtr, destPtr, destRowByteCount, sourceRowByteCount);

2
tests/ImageSharp.Tests/TestUtilities/Tests/ReferenceCodecTests.cs

@ -85,7 +85,7 @@ namespace SixLabors.ImageSharp.Tests
}
}
[Theory(Skip = "Doesen't work yet :(")]
[Theory]
[WithTestPatternImages(100, 100, PixelTypes.Rgba32)]
public void FromFromRgb24SystemDrawingBitmap2<TPixel>(TestImageProvider<TPixel> provider)
where TPixel : struct, IPixel<TPixel>

Loading…
Cancel
Save