diff --git a/src/ImageSharp/PixelFormats/Alpha8.cs b/src/ImageSharp/PixelFormats/Alpha8.cs
index 1e724768d..730734f5f 100644
--- a/src/ImageSharp/PixelFormats/Alpha8.cs
+++ b/src/ImageSharp/PixelFormats/Alpha8.cs
@@ -105,7 +105,11 @@ namespace SixLabors.ImageSharp.PixelFormats
///
[MethodImpl(InliningOptions.ShortMethod)]
- public Rgba32 ToRgba32() => new Rgba32(0, 0, 0, this.PackedValue);
+ public void ToRgba32(ref Rgba32 dest)
+ {
+ dest = default;
+ dest.A = this.PackedValue;
+ }
///
[MethodImpl(InliningOptions.ShortMethod)]
diff --git a/src/ImageSharp/PixelFormats/Argb32.cs b/src/ImageSharp/PixelFormats/Argb32.cs
index 1e3bd9326..a47d7e8e7 100644
--- a/src/ImageSharp/PixelFormats/Argb32.cs
+++ b/src/ImageSharp/PixelFormats/Argb32.cs
@@ -250,7 +250,13 @@ namespace SixLabors.ImageSharp.PixelFormats
///
[MethodImpl(InliningOptions.ShortMethod)]
- public Rgba32 ToRgba32() => new Rgba32(this.R, this.G, this.B, this.A);
+ public void ToRgba32(ref Rgba32 dest)
+ {
+ dest.R = this.R;
+ dest.G = this.G;
+ dest.B = this.B;
+ dest.A = this.A;
+ }
///
[MethodImpl(InliningOptions.ShortMethod)]
diff --git a/src/ImageSharp/PixelFormats/Bgr24.cs b/src/ImageSharp/PixelFormats/Bgr24.cs
index ed65bebf7..8eba08bea 100644
--- a/src/ImageSharp/PixelFormats/Bgr24.cs
+++ b/src/ImageSharp/PixelFormats/Bgr24.cs
@@ -151,7 +151,13 @@ namespace SixLabors.ImageSharp.PixelFormats
///
[MethodImpl(InliningOptions.ShortMethod)]
- public Rgba32 ToRgba32() => new Rgba32(this.R, this.G, this.B, byte.MaxValue);
+ public void ToRgba32(ref Rgba32 dest)
+ {
+ dest.R = this.R;
+ dest.G = this.G;
+ dest.B = this.B;
+ dest.A = byte.MaxValue;
+ }
///
[MethodImpl(InliningOptions.ShortMethod)]
diff --git a/src/ImageSharp/PixelFormats/Bgr565.cs b/src/ImageSharp/PixelFormats/Bgr565.cs
index 04af6ef0f..295f1ca0a 100644
--- a/src/ImageSharp/PixelFormats/Bgr565.cs
+++ b/src/ImageSharp/PixelFormats/Bgr565.cs
@@ -113,7 +113,10 @@ namespace SixLabors.ImageSharp.PixelFormats
///
[MethodImpl(InliningOptions.ShortMethod)]
- public Rgba32 ToRgba32() => new Rgba32(this.ToScaledVector4());
+ public void ToRgba32(ref Rgba32 dest)
+ {
+ dest.PackFromScaledVector4(this.ToScaledVector4());
+ }
///
[MethodImpl(InliningOptions.ShortMethod)]
diff --git a/src/ImageSharp/PixelFormats/Bgra32.cs b/src/ImageSharp/PixelFormats/Bgra32.cs
index 9b0ed4f96..5d70c9e50 100644
--- a/src/ImageSharp/PixelFormats/Bgra32.cs
+++ b/src/ImageSharp/PixelFormats/Bgra32.cs
@@ -206,7 +206,13 @@ namespace SixLabors.ImageSharp.PixelFormats
///
[MethodImpl(InliningOptions.ShortMethod)]
- public Rgba32 ToRgba32() => new Rgba32(this.R, this.G, this.B, this.A);
+ public void ToRgba32(ref Rgba32 dest)
+ {
+ dest.R = this.R;
+ dest.G = this.G;
+ dest.B = this.B;
+ dest.A = this.A;
+ }
///
[MethodImpl(InliningOptions.ShortMethod)]
diff --git a/src/ImageSharp/PixelFormats/Bgra4444.cs b/src/ImageSharp/PixelFormats/Bgra4444.cs
index db1c8f865..29ea63e20 100644
--- a/src/ImageSharp/PixelFormats/Bgra4444.cs
+++ b/src/ImageSharp/PixelFormats/Bgra4444.cs
@@ -116,7 +116,10 @@ namespace SixLabors.ImageSharp.PixelFormats
///
[MethodImpl(InliningOptions.ShortMethod)]
- public Rgba32 ToRgba32() => new Rgba32(this.ToScaledVector4());
+ public void ToRgba32(ref Rgba32 dest)
+ {
+ dest.PackFromScaledVector4(this.ToScaledVector4());
+ }
///
[MethodImpl(InliningOptions.ShortMethod)]
diff --git a/src/ImageSharp/PixelFormats/Bgra5551.cs b/src/ImageSharp/PixelFormats/Bgra5551.cs
index 5d9003cdd..f6dbb7811 100644
--- a/src/ImageSharp/PixelFormats/Bgra5551.cs
+++ b/src/ImageSharp/PixelFormats/Bgra5551.cs
@@ -117,7 +117,10 @@ namespace SixLabors.ImageSharp.PixelFormats
///
[MethodImpl(InliningOptions.ShortMethod)]
- public Rgba32 ToRgba32() => new Rgba32(this.ToScaledVector4());
+ public void ToRgba32(ref Rgba32 dest)
+ {
+ dest.PackFromScaledVector4(this.ToScaledVector4());
+ }
///
[MethodImpl(InliningOptions.ShortMethod)]
diff --git a/src/ImageSharp/PixelFormats/Byte4.cs b/src/ImageSharp/PixelFormats/Byte4.cs
index 230c31c5c..96eeeec0d 100644
--- a/src/ImageSharp/PixelFormats/Byte4.cs
+++ b/src/ImageSharp/PixelFormats/Byte4.cs
@@ -117,7 +117,10 @@ namespace SixLabors.ImageSharp.PixelFormats
///
[MethodImpl(InliningOptions.ShortMethod)]
- public Rgba32 ToRgba32() => new Rgba32(this.ToScaledVector4());
+ public void ToRgba32(ref Rgba32 dest)
+ {
+ dest.PackFromScaledVector4(this.ToScaledVector4());
+ }
///
[MethodImpl(InliningOptions.ShortMethod)]
diff --git a/src/ImageSharp/PixelFormats/HalfSingle.cs b/src/ImageSharp/PixelFormats/HalfSingle.cs
index bef4a5dd9..a1811e147 100644
--- a/src/ImageSharp/PixelFormats/HalfSingle.cs
+++ b/src/ImageSharp/PixelFormats/HalfSingle.cs
@@ -106,7 +106,10 @@ namespace SixLabors.ImageSharp.PixelFormats
///
[MethodImpl(InliningOptions.ShortMethod)]
- public Rgba32 ToRgba32() => new Rgba32(this.ToScaledVector4());
+ public void ToRgba32(ref Rgba32 dest)
+ {
+ dest.PackFromScaledVector4(this.ToScaledVector4());
+ }
///
[MethodImpl(InliningOptions.ShortMethod)]
diff --git a/src/ImageSharp/PixelFormats/HalfVector2.cs b/src/ImageSharp/PixelFormats/HalfVector2.cs
index 5bd9924c5..381650aec 100644
--- a/src/ImageSharp/PixelFormats/HalfVector2.cs
+++ b/src/ImageSharp/PixelFormats/HalfVector2.cs
@@ -117,7 +117,10 @@ namespace SixLabors.ImageSharp.PixelFormats
///
[MethodImpl(InliningOptions.ShortMethod)]
- public Rgba32 ToRgba32() => new Rgba32(this.ToScaledVector4());
+ public void ToRgba32(ref Rgba32 dest)
+ {
+ dest.PackFromScaledVector4(this.ToScaledVector4());
+ }
///
[MethodImpl(InliningOptions.ShortMethod)]
diff --git a/src/ImageSharp/PixelFormats/HalfVector4.cs b/src/ImageSharp/PixelFormats/HalfVector4.cs
index 2e487ef98..b7d6687ea 100644
--- a/src/ImageSharp/PixelFormats/HalfVector4.cs
+++ b/src/ImageSharp/PixelFormats/HalfVector4.cs
@@ -125,7 +125,10 @@ namespace SixLabors.ImageSharp.PixelFormats
///
[MethodImpl(InliningOptions.ShortMethod)]
- public Rgba32 ToRgba32() => new Rgba32(this.ToScaledVector4());
+ public void ToRgba32(ref Rgba32 dest)
+ {
+ dest.PackFromScaledVector4(this.ToScaledVector4());
+ }
///
[MethodImpl(InliningOptions.ShortMethod)]
diff --git a/src/ImageSharp/PixelFormats/IPixel.cs b/src/ImageSharp/PixelFormats/IPixel.cs
index 87125fa0a..c0bcfa459 100644
--- a/src/ImageSharp/PixelFormats/IPixel.cs
+++ b/src/ImageSharp/PixelFormats/IPixel.cs
@@ -100,8 +100,8 @@ namespace SixLabors.ImageSharp.PixelFormats
///
/// Expands the packed representation into an .
///
- /// The .
- Rgba32 ToRgba32();
+ /// The reference to the destination pixel
+ void ToRgba32(ref Rgba32 dest);
///
/// Packs the pixel from an value.
@@ -115,4 +115,18 @@ namespace SixLabors.ImageSharp.PixelFormats
/// The value.
void PackFromRgba64(Rgba64 source);
}
+
+ ///
+ /// Temporary extension methods for compatibility
+ ///
+ internal static class PixelExtensions
+ {
+ public static Rgba32 ToRgba32(this TPixel pixel)
+ where TPixel : struct, IPixel
+ {
+ Rgba32 result = default;
+ pixel.ToRgba32(ref result);
+ return result;
+ }
+ }
}
\ No newline at end of file
diff --git a/src/ImageSharp/PixelFormats/NormalizedByte2.cs b/src/ImageSharp/PixelFormats/NormalizedByte2.cs
index 219ec8763..9999cfe03 100644
--- a/src/ImageSharp/PixelFormats/NormalizedByte2.cs
+++ b/src/ImageSharp/PixelFormats/NormalizedByte2.cs
@@ -107,7 +107,10 @@ namespace SixLabors.ImageSharp.PixelFormats
///
[MethodImpl(InliningOptions.ShortMethod)]
- public Rgba32 ToRgba32() => new Rgba32(this.ToScaledVector4());
+ public void ToRgba32(ref Rgba32 dest)
+ {
+ dest.PackFromScaledVector4(this.ToScaledVector4());
+ }
///
[MethodImpl(InliningOptions.ShortMethod)]
diff --git a/src/ImageSharp/PixelFormats/NormalizedByte4.cs b/src/ImageSharp/PixelFormats/NormalizedByte4.cs
index d5795cb4b..5f9124bdc 100644
--- a/src/ImageSharp/PixelFormats/NormalizedByte4.cs
+++ b/src/ImageSharp/PixelFormats/NormalizedByte4.cs
@@ -128,7 +128,10 @@ namespace SixLabors.ImageSharp.PixelFormats
///
[MethodImpl(InliningOptions.ShortMethod)]
- public Rgba32 ToRgba32() => new Rgba32(this.ToScaledVector4());
+ public void ToRgba32(ref Rgba32 dest)
+ {
+ dest.PackFromScaledVector4(this.ToScaledVector4());
+ }
///
[MethodImpl(InliningOptions.ShortMethod)]
diff --git a/src/ImageSharp/PixelFormats/NormalizedShort2.cs b/src/ImageSharp/PixelFormats/NormalizedShort2.cs
index 34e752496..0cd8d9408 100644
--- a/src/ImageSharp/PixelFormats/NormalizedShort2.cs
+++ b/src/ImageSharp/PixelFormats/NormalizedShort2.cs
@@ -123,7 +123,10 @@ namespace SixLabors.ImageSharp.PixelFormats
///
[MethodImpl(InliningOptions.ShortMethod)]
- public Rgba32 ToRgba32() => new Rgba32(this.ToScaledVector4());
+ public void ToRgba32(ref Rgba32 dest)
+ {
+ dest.PackFromScaledVector4(this.ToScaledVector4());
+ }
///
[MethodImpl(InliningOptions.ShortMethod)]
diff --git a/src/ImageSharp/PixelFormats/NormalizedShort4.cs b/src/ImageSharp/PixelFormats/NormalizedShort4.cs
index 6fda84bc2..21aac4d24 100644
--- a/src/ImageSharp/PixelFormats/NormalizedShort4.cs
+++ b/src/ImageSharp/PixelFormats/NormalizedShort4.cs
@@ -130,7 +130,10 @@ namespace SixLabors.ImageSharp.PixelFormats
///
[MethodImpl(InliningOptions.ShortMethod)]
- public Rgba32 ToRgba32() => new Rgba32(this.ToScaledVector4());
+ public void ToRgba32(ref Rgba32 dest)
+ {
+ dest.PackFromScaledVector4(this.ToScaledVector4());
+ }
///
[MethodImpl(InliningOptions.ShortMethod)]
diff --git a/src/ImageSharp/PixelFormats/PixelBlender{TPixel}.cs b/src/ImageSharp/PixelFormats/PixelBlender{TPixel}.cs
index 63a101656..cca4a1017 100644
--- a/src/ImageSharp/PixelFormats/PixelBlender{TPixel}.cs
+++ b/src/ImageSharp/PixelFormats/PixelBlender{TPixel}.cs
@@ -1,31 +1,31 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System;
+// Copyright (c) Six Labors and contributors.
+// Licensed under the Apache License, Version 2.0.
+
+using System;
using System.Buffers;
using System.Numerics;
using SixLabors.ImageSharp.Memory;
-using SixLabors.Memory;
-
-namespace SixLabors.ImageSharp.PixelFormats
-{
- ///
- /// Abstract base class for calling pixel composition functions
- ///
- /// The type of the pixel
- internal abstract class PixelBlender
- where TPixel : struct, IPixel
- {
- ///
- /// Blend 2 pixels together.
- ///
- /// The background color.
- /// The source color.
- ///
- /// A value between 0 and 1 indicating the weight of the second source vector.
- /// At amount = 0, "from" is returned, at amount = 1, "to" is returned.
- ///
- /// The final pixel value after composition
+using SixLabors.Memory;
+
+namespace SixLabors.ImageSharp.PixelFormats
+{
+ ///
+ /// Abstract base class for calling pixel composition functions
+ ///
+ /// The type of the pixel
+ internal abstract class PixelBlender
+ where TPixel : struct, IPixel
+ {
+ ///
+ /// Blend 2 pixels together.
+ ///
+ /// The background color.
+ /// The source color.
+ ///
+ /// A value between 0 and 1 indicating the weight of the second source vector.
+ /// At amount = 0, "from" is returned, at amount = 1, "to" is returned.
+ ///
+ /// The final pixel value after composition
public abstract TPixel Blend(TPixel background, TPixel source, float amount);
///
@@ -34,9 +34,9 @@ namespace SixLabors.ImageSharp.PixelFormats
/// destination span
/// the background span
/// the source span
- ///
- /// A value between 0 and 1 indicating the weight of the second source vector.
- /// At amount = 0, "from" is returned, at amount = 1, "to" is returned.
+ ///
+ /// A value between 0 and 1 indicating the weight of the second source vector.
+ /// At amount = 0, "from" is returned, at amount = 1, "to" is returned.
///
protected abstract void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount);
@@ -46,9 +46,9 @@ namespace SixLabors.ImageSharp.PixelFormats
/// destination span
/// the background span
/// the source span
- ///
- /// A span with values between 0 and 1 indicating the weight of the second source vector.
- /// At amount = 0, "from" is returned, at amount = 1, "to" is returned.
+ ///
+ /// A span with values between 0 and 1 indicating the weight of the second source vector.
+ /// At amount = 0, "from" is returned, at amount = 1, "to" is returned.
///
protected abstract void BlendFunction(Span destination, ReadOnlySpan background, ReadOnlySpan source, ReadOnlySpan amount);
@@ -59,9 +59,9 @@ namespace SixLabors.ImageSharp.PixelFormats
/// the destination span
/// the background span
/// the source span
- ///
- /// A span with values between 0 and 1 indicating the weight of the second source vector.
- /// At amount = 0, "from" is returned, at amount = 1, "to" is returned.
+ ///
+ /// A span with values between 0 and 1 indicating the weight of the second source vector.
+ /// At amount = 0, "from" is returned, at amount = 1, "to" is returned.
///
public void Blend(MemoryAllocator memoryManager, Span destination, ReadOnlySpan background, ReadOnlySpan source, ReadOnlySpan amount)
{
@@ -76,9 +76,9 @@ namespace SixLabors.ImageSharp.PixelFormats
/// the destination span
/// the background span
/// the source span
- ///
- /// A span with values between 0 and 1 indicating the weight of the second source vector.
- /// At amount = 0, "from" is returned, at amount = 1, "to" is returned.
+ ///
+ /// A span with values between 0 and 1 indicating the weight of the second source vector.
+ /// At amount = 0, "from" is returned, at amount = 1, "to" is returned.
///
public void Blend(MemoryAllocator memoryManager, Span destination, ReadOnlySpan background, ReadOnlySpan source, ReadOnlySpan amount)
where TPixelSrc : struct, IPixel
@@ -110,9 +110,9 @@ namespace SixLabors.ImageSharp.PixelFormats
/// the destination span
/// the background span
/// the source span
- ///
- /// A value between 0 and 1 indicating the weight of the second source vector.
- /// At amount = 0, "from" is returned, at amount = 1, "to" is returned.
+ ///
+ /// A value between 0 and 1 indicating the weight of the second source vector.
+ /// At amount = 0, "from" is returned, at amount = 1, "to" is returned.
///
public void Blend(MemoryAllocator memoryManager, Span destination, ReadOnlySpan background, ReadOnlySpan source, float amount)
where TPixelSrc : struct, IPixel
@@ -135,5 +135,5 @@ namespace SixLabors.ImageSharp.PixelFormats
PixelOperations.Instance.PackFromScaledVector4(destinationSpan, destination, destination.Length);
}
}
- }
-}
+ }
+}
diff --git a/src/ImageSharp/PixelFormats/Rg32.cs b/src/ImageSharp/PixelFormats/Rg32.cs
index 0831f6524..878b2342f 100644
--- a/src/ImageSharp/PixelFormats/Rg32.cs
+++ b/src/ImageSharp/PixelFormats/Rg32.cs
@@ -111,7 +111,10 @@ namespace SixLabors.ImageSharp.PixelFormats
///
[MethodImpl(InliningOptions.ShortMethod)]
- public Rgba32 ToRgba32() => new Rgba32(this.ToScaledVector4());
+ public void ToRgba32(ref Rgba32 dest)
+ {
+ dest.PackFromScaledVector4(this.ToScaledVector4());
+ }
///
[MethodImpl(InliningOptions.ShortMethod)]
diff --git a/src/ImageSharp/PixelFormats/Rgba1010102.cs b/src/ImageSharp/PixelFormats/Rgba1010102.cs
index 14265b54e..7f3e3a870 100644
--- a/src/ImageSharp/PixelFormats/Rgba1010102.cs
+++ b/src/ImageSharp/PixelFormats/Rgba1010102.cs
@@ -117,7 +117,10 @@ namespace SixLabors.ImageSharp.PixelFormats
///
[MethodImpl(InliningOptions.ShortMethod)]
- public Rgba32 ToRgba32() => new Rgba32(this.ToScaledVector4());
+ public void ToRgba32(ref Rgba32 dest)
+ {
+ dest.PackFromScaledVector4(this.ToScaledVector4());
+ }
///
[MethodImpl(InliningOptions.ShortMethod)]
diff --git a/src/ImageSharp/PixelFormats/RgbaVector.cs b/src/ImageSharp/PixelFormats/RgbaVector.cs
index b2a3dc578..25b8155d3 100644
--- a/src/ImageSharp/PixelFormats/RgbaVector.cs
+++ b/src/ImageSharp/PixelFormats/RgbaVector.cs
@@ -152,7 +152,10 @@ namespace SixLabors.ImageSharp.PixelFormats
///
[MethodImpl(InliningOptions.ShortMethod)]
- public Rgba32 ToRgba32() => new Rgba32(this.ToScaledVector4());
+ public void ToRgba32(ref Rgba32 dest)
+ {
+ dest.PackFromScaledVector4(this.ToScaledVector4());
+ }
///
[MethodImpl(InliningOptions.ShortMethod)]
diff --git a/src/ImageSharp/PixelFormats/Short2.cs b/src/ImageSharp/PixelFormats/Short2.cs
index 81df3ef7b..69a4e35e9 100644
--- a/src/ImageSharp/PixelFormats/Short2.cs
+++ b/src/ImageSharp/PixelFormats/Short2.cs
@@ -129,7 +129,10 @@ namespace SixLabors.ImageSharp.PixelFormats
///
[MethodImpl(InliningOptions.ShortMethod)]
- public Rgba32 ToRgba32() => new Rgba32(this.ToScaledVector4());
+ public void ToRgba32(ref Rgba32 dest)
+ {
+ dest.PackFromScaledVector4(this.ToScaledVector4());
+ }
///
[MethodImpl(InliningOptions.ShortMethod)]
diff --git a/src/ImageSharp/PixelFormats/Short4.cs b/src/ImageSharp/PixelFormats/Short4.cs
index 48bd01d6e..653bc030f 100644
--- a/src/ImageSharp/PixelFormats/Short4.cs
+++ b/src/ImageSharp/PixelFormats/Short4.cs
@@ -134,7 +134,10 @@ namespace SixLabors.ImageSharp.PixelFormats
///
[MethodImpl(InliningOptions.ShortMethod)]
- public Rgba32 ToRgba32() => new Rgba32(this.ToScaledVector4());
+ public void ToRgba32(ref Rgba32 dest)
+ {
+ dest.PackFromScaledVector4(this.ToScaledVector4());
+ }
///
[MethodImpl(InliningOptions.ShortMethod)]