PostGIS  3.0.6dev-r@@SVN_REVISION@@

◆ _lwt_UpdateEdgeRingSideFace()

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

Definition at line 6226 of file lwgeom_topo.c.

6228 {
6229  LWT_ISO_EDGE *forward_edges = NULL;
6230  int forward_edges_count = 0;
6231  LWT_ISO_EDGE *backward_edges = NULL;
6232  int backward_edges_count = 0;
6233  int i, ret;
6234 
6235  /* Make a list of forward_edges and backward_edges */
6236 
6237  forward_edges = lwalloc(sizeof(LWT_ISO_EDGE) * ring->size);
6238  forward_edges_count = 0;
6239  backward_edges = lwalloc(sizeof(LWT_ISO_EDGE) * ring->size);
6240  backward_edges_count = 0;
6241 
6242  for ( i=0; i<ring->size; ++i )
6243  {
6244  LWT_EDGERING_ELEM *elem = ring->elems[i];
6245  LWT_ISO_EDGE *edge = elem->edge;
6246  LWT_ELEMID id = edge->edge_id;
6247  if ( elem->left )
6248  {
6249  LWDEBUGF(3, "Forward edge %d is %d", forward_edges_count, id);
6250  forward_edges[forward_edges_count].edge_id = id;
6251  forward_edges[forward_edges_count++].face_left = face;
6252  edge->face_left = face;
6253  }
6254  else
6255  {
6256  LWDEBUGF(3, "Backward edge %d is %d", forward_edges_count, id);
6257  backward_edges[backward_edges_count].edge_id = id;
6258  backward_edges[backward_edges_count++].face_right = face;
6259  edge->face_right = face;
6260  }
6261  }
6262 
6263  /* Update forward edges */
6264  if ( forward_edges_count )
6265  {
6266  ret = lwt_be_updateEdgesById(topo, forward_edges,
6267  forward_edges_count,
6269  if ( ret == -1 )
6270  {
6271  lwfree( forward_edges );
6272  lwfree( backward_edges );
6273  lwerror("Backend error: %s", lwt_be_lastErrorMessage(topo->be_iface));
6274  return -1;
6275  }
6276  if ( ret != forward_edges_count )
6277  {
6278  lwfree( forward_edges );
6279  lwfree( backward_edges );
6280  lwerror("Unexpected error: %d edges updated when expecting %d (forward)",
6281  ret, forward_edges_count);
6282  return -1;
6283  }
6284  }
6285 
6286  /* Update backward edges */
6287  if ( backward_edges_count )
6288  {
6289  ret = lwt_be_updateEdgesById(topo, backward_edges,
6290  backward_edges_count,
6292  if ( ret == -1 )
6293  {
6294  lwfree( forward_edges );
6295  lwfree( backward_edges );
6296  lwerror("Backend error: %s", lwt_be_lastErrorMessage(topo->be_iface));
6297  return -1;
6298  }
6299  if ( ret != backward_edges_count )
6300  {
6301  lwfree( forward_edges );
6302  lwfree( backward_edges );
6303  lwerror("Unexpected error: %d edges updated when expecting %d (backward)",
6304  ret, backward_edges_count);
6305  return -1;
6306  }
6307  }
6308 
6309  lwfree( forward_edges );
6310  lwfree( backward_edges );
6311 
6312  return 0;
6313 }
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:6038
LWT_EDGERING_ELEM ** elems
Definition: lwgeom_topo.c:6048
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: