Browse Source

Merge pull request #1106 from SixLabors/js/fix-1105

Break when minY >= bottom
af/octree-no-pixelmap
James Jackson-South 6 years ago
committed by GitHub
parent
commit
1febb98c56
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 24
      src/ImageSharp/Advanced/ParallelUtils/ParallelHelper.cs
  2. 40
      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);

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

@ -28,17 +28,21 @@ 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 },
{ 24, 0, 209, 9, 2, 24 },
{ 32, 0, 209, 7, 6, 30 },
{ 64, 0, 209, 4, 1, 53 },
}; };
[Theory] [Theory]
@ -48,7 +52,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 +79,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 +89,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 +123,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 +153,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 +166,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