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

◆ ptarray_addPoint()

POINTARRAY * ptarray_addPoint ( const POINTARRAY pa,
uint8_t *  p,
size_t  pdims,
uint32_t  where 
)
extern

Add a point in a pointarray.

Parameters
pathe source POINTARRAY
pthe point to add
pdimsnumber of ordinates in p (2..4)
whereto insert the point. 0 prepends, pa->npoints appends
Returns
a newly constructed POINTARRAY using a newly allocated buffer for the actual points, or NULL on error.

Definition at line 530 of file ptarray.c.

531{
532 POINTARRAY *ret;
533 POINT4D pbuf;
534 size_t ptsize = ptarray_point_size(pa);
535
536 LWDEBUGF(3, "pa %p p %p size %zu where %u",
537 pa, p, pdims, where);
538
539 if ( pdims < 2 || pdims > 4 )
540 {
541 lwerror("ptarray_addPoint: point dimension out of range (%zu)",
542 pdims);
543 return NULL;
544 }
545
546 if ( where > pa->npoints )
547 {
548 lwerror("ptarray_addPoint: offset out of range (%d)",
549 where);
550 return NULL;
551 }
552
553 LWDEBUG(3, "called with a point");
554
555 pbuf.x = pbuf.y = pbuf.z = pbuf.m = 0.0;
556 memcpy((uint8_t *)&pbuf, p, pdims*sizeof(double));
557
558 LWDEBUG(3, "initialized point buffer");
559
561 FLAGS_GET_M(pa->flags), pa->npoints+1);
562
563
564 if ( where )
565 {
566 memcpy(getPoint_internal(ret, 0), getPoint_internal(pa, 0), ptsize*where);
567 }
568
569 memcpy(getPoint_internal(ret, where), (uint8_t *)&pbuf, ptsize);
570
571 if ( where+1 != ret->npoints )
572 {
573 memcpy(getPoint_internal(ret, where+1),
574 getPoint_internal(pa, where),
575 ptsize*(pa->npoints-where));
576 }
577
578 return ret;
579}
#define FLAGS_GET_Z(flags)
Definition liblwgeom.h:165
#define FLAGS_GET_M(flags)
Definition liblwgeom.h:166
#define LWDEBUG(level, msg)
Definition lwgeom_log.h:101
#define LWDEBUGF(level, msg,...)
Definition lwgeom_log.h:106
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
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
double m
Definition liblwgeom.h:414
double x
Definition liblwgeom.h:414
double z
Definition liblwgeom.h:414
double y
Definition liblwgeom.h:414
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(), LWDEBUG, LWDEBUGF, lwerror(), POINT4D::m, POINTARRAY::npoints, ptarray_construct(), ptarray_point_size(), POINT4D::x, POINT4D::y, and POINT4D::z.

Referenced by lwcircstring_addpoint(), LWGEOM2GEOS(), lwline_make_geos_friendly(), ptarray_close2d(), and ring_make_geos_friendly().

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