PostGIS  3.7.0dev-r@@SVN_REVISION@@

◆ _lwt_UpdateEdgeRingSideFace()

static int _lwt_UpdateEdgeRingSideFace ( LWT_TOPOLOGY topo,
LWT_EDGERING ring,
LWT_ELEMID  face 
)
static

Definition at line 260 of file lwgeom_topo_polygonizer.c.

262 {
263  LWT_ISO_EDGE *forward_edges = NULL;
264  int forward_edges_count = 0;
265  LWT_ISO_EDGE *backward_edges = NULL;
266  int backward_edges_count = 0;
267  int i, ret;
268 
269  /* Make a list of forward_edges and backward_edges */
270 
271  forward_edges = lwalloc(sizeof(LWT_ISO_EDGE) * ring->size);
272  forward_edges_count = 0;
273  backward_edges = lwalloc(sizeof(LWT_ISO_EDGE) * ring->size);
274  backward_edges_count = 0;
275 
276  for ( i=0; i<ring->size; ++i )
277  {
278  LWT_EDGERING_ELEM *elem = ring->elems[i];
279  LWT_ISO_EDGE *edge = elem->edge;
280  LWT_ELEMID id = edge->edge_id;
281  if ( elem->left )
282  {
283  LWDEBUGF(3, "Forward edge %d is %lld", forward_edges_count, id);
284  forward_edges[forward_edges_count].edge_id = id;
285  forward_edges[forward_edges_count++].face_left = face;
286  edge->face_left = face;
287  }
288  else
289  {
290  LWDEBUGF(3, "Backward edge %d is %lld", forward_edges_count, id);
291  backward_edges[backward_edges_count].edge_id = id;
292  backward_edges[backward_edges_count++].face_right = face;
293  edge->face_right = face;
294  }
295  }
296 
297  /* Update forward edges */
298  if ( forward_edges_count )
299  {
300  ret = lwt_be_updateEdgesById(topo, forward_edges,
301  forward_edges_count,
303  if ( ret == -1 )
304  {
305  lwfree( forward_edges );
306  lwfree( backward_edges );
307  PGTOPO_BE_ERROR();
308  return -1;
309  }
310  if ( ret != forward_edges_count )
311  {
312  lwfree( forward_edges );
313  lwfree( backward_edges );
314  lwerror("Unexpected error: %d edges updated when expecting %d (forward)",
315  ret, forward_edges_count);
316  return -1;
317  }
318  }
319 
320  /* Update backward edges */
321  if ( backward_edges_count )
322  {
323  ret = lwt_be_updateEdgesById(topo, backward_edges,
324  backward_edges_count,
326  if ( ret == -1 )
327  {
328  lwfree( forward_edges );
329  lwfree( backward_edges );
330  PGTOPO_BE_ERROR();
331  return -1;
332  }
333  if ( ret != backward_edges_count )
334  {
335  lwfree( forward_edges );
336  lwfree( backward_edges );
337  lwerror("Unexpected error: %d edges updated when expecting %d (backward)",
338  ret, backward_edges_count);
339  return -1;
340  }
341  }
342 
343  lwfree( forward_edges );
344  lwfree( backward_edges );
345 
346  return 0;
347 }
void lwfree(void *mem)
Definition: lwutil.c:248
void * lwalloc(size_t size)
Definition: lwutil.c:227
#define LWT_COL_EDGE_FACE_RIGHT
LWT_INT64 LWT_ELEMID
Identifier of topology element.
#define LWT_COL_EDGE_FACE_LEFT
int lwt_be_updateEdgesById(LWT_TOPOLOGY *topo, const LWT_ISO_EDGE *edges, int numedges, int upd_fields)
Definition: lwgeom_topo.c:294
#define PGTOPO_BE_ERROR()
#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.
LWT_EDGERING_ELEM ** elems
LWT_ELEMID face_right
LWT_ELEMID face_left
LWT_ELEMID edge_id

References LWT_EDGERING_ELEM_T::edge, LWT_ISO_EDGE::edge_id, LWT_EDGERING_T::elems, LWT_ISO_EDGE::face_left, LWT_ISO_EDGE::face_right, LWT_EDGERING_ELEM_T::left, lwalloc(), LWDEBUGF, lwerror(), lwfree(), lwt_be_updateEdgesById(), LWT_COL_EDGE_FACE_LEFT, LWT_COL_EDGE_FACE_RIGHT, PGTOPO_BE_ERROR, and LWT_EDGERING_T::size.

Referenced by _lwt_RegisterFaceOnEdgeSide(), and lwt_Polygonize().

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