Browse Source

all pixel types implemented except RgbaVector

af/merge-core
Anton Firszov 7 years ago
parent
commit
c3d4e4d8f4
  1. 4
      src/ImageSharp/PixelFormats/PixelImplementations/Generated/Argb32.PixelOperations.Generated.cs
  2. 4
      src/ImageSharp/PixelFormats/PixelImplementations/Generated/Bgr24.PixelOperations.Generated.cs
  3. 4
      src/ImageSharp/PixelFormats/PixelImplementations/Generated/Bgra32.PixelOperations.Generated.cs
  4. 4
      src/ImageSharp/PixelFormats/PixelImplementations/Generated/Rgb24.PixelOperations.Generated.cs
  5. 4
      src/ImageSharp/PixelFormats/PixelImplementations/Generated/_Common.ttinclude
  6. 6
      src/ImageSharp/PixelFormats/PixelImplementations/Rgba32.PixelOperations.cs
  7. 6
      src/ImageSharp/PixelFormats/PixelImplementations/RgbaVector.PixelOperations.cs
  8. 20
      src/ImageSharp/PixelFormats/PixelOperations{TPixel}.cs
  9. 74
      src/ImageSharp/PixelFormats/Utils/Vector4Converters.Default.cs
  10. 46
      src/ImageSharp/PixelFormats/Utils/Vector4Converters.RgbaCompatible.cs
  11. 48
      src/ImageSharp/PixelFormats/Utils/Vector4Converters.cs
  12. 8
      tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.cs

4
src/ImageSharp/PixelFormats/PixelImplementations/Generated/Argb32.PixelOperations.Generated.cs

@ -44,13 +44,13 @@ namespace SixLabors.ImageSharp.PixelFormats
/// <inheritdoc />
internal override void FromVector4(Configuration configuration, Span<Vector4> sourceVectors, Span<Argb32> destPixels, PixelConversionModifiers modifiers)
{
Vector4Converters.RgbaCompatible.FromVector4(configuration, this, sourceVectors, destPixels, false);
Vector4Converters.RgbaCompatible.FromVector4(configuration, this, sourceVectors, destPixels, modifiers.Remove(PixelConversionModifiers.Scale));
}
/// <inheritdoc />
internal override void ToVector4(Configuration configuration, ReadOnlySpan<Argb32> sourcePixels, Span<Vector4> destVectors, PixelConversionModifiers modifiers)
{
Vector4Converters.RgbaCompatible.ToVector4(configuration, this, sourcePixels, destVectors, false);
Vector4Converters.RgbaCompatible.ToVector4(configuration, this, sourcePixels, destVectors, modifiers.Remove(PixelConversionModifiers.Scale));
}
/// <inheritdoc />
internal override void ToRgba32(Configuration configuration, ReadOnlySpan<Argb32> sourcePixels, Span<Rgba32> destPixels)

4
src/ImageSharp/PixelFormats/PixelImplementations/Generated/Bgr24.PixelOperations.Generated.cs

@ -44,13 +44,13 @@ namespace SixLabors.ImageSharp.PixelFormats
/// <inheritdoc />
internal override void FromVector4(Configuration configuration, Span<Vector4> sourceVectors, Span<Bgr24> destPixels, PixelConversionModifiers modifiers)
{
Vector4Converters.RgbaCompatible.FromVector4(configuration, this, sourceVectors, destPixels, false);
Vector4Converters.RgbaCompatible.FromVector4(configuration, this, sourceVectors, destPixels, modifiers.Remove(PixelConversionModifiers.Scale));
}
/// <inheritdoc />
internal override void ToVector4(Configuration configuration, ReadOnlySpan<Bgr24> sourcePixels, Span<Vector4> destVectors, PixelConversionModifiers modifiers)
{
Vector4Converters.RgbaCompatible.ToVector4(configuration, this, sourcePixels, destVectors, false);
Vector4Converters.RgbaCompatible.ToVector4(configuration, this, sourcePixels, destVectors, modifiers.Remove(PixelConversionModifiers.Scale));
}
/// <inheritdoc />

4
src/ImageSharp/PixelFormats/PixelImplementations/Generated/Bgra32.PixelOperations.Generated.cs

@ -44,13 +44,13 @@ namespace SixLabors.ImageSharp.PixelFormats
/// <inheritdoc />
internal override void FromVector4(Configuration configuration, Span<Vector4> sourceVectors, Span<Bgra32> destPixels, PixelConversionModifiers modifiers)
{
Vector4Converters.RgbaCompatible.FromVector4(configuration, this, sourceVectors, destPixels, false);
Vector4Converters.RgbaCompatible.FromVector4(configuration, this, sourceVectors, destPixels, modifiers.Remove(PixelConversionModifiers.Scale));
}
/// <inheritdoc />
internal override void ToVector4(Configuration configuration, ReadOnlySpan<Bgra32> sourcePixels, Span<Vector4> destVectors, PixelConversionModifiers modifiers)
{
Vector4Converters.RgbaCompatible.ToVector4(configuration, this, sourcePixels, destVectors, false);
Vector4Converters.RgbaCompatible.ToVector4(configuration, this, sourcePixels, destVectors, modifiers.Remove(PixelConversionModifiers.Scale));
}
/// <inheritdoc />
internal override void ToRgba32(Configuration configuration, ReadOnlySpan<Bgra32> sourcePixels, Span<Rgba32> destPixels)

4
src/ImageSharp/PixelFormats/PixelImplementations/Generated/Rgb24.PixelOperations.Generated.cs

@ -44,13 +44,13 @@ namespace SixLabors.ImageSharp.PixelFormats
/// <inheritdoc />
internal override void FromVector4(Configuration configuration, Span<Vector4> sourceVectors, Span<Rgb24> destPixels, PixelConversionModifiers modifiers)
{
Vector4Converters.RgbaCompatible.FromVector4(configuration, this, sourceVectors, destPixels, false);
Vector4Converters.RgbaCompatible.FromVector4(configuration, this, sourceVectors, destPixels, modifiers.Remove(PixelConversionModifiers.Scale));
}
/// <inheritdoc />
internal override void ToVector4(Configuration configuration, ReadOnlySpan<Rgb24> sourcePixels, Span<Vector4> destVectors, PixelConversionModifiers modifiers)
{
Vector4Converters.RgbaCompatible.ToVector4(configuration, this, sourcePixels, destVectors, false);
Vector4Converters.RgbaCompatible.ToVector4(configuration, this, sourcePixels, destVectors, modifiers.Remove(PixelConversionModifiers.Scale));
}
/// <inheritdoc />

4
src/ImageSharp/PixelFormats/PixelImplementations/Generated/_Common.ttinclude

@ -113,13 +113,13 @@ using System.Runtime.InteropServices;
/// <inheritdoc />
internal override void FromVector4(Configuration configuration, Span<Vector4> sourceVectors, Span<<#=pixelType#>> destPixels, PixelConversionModifiers modifiers)
{
Vector4Converters.RgbaCompatible.FromVector4(configuration, this, sourceVectors, destPixels, false);
Vector4Converters.RgbaCompatible.FromVector4(configuration, this, sourceVectors, destPixels, modifiers.Remove(PixelConversionModifiers.Scale));
}
/// <inheritdoc />
internal override void ToVector4(Configuration configuration, ReadOnlySpan<<#=pixelType#>> sourcePixels, Span<Vector4> destVectors, PixelConversionModifiers modifiers)
{
Vector4Converters.RgbaCompatible.ToVector4(configuration, this, sourcePixels, destVectors, false);
Vector4Converters.RgbaCompatible.ToVector4(configuration, this, sourcePixels, destVectors, modifiers.Remove(PixelConversionModifiers.Scale));
}
<#+
}

6
src/ImageSharp/PixelFormats/PixelImplementations/Rgba32.PixelOperations.cs

@ -4,6 +4,8 @@
using System;
using System.Numerics;
using System.Runtime.InteropServices;
using SixLabors.ImageSharp.PixelFormats.Utils;
using SixLabors.Memory;
namespace SixLabors.ImageSharp.PixelFormats
@ -28,10 +30,10 @@ namespace SixLabors.ImageSharp.PixelFormats
Guard.DestinationShouldNotBeTooShort(sourcePixels, destVectors, nameof(destVectors));
destVectors = destVectors.Slice(0, sourcePixels.Length);
SimdUtils.BulkConvertByteToNormalizedFloat(
MemoryMarshal.Cast<Rgba32, byte>(sourcePixels),
MemoryMarshal.Cast<Vector4, float>(destVectors));
Vector4Converters.ApplyForwardConversionModifiers(destVectors, modifiers);
}
/// <inheritdoc />
@ -44,7 +46,7 @@ namespace SixLabors.ImageSharp.PixelFormats
Guard.DestinationShouldNotBeTooShort(sourceVectors, destPixels, nameof(destPixels));
destPixels = destPixels.Slice(0, sourceVectors.Length);
Vector4Converters.ApplyBackwardConversionModifiers(sourceVectors, modifiers);
SimdUtils.BulkConvertNormalizedFloatToByteClampOverflows(
MemoryMarshal.Cast<Vector4, float>(sourceVectors),
MemoryMarshal.Cast<Rgba32, byte>(destPixels));

