star-cpr

Clip 2D meshes with 2D polygons
git clone git://git.meso-star.fr/star-cpr.git
Log | Files | Refs | README | LICENSE

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:
Msrc/scpr.h | 5+++++
Msrc/scpr_polygon.c | 24++++++++++++++++++++++++
Msrc/test_scpr_polygon.c | 7+++++++
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, &copy) == 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);