PostGIS 3.7.0dev-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 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 );
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 );
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 * lwalloc(size_t size)
Definition lwutil.c:227
void lwfree(void *mem)
Definition lwutil.c:248
#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)
#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: