Index: trunk/src/draw.c =================================================================== --- trunk/src/draw.c (revision 12259) +++ trunk/src/draw.c (revision 12260) @@ -77,7 +77,7 @@ * some local prototypes */ static void DrawEverything(const pcb_box_t *); -static void DrawLayerGroup(int, const pcb_box_t *); +static void DrawLayerGroup(int, const pcb_box_t *, int); static void pcb_draw_obj_label(pcb_any_obj_t *obj); /* In draw_ly_spec.c: */ @@ -202,7 +202,7 @@ static void DrawEverything(const pcb_box_t * drawn_area) { int i, ngroups, side, slk_len; - pcb_layergrp_id_t component, solder, slk[16], gid; + pcb_layergrp_id_t component, solder, slk[16], gid, side_copper_grp; /* This is the list of layer groups we will draw. */ pcb_layergrp_id_t do_group[PCB_MAX_LAYERGRP]; /* This is the reverse of the order in which we draw them. */ @@ -237,7 +237,9 @@ solder = component = -1; pcb_layergrp_list(PCB, PCB_LYT_BOTTOM | PCB_LYT_COPPER, &solder, 1); pcb_layergrp_list(PCB, PCB_LYT_TOP | PCB_LYT_COPPER, &component, 1); + side_copper_grp = PCB_SWAP_IDENT ? solder : component; + /* * first draw all 'invisible' stuff */ @@ -253,7 +255,21 @@ pcb_layergrp_id_t group = drawn_groups[i]; if (pcb_layer_gui_set_glayer(PCB, group, 0)) { - DrawLayerGroup(group, drawn_area); + int is_current = 0; + pcb_layergrp_id_t cgrp = CURRENT->meta.real.grp; + + if ((cgrp == solder) || (cgrp == component)) { + /* current group is top or bottom: visibility depends on side we are looking at */ + if (group == side_copper_grp) + is_current = 1; + } + else { + /* internal layer displayed on top: current group is solid, others are "invisible" */ + if (group == cgrp) + is_current = 1; + } + + DrawLayerGroup(group, drawn_area, is_current); pcb_gui->end_layer(); } } @@ -401,11 +417,12 @@ pcb_gui->render_burst(PCB_HID_BURST_END, drawn_area); } -static void pcb_draw_padstacks(pcb_layergrp_id_t group, const pcb_box_t *drawn_area) +static void pcb_draw_padstacks(pcb_layergrp_id_t group, const pcb_box_t *drawn_area, int is_current) { pcb_padstack_draw_t ctx; ctx.pcb = PCB; ctx.gid = group; + ctx.is_current = is_current; pcb_r_search(PCB->Data->padstack_tree, drawn_area, NULL, pcb_padstack_draw_callback, &ctx, NULL); } @@ -571,7 +588,7 @@ * draws one layer group. If the exporter is not a GUI, * also draws the pins / pads / vias in this layer group. */ -static void DrawLayerGroup(int group, const pcb_box_t * drawn_area) +static void DrawLayerGroup(int group, const pcb_box_t *drawn_area, int is_current) { int i, rv = 1; pcb_layer_id_t layernum; @@ -599,7 +616,7 @@ pcb_draw_ppv(group, drawn_area); if (gflg & PCB_LYT_COPPER) - pcb_draw_padstacks(group, drawn_area); + pcb_draw_padstacks(group, drawn_area, is_current); pcb_gui->set_drawing_mode(PCB_HID_COMP_FLUSH, Output.direct, drawn_area); } Index: trunk/src/draw_ly_spec.c =================================================================== --- trunk/src/draw_ly_spec.c (revision 12259) +++ trunk/src/draw_ly_spec.c (revision 12260) @@ -175,7 +175,7 @@ pcb_draw_doing_assy = pcb_true; pcb_gui->set_draw_faded(Output.fgGC, 1); - DrawLayerGroup(side_group, drawn_area); + DrawLayerGroup(side_group, drawn_area, 0); pcb_gui->set_draw_faded(Output.fgGC, 0); /* draw package */ Index: trunk/src/obj_padstack.c =================================================================== --- trunk/src/obj_padstack.c (revision 12259) +++ trunk/src/obj_padstack.c (revision 12260) @@ -126,7 +126,7 @@ /*** draw ***/ -static void set_ps_color(pcb_padstack_t *ps) +static void set_ps_color(pcb_padstack_t *ps, int is_current) { char *color; char buf[sizeof("#XXXXXX")]; @@ -147,8 +147,12 @@ color = buf; } } - else - color = conf_core.appearance.color.via; + else { + if (is_current) + color = conf_core.appearance.color.via; + else + color = conf_core.appearance.color.invisible_objects; + } } else { /* terminal */ @@ -167,7 +171,11 @@ } } else - color = conf_core.appearance.color.pin; + if (is_current) + color = conf_core.appearance.color.pin; + else + color = conf_core.appearance.color.invisible_objects; + } pcb_gui->set_color(Output.fgGC, color); @@ -191,13 +199,13 @@ case PCB_PSSH_POLY: break; case PCB_PSSH_LINE: - set_ps_color(ps); + set_ps_color(ps, ctx->is_current); pcb_gui->set_line_cap(Output.fgGC, shape->data.line.square ? Square_Cap : Round_Cap); pcb_gui->set_line_width(Output.fgGC, shape->data.line.thickness); pcb_gui->draw_line(Output.fgGC, ps->x + shape->data.line.x1, ps->y + shape->data.line.y1, ps->x + shape->data.line.x2, ps->y + shape->data.line.y2); break; case PCB_PSSH_CIRC: - set_ps_color(ps); + set_ps_color(ps, ctx->is_current); pcb_gui->fill_circle(Output.fgGC, ps->x + shape->data.circ.x, ps->y + shape->data.circ.y, shape->data.circ.dia/2); break; } Index: trunk/src/obj_padstack_draw.h =================================================================== --- trunk/src/obj_padstack_draw.h (revision 12259) +++ trunk/src/obj_padstack_draw.h (revision 12260) @@ -34,6 +34,7 @@ typedef struct { pcb_board_t *pcb; pcb_layergrp_id_t gid; + int is_current; } pcb_padstack_draw_t; pcb_r_dir_t pcb_padstack_draw_callback(const pcb_box_t *b, void *cl);