|
|
|
@ -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); |
|
|
|
|