diff --git a/src/ImageSharp/Advanced/ParallelUtils/ParallelHelper.cs b/src/ImageSharp/Advanced/ParallelUtils/ParallelHelper.cs
index ecefadb08d..0414f3ae3f 100644
--- a/src/ImageSharp/Advanced/ParallelUtils/ParallelHelper.cs
+++ b/src/ImageSharp/Advanced/ParallelUtils/ParallelHelper.cs
@@ -62,14 +62,23 @@ namespace SixLabors.ImageSharp.Advanced.ParallelUtils
var parallelOptions = new ParallelOptions { MaxDegreeOfParallelism = numOfSteps };
+ int top = rectangle.Top;
+ int bottom = rectangle.Bottom;
+
Parallel.For(
0,
numOfSteps,
parallelOptions,
i =>
{
- int yMin = rectangle.Top + (i * verticalStep);
- int yMax = Math.Min(yMin + verticalStep, rectangle.Bottom);
+ int yMin = top + (i * verticalStep);
+
+ if (yMin >= bottom)
+ {
+ return;
+ }
+
+ int yMax = Math.Min(yMin + verticalStep, bottom);
var rows = new RowInterval(yMin, yMax);
body(rows);
@@ -110,13 +119,22 @@ namespace SixLabors.ImageSharp.Advanced.ParallelUtils
var parallelOptions = new ParallelOptions { MaxDegreeOfParallelism = numOfSteps };
+ int top = rectangle.Top;
+ int bottom = rectangle.Bottom;
+
Parallel.For(
0,
numOfSteps,
parallelOptions,
i =>
{
- int yMin = rectangle.Top + (i * verticalStep);
+ int yMin = top + (i * verticalStep);
+
+ if (yMin >= bottom)
+ {
+ return;
+ }
+
int yMax = Math.Min(yMin + verticalStep, rectangle.Bottom);
var rows = new RowInterval(yMin, yMax);
diff --git a/tests/ImageSharp.Tests/Helpers/ParallelHelperTests.cs b/tests/ImageSharp.Tests/Helpers/ParallelHelperTests.cs
index 5914aba400..69942eef98 100644
--- a/tests/ImageSharp.Tests/Helpers/ParallelHelperTests.cs
+++ b/tests/ImageSharp.Tests/Helpers/ParallelHelperTests.cs
@@ -28,17 +28,18 @@ namespace SixLabors.ImageSharp.Tests.Helpers
///
/// maxDegreeOfParallelism, minY, maxY, expectedStepLength, expectedLastStepLength
///
- public static TheoryData IterateRows_OverMinimumPixelsLimit_Data =
- new TheoryData
+ public static TheoryData IterateRows_OverMinimumPixelsLimit_Data =
+ new TheoryData
{
- { 1, 0, 100, -1, 100 },
- { 2, 0, 9, 5, 4 },
- { 4, 0, 19, 5, 4 },
- { 2, 10, 19, 5, 4 },
- { 4, 0, 200, 50, 50 },
- { 4, 123, 323, 50, 50 },
- { 4, 0, 1201, 301, 298 },
- { 8, 10, 236, 29, 23 }
+ { 1, 0, 100, -1, 100, 1 },
+ { 2, 0, 9, 5, 4, 2 },
+ { 4, 0, 19, 5, 4, 4 },
+ { 2, 10, 19, 5, 4, 2 },
+ { 4, 0, 200, 50, 50, 4 },
+ { 4, 123, 323, 50, 50, 4 },
+ { 4, 0, 1201, 301, 298, 4 },
+ { 8, 10, 236, 29, 23, 8 },
+ { 16, 0, 209, 14, 13, 15 }
};
[Theory]
@@ -48,7 +49,8 @@ namespace SixLabors.ImageSharp.Tests.Helpers
int minY,
int maxY,
int expectedStepLength,
- int expectedLastStepLength)
+ int expectedLastStepLength,
+ int expectedNumberOfSteps)
{
var parallelSettings = new ParallelExecutionSettings(
maxDegreeOfParallelism,
@@ -74,7 +76,7 @@ namespace SixLabors.ImageSharp.Tests.Helpers
Assert.Equal(expected, step);
});
- Assert.Equal(maxDegreeOfParallelism, actualNumberOfSteps);
+ Assert.Equal(expectedNumberOfSteps, actualNumberOfSteps);
}
[Theory]
@@ -84,7 +86,8 @@ namespace SixLabors.ImageSharp.Tests.Helpers
int minY,
int maxY,
int expectedStepLength,
- int expectedLastStepLength)
+ int expectedLastStepLength,
+ int expectedNumberOfSteps)
{
var parallelSettings = new ParallelExecutionSettings(
maxDegreeOfParallelism,
@@ -117,7 +120,8 @@ namespace SixLabors.ImageSharp.Tests.Helpers
int minY,
int maxY,
int expectedStepLength,
- int expectedLastStepLength)
+ int expectedLastStepLength,
+ int expectedNumberOfSteps)
{
var parallelSettings = new ParallelExecutionSettings(
maxDegreeOfParallelism,
@@ -146,7 +150,7 @@ namespace SixLabors.ImageSharp.Tests.Helpers
Assert.Equal(expected, step);
});
- Assert.Equal(maxDegreeOfParallelism, actualNumberOfSteps);
+ Assert.Equal(expectedNumberOfSteps, actualNumberOfSteps);
int numberOfDifferentBuffers = bufferHashes.Distinct().Count();
Assert.Equal(actualNumberOfSteps, numberOfDifferentBuffers);
@@ -159,7 +163,8 @@ namespace SixLabors.ImageSharp.Tests.Helpers
int minY,
int maxY,
int expectedStepLength,
- int expectedLastStepLength)
+ int expectedLastStepLength,
+ int expectedNumberOfSteps)
{
var parallelSettings = new ParallelExecutionSettings(
maxDegreeOfParallelism,