Index: trunk/src/rtree.c =================================================================== --- trunk/src/rtree.c (revision 13903) +++ trunk/src/rtree.c (revision 13904) @@ -333,24 +333,27 @@ } } -/* create an r-tree from an unsorted list of boxes. - * the r-tree will keep pointers into - * it, so don't free the box list until you've called r_destroy_tree. - * if you set 'manage' to pcb_true, r_destroy_tree will free your boxlist. - */ -pcb_rtree_t *pcb_r_create_tree_old(const pcb_box_t * boxlist[], int N, int manage) +pcb_rtree_t *pcb_r_create_tree(void) { pcb_rtree_t *rtree; struct rtree_node *node; - int i; - assert(N >= 0); - rtree = (pcb_rtree_t *) calloc(1, sizeof(*rtree)); + rtree = calloc(1, sizeof(*rtree)); + /* start with a single empty leaf node */ - node = (struct rtree_node *) calloc(1, sizeof(*node)); + node = calloc(1, sizeof(*node)); node->flags.is_leaf = 1; node->parent = NULL; rtree->root = node; + return rtree; +} + +void pcb_r_create_insert_array(pcb_rtree_t *rtree, const pcb_box_t *boxlist[], int N, int manage) +{ + int i; + + assert(N >= 0); + /* simple, just insert all of the boxes! */ for (i = 0; i < N; i++) { assert(boxlist[i]); @@ -359,13 +362,8 @@ #ifdef SLOW_ASSERTS assert(__r_tree_is_good(rtree->root)); #endif - return rtree; } -pcb_rtree_t *pcb_r_create_tree(void) -{ - return pcb_r_create_tree_old(NULL, 0, 0); -} static void __r_destroy_tree(struct rtree_node *node) { Index: trunk/src/rtree.h =================================================================== --- trunk/src/rtree.h (revision 13903) +++ trunk/src/rtree.h (revision 13904) @@ -60,14 +60,14 @@ PCB_R_DIR_CANCEL /* cancel the search and return immediately */ } pcb_r_dir_t; -/* create an rtree from the list of boxes. if 'manage' is pcb_true, then - * the tree will take ownership of 'boxlist' and free it when the tree - * is destroyed. */ -pcb_rtree_t *pcb_r_create_tree_old(const pcb_box_t * boxlist[], int N, int manage); -pcb_rtree_t *pcb_r_create_tree(); +pcb_rtree_t *pcb_r_create_tree(void); +void pcb_r_destroy_tree(pcb_rtree_t **rtree); -/* destroy an rtree */ -void pcb_r_destroy_tree(pcb_rtree_t ** rtree); +/* insert an unsorted list of boxes into an existing r-tree the r-tree will + keep pointers into it, so don't free the box list until you've called + r_destroy_tree. If you set 'manage' to pcb_true, r_destroy_tree will + free your boxlist. */ +void pcb_r_create_insert_array(pcb_rtree_t *rtree, const pcb_box_t *boxlist[], int N, int manage); pcb_bool pcb_r_delete_entry(pcb_rtree_t * rtree, const pcb_box_t * which); void pcb_r_insert_entry(pcb_rtree_t * rtree, const pcb_box_t * which, int manage); Index: trunk/src_plugins/autoplace/autoplace.c =================================================================== --- trunk/src_plugins/autoplace/autoplace.c (revision 13903) +++ trunk/src_plugins/autoplace/autoplace.c (revision 13904) @@ -609,8 +609,10 @@ } PCB_END_LOOP; - rt_s = pcb_r_create_tree_old((const pcb_box_t **) seboxes.array, vtp0_len(&seboxes), 1); - rt_c = pcb_r_create_tree_old((const pcb_box_t **) ceboxes.array, vtp0_len(&ceboxes), 1); + rt_s = pcb_r_create_tree(); + pcb_r_create_insert_array(rt_s, (const pcb_box_t **) seboxes.array, vtp0_len(&seboxes), 1); + rt_c = pcb_r_create_tree(); + pcb_r_create_insert_array(rt_c, (const pcb_box_t **) ceboxes.array, vtp0_len(&ceboxes), 1); vtp0_uninit(&seboxes); vtp0_uninit(&ceboxes); /* now, for each element, find its neighbor on all four sides */ Index: trunk/src_plugins/autoroute/autoroute.c =================================================================== --- trunk/src_plugins/autoroute/autoroute.c (revision 13903) +++ trunk/src_plugins/autoroute/autoroute.c (revision 13904) @@ -1276,7 +1276,8 @@ /* create r-trees from pointer lists */ for (i = 0; i < pcb_max_group(PCB); i++) { /* create the r-tree */ - rd->layergrouptree[i] = pcb_r_create_tree_old((const pcb_box_t **) layergroupboxes[i].array, vtp0_len(&layergroupboxes[i]), 1); + rd->layergrouptree[i] = pcb_r_create_tree(); + pcb_r_create_insert_array(rd->layergrouptree[i], (const pcb_box_t **) layergroupboxes[i].array, vtp0_len(&layergroupboxes[i]), 1); } if (AutoRouteParameters.use_vias) { @@ -3791,7 +3792,8 @@ #endif } PCB_END_LOOP; - targets = pcb_r_create_tree_old((const pcb_box_t **) target_list, i, 0); + targets = pcb_r_create_tree(); + pcb_r_create_insert_array(targets, (const pcb_box_t **)target_list, i, 0); assert(i <= num_targets); free(target_list);