Skip to content

Commit 16abb95

Browse files
Merge pull request #1106 from SixLabors/js/fix-1105
Break when minY >= bottom
2 parents ff371db + b3e0963 commit 16abb95

File tree

2 files changed

+45
-19
lines changed

2 files changed

+45
-19
lines changed

src/ImageSharp/Advanced/ParallelUtils/ParallelHelper.cs

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,14 +62,23 @@ public static void IterateRows(
6262

6363
var parallelOptions = new ParallelOptions { MaxDegreeOfParallelism = numOfSteps };
6464

65+
int top = rectangle.Top;
66+
int bottom = rectangle.Bottom;
67+
6568
Parallel.For(
6669
0,
6770
numOfSteps,
6871
parallelOptions,
6972
i =>
7073
{
71-
int yMin = rectangle.Top + (i * verticalStep);
72-
int yMax = Math.Min(yMin + verticalStep, rectangle.Bottom);
74+
int yMin = top + (i * verticalStep);
75+
76+
if (yMin >= bottom)
77+
{
78+
return;
79+
}
80+
81+
int yMax = Math.Min(yMin + verticalStep, bottom);
7382

7483
var rows = new RowInterval(yMin, yMax);
7584
body(rows);
@@ -110,13 +119,22 @@ internal static void IterateRowsWithTempBuffer<T>(
110119

111120
var parallelOptions = new ParallelOptions { MaxDegreeOfParallelism = numOfSteps };
112121

122+
int top = rectangle.Top;
123+
int bottom = rectangle.Bottom;
124+
113125
Parallel.For(
114126
0,
115127
numOfSteps,
116128
parallelOptions,
117129
i =>
118130
{
119-
int yMin = rectangle.Top + (i * verticalStep);
131+
int yMin = top + (i * verticalStep);
132+
133+
if (yMin >= bottom)
134+
{
135+
return;
136+
}
137+
120138
int yMax = Math.Min(yMin + verticalStep, rectangle.Bottom);
121139

122140
var rows = new RowInterval(yMin, yMax);

tests/ImageSharp.Tests/Helpers/ParallelHelperTests.cs

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -28,17 +28,21 @@ public ParallelHelperTests(ITestOutputHelper output)
2828
/// <summary>
2929
/// maxDegreeOfParallelism, minY, maxY, expectedStepLength, expectedLastStepLength
3030
/// </summary>
31-
public static TheoryData<int, int, int, int, int> IterateRows_OverMinimumPixelsLimit_Data =
32-
new TheoryData<int, int, int, int, int>
31+
public static TheoryData<int, int, int, int, int, int> IterateRows_OverMinimumPixelsLimit_Data =
32+
new TheoryData<int, int, int, int, int, int>
3333
{
34-
{ 1, 0, 100, -1, 100 },
35-
{ 2, 0, 9, 5, 4 },
36-
{ 4, 0, 19, 5, 4 },
37-
{ 2, 10, 19, 5, 4 },
38-
{ 4, 0, 200, 50, 50 },
39-
{ 4, 123, 323, 50, 50 },
40-
{ 4, 0, 1201, 301, 298 },
41-
{ 8, 10, 236, 29, 23 }
34+
{ 1, 0, 100, -1, 100, 1 },
35+
{ 2, 0, 9, 5, 4, 2 },
36+
{ 4, 0, 19, 5, 4, 4 },
37+
{ 2, 10, 19, 5, 4, 2 },
38+
{ 4, 0, 200, 50, 50, 4 },
39+
{ 4, 123, 323, 50, 50, 4 },
40+
{ 4, 0, 1201, 301, 298, 4 },
41+
{ 8, 10, 236, 29, 23, 8 },
42+
{ 16, 0, 209, 14, 13, 15 },
43+
{ 24, 0, 209, 9, 2, 24 },
44+
{ 32, 0, 209, 7, 6, 30 },
45+
{ 64, 0, 209, 4, 1, 53 },
4246
};
4347

4448
[Theory]
@@ -48,7 +52,8 @@ public void IterateRows_OverMinimumPixelsLimit_IntervalsAreCorrect(
4852
int minY,
4953
int maxY,
5054
int expectedStepLength,
51-
int expectedLastStepLength)
55+
int expectedLastStepLength,
56+
int expectedNumberOfSteps)
5257
{
5358
var parallelSettings = new ParallelExecutionSettings(
5459
maxDegreeOfParallelism,
@@ -74,7 +79,7 @@ public void IterateRows_OverMinimumPixelsLimit_IntervalsAreCorrect(
7479
Assert.Equal(expected, step);
7580
});
7681

77-
Assert.Equal(maxDegreeOfParallelism, actualNumberOfSteps);
82+
Assert.Equal(expectedNumberOfSteps, actualNumberOfSteps);
7883
}
7984

8085
[Theory]
@@ -84,7 +89,8 @@ public void IterateRows_OverMinimumPixelsLimit_ShouldVisitAllRows(
8489
int minY,
8590
int maxY,
8691
int expectedStepLength,
87-
int expectedLastStepLength)
92+
int expectedLastStepLength,
93+
int expectedNumberOfSteps)
8894
{
8995
var parallelSettings = new ParallelExecutionSettings(
9096
maxDegreeOfParallelism,
@@ -117,7 +123,8 @@ public void IterateRowsWithTempBuffer_OverMinimumPixelsLimit(
117123
int minY,
118124
int maxY,
119125
int expectedStepLength,
120-
int expectedLastStepLength)
126+
int expectedLastStepLength,
127+
int expectedNumberOfSteps)
121128
{
122129
var parallelSettings = new ParallelExecutionSettings(
123130
maxDegreeOfParallelism,
@@ -146,7 +153,7 @@ public void IterateRowsWithTempBuffer_OverMinimumPixelsLimit(
146153
Assert.Equal(expected, step);
147154
});
148155

149-
Assert.Equal(maxDegreeOfParallelism, actualNumberOfSteps);
156+
Assert.Equal(expectedNumberOfSteps, actualNumberOfSteps);
150157

151158
int numberOfDifferentBuffers = bufferHashes.Distinct().Count();
152159
Assert.Equal(actualNumberOfSteps, numberOfDifferentBuffers);
@@ -159,7 +166,8 @@ public void IterateRowsWithTempBuffer_OverMinimumPixelsLimit_ShouldVisitAllRows(
159166
int minY,
160167
int maxY,
161168
int expectedStepLength,
162-
int expectedLastStepLength)
169+
int expectedLastStepLength,
170+
int expectedNumberOfSteps)
163171
{
164172
var parallelSettings = new ParallelExecutionSettings(
165173
maxDegreeOfParallelism,

0 commit comments

Comments
 (0)