diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/Argb32.PixelOperations.Generated.cs b/src/ImageSharp/PixelFormats/PixelImplementations/Generated/Argb32.PixelOperations.Generated.cs
index add48cfd8..e832bc97f 100644
--- a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/Argb32.PixelOperations.Generated.cs
+++ b/src/ImageSharp/PixelFormats/PixelImplementations/Generated/Argb32.PixelOperations.Generated.cs
@@ -42,29 +42,16 @@ namespace SixLabors.ImageSharp.PixelFormats
}
///
- internal override void FromVector4(Configuration configuration, Span sourceVectors, Span destPixels)
+ internal override void FromVector4(Configuration configuration, Span sourceVectors, Span destPixels, PixelConversionModifiers modifiers)
{
Vector4Converters.RgbaCompatible.FromVector4(configuration, this, sourceVectors, destPixels, false);
}
///
- internal override void ToVector4(Configuration configuration, ReadOnlySpan sourcePixels, Span destVectors)
+ internal override void ToVector4(Configuration configuration, ReadOnlySpan sourcePixels, Span destVectors, PixelConversionModifiers modifiers)
{
Vector4Converters.RgbaCompatible.ToVector4(configuration, this, sourcePixels, destVectors, false);
}
-
- ///
- internal override void FromScaledVector4(Configuration configuration, Span sourceVectors, Span destPixels)
- {
- Vector4Converters.RgbaCompatible.FromVector4(configuration, this, sourceVectors, destPixels, true);
- }
-
- ///
- internal override void ToScaledVector4(Configuration configuration, ReadOnlySpan sourcePixels, Span destVectors)
- {
- Vector4Converters.RgbaCompatible.ToVector4(configuration, this, sourcePixels, destVectors, true);
- }
-
///
internal override void ToRgba32(Configuration configuration, ReadOnlySpan sourcePixels, Span destPixels)
{
diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/Bgr24.PixelOperations.Generated.cs b/src/ImageSharp/PixelFormats/PixelImplementations/Generated/Bgr24.PixelOperations.Generated.cs
index 372c71b32..f1885c71b 100644
--- a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/Bgr24.PixelOperations.Generated.cs
+++ b/src/ImageSharp/PixelFormats/PixelImplementations/Generated/Bgr24.PixelOperations.Generated.cs
@@ -42,30 +42,17 @@ namespace SixLabors.ImageSharp.PixelFormats
}
///
- internal override void FromVector4(Configuration configuration, Span sourceVectors, Span destPixels)
+ internal override void FromVector4(Configuration configuration, Span sourceVectors, Span destPixels, PixelConversionModifiers modifiers)
{
Vector4Converters.RgbaCompatible.FromVector4(configuration, this, sourceVectors, destPixels, false);
}
///
- internal override void ToVector4(Configuration configuration, ReadOnlySpan sourcePixels, Span destVectors)
+ internal override void ToVector4(Configuration configuration, ReadOnlySpan sourcePixels, Span destVectors, PixelConversionModifiers modifiers)
{
Vector4Converters.RgbaCompatible.ToVector4(configuration, this, sourcePixels, destVectors, false);
}
- ///
- internal override void FromScaledVector4(Configuration configuration, Span sourceVectors, Span destPixels)
- {
- Vector4Converters.RgbaCompatible.FromVector4(configuration, this, sourceVectors, destPixels, true);
- }
-
- ///
- internal override void ToScaledVector4(Configuration configuration, ReadOnlySpan sourcePixels, Span destVectors)
- {
- Vector4Converters.RgbaCompatible.ToVector4(configuration, this, sourcePixels, destVectors, true);
- }
-
-
///
internal override void ToArgb32(Configuration configuration, ReadOnlySpan sourcePixels, Span destPixels)
{
diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/Bgra32.PixelOperations.Generated.cs b/src/ImageSharp/PixelFormats/PixelImplementations/Generated/Bgra32.PixelOperations.Generated.cs
index aa4680dcc..2409f6784 100644
--- a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/Bgra32.PixelOperations.Generated.cs
+++ b/src/ImageSharp/PixelFormats/PixelImplementations/Generated/Bgra32.PixelOperations.Generated.cs
@@ -42,29 +42,16 @@ namespace SixLabors.ImageSharp.PixelFormats
}
///
- internal override void FromVector4(Configuration configuration, Span sourceVectors, Span destPixels)
+ internal override void FromVector4(Configuration configuration, Span sourceVectors, Span destPixels, PixelConversionModifiers modifiers)
{
Vector4Converters.RgbaCompatible.FromVector4(configuration, this, sourceVectors, destPixels, false);
}
///
- internal override void ToVector4(Configuration configuration, ReadOnlySpan sourcePixels, Span destVectors)
+ internal override void ToVector4(Configuration configuration, ReadOnlySpan sourcePixels, Span destVectors, PixelConversionModifiers modifiers)
{
Vector4Converters.RgbaCompatible.ToVector4(configuration, this, sourcePixels, destVectors, false);
}
-
- ///
- internal override void FromScaledVector4(Configuration configuration, Span sourceVectors, Span destPixels)
- {
- Vector4Converters.RgbaCompatible.FromVector4(configuration, this, sourceVectors, destPixels, true);
- }
-
- ///
- internal override void ToScaledVector4(Configuration configuration, ReadOnlySpan sourcePixels, Span destVectors)
- {
- Vector4Converters.RgbaCompatible.ToVector4(configuration, this, sourcePixels, destVectors, true);
- }
-
///
internal override void ToRgba32(Configuration configuration, ReadOnlySpan sourcePixels, Span destPixels)
{
diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/Rgb24.PixelOperations.Generated.cs b/src/ImageSharp/PixelFormats/PixelImplementations/Generated/Rgb24.PixelOperations.Generated.cs
index f87ed88e5..ddf9813ab 100644
--- a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/Rgb24.PixelOperations.Generated.cs
+++ b/src/ImageSharp/PixelFormats/PixelImplementations/Generated/Rgb24.PixelOperations.Generated.cs
@@ -42,30 +42,17 @@ namespace SixLabors.ImageSharp.PixelFormats
}
///
- internal override void FromVector4(Configuration configuration, Span sourceVectors, Span destPixels)
+ internal override void FromVector4(Configuration configuration, Span sourceVectors, Span destPixels, PixelConversionModifiers modifiers)
{
Vector4Converters.RgbaCompatible.FromVector4(configuration, this, sourceVectors, destPixels, false);
}
///
- internal override void ToVector4(Configuration configuration, ReadOnlySpan sourcePixels, Span destVectors)
+ internal override void ToVector4(Configuration configuration, ReadOnlySpan sourcePixels, Span destVectors, PixelConversionModifiers modifiers)
{
Vector4Converters.RgbaCompatible.ToVector4(configuration, this, sourcePixels, destVectors, false);
}
- ///
- internal override void FromScaledVector4(Configuration configuration, Span sourceVectors, Span destPixels)
- {
- Vector4Converters.RgbaCompatible.FromVector4(configuration, this, sourceVectors, destPixels, true);
- }
-
- ///
- internal override void ToScaledVector4(Configuration configuration, ReadOnlySpan sourcePixels, Span destVectors)
- {
- Vector4Converters.RgbaCompatible.ToVector4(configuration, this, sourcePixels, destVectors, true);
- }
-
-
///
internal override void ToArgb32(Configuration configuration, ReadOnlySpan sourcePixels, Span destPixels)
{
diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/_Common.ttinclude b/src/ImageSharp/PixelFormats/PixelImplementations/Generated/_Common.ttinclude
index bfeccfca5..0ff5b8605 100644
--- a/src/ImageSharp/PixelFormats/PixelImplementations/Generated/_Common.ttinclude
+++ b/src/ImageSharp/PixelFormats/PixelImplementations/Generated/_Common.ttinclude
@@ -111,29 +111,16 @@ using System.Runtime.InteropServices;
{
#>
///
- internal override void FromVector4(Configuration configuration, Span sourceVectors, Span<<#=pixelType#>> destPixels)
+ internal override void FromVector4(Configuration configuration, Span sourceVectors, Span<<#=pixelType#>> destPixels, PixelConversionModifiers modifiers)
{
Vector4Converters.RgbaCompatible.FromVector4(configuration, this, sourceVectors, destPixels, false);
}
///
- internal override void ToVector4(Configuration configuration, ReadOnlySpan<<#=pixelType#>> sourcePixels, Span destVectors)
+ internal override void ToVector4(Configuration configuration, ReadOnlySpan<<#=pixelType#>> sourcePixels, Span destVectors, PixelConversionModifiers modifiers)
{
Vector4Converters.RgbaCompatible.ToVector4(configuration, this, sourcePixels, destVectors, false);
}
-
- ///
- internal override void FromScaledVector4(Configuration configuration, Span sourceVectors, Span<<#=pixelType#>> destPixels)
- {
- Vector4Converters.RgbaCompatible.FromVector4(configuration, this, sourceVectors, destPixels, true);
- }
-
- ///
- internal override void ToScaledVector4(Configuration configuration, ReadOnlySpan<<#=pixelType#>> sourcePixels, Span destVectors)
- {
- Vector4Converters.RgbaCompatible.ToVector4(configuration, this, sourcePixels, destVectors, true);
- }
-
<#+
}
diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/Rgba32.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/Rgba32.PixelOperations.cs
index 2801b8225..7e8bb7f29 100644
--- a/src/ImageSharp/PixelFormats/PixelImplementations/Rgba32.PixelOperations.cs
+++ b/src/ImageSharp/PixelFormats/PixelImplementations/Rgba32.PixelOperations.cs
@@ -22,7 +22,8 @@ namespace SixLabors.ImageSharp.PixelFormats
internal override void ToVector4(
Configuration configuration,
ReadOnlySpan sourcePixels,
- Span destVectors)
+ Span destVectors,
+ PixelConversionModifiers modifiers)
{
Guard.DestinationShouldNotBeTooShort(sourcePixels, destVectors, nameof(destVectors));
@@ -37,7 +38,8 @@ namespace SixLabors.ImageSharp.PixelFormats
internal override void FromVector4(
Configuration configuration,
Span sourceVectors,
- Span destPixels)
+ Span destPixels,
+ PixelConversionModifiers modifiers)
{
Guard.DestinationShouldNotBeTooShort(sourceVectors, destPixels, nameof(destPixels));
@@ -47,24 +49,6 @@ namespace SixLabors.ImageSharp.PixelFormats
MemoryMarshal.Cast(sourceVectors),
MemoryMarshal.Cast(destPixels));
}
-
- ///
- internal override void ToScaledVector4(
- Configuration configuration,
- ReadOnlySpan sourceColors,
- Span destinationVectors)
- {
- this.ToVector4(configuration, sourceColors, destinationVectors);
- }
-
- ///
- internal override void FromScaledVector4(
- Configuration configuration,
- Span sourceVectors,
- Span destinationColors)
- {
- this.FromVector4(configuration, sourceVectors, destinationColors);
- }
}
}
}
\ No newline at end of file
diff --git a/src/ImageSharp/PixelFormats/PixelImplementations/RgbaVector.PixelOperations.cs b/src/ImageSharp/PixelFormats/PixelImplementations/RgbaVector.PixelOperations.cs
index 0cde00736..777d0da6d 100644
--- a/src/ImageSharp/PixelFormats/PixelImplementations/RgbaVector.PixelOperations.cs
+++ b/src/ImageSharp/PixelFormats/PixelImplementations/RgbaVector.PixelOperations.cs
@@ -18,32 +18,43 @@ namespace SixLabors.ImageSharp.PixelFormats
internal class PixelOperations : PixelOperations
{
///
- internal override void FromScaledVector4(
+ internal override void FromVector4(
Configuration configuration,
Span sourceVectors,
- Span destinationColors)
+ Span destinationColors,
+ PixelConversionModifiers modifiers)
{
Guard.DestinationShouldNotBeTooShort(sourceVectors, destinationColors, nameof(destinationColors));
- MemoryMarshal.Cast(sourceVectors).CopyTo(destinationColors);
+ // TODO: Repeating previous override behavior here. Not sure if this is correct!
+ if (modifiers.IsDefined(PixelConversionModifiers.Scale))
+ {
+ MemoryMarshal.Cast(sourceVectors).CopyTo(destinationColors);
+ }
+ else
+ {
+ base.FromVector4(configuration, sourceVectors, destinationColors, modifiers);
+ }
}
- ///
- internal override void ToScaledVector4(
- Configuration configuration,
- ReadOnlySpan sourceColors,
- Span destinationVectors)
- => this.ToVector4(configuration, sourceColors, destinationVectors);
-
///
internal override void ToVector4(
Configuration configuration,
ReadOnlySpan sourcePixels,
- Span destVectors)
+ Span destVectors,
+ PixelConversionModifiers modifiers)
{
Guard.DestinationShouldNotBeTooShort(sourcePixels, destVectors, nameof(destVectors));
- MemoryMarshal.Cast(sourcePixels).CopyTo(destVectors);
+ // TODO: Repeating previous override behavior here. Not sure if this is correct!
+ if (modifiers.IsDefined(PixelConversionModifiers.Scale))
+ {
+ base.ToVector4(configuration, sourcePixels, destVectors, modifiers);
+ }
+ else
+ {
+ MemoryMarshal.Cast(sourcePixels).CopyTo(destVectors);
+ }
}
}
}
diff --git a/src/ImageSharp/PixelFormats/PixelOperations{TPixel}.cs b/src/ImageSharp/PixelFormats/PixelOperations{TPixel}.cs
index 61e338b9c..44c7f2e30 100644
--- a/src/ImageSharp/PixelFormats/PixelOperations{TPixel}.cs
+++ b/src/ImageSharp/PixelFormats/PixelOperations{TPixel}.cs
@@ -17,6 +17,12 @@ namespace SixLabors.ImageSharp.PixelFormats
SRgbCompand = 1 << 2,
}
+ internal static class PixelConversionModifiersExtensions
+ {
+ public static bool IsDefined(this PixelConversionModifiers modifiers, PixelConversionModifiers expected) =>
+ (modifiers & expected) == expected;
+ }
+
///
/// A stateless class implementing Strategy Pattern for batched pixel-data conversion operations
/// for pixel buffers of type .
@@ -32,71 +38,93 @@ namespace SixLabors.ImageSharp.PixelFormats
///
/// Bulk version of converting 'sourceVectors.Length' pixels into 'destinationColors'.
+ /// TODO: Rename to DestructiveFromVector4() + add explain behavior
///
/// A to configure internal operations
/// The to the source vectors.
/// The to the destination colors.
+ /// The to apply during the conversion
internal virtual void FromVector4(
Configuration configuration,
Span sourceVectors,
- Span destPixels)
+ Span destPixels,
+ PixelConversionModifiers modifiers)
{
Guard.NotNull(configuration, nameof(configuration));
Guard.DestinationShouldNotBeTooShort(sourceVectors, destPixels, nameof(destPixels));
- Utils.Vector4Converters.Default.DangerousFromVector4(sourceVectors, destPixels);
+ if (modifiers.IsDefined(PixelConversionModifiers.Scale))
+ {
+ Utils.Vector4Converters.Default.DangerousFromScaledVector4(sourceVectors, destPixels);
+ }
+ else
+ {
+ Utils.Vector4Converters.Default.DangerousFromVector4(sourceVectors, destPixels);
+ }
}
+ ///
+ /// TODO: For compatibility, should be inlined!
+ ///
+ internal void FromScaledVector4(
+ Configuration configuration,
+ Span sourceVectors,
+ Span destPixels) =>
+ this.FromVector4(configuration, sourceVectors, destPixels, PixelConversionModifiers.Scale);
+
+ ///
+ /// Bulk version of converting 'sourceVectors.Length' pixels into 'destinationColors'.
+ /// TODO: Rename to DestructiveFromVector4() + add explain behavior
+ ///
+ /// A to configure internal operations
+ /// The to the source vectors.
+ /// The to the destination colors.
+ internal void FromVector4(Configuration configuration, Span sourceVectors, Span destPixels) =>
+ this.FromVector4(configuration, sourceVectors, destPixels, PixelConversionModifiers.None);
+
///
/// Bulk version of converting 'sourceColors.Length' pixels into 'destinationVectors'.
///
/// A to configure internal operations
/// The to the source colors.
/// The to the destination vectors.
+ /// The to apply during the conversion
internal virtual void ToVector4(
Configuration configuration,
ReadOnlySpan sourcePixels,
- Span destVectors)
+ Span destVectors,
+ PixelConversionModifiers modifiers)
{
Guard.NotNull(configuration, nameof(configuration));
Guard.DestinationShouldNotBeTooShort(sourcePixels, destVectors, nameof(destVectors));
- Utils.Vector4Converters.Default.DangerousToVector4(sourcePixels, destVectors);
+ if (modifiers.IsDefined(PixelConversionModifiers.Scale))
+ {
+ Utils.Vector4Converters.Default.DangerousToScaledVector4(sourcePixels, destVectors);
+ }
+ else
+ {
+ Utils.Vector4Converters.Default.DangerousToVector4(sourcePixels, destVectors);
+ }
}
///
- /// Bulk version of converting 'sourceVectors.Length' pixels into 'destinationColors'.
+ /// Bulk version of converting 'sourceColors.Length' pixels into 'destinationVectors'.
///
/// A to configure internal operations
- /// The to the source vectors.
- /// The to the destination colors.
- internal virtual void FromScaledVector4(
+ /// The to the source colors.
+ /// The to the destination vectors.
+ internal virtual void ToVector4(
Configuration configuration,
- Span sourceVectors,
- Span destinationColors)
- {
- Guard.NotNull(configuration, nameof(configuration));
- Guard.DestinationShouldNotBeTooShort(sourceVectors, destinationColors, nameof(destinationColors));
-
- Utils.Vector4Converters.Default.DangerousFromScaledVector4(sourceVectors, destinationColors);
- }
+ ReadOnlySpan sourcePixels,
+ Span destVectors) =>
+ this.ToVector4(configuration, sourcePixels, destVectors, PixelConversionModifiers.None);
///
- /// Bulk version of converting 'sourceColors.Length' pixels into 'destinationVectors'.
+ /// TODO: For compatibility, should be inlined!
///
- /// A to configure internal operations
- /// The to the source colors.
- /// The to the destination vectors.
- internal virtual void ToScaledVector4(
- Configuration configuration,
- ReadOnlySpan sourceColors,
- Span destinationVectors)
- {
- Guard.NotNull(configuration, nameof(configuration));
- Guard.DestinationShouldNotBeTooShort(sourceColors, destinationVectors, nameof(destinationVectors));
-
- Utils.Vector4Converters.Default.DangerousToScaledVector4(sourceColors, destinationVectors);
- }
+ internal void ToScaledVector4(Configuration configuration, ReadOnlySpan sourcePixels, Span destVectors) =>
+ this.ToVector4(configuration, sourcePixels, destVectors, PixelConversionModifiers.Scale);
///
/// Converts 'sourceColors.Length' pixels from 'sourceColors' into 'destinationColors'.
diff --git a/src/ImageSharp/PixelFormats/Utils/Vector4Converters.RgbaCompatible.cs b/src/ImageSharp/PixelFormats/Utils/Vector4Converters.RgbaCompatible.cs
index 06c33d79c..006ebe828 100644
--- a/src/ImageSharp/PixelFormats/Utils/Vector4Converters.RgbaCompatible.cs
+++ b/src/ImageSharp/PixelFormats/Utils/Vector4Converters.RgbaCompatible.cs
@@ -29,7 +29,7 @@ namespace SixLabors.ImageSharp.PixelFormats.Utils
private static readonly int Vector4ConversionThreshold = CalculateVector4ConversionThreshold();
///
- /// Provides an efficient default implementation for
+ /// Provides an efficient default implementation for
/// and
/// which is applicable for -compatible pixel types where
/// returns the same scaled result as .
@@ -73,7 +73,7 @@ namespace SixLabors.ImageSharp.PixelFormats.Utils
}
///
- /// Provides an efficient default implementation for
+ /// Provides an efficient default implementation for
/// and
/// which is applicable for -compatible pixel types where
/// returns the same scaled result as .