diff --git a/src/ImageSharp/PixelFormats/PixelConversionModifiers.cs b/src/ImageSharp/PixelFormats/PixelConversionModifiers.cs
index 536a23061a..d66dbb57a1 100644
--- a/src/ImageSharp/PixelFormats/PixelConversionModifiers.cs
+++ b/src/ImageSharp/PixelFormats/PixelConversionModifiers.cs
@@ -3,14 +3,38 @@
using System;
+using SixLabors.ImageSharp.ColorSpaces.Companding;
+
namespace SixLabors.ImageSharp.PixelFormats
{
+ ///
+ /// Flags responsible to select additional operations which could be effitiently applied in
+ ///
+ /// or
+ ///
+ /// knowing the pixel type.
+ ///
[Flags]
internal enum PixelConversionModifiers
{
+ ///
+ /// No special operation is selected
+ ///
None = 0,
+
+ ///
+ /// Select instead the standard (non scaled) variants.
+ ///
Scale = 1 << 0,
+
+ ///
+ /// Enable alpha premultiplication / unpremultiplication
+ ///
Premultiply = 1 << 1,
+
+ ///
+ /// Enable SRGB companding (defined in ).
+ ///
SRgbCompand = 1 << 2,
}
}
\ No newline at end of file
diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/Bgr24.PixelOperations.Generated.cs b/src/ImageSharp/PixelFormats/PixelImplementations/Generated/Bgr24.PixelOperations.Generated.cs
index a9eca8994c..92925898b6 100644
--- a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/Bgr24.PixelOperations.Generated.cs
+++ b/src/ImageSharp/PixelFormats/PixelImplementations/Generated/Bgr24.PixelOperations.Generated.cs
@@ -44,13 +44,13 @@ namespace SixLabors.ImageSharp.PixelFormats
///
internal override void FromVector4(Configuration configuration, Span sourceVectors, Span 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));
}
///
internal override void ToVector4(Configuration configuration, ReadOnlySpan sourcePixels, Span 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));
}
///
diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/Rgb24.PixelOperations.Generated.cs b/src/ImageSharp/PixelFormats/PixelImplementations/Generated/Rgb24.PixelOperations.Generated.cs
index 1648f53416..6de8c92bcf 100644
--- a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/Rgb24.PixelOperations.Generated.cs
+++ b/src/ImageSharp/PixelFormats/PixelImplementations/Generated/Rgb24.PixelOperations.Generated.cs
@@ -44,13 +44,13 @@ namespace SixLabors.ImageSharp.PixelFormats
///
internal override void FromVector4(Configuration configuration, Span sourceVectors, Span 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));
}
///
internal override void ToVector4(Configuration configuration, ReadOnlySpan sourcePixels, Span 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));
}
///
diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/_Common.ttinclude b/src/ImageSharp/PixelFormats/PixelImplementations/Generated/_Common.ttinclude
index 6286eaf72c..584615532d 100644
--- a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/_Common.ttinclude
+++ b/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";
+ }
#>
///
internal override void FromVector4(Configuration configuration, Span 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#>));
}
///
internal override void ToVector4(Configuration configuration, ReadOnlySpan<<#=pixelType#>> sourcePixels, Span 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);
}
}
-#>
\ No newline at end of file
+#>
diff --git a/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.Bgr24OperationsTests.cs b/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.Bgr24OperationsTests.cs
index 323d3914cf..afcec79385 100644
--- a/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.Bgr24OperationsTests.cs
+++ b/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]
diff --git a/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.Rgb24OperationsTests.cs b/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.Rgb24OperationsTests.cs
index fa51c2278b..1c7d312d30 100644
--- a/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.Rgb24OperationsTests.cs
+++ b/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]
diff --git a/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.cs b/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.cs
index b9d3fcff5b..659da47a7e 100644
--- a/tests/ImageSharp.Tests/PixelFormats/PixelOperations/PixelOperationsTests.cs
+++ b/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);
}