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

◆ ptarray_to_wkb_buf()

static uint8_t * ptarray_to_wkb_buf ( const POINTARRAY pa,
uint8_t *  buf,
uint8_t  variant 
)
static

Definition at line 398 of file lwout_wkb.c.

399{
400 uint32_t dims = 2;
401 uint32_t pa_dims = FLAGS_NDIMS(pa->flags);
402 uint32_t i, j;
403 double *dbl_ptr;
404
405 /* SFSQL is always 2-d. Extended and ISO use all available dimensions */
406 if ( (variant & WKB_ISO) || (variant & WKB_EXTENDED) )
407 dims = pa_dims;
408
409 /* Set the number of points (if it's not a POINT type) */
410 if ( ! ( variant & WKB_NO_NPOINTS ) )
411 buf = integer_to_wkb_buf(pa->npoints, buf, variant);
412
413 /* Bulk copy the coordinates when: dimensionality matches, output format */
414 /* is not hex, and output endian matches internal endian. */
415 if ( pa->npoints && (dims == pa_dims) && ! wkb_swap_bytes(variant) && ! (variant & WKB_HEX) )
416 {
417 size_t size = (size_t)pa->npoints * dims * WKB_DOUBLE_SIZE;
418 memcpy(buf, getPoint_internal(pa, 0), size);
419 buf += size;
420 }
421 /* Copy coordinates one-by-one otherwise */
422 else
423 {
424 for ( i = 0; i < pa->npoints; i++ )
425 {
426 LWDEBUGF(4, "Writing point #%d", i);
427 dbl_ptr = (double*)getPoint_internal(pa, i);
428 for ( j = 0; j < dims; j++ )
429 {
430 LWDEBUGF(4, "Writing dimension #%d (buf = %p)", j, buf);
431 buf = double_to_wkb_buf(dbl_ptr[j], buf, variant);
432 }
433 }
434 }
435 LWDEBUGF(4, "Done (buf = %p)", buf);
436 return buf;
437}
static uint8_t variant
Definition cu_in_twkb.c:26
#define WKB_ISO
Definition liblwgeom.h:2210
#define WKB_NO_NPOINTS
Definition liblwgeom.h:2216
#define WKB_HEX
Definition liblwgeom.h:2215
#define FLAGS_NDIMS(flags)
Definition liblwgeom.h:179
#define WKB_EXTENDED
Definition liblwgeom.h:2212
#define WKB_DOUBLE_SIZE
Well-Known Binary (WKB) Output Variant Types.
#define LWDEBUGF(level, msg,...)
Definition lwgeom_log.h:106
static uint8_t * getPoint_internal(const POINTARRAY *pa, uint32_t n)
Definition lwinline.h:75
static uint8_t * integer_to_wkb_buf(const uint32_t ival, uint8_t *buf, uint8_t variant)
Definition lwout_wkb.c:197
static uint8_t * double_to_wkb_buf(const double d, uint8_t *buf, uint8_t variant)
Definition lwout_wkb.c:272
static int wkb_swap_bytes(uint8_t variant)
Definition lwout_wkb.c:182
lwflags_t flags
Definition liblwgeom.h:431
uint32_t npoints
Definition liblwgeom.h:427

References double_to_wkb_buf(), POINTARRAY::flags, FLAGS_NDIMS, getPoint_internal(), integer_to_wkb_buf(), LWDEBUGF, POINTARRAY::npoints, variant, WKB_DOUBLE_SIZE, WKB_EXTENDED, WKB_HEX, WKB_ISO, WKB_NO_NPOINTS, and wkb_swap_bytes().

Referenced by lwline_to_wkb_buf(), lwpoint_to_wkb_buf(), lwpoly_to_wkb_buf(), and lwtriangle_to_wkb_buf().

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