commit 31f882ae8ce9e878ee968a53ca959b17f06b37f8
parent 805b57fd650b1c9811aa221a4e9bc68d757b1327
Author: Benjamin Piaud <benjamin.piaud@meso-star.com>
Date: Thu, 20 Oct 2022 11:13:15 +0200
Add polygon copy function
Diffstat:
3 files changed, 36 insertions(+), 0 deletions(-)
diff --git a/src/scpr.h b/src/scpr.h
@@ -85,6 +85,11 @@ scpr_polygon_setup_indexed_vertices
void* data); /* Client data set as the last param of the callbacks */
SCPR_API res_T
+scpr_polygon_copy
+ (const struct scpr_polygon* polygon,
+ struct scpr_polygon* copy);
+
+SCPR_API res_T
scpr_offset_polygon
(struct scpr_polygon* polygon,
const double offset, /* Can be either positive or negative */
diff --git a/src/scpr_polygon.c b/src/scpr_polygon.c
@@ -227,6 +227,28 @@ error:
}
goto exit;
}
+
+res_T
+scpr_polygon_copy
+ (const struct scpr_polygon* polygon,
+ struct scpr_polygon* copy)
+{
+ res_T res = RES_OK;
+
+ if(!polygon || !copy) {
+ res = RES_BAD_ARG;
+ goto error;
+ }
+
+ copy->paths = polygon->paths;
+ d2_set(copy->lower, polygon->lower);
+ d2_set(copy->upper, polygon->upper);
+
+exit:
+ return res;
+error:
+ goto exit;
+}
#undef TRY
res_T
@@ -369,3 +391,5 @@ exit:
error:
goto exit;
}
+
+
diff --git a/src/test_scpr_polygon.c b/src/test_scpr_polygon.c
@@ -40,6 +40,7 @@ main(int argc, char** argv)
struct mem_allocator allocator;
struct polygon_context ctx;
struct scpr_polygon* polygon;
+ struct scpr_polygon* copy;
int eq;
(void)argc, (void)argv;
@@ -52,6 +53,7 @@ main(int argc, char** argv)
CHK(scpr_polygon_create(NULL, NULL) == RES_BAD_ARG);
CHK(scpr_polygon_create(&allocator, NULL) == RES_BAD_ARG);
CHK(scpr_polygon_create(NULL, &polygon) == RES_OK);
+ CHK(scpr_polygon_create(NULL, ©) == RES_OK);
CHK(scpr_polygon_ref_get(NULL) == RES_BAD_ARG);
CHK(scpr_polygon_ref_get(polygon) == RES_OK);
@@ -128,12 +130,17 @@ main(int argc, char** argv)
}
}
+ scpr_polygon_copy(polygon, copy);
+ CHK(scpr_polygon_eq(polygon, copy, &eq) == RES_OK);
+ CHK(eq);
+
CHK(scpr_offset_polygon(NULL, 0, SCPR_JOIN_TYPES_COUNT__) == RES_BAD_ARG);
CHK(scpr_offset_polygon(polygon, 0, SCPR_JOIN_TYPES_COUNT__) == RES_BAD_ARG);
CHK(scpr_offset_polygon(NULL, 0, SCPR_JOIN_MITER) == RES_BAD_ARG);
CHK(scpr_offset_polygon(polygon, 0, SCPR_JOIN_MITER) == RES_OK);
CHK(scpr_polygon_ref_put(polygon) == RES_OK);
+ CHK(scpr_polygon_ref_put(copy) == RES_OK);
MEM_RM(&allocator, *coords);
MEM_RM(&allocator, coords);