mirror of https://github.com/SixLabors/ImageSharp
6 changed files with 181 additions and 167 deletions
@ -0,0 +1,24 @@ |
|||||
|
using System.Numerics; |
||||
|
|
||||
|
using SixLabors.ImageSharp.PixelFormats; |
||||
|
|
||||
|
namespace SixLabors.ImageSharp.Benchmarks.General.PixelConversion |
||||
|
{ |
||||
|
interface ITestPixel<T> |
||||
|
where T : struct, ITestPixel<T> |
||||
|
{ |
||||
|
void FromRgba32(Rgba32 source); |
||||
|
|
||||
|
void FromRgba32(ref Rgba32 source); |
||||
|
|
||||
|
void FromBytes(byte r, byte g, byte b, byte a); |
||||
|
|
||||
|
void FromVector4(Vector4 source); |
||||
|
|
||||
|
void FromVector4(ref Vector4 source); |
||||
|
|
||||
|
Rgba32 ToRgba32(); |
||||
|
|
||||
|
void CopyToRgba32(ref Rgba32 dest); |
||||
|
} |
||||
|
} |
||||
@ -1,86 +1,15 @@ |
|||||
// ReSharper disable InconsistentNaming
|
// ReSharper disable InconsistentNaming
|
||||
|
|
||||
using SixLabors.ImageSharp.PixelFormats; |
using System.Runtime.CompilerServices; |
||||
|
|
||||
namespace SixLabors.ImageSharp.Benchmarks.General |
using BenchmarkDotNet.Attributes; |
||||
{ |
|
||||
using System.Runtime.CompilerServices; |
|
||||
using System.Runtime.InteropServices; |
|
||||
|
|
||||
using BenchmarkDotNet.Attributes; |
using SixLabors.ImageSharp.PixelFormats; |
||||
|
|
||||
|
namespace SixLabors.ImageSharp.Benchmarks.General.PixelConversion |
||||
|
{ |
||||
public class PixelConversion_ConvertFromRgba32 |
public class PixelConversion_ConvertFromRgba32 |
||||
{ |
{ |
||||
interface ITestPixel<T> |
|
||||
where T : struct, ITestPixel<T> |
|
||||
{ |
|
||||
void FromRgba32(Rgba32 source); |
|
||||
|
|
||||
void FromRgba32(ref Rgba32 source); |
|
||||
|
|
||||
void FromBytes(byte r, byte g, byte b, byte a); |
|
||||
} |
|
||||
|
|
||||
[StructLayout(LayoutKind.Sequential)] |
|
||||
struct TestArgb : ITestPixel<TestArgb> |
|
||||
{ |
|
||||
private byte a, r, g, b; |
|
||||
|
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)] |
|
||||
public void FromRgba32(Rgba32 p) |
|
||||
{ |
|
||||
this.r = p.R; |
|
||||
this.g = p.G; |
|
||||
this.b = p.B; |
|
||||
this.a = p.A; |
|
||||
} |
|
||||
|
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)] |
|
||||
public void FromRgba32(ref Rgba32 p) |
|
||||
{ |
|
||||
this.r = p.R; |
|
||||
this.g = p.G; |
|
||||
this.b = p.B; |
|
||||
this.a = p.A; |
|
||||
} |
|
||||
|
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)] |
|
||||
public void FromBytes(byte r, byte g, byte b, byte a) |
|
||||
{ |
|
||||
this.r = r; |
|
||||
this.g = g; |
|
||||
this.b = b; |
|
||||
this.a = a; |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
[StructLayout(LayoutKind.Sequential)] |
|
||||
struct TestRgba : ITestPixel<TestRgba> |
|
||||
{ |
|
||||
private byte r, g, b, a; |
|
||||
|
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)] |
|
||||
public void FromRgba32(Rgba32 source) |
|
||||
{ |
|
||||
this = Unsafe.As<Rgba32, TestRgba>(ref source); |
|
||||
} |
|
||||
|
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)] |
|
||||
public void FromRgba32(ref Rgba32 source) |
|
||||
{ |
|
||||
this = Unsafe.As<Rgba32, TestRgba>(ref source); |
|
||||
} |
|
||||
|
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)] |
|
||||
public void FromBytes(byte r, byte g, byte b, byte a) |
|
||||
{ |
|
||||
this.r = r; |
|
||||
this.g = g; |
|
||||
this.b = b; |
|
||||
this.a = a; |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
struct ConversionRunner<T> |
struct ConversionRunner<T> |
||||
where T : struct, ITestPixel<T> |
where T : struct, ITestPixel<T> |
||||
{ |
{ |
||||
@ -0,0 +1,74 @@ |
|||||
|
using System.Numerics; |
||||
|
using System.Runtime.CompilerServices; |
||||
|
using System.Runtime.InteropServices; |
||||
|
|
||||
|
using SixLabors.ImageSharp.PixelFormats; |
||||
|
|
||||
|
namespace SixLabors.ImageSharp.Benchmarks.General.PixelConversion |
||||
|
{ |
||||
|
[StructLayout(LayoutKind.Sequential)] |
||||
|
struct TestArgb : ITestPixel<TestArgb> |
||||
|
{ |
||||
|
private byte a, r, g, b; |
||||
|
|
||||
|
[MethodImpl(MethodImplOptions.AggressiveInlining)] |
||||
|
public void FromRgba32(Rgba32 p) |
||||
|
{ |
||||
|
this.r = p.R; |
||||
|
this.g = p.G; |
||||
|
this.b = p.B; |
||||
|
this.a = p.A; |
||||
|
} |
||||
|
|
||||
|
[MethodImpl(MethodImplOptions.AggressiveInlining)] |
||||
|
public void FromRgba32(ref Rgba32 p) |
||||
|
{ |
||||
|
this.r = p.R; |
||||
|
this.g = p.G; |
||||
|
this.b = p.B; |
||||
|
this.a = p.A; |
||||
|
} |
||||
|
|
||||
|
[MethodImpl(MethodImplOptions.AggressiveInlining)] |
||||
|
public void FromBytes(byte r, byte g, byte b, byte a) |
||||
|
{ |
||||
|
this.r = r; |
||||
|
this.g = g; |
||||
|
this.b = b; |
||||
|
this.a = a; |
||||
|
} |
||||
|
|
||||
|
[MethodImpl(MethodImplOptions.AggressiveInlining)] |
||||
|
public void FromVector4(Vector4 p) |
||||
|
{ |
||||
|
this.r = (byte)p.X; |
||||
|
this.g = (byte)p.Y; |
||||
|
this.b = (byte)p.Z; |
||||
|
this.a = (byte)p.W; |
||||
|
} |
||||
|
|
||||
|
[MethodImpl(MethodImplOptions.AggressiveInlining)] |
||||
|
public void FromVector4(ref Vector4 p) |
||||
|
{ |
||||
|
this.r = (byte)p.X; |
||||
|
this.g = (byte)p.Y; |
||||
|
this.b = (byte)p.Z; |
||||
|
this.a = (byte)p.W; |
||||
|
} |
||||
|
|
||||
|
[MethodImpl(MethodImplOptions.AggressiveInlining)] |
||||
|
public Rgba32 ToRgba32() |
||||
|
{ |
||||
|
return new Rgba32(this.r, this.g, this.b, this.a); |
||||
|
} |
||||
|
|
||||
|
[MethodImpl(MethodImplOptions.AggressiveInlining)] |
||||
|
public void CopyToRgba32(ref Rgba32 dest) |
||||
|
{ |
||||
|
dest.R = this.r; |
||||
|
dest.G = this.g; |
||||
|
dest.B = this.b; |
||||
|
dest.A = this.a; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,57 @@ |
|||||
|
using System.Numerics; |
||||
|
using System.Runtime.CompilerServices; |
||||
|
using System.Runtime.InteropServices; |
||||
|
|
||||
|
using SixLabors.ImageSharp.PixelFormats; |
||||
|
|
||||
|
namespace SixLabors.ImageSharp.Benchmarks.General.PixelConversion |
||||
|
{ |
||||
|
[StructLayout(LayoutKind.Sequential)] |
||||
|
struct TestRgba : ITestPixel<TestRgba> |
||||
|
{ |
||||
|
private byte r, g, b, a; |
||||
|
|
||||
|
[MethodImpl(MethodImplOptions.AggressiveInlining)] |
||||
|
public void FromRgba32(Rgba32 source) |
||||
|
{ |
||||
|
this = Unsafe.As<Rgba32, TestRgba>(ref source); |
||||
|
} |
||||
|
|
||||
|
[MethodImpl(MethodImplOptions.AggressiveInlining)] |
||||
|
public void FromRgba32(ref Rgba32 source) |
||||
|
{ |
||||
|
this = Unsafe.As<Rgba32, TestRgba>(ref source); |
||||
|
} |
||||
|
|
||||
|
[MethodImpl(MethodImplOptions.AggressiveInlining)] |
||||
|
public void FromBytes(byte r, byte g, byte b, byte a) |
||||
|
{ |
||||
|
this.r = r; |
||||
|
this.g = g; |
||||
|
this.b = b; |
||||
|
this.a = a; |
||||
|
} |
||||
|
|
||||
|
public void FromVector4(Vector4 source) |
||||
|
{ |
||||
|
throw new System.NotImplementedException(); |
||||
|
} |
||||
|
|
||||
|
public void FromVector4(ref Vector4 source) |
||||
|
{ |
||||
|
throw new System.NotImplementedException(); |
||||
|
} |
||||
|
|
||||
|
[MethodImpl(MethodImplOptions.AggressiveInlining)] |
||||
|
public Rgba32 ToRgba32() |
||||
|
{ |
||||
|
return Unsafe.As<TestRgba, Rgba32>(ref this); |
||||
|
} |
||||
|
|
||||
|
[MethodImpl(MethodImplOptions.AggressiveInlining)] |
||||
|
public void CopyToRgba32(ref Rgba32 dest) |
||||
|
{ |
||||
|
dest = Unsafe.As<TestRgba, Rgba32>(ref this); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue