Browse Source

Optimization: omit premultiplication for Bgr24 and Rgb24

af/merge-core
Anton Firszov 7 years ago
parent
commit
c88f8707e9
  1. 24
      src/ImageSharp/PixelFormats/PixelConversionModifiers.cs
  2. 4
      src/ImageSharp/PixelFormats/PixelImplementations/Generated/Bgr24.PixelOperations.Generated.cs
  3. 4
      src/ImageSharp/PixelFormats/PixelImplementations/Generated/Rgb24.PixelOperations.Generated.cs
  4. 16
      src/ImageSharp/PixelFormats/PixelImplementations/Generated/_Common.ttinclude
  5. 1
      tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.Bgr24OperationsTests.cs
  6. 1
      tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.Rgb24OperationsTests.cs
  7. 34
      tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.cs

24
src/ImageSharp/PixelFormats/PixelConversionModifiers.cs

@ -3,14 +3,38 @@
using System;
using SixLabors.ImageSharp.ColorSpaces.Companding;
namespace SixLabors.ImageSharp.PixelFormats
{
/// <summary>
/// Flags responsible to select additional operations which could be effitiently applied in
/// <see cref="PixelOperations{TPixel}.ToVector4(SixLabors.ImageSharp.Configuration,System.ReadOnlySpan{TPixel},System.Span{System.Numerics.Vector4},SixLabors.ImageSharp.PixelFormats.PixelConversionModifiers)"/>
/// or
/// <see cref="PixelOperations{TPixel}.FromVector4(SixLabors.ImageSharp.Configuration,System.Span{System.Numerics.Vector4},System.Span{TPixel},SixLabors.ImageSharp.PixelFormats.PixelConversionModifiers)"/>
/// knowing the pixel type.
/// </summary>
[Flags]
internal enum PixelConversionModifiers
{
/// <summary>
/// No special operation is selected
/// </summary>
None = 0,
/// <summary>
/// Select <see cref="IPixel.ToScaledVector4"/> <see cref="IPixel.FromScaledVector4"/> instead the standard (non scaled) variants.
/// </summary>
Scale = 1 << 0,
/// <summary>
/// Enable alpha premultiplication / unpremultiplication
/// </summary>
Premultiply = 1 << 1,
/// <summary>
/// Enable SRGB companding (defined in <see cref="SRgbCompanding"/>).
/// </summary>
SRgbCompand = 1 << 2,
}
}

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, modifiers.Remove(PixelConversionModifiers.Scale));
Vector4Converters.RgbaCompatible.FromVector4(configuration, this, sourceVectors, destPixels, modifiers.Remove(PixelConversionModifiers.Scale | PixelConversionModifiers.Premultiply));
}
/// <inheritdoc />
internal override void ToVector4(Configuration configuration, ReadOnlySpan<Bgr24> sourcePixels, Span<Vector4> destVectors, PixelConversionModifiers modifiers)
{
Vector4Converters.RgbaCompatible.ToVector4(configuration, this, sourcePixels, destVectors, modifiers.Remove(PixelConversionModifiers.Scale));
Vector4Converters.RgbaCompatible.ToVector4(configuration, this, sourcePixels, destVectors, modifiers.Remove(PixelConversionModifiers.Scale | PixelConversionModifiers.Premultiply));
}
/// <inheritdoc />

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, modifiers.Remove(PixelConversionModifiers.Scale));
Vector4Converters.RgbaCompatible.FromVector4(configuration, this, sourceVectors, destPixels, modifiers.Remove(PixelConversionModifiers.Scale | PixelConversionModifiers.Premultiply));
}
/// <inheritdoc />
internal override void ToVector4(Configuration configuration, ReadOnlySpan<Rgb24> sourcePixels, Span<Vector4> destVectors, PixelConversionModifiers modifiers)
{
Vector4Converters.RgbaCompatible.ToVector4(configuration, this, sourcePixels, destVectors, modifiers.Remove(PixelConversionModifiers.Scale));
Vector4Converters.RgbaCompatible.ToVector4(configuration, this, sourcePixels, destVectors, modifiers.Remove(PixelConversionModifiers.Scale | PixelConversionModifiers.Premultiply));
}
/// <inheritdoc />

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

@ -22,6 +22,7 @@ using System.Runtime.InteropServices;
// Types with Rgba32-combatible to/from Vector4 conversion
static readonly string[] Rgba32CompatibleTypes = { "Argb32", "Bgra32", "Rgb24", "Bgr24" };
void GenerateDefaultSelfConversionMethods(string pixelType)
{
#>
@ -107,19 +108,24 @@ using System.Runtime.InteropServices;
<#+
}
void GenerateRgba32CompatibleVector4ConversionMethods(string pixelType)
void GenerateRgba32CompatibleVector4ConversionMethods(string pixelType, bool hasAlpha)
{
string removeTheseModifiers = "PixelConversionModifiers.Scale";
if (!hasAlpha)
{
removeTheseModifiers += " | PixelConversionModifiers.Premultiply";
}
#>
/// <inheritdoc />
internal override void FromVector4(Configuration configuration, Span<Vector4> sourceVectors, Span<<#=pixelType#>> destPixels, PixelConversionModifiers modifiers)
{
Vector4Converters.RgbaCompatible.FromVector4(configuration, this, sourceVectors, destPixels, modifiers.Remove(PixelConversionModifiers.Scale));
Vector4Converters.RgbaCompatible.FromVector4(configuration, this, sourceVectors, destPixels, modifiers.Remove(<#=removeTheseModifiers#>));
}
/// <inheritdoc />
internal override void ToVector4(Configuration configuration, ReadOnlySpan<<#=pixelType#>> sourcePixels, Span<Vector4> destVectors, PixelConversionModifiers modifiers)
{
Vector4Converters.RgbaCompatible.ToVector4(configuration, this, sourcePixels, destVectors, modifiers.Remove(PixelConversionModifiers.Scale));
Vector4Converters.RgbaCompatible.ToVector4(configuration, this, sourcePixels, destVectors, modifiers.Remove(<#=removeTheseModifiers#>));
}
<#+
}
@ -130,7 +136,7 @@ using System.Runtime.InteropServices;
if (Rgba32CompatibleTypes.Contains(pixelType))
{
GenerateRgba32CompatibleVector4ConversionMethods(pixelType);
GenerateRgba32CompatibleVector4ConversionMethods(pixelType, pixelType.EndsWith("32"));
}
var matching32BitTypes = Optimized32BitTypes.Contains(pixelType) ?
@ -151,4 +157,4 @@ using System.Runtime.InteropServices;
GenerateDefaultConvertToMethod(pixelType, destPixelType);
}
}
#>
#>

1
tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.Bgr24OperationsTests.cs

@ -15,6 +15,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations
public Bgr24OperationsTests(ITestOutputHelper output)
: base(output)
{
this.HasAlpha = false;
}
[Fact]

1
tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.Rgb24OperationsTests.cs

@ -14,6 +14,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations
public Rgb24OperationsTests(ITestOutputHelper output)
: base(output)
{
this.HasAlpha = false;
}
[Fact]

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

@ -33,6 +33,8 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations
null;
#endif
protected bool HasAlpha { get; set; } = true;
protected PixelOperationsTests(ITestOutputHelper output)
: base(output)
{
@ -165,12 +167,18 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations
{
void sourceAction(ref Vector4 v)
{
Vector4Utils.Premultiply(ref v);
if (this.HasAlpha)
{
Vector4Utils.Premultiply(ref v);
}
}
void expectedAction(ref Vector4 v)
{
Vector4Utils.UnPremultiply(ref v);
if (this.HasAlpha)
{
Vector4Utils.UnPremultiply(ref v);
}
}
Vector4[] source = CreateVector4TestData(count, (ref Vector4 v) => sourceAction(ref v));
@ -189,12 +197,18 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations
{
void sourceAction(ref Vector4 v)
{
Vector4Utils.Premultiply(ref v);
if (this.HasAlpha)
{
Vector4Utils.Premultiply(ref v);
}
}
void expectedAction(ref Vector4 v)
{
Vector4Utils.UnPremultiply(ref v);
if (this.HasAlpha)
{
Vector4Utils.UnPremultiply(ref v);
}
}
Vector4[] source = CreateVector4TestData(count, (ref Vector4 v) => sourceAction(ref v));
@ -218,12 +232,20 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelOperations
void sourceAction(ref Vector4 v)
{
SRgbCompanding.Expand(ref v);
Vector4Utils.Premultiply(ref v);
if (this.HasAlpha)
{
Vector4Utils.Premultiply(ref v);
}
}
void expectedAction(ref Vector4 v)
{
Vector4Utils.UnPremultiply(ref v);
if (this.HasAlpha)
{
Vector4Utils.UnPremultiply(ref v);
}
SRgbCompanding.Compress(ref v);
}

Loading…
Cancel
Save