Index: trunk/src/layer.c =================================================================== --- trunk/src/layer.c (revision 12537) +++ trunk/src/layer.c (revision 12538) @@ -637,6 +637,33 @@ dst->polygon_tree = src->polygon_tree; } + +void pcb_layer_real2bound_offs(pcb_layer_t *dst, pcb_board_t *src_pcb, pcb_layer_t *src) +{ + dst->meta.bound.real = NULL; + dst->is_bound = 1; + if ((dst->meta.bound.type & PCB_LYT_INTERN) && (dst->meta.bound.type & PCB_LYT_COPPER)) { + int from_top, from_bottom, res; + pcb_layergrp_t *tcop = pcb_get_grp(&src_pcb->LayerGroups, PCB_LYT_TOP, PCB_LYT_COPPER); + pcb_layergrp_t *bcop = pcb_get_grp(&src_pcb->LayerGroups, PCB_LYT_BOTTOM, PCB_LYT_COPPER); + pcb_layergrp_id_t tcop_id = pcb_layergrp_id(src_pcb, tcop); + pcb_layergrp_id_t bcop_id = pcb_layergrp_id(src_pcb, bcop); + + res = pcb_layergrp_dist(src_pcb, src->meta.real.grp, tcop_id, PCB_LYT_COPPER, &from_top); + res |= pcb_layergrp_dist(src_pcb, src->meta.real.grp, bcop_id, PCB_LYT_COPPER, &from_bottom); + if (res == 0) { + if (from_top <= from_bottom) + dst->meta.bound.stack_offs = from_top; + else + dst->meta.bound.stack_offs = -from_bottom; + } + else + pcb_message(PCB_MSG_ERROR, "Internal error: can't figure the inter copper\nlayer offset for %s\n", src->name); + } + else + dst->meta.bound.stack_offs = 0; +} + void pcb_layer_real2bound(pcb_layer_t *dst, pcb_layer_t *src, int share_rtrees) { pcb_board_t *pcb; @@ -645,16 +672,7 @@ pcb = pcb_layer_get_top(src); dst->comb = src->comb; - dst->is_bound = 1; - if (!src->is_bound) { - dst->meta.bound.real = src; - if (share_rtrees) - pcb_layer_link_trees(dst, src); - } - else - dst->meta.bound.real = NULL; - dst->meta.bound.type = pcb_layergrp_flags(pcb, src->meta.real.grp); if (src->name != NULL) dst->name = pcb_strdup(src->name); @@ -661,22 +679,13 @@ else dst->name = NULL; - if ((dst->meta.bound.type & PCB_LYT_INTERN) && (dst->meta.bound.type & PCB_LYT_COPPER)) { - int from_top, from_bottom, res; - - res = pcb_layergrp_dist(pcb, src->meta.real.grp, pcb_layergrp_get_top_copper(), PCB_LYT_COPPER, &from_top); - res |= pcb_layergrp_dist(pcb, src->meta.real.grp, pcb_layergrp_get_bottom_copper(), PCB_LYT_COPPER, &from_bottom); - if (res == 0) { - if (from_top <= from_bottom) - dst->meta.bound.stack_offs = from_top; - else - dst->meta.bound.stack_offs = -from_bottom; - } - else - pcb_message(PCB_MSG_ERROR, "Internal error: can't figure the inter copper\nlayer offset for %s\n", src->name); + pcb_layer_real2bound_offs(dst, pcb, src); + + if (!src->is_bound) { + dst->meta.bound.real = src; + if (share_rtrees) + pcb_layer_link_trees(dst, src); } - else - dst->meta.bound.stack_offs = 0; } pcb_layer_t *pcb_layer_resolve_binding(pcb_board_t *pcb, pcb_layer_t *src) Index: trunk/src/layer.h =================================================================== --- trunk/src/layer.h (revision 12537) +++ trunk/src/layer.h (revision 12538) @@ -251,6 +251,11 @@ int pcb_layer_move(pcb_board_t *pcb, pcb_layer_id_t old_index, pcb_layer_id_t new_index, pcb_layergrp_id_t new_in_grp); +/* set up dst to be a bound layer with the right offset in the stack; src_pcb + is used for the layer stack of src. Assumes other fields of dst, e.g. name, + are all set up. */ +void pcb_layer_real2bound_offs(pcb_layer_t *dst, pcb_board_t *src_pcb, pcb_layer_t *src); + /* Set up dst so that it's a non-real layer bound to src */ void pcb_layer_real2bound(pcb_layer_t *dst, pcb_layer_t *src, int share_rtrees);