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,