private void _fixOrphanVertices() { int pathCount = 0; // clean any path info for (int node = m_sortedVertices.getFirst(m_sortedVertices.getFirstList()); node != -1; node = m_sortedVertices.getNext(node)) { int vertex = m_sortedVertices.getData(node); m_shape.setPathToVertex_(vertex, -1); } int geometrySize = 0; for (int path = m_shape.getFirstPath(m_geometry); path != -1; ) { int first = m_shape.getFirstVertex(path); if (first == -1 || m_shape.getPathFromVertex(first) != -1) { int p = path; path = m_shape.getNextPath(path); m_shape.removePathOnly_(p); continue; } m_shape.setPathToVertex_(first, path); int pathSize = 1; for (int vertex = m_shape.getNextVertex(first); vertex != first; vertex = m_shape.getNextVertex(vertex)) { // _ASSERT(m_shape.getPathFromVertex(vertex) == -1); m_shape.setPathToVertex_(vertex, path); // _ASSERT(m_shape.getNextVertex(m_shape.getPrevVertex(vertex)) // == vertex); pathSize++; } m_shape.setPathSize_(path, pathSize); m_shape.setLastVertex_(path, m_shape.getPrevVertex(first)); geometrySize += pathSize; pathCount++; path = m_shape.getNextPath(path); } // produce new paths for the orphan vertices. for (int node = m_sortedVertices.getFirst(m_sortedVertices.getFirstList()); node != -1; node = m_sortedVertices.getNext(node)) { int vertex = m_sortedVertices.getData(node); if (m_shape.getPathFromVertex(vertex) != -1) continue; int path = m_shape.insertPath(m_geometry, -1); int pathSize = 0; int first = vertex; while (true) { m_shape.setPathToVertex_(vertex, path); pathSize++; int next = m_shape.getNextVertex(vertex); // _ASSERT(m_shape.getNextVertex(m_shape.getPrevVertex(vertex)) // == vertex); if (next == first) break; vertex = next; } m_shape.setClosedPath(path, true); m_shape.setPathSize_(path, pathSize); m_shape.setFirstVertex_(path, first); m_shape.setLastVertex_(path, m_shape.getPrevVertex(first)); geometrySize += pathSize; pathCount++; } m_shape.setGeometryPathCount_(m_geometry, pathCount); int totalPointCount = m_shape.getTotalPointCount() - m_shape.getPointCount(m_geometry); m_shape.setGeometryVertexCount_(m_geometry, geometrySize); m_shape.setTotalPointCount_(totalPointCount + geometrySize); }