diff --git a/src/ImageSharp/Common/ParallelUtils/ParallelExecutionSettings.cs b/src/ImageSharp/Common/ParallelUtils/ParallelExecutionSettings.cs
index 516c1446d..9b2ae89d0 100644
--- a/src/ImageSharp/Common/ParallelUtils/ParallelExecutionSettings.cs
+++ b/src/ImageSharp/Common/ParallelUtils/ParallelExecutionSettings.cs
@@ -15,7 +15,7 @@ namespace SixLabors.ImageSharp.ParallelUtils
///
/// Default value for .
///
- public const int DefaultMinimumPixelsProcessedPerTask = 2048;
+ public const int DefaultMinimumPixelsProcessedPerTask = 4096;
public ParallelExecutionSettings(
int maxDegreeOfParallelism,
diff --git a/src/ImageSharp/Processing/Processors/Transforms/FlipProcessor.cs b/src/ImageSharp/Processing/Processors/Transforms/FlipProcessor.cs
index 442873676..c6f5e9d7b 100644
--- a/src/ImageSharp/Processing/Processors/Transforms/FlipProcessor.cs
+++ b/src/ImageSharp/Processing/Processors/Transforms/FlipProcessor.cs
@@ -2,9 +2,11 @@
// Licensed under the Apache License, Version 2.0.
using System;
+using System.Buffers;
using System.Threading.Tasks;
using SixLabors.ImageSharp.Advanced;
using SixLabors.ImageSharp.Memory;
+using SixLabors.ImageSharp.ParallelUtils;
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.Memory;
using SixLabors.Primitives;
@@ -55,30 +57,20 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms
private void FlipX(ImageFrame source, Configuration configuration)
{
int height = source.Height;
- int halfHeight = (int)Math.Ceiling(source.Height * .5F);
-
- using (Buffer2D targetPixels = configuration.MemoryAllocator.Allocate2D(source.Size()))
+ using (IMemoryOwner tempBuffer = configuration.MemoryAllocator.Allocate(source.Width))
{
+ Span temp = tempBuffer.Memory.Span;
-
- ParallelFor.WithConfiguration(
- 0,
- halfHeight,
- configuration,
- y =>
- {
- int newY = height - y - 1;
- Span sourceRow = source.GetPixelRowSpan(y);
- Span altSourceRow = source.GetPixelRowSpan(newY);
- Span targetRow = targetPixels.GetRowSpan(y);
- Span altTargetRow = targetPixels.GetRowSpan(newY);
-
- sourceRow.CopyTo(altTargetRow);
- altSourceRow.CopyTo(targetRow);
- });
-
- Buffer2D.SwapOrCopyContent(source.PixelBuffer, targetPixels);
+ for (int yTop = 0; yTop < height / 2; yTop++)
+ {
+ int yBottom = height - yTop - 1;
+ Span topRow = source.GetPixelRowSpan(yBottom);
+ Span bottomRow = source.GetPixelRowSpan(yTop);
+ topRow.CopyTo(temp);
+ bottomRow.CopyTo(topRow);
+ temp.CopyTo(bottomRow);
+ }
}
}
@@ -89,31 +81,16 @@ namespace SixLabors.ImageSharp.Processing.Processors.Transforms
/// The configuration.
private void FlipY(ImageFrame source, Configuration configuration)
{
- int width = source.Width;
- int height = source.Height;
- int halfWidth = (int)Math.Ceiling(width * .5F);
-
- using (Buffer2D targetPixels = configuration.MemoryAllocator.Allocate2D(source.Size()))
- {
- ParallelFor.WithConfiguration(
- 0,
- height,
- configuration,
- y =>
+ ParallelHelper.IterateRows(
+ source.Bounds(),
+ configuration,
+ rows =>
+ {
+ for (int y = rows.Min; y < rows.Max; y++)
{
- Span sourceRow = source.GetPixelRowSpan(y);
- Span targetRow = targetPixels.GetRowSpan(y);
-
- for (int x = 0; x < halfWidth; x++)
- {
- int newX = width - x - 1;
- targetRow[x] = sourceRow[newX];
- targetRow[newX] = sourceRow[x];
- }
- });
-
- Buffer2D.SwapOrCopyContent(source.PixelBuffer, targetPixels);
- }
+ source.GetPixelRowSpan(y).Reverse();
+ }
+ });
}
}
}
\ No newline at end of file