Index: trunk/src/draw.c =================================================================== --- trunk/src/draw.c (revision 19122) +++ trunk/src/draw.c (revision 19123) @@ -38,6 +38,7 @@ #include "stub_draw.h" #include "layer_ui.h" #include "hid_inlines.h" +#include "funchash_core.h" #include "obj_pstk_draw.h" #include "obj_line_draw.h" @@ -931,6 +932,7 @@ { pcb_hid_t *old_gui = expose_begin(hid); unsigned long lflg = pcb_layer_flags(PCB, e->content.layer_id); + int purpi = -1; int fx, fy; if (lflg & PCB_LYT_LOGICAL) { @@ -940,7 +942,10 @@ conf_force_set_bool(conf_core.editor.view.flip_y, 0); } - if (lflg & PCB_LYT_CSECT) { + if (lflg & PCB_LYT_VIRTUAL) + purpi = pcb_layer_purpose(PCB, e->content.layer_id, NULL); + + if (PCB_LAYER_IS_CSECT(lflg, purpi)) { if ((pcb_layer_gui_set_vlayer(PCB, PCB_VLY_CSECT, 0)) || (e->force)) { pcb_gui->set_drawing_mode(PCB_HID_COMP_RESET, 1, &e->view); pcb_gui->set_drawing_mode(PCB_HID_COMP_POSITIVE, 1, &e->view); Index: trunk/src/layer.c =================================================================== --- trunk/src/layer.c (revision 19122) +++ trunk/src/layer.c (revision 19123) @@ -357,6 +357,7 @@ } + int pcb_layer_list(pcb_board_t *pcb, pcb_layer_type_t mask, pcb_layer_id_t *res, int res_len) { int n, used = 0; @@ -378,6 +379,36 @@ return used; } +/* optimization: code dup for speed */ +int pcb_layer_listp(pcb_board_t *pcb, pcb_layer_type_t mask, pcb_layer_id_t *res, int res_len, int purpi, const char *purpose) +{ + int n, used = 0; + pcb_virt_layer_t *v; + +#define PURP_MATCH(ps, pi) (((purpi == -1) || (purpi == pi)) && ((purpose == NULL) || (strcmp(purpose, ps) == 0))) + + for(v = pcb_virt_layers; v->name != NULL; v++) + if (((v->type & mask) == mask) && (PURP_MATCH(v->purpose, v->purpi))) + APPEND_VIRT(v); + + for (n = 0; n < PCB_MAX_LAYER; n++) { + if ((pcb_layer_flags(pcb, n) & mask) == mask) { + const char *lpurp; + int lpurpi = pcb_layer_purpose(pcb, n, &lpurp); + if (PURP_MATCH(lpurp, lpurpi)) + APPEND(n); + } + } + + if (mask == PCB_LYT_UI) + for (n = 0; n < vtp0_len(&pcb_uilayers); n++) + if ((pcb_uilayers.array[n] != NULL)) + APPEND(n | PCB_LYT_UI | PCB_LYT_VIRTUAL); + + return used; +} + + int pcb_layer_list_any(pcb_board_t *pcb, pcb_layer_type_t mask, pcb_layer_id_t *res, int res_len) { int n, used = 0; Index: trunk/src/layer.h =================================================================== --- trunk/src/layer.h (revision 19122) +++ trunk/src/layer.h (revision 19123) @@ -95,6 +95,7 @@ #define PCB_LAYER_IS_ASSY(lyt, purpi) (((lyt) & PCB_LYT_VIRTUAL) && ((purpi) == F_assy)) #define PCB_LAYER_IS_FAB(lyt, purpi) (((lyt) & PCB_LYT_VIRTUAL) && ((purpi) == F_fab)) +#define PCB_LAYER_IS_CSECT(lyt, purpi) (((lyt) & PCB_LYT_VIRTUAL) && ((purpi) == F_csect)) #include "globalconst.h" #include "global_typedefs.h" @@ -248,10 +249,14 @@ - the number of layers copied into res if res is not NULL The plain version require exact match (look for a specific layer), the _any version allows partial match so work with PCB_LYT_ANY*. + The version that ends in 'p' also matches purpose if purpi is not -1 + and/or purpose is not NULL. */ int pcb_layer_list(pcb_board_t *pcb, pcb_layer_type_t mask, pcb_layer_id_t *res, int res_len); int pcb_layer_list_any(pcb_board_t *pcb, pcb_layer_type_t mask, pcb_layer_id_t *res, int res_len); +int pcb_layer_listp(pcb_board_t *pcb, pcb_layer_type_t mask, pcb_layer_id_t *res, int res_len, int purpi, const char *purpose); + /**** layer creation (for load/import code) ****/ /* Reset layers to the bare minimum (double sided board) */ Index: trunk/src_plugins/export_gerber/gerber.c =================================================================== --- trunk/src_plugins/export_gerber/gerber.c (revision 19122) +++ trunk/src_plugins/export_gerber/gerber.c (revision 19123) @@ -734,7 +734,7 @@ return 0; } - if ((flags & PCB_LYT_CSECT) && (!want_cross_sect)) + if (PCB_LAYER_IS_CSECT(flags, purpi) && (!want_cross_sect)) return 0; if ((group >= 0) && (group < pcb_max_group(PCB))) { Index: trunk/src_plugins/export_png/png.c =================================================================== --- trunk/src_plugins/export_png/png.c (revision 19122) +++ trunk/src_plugins/export_png/png.c (revision 19123) @@ -1278,7 +1278,7 @@ if (flags & PCB_LYT_NOEXPORT) return 0; - if (PCB_LAYER_IS_ASSY(flags, purpi) || PCB_LAYER_IS_FAB(flags, purpi) || (flags & PCB_LYT_PASTE) || (flags & PCB_LYT_INVIS) || (flags & PCB_LYT_CSECT)) + if (PCB_LAYER_IS_ASSY(flags, purpi) || PCB_LAYER_IS_FAB(flags, purpi) || (flags & PCB_LYT_PASTE) || (flags & PCB_LYT_INVIS) || PCB_LAYER_IS_CSECT(flags, purpi)) return 0; } Index: trunk/src_plugins/export_ps/eps.c =================================================================== --- trunk/src_plugins/export_ps/eps.c (revision 19122) +++ trunk/src_plugins/export_ps/eps.c (revision 19123) @@ -375,7 +375,7 @@ if (flags & PCB_LYT_NOEXPORT) return 0; - if (PCB_LAYER_IS_ASSY(flags, purpi) || PCB_LAYER_IS_FAB(flags, purpi) || (flags & PCB_LYT_CSECT) || (flags & PCB_LYT_INVIS)) + if (PCB_LAYER_IS_ASSY(flags, purpi) || PCB_LAYER_IS_FAB(flags, purpi) || PCB_LAYER_IS_CSECT(flags, purpi) || (flags & PCB_LYT_INVIS)) return 0; if ((group >= 0) && pcb_layergrp_is_empty(PCB, group) && (flags & PCB_LYT_OUTLINE)) Index: trunk/src_plugins/export_ps/ps.c =================================================================== --- trunk/src_plugins/export_ps/ps.c (revision 19122) +++ trunk/src_plugins/export_ps/ps.c (revision 19123) @@ -820,7 +820,7 @@ if (flags & PCB_LYT_INVIS) return 0; - if (flags & PCB_LYT_CSECT) /* not yet finished */ + if (PCB_LAYER_IS_CSECT(flags, purpi)) /* not yet finished */ return 0; } Index: trunk/src_plugins/hid_gtk2_gl/gtkhid-gl.c =================================================================== --- trunk/src_plugins/hid_gtk2_gl/gtkhid-gl.c (revision 19122) +++ trunk/src_plugins/hid_gtk2_gl/gtkhid-gl.c (revision 19123) @@ -192,6 +192,16 @@ if (PCB_LAYER_IS_ASSY(flags, purpi)) return 0; + if (PCB_LAYER_IS_CSECT(flags, purpi)) { + /* Opaque draw */ + priv->trans_lines = pcb_false; + /* Disable stencil for cross-section drawing; that code + * relies on overdraw doing the right thing and doesn't + * use layers */ + /*glDisable(GL_STENCIL_TEST);*/ + return 0; + } + /* virtual layers */ { switch (flags & PCB_LYT_ANYTHING) { @@ -208,14 +218,6 @@ return 1; case PCB_LYT_RAT: return PCB->RatOn; - case PCB_LYT_CSECT: - /* Opaque draw */ - priv->trans_lines = pcb_false; - /* Disable stencil for cross-section drawing; that code - * relies on overdraw doing the right thing and doesn't - * use layers */ - /*glDisable(GL_STENCIL_TEST);*/ - return 0; } } return 0; Index: trunk/src_plugins/hid_remote/remote.c =================================================================== --- trunk/src_plugins/hid_remote/remote.c (revision 19122) +++ trunk/src_plugins/hid_remote/remote.c (revision 19123) @@ -12,6 +12,7 @@ #include "pcb-printf.h" #include "plugins.h" #include "compat_misc.h" +#include "funchash_core.h" #include "event.h" #include "proto.h" @@ -138,7 +139,7 @@ return 0; if (flags & PCB_LYT_NOEXPORT) return 0; - if (flags & PCB_LYT_CSECT) /* do not draw cross-sect, we didn't create them */ + if (PCB_LAYER_IS_CSECT(flags, purpi)) /* do not draw cross-sect, we didn't create them */ return 0; if (group >= 0) proto_send_set_layer_group(group, purpose, is_empty);