Browse Source

Break when minY >= bottom

af/octree-no-pixelmap
James Jackson-South 6 years ago
parent
commit
8e12faddf3
  1. 24
      src/ImageSharp/Advanced/ParallelUtils/ParallelHelper.cs
  2. 37
      tests/ImageSharp.Tests/Helpers/ParallelHelperTests.cs

24
src/ImageSharp/Advanced/ParallelUtils/ParallelHelper.cs

@ -62,14 +62,23 @@ namespace SixLabors.ImageSharp.Advanced.ParallelUtils
var parallelOptions = new ParallelOptions { MaxDegreeOfParallelism = numOfSteps }; var parallelOptions = new ParallelOptions { MaxDegreeOfParallelism = numOfSteps };
int top = rectangle.Top;
int bottom = rectangle.Bottom;
Parallel.For( Parallel.For(
0, 0,
numOfSteps, numOfSteps,
parallelOptions, parallelOptions,
i => i =>
{ {
int yMin = rectangle.Top + (i * verticalStep); int yMin = top + (i * verticalStep);
int yMax = Math.Min(yMin + verticalStep, rectangle.Bottom);
if (yMin >= bottom)
{
return;
}
int yMax = Math.Min(yMin + verticalStep, bottom);
var rows = new RowInterval(yMin, yMax); var rows = new RowInterval(yMin, yMax);
body(rows); body(rows);
@ -110,13 +119,22 @@ namespace SixLabors.ImageSharp.Advanced.ParallelUtils
var parallelOptions = new ParallelOptions { MaxDegreeOfParallelism = numOfSteps }; var parallelOptions = new ParallelOptions { MaxDegreeOfParallelism = numOfSteps };
int top = rectangle.Top;
int bottom = rectangle.Bottom;
Parallel.For( Parallel.For(
0, 0,
numOfSteps, numOfSteps,
parallelOptions, parallelOptions,
i => i =>
{ {
int yMin = rectangle.Top + (i * verticalStep); int yMin = top + (i * verticalStep);
if (yMin >= bottom)
{
return;
}
int yMax = Math.Min(yMin + verticalStep, rectangle.Bottom); int yMax = Math.Min(yMin + verticalStep, rectangle.Bottom);
var rows = new RowInterval(yMin, yMax); var rows = new RowInterval(yMin, yMax);

37
tests/ImageSharp.Tests/Helpers/ParallelHelperTests.cs

@ -28,17 +28,18 @@ namespace SixLabors.ImageSharp.Tests.Helpers
/// <summary> /// <summary>
/// maxDegreeOfParallelism, minY, maxY, expectedStepLength, expectedLastStepLength /// maxDegreeOfParallelism, minY, maxY, expectedStepLength, expectedLastStepLength
/// </summary> /// </summary>
public static TheoryData<int, int, int, int, int> IterateRows_OverMinimumPixelsLimit_Data = public static TheoryData<int, int, int, int, int, int> IterateRows_OverMinimumPixelsLimit_Data =
new TheoryData<int, int, int, int, int> new TheoryData<int, int, int, int, int, int>
{ {
{ 1, 0, 100, -1, 100 }, { 1, 0, 100, -1, 100, 1 },
{ 2, 0, 9, 5, 4 }, { 2, 0, 9, 5, 4, 2 },
{ 4, 0, 19, 5, 4 }, { 4, 0, 19, 5, 4, 4 },
{ 2, 10, 19, 5, 4 }, { 2, 10, 19, 5, 4, 2 },
{ 4, 0, 200, 50, 50 }, { 4, 0, 200, 50, 50, 4 },
{ 4, 123, 323, 50, 50 }, { 4, 123, 323, 50, 50, 4 },
{ 4, 0, 1201, 301, 298 }, { 4, 0, 1201, 301, 298, 4 },
{ 8, 10, 236, 29, 23 } { 8, 10, 236, 29, 23, 8 },
{ 16, 0, 209, 14, 13, 15 }
}; };
[Theory] [Theory]
@ -48,7 +49,8 @@ namespace SixLabors.ImageSharp.Tests.Helpers
int minY, int minY,
int maxY, int maxY,
int expectedStepLength, int expectedStepLength,
int expectedLastStepLength) int expectedLastStepLength,
int expectedNumberOfSteps)
{ {
var parallelSettings = new ParallelExecutionSettings( var parallelSettings = new ParallelExecutionSettings(
maxDegreeOfParallelism, maxDegreeOfParallelism,
@ -74,7 +76,7 @@ namespace SixLabors.ImageSharp.Tests.Helpers
Assert.Equal(expected, step); Assert.Equal(expected, step);
}); });
Assert.Equal(maxDegreeOfParallelism, actualNumberOfSteps); Assert.Equal(expectedNumberOfSteps, actualNumberOfSteps);
} }
[Theory] [Theory]
@ -84,7 +86,8 @@ namespace SixLabors.ImageSharp.Tests.Helpers
int minY, int minY,
int maxY, int maxY,
int expectedStepLength, int expectedStepLength,
int expectedLastStepLength) int expectedLastStepLength,
int expectedNumberOfSteps)
{ {
var parallelSettings = new ParallelExecutionSettings( var parallelSettings = new ParallelExecutionSettings(
maxDegreeOfParallelism, maxDegreeOfParallelism,
@ -117,7 +120,8 @@ namespace SixLabors.ImageSharp.Tests.Helpers
int minY, int minY,
int maxY, int maxY,
int expectedStepLength, int expectedStepLength,
int expectedLastStepLength) int expectedLastStepLength,
int expectedNumberOfSteps)
{ {
var parallelSettings = new ParallelExecutionSettings( var parallelSettings = new ParallelExecutionSettings(
maxDegreeOfParallelism, maxDegreeOfParallelism,
@ -146,7 +150,7 @@ namespace SixLabors.ImageSharp.Tests.Helpers
Assert.Equal(expected, step); Assert.Equal(expected, step);
}); });
Assert.Equal(maxDegreeOfParallelism, actualNumberOfSteps); Assert.Equal(expectedNumberOfSteps, actualNumberOfSteps);
int numberOfDifferentBuffers = bufferHashes.Distinct().Count(); int numberOfDifferentBuffers = bufferHashes.Distinct().Count();
Assert.Equal(actualNumberOfSteps, numberOfDifferentBuffers); Assert.Equal(actualNumberOfSteps, numberOfDifferentBuffers);
@ -159,7 +163,8 @@ namespace SixLabors.ImageSharp.Tests.Helpers
int minY, int minY,
int maxY, int maxY,
int expectedStepLength, int expectedStepLength,
int expectedLastStepLength) int expectedLastStepLength,
int expectedNumberOfSteps)
{ {
var parallelSettings = new ParallelExecutionSettings( var parallelSettings = new ParallelExecutionSettings(
maxDegreeOfParallelism, maxDegreeOfParallelism,

Loading…
Cancel
Save