commit 51b4479b86f195f7aa0e1fc97a25e851ad591db6
parent af9932bc8558765f879ee1419a9cd76aaa7abf4e
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date: Tue, 17 Jan 2023 15:27:47 +0100
Fix offset=0 not leaving polygon unchanged
Diffstat:
2 files changed, 28 insertions(+), 23 deletions(-)
diff --git a/src/scpr_polygon.c b/src/scpr_polygon.c
@@ -315,13 +315,14 @@ scpr_offset_polygon
size_t c;
Clipper2Lib::PathD tmp;
Clipper2Lib::PathsD polygon;
- Clipper2Lib::JoinType cjt;
res_T res = RES_OK;
if(!poly_desc) {
res = RES_BAD_ARG;
goto error;
}
+
+ /* Check join type */
switch(join_type) {
case SCPR_JOIN_SQUARE:
case SCPR_JOIN_ROUND:
@@ -331,22 +332,26 @@ scpr_offset_polygon
res = RES_BAD_ARG;
goto error;
}
- cjt = scpr_join_type_to_clipper_join_type(join_type);
- poly_desc->paths = Clipper2Lib::InflatePaths(poly_desc->paths, offset, cjt,
- Clipper2Lib::EndType::Polygon);
-
- /* Rebuild AABB */
- d2_splat(poly_desc->lower, DBL_MAX);
- d2_splat(poly_desc->upper,-DBL_MAX);
- FOR_EACH(c, 0, poly_desc->paths.size()) {
- size_t i, nverts;
- nverts = poly_desc->paths[c].size();
- FOR_EACH(i, 0, nverts) {
- double pos[2];
- ERR(scpr_polygon_get_position(poly_desc, c, i, pos));
- d2_min(poly_desc->lower, poly_desc->lower, pos);
- d2_max(poly_desc->upper, poly_desc->upper, pos);
+ /* Some known problems when offset=0, not leaving polygon unchanged */
+ if(offset != 0) {
+ Clipper2Lib::JoinType cjt = scpr_join_type_to_clipper_join_type(join_type);
+ poly_desc->paths = Clipper2Lib::InflatePaths(poly_desc->paths, offset, cjt,
+ Clipper2Lib::EndType::Polygon);
+
+ /* Rebuild AABB */
+ d2_splat(poly_desc->lower, DBL_MAX);
+ d2_splat(poly_desc->upper,-DBL_MAX);
+ FOR_EACH(c, 0, poly_desc->paths.size()) {
+ size_t i, nverts;
+ nverts = poly_desc->paths[c].size();
+
+ FOR_EACH(i, 0, nverts) {
+ double pos[2];
+ ERR(scpr_polygon_get_position(poly_desc, c, i, pos));
+ d2_min(poly_desc->lower, poly_desc->lower, pos);
+ d2_max(poly_desc->upper, poly_desc->upper, pos);
+ }
}
}
diff --git a/src/test_scpr_offset.c b/src/test_scpr_offset.c
@@ -54,7 +54,7 @@ test_single(void)
ctx.coords = coords;
ctx.nverts = nverts;
ctx.ncomps = ncomps;
-
+
CHK(scpr_polygon_setup_indexed_vertices(polygon, ncomps, pget_nverts, pget_pos, &ctx)
== RES_OK);
CHK(scpr_polygon_setup_indexed_vertices(expected, ncomps, pget_nverts, pget_pos, &ctx)
@@ -78,7 +78,7 @@ test_single(void)
memcpy(*coords, coords0, 2*nverts[0]*sizeof(**coords));
CHK(scpr_polygon_setup_indexed_vertices(expected, ncomps, pget_nverts, pget_pos, &ctx)
== RES_OK);
-
+
CHK(scpr_offset_polygon(polygon, -1, SCPR_JOIN_MITER) == RES_OK);
CHK(scpr_polygon_eq(polygon, expected, &eq) == RES_OK);
CHK(eq);
@@ -160,7 +160,7 @@ test_double(void)
ctx.coords = coords;
ctx.nverts = nverts;
ctx.ncomps = ncomps;
-
+
CHK(scpr_polygon_setup_indexed_vertices(polygon, ncomps, pget_nverts, pget_pos, &ctx)
== RES_OK);
CHK(scpr_polygon_setup_indexed_vertices(expected, ncomps, pget_nverts, pget_pos, &ctx)
@@ -186,7 +186,7 @@ test_double(void)
memcpy(*(coords+1), coords1, 2*nverts[1]*sizeof(**coords));
CHK(scpr_polygon_setup_indexed_vertices(expected, ncomps, pget_nverts, pget_pos, &ctx)
== RES_OK);
-
+
CHK(scpr_offset_polygon(polygon, -1, SCPR_JOIN_MITER) == RES_OK);
CHK(scpr_polygon_eq(polygon, expected, &eq) == RES_OK);
CHK(eq);
@@ -280,7 +280,7 @@ test_internal(void)
ctx.coords = coords;
ctx.nverts = nverts;
ctx.ncomps = ncomps;
-
+
CHK(scpr_polygon_setup_indexed_vertices(polygon, ncomps, pget_nverts, pget_pos, &ctx)
== RES_OK);
CHK(scpr_polygon_setup_indexed_vertices(expected, ncomps, pget_nverts, pget_pos, &ctx)
@@ -306,7 +306,7 @@ test_internal(void)
memcpy(*(coords+1), coords1, 2*nverts[1]*sizeof(**coords));
CHK(scpr_polygon_setup_indexed_vertices(expected, ncomps, pget_nverts, pget_pos, &ctx)
== RES_OK);
-
+
CHK(scpr_offset_polygon(polygon, 1, SCPR_JOIN_MITER) == RES_OK);
CHK(scpr_polygon_eq(polygon, expected, &eq) == RES_OK);
CHK(eq);
@@ -329,7 +329,7 @@ test_internal(void)
memcpy(*(coords+1), coords1, 2*nverts[1]*sizeof(**coords));
CHK(scpr_polygon_setup_indexed_vertices(polygon, ncomps, pget_nverts, pget_pos, &ctx)
== RES_OK);
-
+
ncomps = 0;
ctx.ncomps = ncomps;
CHK(scpr_polygon_setup_indexed_vertices(expected, ncomps, pget_nverts, pget_pos, &ctx)