mirror of
https://github.com/python-pillow/Pillow.git
synced 2025-01-27 09:44:31 +03:00
Improved connecting discontiguous corners
This commit is contained in:
parent
ef223f52f7
commit
d5b86c0c91
Binary file not shown.
Before Width: | Height: | Size: 533 B After Width: | Height: | Size: 533 B |
|
@ -1683,7 +1683,7 @@ def test_discontiguous_corners_polygon() -> None:
|
|||
BLACK,
|
||||
)
|
||||
expected = os.path.join(IMAGES_PATH, "discontiguous_corners_polygon.png")
|
||||
assert_image_similar_tofile(img, expected, 1)
|
||||
assert_image_equal_tofile(img, expected)
|
||||
|
||||
|
||||
def test_polygon2() -> None:
|
||||
|
|
|
@ -501,55 +501,49 @@ polygon_generic(
|
|||
// Needed to draw consistent polygons
|
||||
xx[j] = xx[j - 1];
|
||||
j++;
|
||||
} else if (current->dx != 0 && j % 2 == 1 &&
|
||||
roundf(xx[j - 1]) == xx[j - 1]) {
|
||||
} else if ((ymin == current->ymin || ymin == current->ymax) &&
|
||||
current->dx != 0) {
|
||||
// Connect discontiguous corners
|
||||
for (k = 0; k < i; k++) {
|
||||
Edge *other_edge = edge_table[k];
|
||||
if ((current->dx > 0 && other_edge->dx <= 0) ||
|
||||
(current->dx < 0 && other_edge->dx >= 0)) {
|
||||
if ((ymin != other_edge->ymin && ymin != other_edge->ymax) ||
|
||||
other_edge->dx == 0) {
|
||||
continue;
|
||||
}
|
||||
// Check if the two edges join to make a corner
|
||||
if (xx[j - 1] ==
|
||||
(ymin - other_edge->y0) * other_edge->dx + other_edge->x0) {
|
||||
if (roundf(xx[j - 1]) ==
|
||||
roundf(
|
||||
(ymin - other_edge->y0) * other_edge->dx +
|
||||
other_edge->x0
|
||||
)) {
|
||||
// Determine points from the edges on the next row
|
||||
// Or if this is the last row, check the previous row
|
||||
int offset = ymin == ymax ? -1 : 1;
|
||||
int offset = ymin == current->ymax ? -1 : 1;
|
||||
adjacent_line_x =
|
||||
(ymin + offset - current->y0) * current->dx +
|
||||
current->x0;
|
||||
adjacent_line_x_other_edge =
|
||||
(ymin + offset - other_edge->y0) * other_edge->dx +
|
||||
other_edge->x0;
|
||||
if (ymin == current->ymax) {
|
||||
if (current->dx > 0) {
|
||||
xx[k] =
|
||||
fmax(
|
||||
if (ymin + offset >= other_edge->ymin &&
|
||||
ymin + offset <= other_edge->ymax) {
|
||||
adjacent_line_x_other_edge =
|
||||
(ymin + offset - other_edge->y0) * other_edge->dx +
|
||||
other_edge->x0;
|
||||
if (xx[j - 1] > adjacent_line_x + 1 &&
|
||||
xx[j - 1] > adjacent_line_x_other_edge + 1) {
|
||||
xx[j - 1] =
|
||||
roundf(fmax(
|
||||
adjacent_line_x, adjacent_line_x_other_edge
|
||||
) +
|
||||
)) +
|
||||
1;
|
||||
} else {
|
||||
xx[k] =
|
||||
fmin(
|
||||
} else if (xx[j - 1] < adjacent_line_x - 1 &&
|
||||
xx[j - 1] < adjacent_line_x_other_edge - 1) {
|
||||
xx[j - 1] =
|
||||
roundf(fmin(
|
||||
adjacent_line_x, adjacent_line_x_other_edge
|
||||
) -
|
||||
1;
|
||||
}
|
||||
} else {
|
||||
if (current->dx > 0) {
|
||||
xx[k] = fmin(
|
||||
adjacent_line_x, adjacent_line_x_other_edge
|
||||
);
|
||||
} else {
|
||||
xx[k] =
|
||||
fmax(
|
||||
adjacent_line_x, adjacent_line_x_other_edge
|
||||
) +
|
||||
)) -
|
||||
1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user