6
src/ImageSharp/PixelFormats/PixelImplementations/RgbaVector.PixelOperations.cs

@ -5,6 +5,8 @@ using System;
using System.Numerics;
using System.Runtime.InteropServices;
using SixLabors.ImageSharp.PixelFormats.Utils;
namespace SixLabors.ImageSharp.PixelFormats
{
/// <content>
@ -26,6 +28,8 @@ namespace SixLabors.ImageSharp.PixelFormats
{
Guard.DestinationShouldNotBeTooShort(sourceVectors, destinationColors, nameof(destinationColors));
Vector4Converters.ApplyBackwardConversionModifiers(sourceVectors, modifiers);
// TODO: Repeating previous override behavior here. Not sure if this is correct!
if (modifiers.IsDefined(PixelConversionModifiers.Scale))
{
@ -55,6 +59,8 @@ namespace SixLabors.ImageSharp.PixelFormats
{
MemoryMarshal.Cast<RgbaVector, Vector4>(sourcePixels).CopyTo(destVectors);
}
Vector4Converters.ApplyForwardConversionModifiers(destVectors, modifiers);
}
}
}

20
src/ImageSharp/PixelFormats/PixelOperations{TPixel}.cs

@ -37,16 +37,8 @@ namespace SixLabors.ImageSharp.PixelFormats
PixelConversionModifiers modifiers)
{
Guard.NotNull(configuration, nameof(configuration));
Guard.DestinationShouldNotBeTooShort(sourceVectors, destPixels, nameof(destPixels));
if (modifiers.IsDefined(PixelConversionModifiers.Scale))
{
Utils.Vector4Converters.Default.DangerousFromScaledVector4(sourceVectors, destPixels);
}
else
{
Utils.Vector4Converters.Default.DangerousFromVector4(sourceVectors, destPixels);
}
Utils.Vector4Converters.Default.FromVector4(sourceVectors, destPixels, modifiers);
}
/// <summary>
@ -82,16 +74,8 @@ namespace SixLabors.ImageSharp.PixelFormats
PixelConversionModifiers modifiers)
{
Guard.NotNull(configuration, nameof(configuration));
Guard.DestinationShouldNotBeTooShort(sourcePixels, destVectors, nameof(destVectors));
if (modifiers.IsDefined(PixelConversionModifiers.Scale))
{
Utils.Vector4Converters.Default.DangerousToScaledVector4(sourcePixels, destVectors);
}
else
{
Utils.Vector4Converters.Default.DangerousToVector4(sourcePixels, destVectors);
}
Utils.Vector4Converters.Default.ToVector4(sourcePixels, destVectors, modifiers);
}
/// <summary>

74
src/ImageSharp/PixelFormats/Utils/Vector4Converters.Default.cs

@ -6,6 +6,8 @@ using System.Numerics;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using SixLabors.ImageSharp.ColorSpaces.Companding;
namespace SixLabors.ImageSharp.PixelFormats.Utils
{
/// <summary>
@ -15,13 +17,75 @@ namespace SixLabors.ImageSharp.PixelFormats.Utils
{
/// <summary>
/// Provides default implementations for batched to/from <see cref="Vector4"/> conversion.
/// WARNING: The methods are operating without bounds checking and input validation!
/// WARNING: The methods prefixed with "Unsafe" are operating without bounds checking and input validation!
/// Input validation is the responsibility of the caller!
/// </summary>
public static class Default
{
[MethodImpl(InliningOptions.ShortMethod)]
internal static void DangerousFromVector4<TPixel>(
public static void FromVector4<TPixel>(
Span<Vector4> sourceVectors,
Span<TPixel> destPixels,
PixelConversionModifiers modifiers)
where TPixel : struct, IPixel<TPixel>
{
Guard.DestinationShouldNotBeTooShort(sourceVectors, destPixels, nameof(destPixels));
UnsafeFromVector4(sourceVectors, destPixels, modifiers);
}
[MethodImpl(InliningOptions.ShortMethod)]
public static void ToVector4<TPixel>(
ReadOnlySpan<TPixel> sourcePixels,
Span<Vector4> destVectors,
PixelConversionModifiers modifiers)
where TPixel : struct, IPixel<TPixel>
{
Guard.DestinationShouldNotBeTooShort(sourcePixels, destVectors, nameof(destVectors));
UnsafeToVector4(sourcePixels, destVectors, modifiers);
}
[MethodImpl(InliningOptions.ShortMethod)]
public static void UnsafeFromVector4<TPixel>(
Span<Vector4> sourceVectors,
Span<TPixel> destPixels,
PixelConversionModifiers modifiers)
where TPixel : struct, IPixel<TPixel>
{
ApplyBackwardConversionModifiers(sourceVectors, modifiers);
if (modifiers.IsDefined(PixelConversionModifiers.Scale))
{
UnsafeFromScaledVector4Core(sourceVectors, destPixels);
}
else
{
UnsafeFromVector4Core(sourceVectors, destPixels);
}
}
[MethodImpl(InliningOptions.ShortMethod)]
public static void UnsafeToVector4<TPixel>(
ReadOnlySpan<TPixel> sourcePixels,
Span<Vector4> destVectors,
PixelConversionModifiers modifiers)
where TPixel : struct, IPixel<TPixel>
{
if (modifiers.IsDefined(PixelConversionModifiers.Scale))
{
UnsafeToScaledVector4Core(sourcePixels, destVectors);
}
else
{
UnsafeToVector4Core(sourcePixels, destVectors);
}
ApplyForwardConversionModifiers(destVectors, modifiers);
}
[MethodImpl(InliningOptions.ShortMethod)]
private static void UnsafeFromVector4Core<TPixel>(
ReadOnlySpan<Vector4> sourceVectors,
Span<TPixel> destPixels)
where TPixel : struct, IPixel<TPixel>
@ -38,7 +102,7 @@ namespace SixLabors.ImageSharp.PixelFormats.Utils
}
[MethodImpl(InliningOptions.ShortMethod)]
internal static void DangerousToVector4<TPixel>(
private static void UnsafeToVector4Core<TPixel>(
ReadOnlySpan<TPixel> sourcePixels,
Span<Vector4> destVectors)
where TPixel : struct, IPixel<TPixel>
@ -55,7 +119,7 @@ namespace SixLabors.ImageSharp.PixelFormats.Utils
}
[MethodImpl(InliningOptions.ShortMethod)]
internal static void DangerousFromScaledVector4<TPixel>(
private static void UnsafeFromScaledVector4Core<TPixel>(
ReadOnlySpan<Vector4> sourceVectors,
Span<TPixel> destinationColors)
where TPixel : struct, IPixel<TPixel>
@ -72,7 +136,7 @@ namespace SixLabors.ImageSharp.PixelFormats.Utils
}
[MethodImpl(InliningOptions.ShortMethod)]
internal static void DangerousToScaledVector4<TPixel>(
private static void UnsafeToScaledVector4Core<TPixel>(
ReadOnlySpan<TPixel> sourceColors,
Span<Vector4> destinationVectors)
where TPixel : struct, IPixel<TPixel>

46
src/ImageSharp/PixelFormats/Utils/Vector4Converters.RgbaCompatible.cs

@ -7,6 +7,8 @@ using System.Numerics;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using SixLabors.ImageSharp.ColorSpaces.Companding;
namespace SixLabors.ImageSharp.PixelFormats.Utils
{
/// <content>
@ -41,7 +43,7 @@ namespace SixLabors.ImageSharp.PixelFormats.Utils
PixelOperations<TPixel> pixelOperations,
ReadOnlySpan<TPixel> sourcePixels,
Span<Vector4> destVectors,
bool scaled)
PixelConversionModifiers modifiers)
where TPixel : struct, IPixel<TPixel>
{
Guard.NotNull(configuration, nameof(configuration));
@ -52,7 +54,7 @@ namespace SixLabors.ImageSharp.PixelFormats.Utils
// Not worth for small buffers:
if (count < Vector4ConversionThreshold)
{
ToVector4Fallback(sourcePixels, destVectors, scaled);
Default.UnsafeToVector4(sourcePixels, destVectors, modifiers);
return;
}
@ -70,6 +72,9 @@ namespace SixLabors.ImageSharp.PixelFormats.Utils
MemoryMarshal.Cast<Vector4, float>(destVectors.Slice(0, countWithoutLastItem)));
destVectors[countWithoutLastItem] = sourcePixels[countWithoutLastItem].ToVector4();
// TODO: Investigate optimized 1-pass approach!
ApplyForwardConversionModifiers(destVectors, modifiers);
}
/// <summary>
@ -83,9 +88,9 @@ namespace SixLabors.ImageSharp.PixelFormats.Utils
internal static void FromVector4<TPixel>(
Configuration configuration,
PixelOperations<TPixel> pixelOperations,
ReadOnlySpan<Vector4> sourceVectors,
Span<Vector4> sourceVectors,
Span<TPixel> destPixels,
bool scaled)
PixelConversionModifiers modifiers)
where TPixel : struct, IPixel<TPixel>
{
Guard.NotNull(configuration, nameof(configuration));
@ -96,11 +101,14 @@ namespace SixLabors.ImageSharp.PixelFormats.Utils
// Not worth for small buffers:
if (count < Vector4ConversionThreshold)
{
FromVector4Fallback(sourceVectors, destPixels, scaled);
Default.UnsafeFromVector4(sourceVectors, destPixels, modifiers);
return;
}
// TODO: Investigate optimized 1-pass approach!
ApplyBackwardConversionModifiers(sourceVectors, modifiers);
// For the opposite direction it's not easy to implement the trick used in RunRgba32CompatibleToVector4Conversion,
// so let's allocate a temporary buffer as usually:
using (IMemoryOwner<Rgba32> tempBuffer = configuration.MemoryAllocator.Allocate<Rgba32>(count))
@ -115,34 +123,6 @@ namespace SixLabors.ImageSharp.PixelFormats.Utils
}
}
[MethodImpl(InliningOptions.ColdPath)]
private static void ToVector4Fallback<TPixel>(ReadOnlySpan<TPixel> sourcePixels, Span<Vector4> destVectors, bool scaled)
where TPixel : struct, IPixel<TPixel>
{
if (scaled)
{
Default.DangerousToScaledVector4(sourcePixels, destVectors);
}
else
{
Default.DangerousToVector4(sourcePixels, destVectors);
}
}
[MethodImpl(InliningOptions.ColdPath)]
private static void FromVector4Fallback<TPixel>(ReadOnlySpan<Vector4> sourceVectors, Span<TPixel> destPixels, bool scaled)
where TPixel : struct, IPixel<TPixel>
{
if (scaled)
{
Default.DangerousFromScaledVector4(sourceVectors, destPixels);
}
else
{
Default.DangerousFromVector4(sourceVectors, destPixels);
}
}
private static int CalculateVector4ConversionThreshold()
{
if (!Vector.IsHardwareAccelerated)

48
src/ImageSharp/PixelFormats/Utils/Vector4Converters.cs

@ -0,0 +1,48 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System;
using System.Numerics;
using System.Runtime.CompilerServices;
using SixLabors.ImageSharp.ColorSpaces.Companding;
namespace SixLabors.ImageSharp.PixelFormats.Utils
{
internal static partial class Vector4Converters
{
/// <summary>
/// Apply modifiers used requested by ToVector4() conversion.
/// </summary>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal static void ApplyForwardConversionModifiers(Span<Vector4> vectors, PixelConversionModifiers modifiers)
{
if (modifiers.IsDefined(PixelConversionModifiers.SRgbCompand))
{
SRgbCompanding.Expand(vectors);
}
if (modifiers.IsDefined(PixelConversionModifiers.Premultiply))
{
Vector4Utils.Premultiply(vectors);
}
}
/// <summary>
/// Apply modifiers used requested by FromVector4() conversion.
/// </summary>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal static void ApplyBackwardConversionModifiers(Span<Vector4> vectors, PixelConversionModifiers modifiers)
{
if (modifiers.IsDefined(PixelConversionModifiers.Premultiply))
{
Vector4Utils.UnPremultiply(vectors);
}
if (modifiers.IsDefined(PixelConversionModifiers.SRgbCompand))
{
SRgbCompanding.Compress(vectors);
}
}
}
}

8
tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.cs

@ -148,7 +148,11 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations
TestOperation(
source,
expected,
(s, d) => Operations.FromVector4(this.Configuration, s, d.GetSpan(), PixelConversionModifiers.SRgbCompand | PixelConversionModifiers.Scale)
(s, d) => Operations.FromVector4(
this.Configuration,
s,
d.GetSpan(),
PixelConversionModifiers.SRgbCompand | PixelConversionModifiers.Scale)
);
}
@ -230,7 +234,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations
this.Configuration,
s,
d.GetSpan(),
PixelConversionModifiers.SRgbCompand | PixelConversionModifiers.Premultiply)
PixelConversionModifiers.SRgbCompand | PixelConversionModifiers.Premultiply | PixelConversionModifiers.Scale)
);
}

Loading…
Cancel
Save