Index: trunk/src/data.c =================================================================== --- trunk/src/data.c (revision 6230) +++ trunk/src/data.c (revision 6231) @@ -198,7 +198,7 @@ list_map0(&data->Element, pcb_element_t, pcb_element_free); list_map0(&data->Rat, pcb_rat_t, pcb_rat_free); - for (layer = data->Layer, i = 0; i < PCB_MAX_LAYER + 2; layer++, i++) { + for (layer = data->Layer, i = 0; i < PCB_MAX_LAYER; layer++, i++) { pcb_attribute_free(&layer->Attributes); PCB_TEXT_LOOP(layer); { Index: trunk/src/data.h =================================================================== --- trunk/src/data.h (revision 6230) +++ trunk/src/data.h (revision 6231) @@ -47,14 +47,13 @@ pcb_rtree_t *via_tree, *element_tree, *pin_tree, *pad_tree, *name_tree[3], /* for element names */ *rat_tree; pcb_board_t *pcb; - pcb_layer_t Layer[PCB_MAX_LAYER + 2]; /* add 2 silkscreen layers; layer TODO: remove this hack */ + pcb_layer_t Layer[PCB_MAX_LAYER]; /* layer TODO: make this dynamic */ pcb_plug_io_t *loader; ratlist_t Rat; }; -/* layer TODO: update and remove +2 when the silk hack is out */ -#define pcb_max_layer (PCB->Data->LayerN+2) +#define pcb_max_layer (PCB->Data->LayerN) /* OBSOLOTE: do not use these 4 */ #define pcb_max_group (PCB->LayerGroups.len) Index: trunk/src/draw.c =================================================================== --- trunk/src/draw.c (revision 6230) +++ trunk/src/draw.c (revision 6231) @@ -195,6 +195,11 @@ for (ngroups = 0, i = 0; i < pcb_max_layer; i++) { pcb_layer_t *l = LAYER_ON_STACK(i); pcb_layergrp_id_t group = pcb_layer_get_group(pcb_layer_stack[i]); + unsigned int gflg = pcb_layergrp_flags(group); + + if (gflg & PCB_LYT_SILK) /* do not draw silk here, it'll be drawn separately */ + continue; + if (l->On && !do_group[group]) { do_group[group] = 1; drawn_groups[ngroups++] = group; Index: trunk/src/layer.c =================================================================== --- trunk/src/layer.c (revision 6230) +++ trunk/src/layer.c (revision 6231) @@ -138,7 +138,7 @@ pcb_layer_id_t pcb_layer_id(pcb_data_t *Data, pcb_layer_t *Layer) { - if ((Layer >= Data->Layer) && (Layer < (Data->Layer + PCB_MAX_LAYER + 2))) + if ((Layer >= Data->Layer) && (Layer < (Data->Layer + PCB_MAX_LAYER))) return Layer - Data->Layer; if ((Layer >= pcb_uilayer.array) && (Layer < pcb_uilayer.array + vtlayer_len(&pcb_uilayer))) @@ -224,7 +224,7 @@ if ((v->type & mask) == mask) APPEND_VIRT(v); - for (n = 0; n < PCB_MAX_LAYER + 2; n++) + for (n = 0; n < PCB_MAX_LAYER; n++) if ((pcb_layer_flags(n) & mask) == mask) APPEND(n); @@ -244,7 +244,7 @@ if ((v->type & mask)) APPEND_VIRT(v); - for (n = 0; n < PCB_MAX_LAYER + 2; n++) + for (n = 0; n < PCB_MAX_LAYER; n++) if ((pcb_layer_flags(n) & mask)) APPEND(n); Index: trunk/src/layer_grp.c =================================================================== --- trunk/src/layer_grp.c (revision 6230) +++ trunk/src/layer_grp.c (revision 6231) @@ -260,10 +260,10 @@ /* set the two silks */ g = get_grp(LayerGroup, PCB_LYT_BOTTOM, PCB_LYT_SILK); - pcb_layer_add_in_group_(g, g - LayerGroup->grp, LayerN); + pcb_layer_add_in_group_(g, g - LayerGroup->grp, LayerN-2); g = get_grp(LayerGroup, PCB_LYT_TOP, PCB_LYT_SILK); - pcb_layer_add_in_group_(g, g - LayerGroup->grp, LayerN+1); + pcb_layer_add_in_group_(g, g - LayerGroup->grp, LayerN-1); return 0; Index: trunk/src/layer_grp.h =================================================================== --- trunk/src/layer_grp.h (revision 6230) +++ trunk/src/layer_grp.h (revision 6231) @@ -39,7 +39,7 @@ struct pcb_layer_group_s { pcb_cardinal_t len; /* number of layer IDs in use */ - pcb_layer_id_t lid[PCB_MAX_LAYER + 2]; /* lid=layer ID */ + pcb_layer_id_t lid[PCB_MAX_LAYER]; /* lid=layer ID */ char *name; /* name of the physical layer (independent of the name of the layer groups) */ pcb_layer_type_t type; Index: trunk/src/layer_vis.c =================================================================== --- trunk/src/layer_vis.c (revision 6230) +++ trunk/src/layer_vis.c (revision 6231) @@ -223,7 +223,7 @@ pcb_layergrp_id_t comp_group; pcb_cardinal_t i; - assert(PCB->Data->LayerN <= PCB_MAX_LAYER); + assert(PCB->Data->LayerN < PCB_MAX_LAYER); for (i = 0; i < pcb_max_layer; i++) { if (!(pcb_layer_flags(i) & PCB_LYT_SILK)) pcb_layer_stack[i] = i; Index: trunk/src_plugins/draw_csect/draw_csect.c =================================================================== --- trunk/src_plugins/draw_csect/draw_csect.c (revision 6230) +++ trunk/src_plugins/draw_csect/draw_csect.c (revision 6231) @@ -78,6 +78,8 @@ pcb_layer_id_t lid = g->lid[i]; pcb_layer_t *l = &PCB->Data->Layer[lid]; printf(" [%ld] %s\n", lid, l->Name); + if (l->grp != gid) + printf(" *** broken layer-to-group cross reference: %d\n", l->grp); } } return 0; Index: trunk/src_plugins/io_pcb/parse_y.c =================================================================== --- trunk/src_plugins/io_pcb/parse_y.c (revision 6230) +++ trunk/src_plugins/io_pcb/parse_y.c (revision 6231) @@ -2233,8 +2233,8 @@ free((char*)Layer->Name); Layer->Name = (yyvsp[-3].string); /* shouldn't this be strdup()'ed ? */ LayerFlag[(yyvsp[-4].integer)-1] = pcb_true; - if (yyData->LayerN + 2 < (yyvsp[-4].integer)) - yyData->LayerN = (yyvsp[-4].integer) - 2; + if (yyData->LayerN < (yyvsp[-4].integer)) + yyData->LayerN = (yyvsp[-4].integer); if ((yyvsp[-2].string) != NULL) free((yyvsp[-2].string)); } @@ -2328,7 +2328,7 @@ if ((yyvsp[-1].integer) & PCB_FLAG_ONSILK) { pcb_layer_t *lay = &yyData->Layer[yyData->LayerN + - (((yyvsp[-1].integer) & PCB_FLAG_ONSOLDER) ? PCB_SOLDER_SIDE : PCB_COMPONENT_SIDE)]; + (((yyvsp[-1].integer) & PCB_FLAG_ONSOLDER) ? PCB_SOLDER_SIDE : PCB_COMPONENT_SIDE) - 2]; pcb_text_new(lay ,yyFont, OU ((yyvsp[-6].measure)), OU ((yyvsp[-5].measure)), (yyvsp[-4].number), (yyvsp[-3].number), (yyvsp[-2].string), pcb_flag_old((yyvsp[-1].integer))); @@ -2354,7 +2354,7 @@ if ((yyvsp[-1].flagtype).f & PCB_FLAG_ONSILK) { pcb_layer_t *lay = &yyData->Layer[yyData->LayerN + - (((yyvsp[-1].flagtype).f & PCB_FLAG_ONSOLDER) ? PCB_SOLDER_SIDE : PCB_COMPONENT_SIDE)]; + (((yyvsp[-1].flagtype).f & PCB_FLAG_ONSOLDER) ? PCB_SOLDER_SIDE : PCB_COMPONENT_SIDE) - 2]; pcb_text_new(lay, yyFont, NU ((yyvsp[-6].measure)), NU ((yyvsp[-5].measure)), (yyvsp[-4].number), (yyvsp[-3].number), (yyvsp[-2].string), (yyvsp[-1].flagtype)); } Index: trunk/src_plugins/io_pcb/parse_y.y =================================================================== --- trunk/src_plugins/io_pcb/parse_y.y (revision 6230) +++ trunk/src_plugins/io_pcb/parse_y.y (revision 6231) @@ -884,8 +884,8 @@ free((char*)Layer->Name); Layer->Name = $4; /* shouldn't this be strdup()'ed ? */ LayerFlag[$3-1] = pcb_true; - if (yyData->LayerN + 2 < $3) - yyData->LayerN = $3 - 2; + if (yyData->LayerN < $3) + yyData->LayerN = $3; if ($5 != NULL) free($5); } @@ -1085,7 +1085,7 @@ if ($8 & PCB_FLAG_ONSILK) { pcb_layer_t *lay = &yyData->Layer[yyData->LayerN + - (($8 & PCB_FLAG_ONSOLDER) ? PCB_SOLDER_SIDE : PCB_COMPONENT_SIDE)]; + (($8 & PCB_FLAG_ONSOLDER) ? PCB_SOLDER_SIDE : PCB_COMPONENT_SIDE) - 2]; pcb_text_new(lay ,yyFont, OU ($3), OU ($4), $5, $6, $7, pcb_flag_old($8)); @@ -1110,7 +1110,7 @@ if ($8.f & PCB_FLAG_ONSILK) { pcb_layer_t *lay = &yyData->Layer[yyData->LayerN + - (($8.f & PCB_FLAG_ONSOLDER) ? PCB_SOLDER_SIDE : PCB_COMPONENT_SIDE)]; + (($8.f & PCB_FLAG_ONSOLDER) ? PCB_SOLDER_SIDE : PCB_COMPONENT_SIDE) - 2]; pcb_text_new(lay, yyFont, NU ($3), NU ($4), $5, $6, $7, $8); }