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

◆ _lwt_UpdateEdgeRingSideFace()

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

Definition at line 6241 of file lwgeom_topo.c.

6243{
6244 LWT_ISO_EDGE *forward_edges = NULL;
6245 int forward_edges_count = 0;
6246 LWT_ISO_EDGE *backward_edges = NULL;
6247 int backward_edges_count = 0;
6248 int i, ret;
6249
6250 /* Make a list of forward_edges and backward_edges */
6251
6252 forward_edges = lwalloc(sizeof(LWT_ISO_EDGE) * ring->size);
6253 forward_edges_count = 0;
6254 backward_edges = lwalloc(sizeof(LWT_ISO_EDGE) * ring->size);
6255 backward_edges_count = 0;
6256
6257 for ( i=0; i<ring->size; ++i )
6258 {
6259 LWT_EDGERING_ELEM *elem = ring->elems[i];
6260 LWT_ISO_EDGE *edge = elem->edge;
6261 LWT_ELEMID id = edge->edge_id;
6262 if ( elem->left )
6263 {
6264 LWDEBUGF(3, "Forward edge %d is %d", forward_edges_count, id);
6265 forward_edges[forward_edges_count].edge_id = id;
6266 forward_edges[forward_edges_count++].face_left = face;
6267 edge->face_left = face;
6268 }
6269 else
6270 {
6271 LWDEBUGF(3, "Backward edge %d is %d", forward_edges_count, id);
6272 backward_edges[backward_edges_count].edge_id = id;
6273 backward_edges[backward_edges_count++].face_right = face;
6274 edge->face_right = face;
6275 }
6276 }
6277
6278 /* Update forward edges */
6279 if ( forward_edges_count )
6280 {
6281 ret = lwt_be_updateEdgesById(topo, forward_edges,
6282 forward_edges_count,
6284 if ( ret == -1 )
6285 {
6286 lwfree( forward_edges );
6287 lwfree( backward_edges );
6288 lwerror("Backend error: %s", lwt_be_lastErrorMessage(topo->be_iface));
6289 return -1;
6290 }
6291 if ( ret != forward_edges_count )
6292 {
6293 lwfree( forward_edges );
6294 lwfree( backward_edges );
6295 lwerror("Unexpected error: %d edges updated when expecting %d (forward)",
6296 ret, forward_edges_count);
6297 return -1;
6298 }
6299 }
6300
6301 /* Update backward edges */
6302 if ( backward_edges_count )
6303 {
6304 ret = lwt_be_updateEdgesById(topo, backward_edges,
6305 backward_edges_count,
6307 if ( ret == -1 )
6308 {
6309 lwfree( forward_edges );
6310 lwfree( backward_edges );
6311 lwerror("Backend error: %s", lwt_be_lastErrorMessage(topo->be_iface));
6312 return -1;
6313 }
6314 if ( ret != backward_edges_count )
6315 {
6316 lwfree( forward_edges );
6317 lwfree( backward_edges );
6318 lwerror("Unexpected error: %d edges updated when expecting %d (backward)",
6319 ret, backward_edges_count);
6320 return -1;
6321 }
6322 }
6323
6324 lwfree( forward_edges );
6325 lwfree( backward_edges );
6326
6327 return 0;
6328}
void * lwalloc(size_t size)
Definition lwutil.c:227
void lwfree(void *mem)
Definition lwutil.c:242
#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)
static int lwt_be_updateEdgesById(LWT_TOPOLOGY *topo, const LWT_ISO_EDGE *edges, int numedges, int upd_fields)
LWT_ISO_EDGE * edge
LWT_EDGERING_ELEM ** elems
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: