Index: trunk/src/data.h =================================================================== --- trunk/src/data.h (revision 6283) +++ trunk/src/data.h (revision 6284) @@ -54,11 +54,7 @@ #define pcb_max_layer (PCB->Data->LayerN) - -/* OBSOLOTE: do not use these 4 */ #define pcb_max_group (PCB->LayerGroups.len) -#define pcb_layer_get_bottom_silk() (pcb_max_layer + PCB_SOLDER_SIDE - 2) -#define pcb_layer_get_top_silk() (pcb_max_layer + PCB_COMPONENT_SIDE - 2) extern pcb_buffer_t pcb_buffers[PCB_MAX_BUFFER]; extern int pcb_added_lines; Index: trunk/src/layer.c =================================================================== --- trunk/src/layer.c (revision 6283) +++ trunk/src/layer.c (revision 6284) @@ -720,3 +720,38 @@ return 1; } +static pcb_layer_id_t pcb_layer_get_cached(pcb_layer_id_t *cache, unsigned int loc, unsigned int typ) +{ + pcb_layer_group_t *g; + + if (*cache < pcb_max_layer) { /* check if the cache is still pointing to the right layer */ + pcb_layergrp_id_t gid = PCB->Data->Layer[*cache].grp; + if ((gid >= 0) && (gid < PCB->LayerGroups.len)) { + g = &(PCB->LayerGroups.grp[gid]); + if ((g->type & loc) && (g->type & typ) && (g->lid[0] == *cache)) + return *cache; + } + } + + /* nope: need to resolve it again */ + g = pcb_get_grp(&PCB->LayerGroups, loc, typ); + if ((g == NULL) || (g->len == 0)) { + *cache = -1; + return -1; + } + *cache = g->lid[0]; + return *cache; +} + +pcb_layer_id_t pcb_layer_get_bottom_silk() +{ + static pcb_layer_id_t cache = -1; + return pcb_layer_get_cached(&cache, PCB_LYT_BOTTOM, PCB_LYT_SILK); +} + +pcb_layer_id_t pcb_layer_get_top_silk() +{ + static pcb_layer_id_t cache = -1; + return pcb_layer_get_cached(&cache, PCB_LYT_TOP, PCB_LYT_SILK); +} + Index: trunk/src/layer.h =================================================================== --- trunk/src/layer.h (revision 6283) +++ trunk/src/layer.h (revision 6284) @@ -121,6 +121,11 @@ pcb_bool pcb_layer_is_paste_empty(pcb_side_t side); +/* Cached lookup of the first silk layer in the bottom or top group */ +pcb_layer_id_t pcb_layer_get_bottom_silk(); +pcb_layer_id_t pcb_layer_get_top_silk(); + + /************ OLD API - new code should not use these **************/ #define LAYER_ON_STACK(n) (&PCB->Data->Layer[pcb_layer_stack[(n)]])