Index: trunk/src/draw.c =================================================================== --- trunk/src/draw.c (revision 32459) +++ trunk/src/draw.c (revision 32460) @@ -1268,7 +1268,7 @@ } -void pcb_label_draw(pcb_draw_info_t *info, rnd_coord_t x, rnd_coord_t y, double scale, rnd_bool vert, rnd_bool centered, const char *label) +void pcb_label_draw(pcb_draw_info_t *info, rnd_coord_t x, rnd_coord_t y, double scale, rnd_bool vert, rnd_bool centered, const char *label, int prio) { int mirror, direction; @@ -1288,7 +1288,7 @@ pcb_draw_force_termlab--; } else - pcb_label_smart_add(info, x, y, scale/100.0, direction*90.0, mirror, w, h, label); + pcb_label_smart_add(info, x, y, scale/100.0, direction*90.0, mirror, w, h, label, prio); } @@ -1311,8 +1311,30 @@ void pcb_term_label_draw(pcb_draw_info_t *info, rnd_coord_t x, rnd_coord_t y, double scale, rnd_bool vert, rnd_bool centered, const pcb_any_obj_t *obj) { char buff[128]; + int prio = 1; /* slightly lower prio than subc */ + int on_bottom, flips; const char *label = lab_with_intconn(obj, obj->intconn, obj->term, buff, sizeof(buff)); - pcb_label_draw(info, x, y, scale, vert, centered, label); + + flips = !!(rnd_conf.editor.view.flip_x ^ rnd_conf.editor.view.flip_y); + + switch(obj->type) { + case PCB_OBJ_PSTK: /* top prio */ + break; + case PCB_OBJ_LINE: + case PCB_OBJ_ARC: + case PCB_OBJ_TEXT: + case PCB_OBJ_POLY: + case PCB_OBJ_GFX: + on_bottom = !!(pcb_layer_flags_(obj->parent.layer) & PCB_LYT_BOTTOM); + if (on_bottom == flips) + prio += 1; + else + prio += 2; /* other-side object penalty */ + break; + default: + prio += 10; + } + pcb_label_draw(info, x, y, scale, vert, centered, label, prio); } void pcb_term_label_invalidate(rnd_coord_t x, rnd_coord_t y, double scale, rnd_bool vert, rnd_bool centered, const pcb_any_obj_t *obj) Index: trunk/src/draw.h =================================================================== --- trunk/src/draw.h (revision 32459) +++ trunk/src/draw.h (revision 32460) @@ -166,7 +166,7 @@ /* Draw (render) or invalidate a terminal label */ void pcb_term_label_draw(pcb_draw_info_t *info, rnd_coord_t x, rnd_coord_t y, double scale, rnd_bool vert, rnd_bool centered, const pcb_any_obj_t *obj); void pcb_term_label_invalidate(rnd_coord_t x, rnd_coord_t y, double scale, rnd_bool vert, rnd_bool centered, const pcb_any_obj_t *obj); -void pcb_label_draw(pcb_draw_info_t *info, rnd_coord_t x, rnd_coord_t y, double scale, rnd_bool vert, rnd_bool centered, const char *label); +void pcb_label_draw(pcb_draw_info_t *info, rnd_coord_t x, rnd_coord_t y, double scale, rnd_bool vert, rnd_bool centered, const char *label, int prio); void pcb_label_invalidate(rnd_coord_t x, rnd_coord_t y, double scale, rnd_bool vert, rnd_bool centered, const char *label); Index: trunk/src/draw_label_smart.c =================================================================== --- trunk/src/draw_label_smart.c (revision 32459) +++ trunk/src/draw_label_smart.c (revision 32460) @@ -6,6 +6,7 @@ rnd_coord_t y; double scale; double rot; + int prio; rnd_bool mirror; rnd_coord_t w; rnd_coord_t h; @@ -15,7 +16,7 @@ static pcb_smart_label_t *smart_labels = NULL; -RND_INLINE void pcb_label_smart_add(pcb_draw_info_t *info, rnd_coord_t x, rnd_coord_t y, double scale, double rot, rnd_bool mirror, rnd_coord_t w, rnd_coord_t h, const char *label) +RND_INLINE void pcb_label_smart_add(pcb_draw_info_t *info, rnd_coord_t x, rnd_coord_t y, double scale, double rot, rnd_bool mirror, rnd_coord_t w, rnd_coord_t h, const char *label, int prio) { int len = strlen(label); pcb_smart_label_t *l = malloc(sizeof(pcb_smart_label_t) + len + 1); @@ -25,6 +26,7 @@ l->rot = rot; l->mirror = mirror; l->w = w; l->h = h; + l->prio = prio; memcpy(l->label, label, len+1); l->next = smart_labels; @@ -51,6 +53,7 @@ for(l = smart_labels; l != NULL; l = next) { next = l->next; +/*printf("l->prio=%d\n", l->prio);*/ pcb_text_draw_string(info, font, (unsigned const char *)l->label, l->x, l->y, l->scale, l->scale, l->rot, l->mirror, 1, 0, 0, 0, 0, PCB_TXT_TINY_HIDE); free(l); } Index: trunk/src/obj_subc.c =================================================================== --- trunk/src/obj_subc.c (revision 32459) +++ trunk/src/obj_subc.c (revision 32460) @@ -2114,7 +2114,7 @@ next++; ctrl = 1; } - pcb_label_draw(info, x, y, conf_core.appearance.term_label_size/2, 0, 0, curr); + pcb_label_draw(info, x, y, conf_core.appearance.term_label_size/2, 0, 0, curr, 0); if (ctrl) { switch(*next) { case 'n': y += dy; x = x0; break; @@ -2124,10 +2124,10 @@ } } else - pcb_label_draw(info, x0, y0, conf_core.appearance.term_label_size/2.0, 0, 0, ""); + pcb_label_draw(info, x0, y0, conf_core.appearance.term_label_size/2.0, 0, 0, "", 0); } else if (subc->refdes != NULL) - pcb_label_draw(info, x0, y0, conf_core.appearance.term_label_size/2.0, 0, 0, subc->refdes); + pcb_label_draw(info, x0, y0, conf_core.appearance.term_label_size/2.0, 0, 0, subc->refdes, 0); return RND_R_DIR_FOUND_CONTINUE; }