PostGIS  3.7.0dev-r@@SVN_REVISION@@

◆ ptarray_scroll_in_place()

int ptarray_scroll_in_place ( POINTARRAY pa,
const POINT4D newbase 
)

Definition at line 2209 of file ptarray.c.

2210 {
2211  POINTARRAY *tmp;
2212  int found;
2213  uint32_t it;
2214  int ptsize;
2215 
2216  if ( ! ptarray_is_closed_2d(pa) )
2217  {
2218  lwerror("ptarray_scroll_in_place: input POINTARRAY is not closed");
2219  return LW_FAILURE;
2220  }
2221 
2222  ptsize = ptarray_point_size(pa);
2223 
2224  /* Find the point in the array */
2225  found = 0;
2226  for ( it = 0; it < pa->npoints; ++it )
2227  {
2228  if ( ! memcmp(getPoint_internal(pa, it), pt, ptsize) )
2229  {
2230  found = 1;
2231  break;
2232  }
2233  }
2234 
2235  if ( ! found )
2236  {
2237  lwerror("ptarray_scroll_in_place: input POINTARRAY does not contain the given point");
2238  return LW_FAILURE;
2239  }
2240 
2241  if ( 0 == it )
2242  {
2243  /* Point is already the start/end point, just clone the input */
2244  return LW_SUCCESS;
2245  }
2246 
2247  /* TODO: reduce allocations */
2249 
2250  memset(getPoint_internal(tmp, 0), 0, (size_t)ptsize * pa->npoints);
2251  /* Copy the block from found point to last point into the output array */
2252  memcpy(
2253  getPoint_internal(tmp, 0),
2254  getPoint_internal(pa, it),
2255  (size_t)ptsize * ( pa->npoints - it )
2256  );
2257 
2258  /* Copy the block from second point to the found point into the last portion of the
2259  * return */
2260  memcpy(
2261  getPoint_internal(tmp, pa->npoints - it),
2262  getPoint_internal(pa, 1),
2263  (size_t)ptsize * ( it )
2264  );
2265 
2266  /* Copy the resulting pointarray back to source one */
2267  memcpy(
2268  getPoint_internal(pa, 0),
2269  getPoint_internal(tmp, 0),
2270  (size_t)ptsize * ( pa->npoints )
2271  );
2272 
2273  ptarray_free(tmp);
2274 
2275  return LW_SUCCESS;
2276 }
#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 size_t ptarray_point_size(const POINTARRAY *pa)
Definition: lwinline.h:56
static uint8_t * getPoint_internal(const POINTARRAY *pa, uint32_t n)
Definition: lwinline.h:75
int ptarray_is_closed_2d(const POINTARRAY *in)
Definition: ptarray.c:710
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
void ptarray_free(POINTARRAY *pa)
Definition: ptarray.c:327
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: