PostGIS  3.2.2dev-r@@SVN_REVISION@@

◆ _lwt_UpdateEdgeRingSideFace()

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

Definition at line 6420 of file lwgeom_topo.c.

6422 {
6423  LWT_ISO_EDGE *forward_edges = NULL;
6424  int forward_edges_count = 0;
6425  LWT_ISO_EDGE *backward_edges = NULL;
6426  int backward_edges_count = 0;
6427  int i, ret;
6428 
6429  /* Make a list of forward_edges and backward_edges */
6430 
6431  forward_edges = lwalloc(sizeof(LWT_ISO_EDGE) * ring->size);
6432  forward_edges_count = 0;
6433  backward_edges = lwalloc(sizeof(LWT_ISO_EDGE) * ring->size);
6434  backward_edges_count = 0;
6435 
6436  for ( i=0; i<ring->size; ++i )
6437  {
6438  LWT_EDGERING_ELEM *elem = ring->elems[i];
6439  LWT_ISO_EDGE *edge = elem->edge;
6440  LWT_ELEMID id = edge->edge_id;
6441  if ( elem->left )
6442  {
6443  LWDEBUGF(3, "Forward edge %d is %d", forward_edges_count, id);
6444  forward_edges[forward_edges_count].edge_id = id;
6445  forward_edges[forward_edges_count++].face_left = face;
6446  edge->face_left = face;
6447  }
6448  else
6449  {
6450  LWDEBUGF(3, "Backward edge %d is %d", forward_edges_count, id);
6451  backward_edges[backward_edges_count].edge_id = id;
6452  backward_edges[backward_edges_count++].face_right = face;
6453  edge->face_right = face;
6454  }
6455  }
6456 
6457  /* Update forward edges */
6458  if ( forward_edges_count )
6459  {
6460  ret = lwt_be_updateEdgesById(topo, forward_edges,
6461  forward_edges_count,
6463  if ( ret == -1 )
6464  {
6465  lwfree( forward_edges );
6466  lwfree( backward_edges );
6467  lwerror("Backend error: %s", lwt_be_lastErrorMessage(topo->be_iface));
6468  return -1;
6469  }
6470  if ( ret != forward_edges_count )
6471  {
6472  lwfree( forward_edges );
6473  lwfree( backward_edges );
6474  lwerror("Unexpected error: %d edges updated when expecting %d (forward)",
6475  ret, forward_edges_count);
6476  return -1;
6477  }
6478  }
6479 
6480  /* Update backward edges */
6481  if ( backward_edges_count )
6482  {
6483  ret = lwt_be_updateEdgesById(topo, backward_edges,
6484  backward_edges_count,
6486  if ( ret == -1 )
6487  {
6488  lwfree( forward_edges );
6489  lwfree( backward_edges );
6490  lwerror("Backend error: %s", lwt_be_lastErrorMessage(topo->be_iface));
6491  return -1;
6492  }
6493  if ( ret != backward_edges_count )
6494  {
6495  lwfree( forward_edges );
6496  lwfree( backward_edges );
6497  lwerror("Unexpected error: %d edges updated when expecting %d (backward)",
6498  ret, backward_edges_count);
6499  return -1;
6500  }
6501  }
6502 
6503  lwfree( forward_edges );
6504  lwfree( backward_edges );
6505 
6506  return 0;
6507 }
void lwfree(void *mem)
Definition: lwutil.c:242
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
#define LWDEBUGF(level, msg,...)
Definition: lwgeom_log.h:88
void lwerror(const char *fmt,...)
Write a notice out to the error handler.
Definition: lwutil.c:190
const char * lwt_be_lastErrorMessage(const LWT_BE_IFACE *be)
Definition: lwgeom_topo.c:119
static int lwt_be_updateEdgesById(LWT_TOPOLOGY *topo, const LWT_ISO_EDGE *edges, int numedges, int upd_fields)
Definition: lwgeom_topo.c:299
LWT_ISO_EDGE * edge
Definition: lwgeom_topo.c:6232
LWT_EDGERING_ELEM ** elems
Definition: lwgeom_topo.c:6242
LWT_ELEMID face_right
LWT_ELEMID face_left
LWT_ELEMID edge_id
const LWT_BE_IFACE * be_iface

References LWT_TOPOLOGY_T::be_iface, 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_lastErrorMessage(), lwt_be_updateEdgesById(), LWT_COL_EDGE_FACE_LEFT, LWT_COL_EDGE_FACE_RIGHT, 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: