PostGIS 3.7.0dev-r@@SVN_REVISION@@
Loading...
Searching...
No Matches

◆ ptarray_scroll_in_place()

int ptarray_scroll_in_place ( POINTARRAY pa,
const POINT4D newbase 
)

Definition at line 2337 of file ptarray.c.

2338{
2339 POINTARRAY *tmp;
2340 int found;
2341 uint32_t it;
2342 int ptsize;
2343
2344 if ( ! ptarray_is_closed_2d(pa) )
2345 {
2346 lwerror("ptarray_scroll_in_place: input POINTARRAY is not closed");
2347 return LW_FAILURE;
2348 }
2349
2350 ptsize = ptarray_point_size(pa);
2351
2352 /* Find the point in the array */
2353 found = 0;
2354 for ( it = 0; it < pa->npoints; ++it )
2355 {
2356 if ( ! memcmp(getPoint_internal(pa, it), pt, ptsize) )
2357 {
2358 found = 1;
2359 break;
2360 }
2361 }
2362
2363 if ( ! found )
2364 {
2365 lwerror("ptarray_scroll_in_place: input POINTARRAY does not contain the given point");
2366 return LW_FAILURE;
2367 }
2368
2369 if ( 0 == it )
2370 {
2371 /* Point is already the start/end point, just clone the input */
2372 return LW_SUCCESS;
2373 }
2374
2375 /* TODO: reduce allocations */
2377
2378 memset(getPoint_internal(tmp, 0), 0, (size_t)ptsize * pa->npoints);
2379 /* Copy the block from found point to last point into the output array */
2380 memcpy(
2381 getPoint_internal(tmp, 0),
2382 getPoint_internal(pa, it),
2383 (size_t)ptsize * ( pa->npoints - it )
2384 );
2385
2386 /* Copy the block from second point to the found point into the last portion of the
2387 * return */
2388 memcpy(
2389 getPoint_internal(tmp, pa->npoints - it),
2390 getPoint_internal(pa, 1),
2391 (size_t)ptsize * ( it )
2392 );
2393
2394 /* Copy the resulting pointarray back to source one */
2395 memcpy(
2396 getPoint_internal(pa, 0),
2397 getPoint_internal(tmp, 0),
2398 (size_t)ptsize * ( pa->npoints )
2399 );
2400
2401 ptarray_free(tmp);
2402
2403 return LW_SUCCESS;
2404}
#define LW_FAILURE
Definition liblwgeom.h:96
#define LW_SUCCESS
Definition liblwgeom.h:97
#define FLAGS_GET_Z(flags)
Definition liblwgeom.h:165
#define FLAGS_GET_M(flags)
Definition liblwgeom.h:166
void void lwerror(const char *fmt,...) __attribute__((format(printf
Write a notice out to the error handler.
static uint8_t * getPoint_internal(const POINTARRAY *pa, uint32_t n)
Definition lwinline.h:75
static size_t ptarray_point_size(const POINTARRAY *pa)
Definition lwinline.h:56
int ptarray_is_closed_2d(const POINTARRAY *in)
Definition ptarray.c:710
void ptarray_free(POINTARRAY *pa)
Definition ptarray.c:327
POINTARRAY * ptarray_construct(char hasz, char hasm, uint32_t npoints)
Construct an empty pointarray, allocating storage and setting the npoints, but not filling in any inf...
Definition ptarray.c:51
lwflags_t flags
Definition liblwgeom.h:431
uint32_t npoints
Definition liblwgeom.h:427

References POINTARRAY::flags, FLAGS_GET_M, FLAGS_GET_Z, getPoint_internal(), LW_FAILURE, LW_SUCCESS, lwerror(), POINTARRAY::npoints, ptarray_construct(), ptarray_free(), ptarray_is_closed_2d(), and ptarray_point_size().

Referenced by _lwt_AddLine(), ST_Scroll(), and test_ptarray_scroll().

Here is the call graph for this function:
Here is the caller graph for this function: