Index: trunk/src/draw.c =================================================================== --- trunk/src/draw.c (revision 10732) +++ trunk/src/draw.c (revision 10733) @@ -69,6 +69,8 @@ int pcb_draw_doing_pinout = 0; pcb_bool pcb_draw_doing_assy = pcb_false; +static vtp0_t delayed_labels; +pcb_bool delayed_labels_enabled = pcb_false; /* --------------------------------------------------------------------------- * some local prototypes @@ -75,6 +77,7 @@ */ static void DrawEverything(const pcb_box_t *); static void DrawLayerGroup(int, const pcb_box_t *); +static void pcb_draw_obj_label(pcb_any_obj_t *obj); /* In draw_ly_spec.c: */ static void pcb_draw_paste(int side, const pcb_box_t *drawn_area); @@ -84,7 +87,13 @@ static void pcb_draw_assembly(unsigned int lyt_side, const pcb_box_t *drawn_area); +void pcb_draw_delay_label_add(pcb_any_obj_t *obj) +{ + if (delayed_labels_enabled) + vtp0_append(&delayed_labels, obj); +} + #warning TODO: this should be cached void pcb_lighten_color(const char *orig, char buf[8], double factor) { @@ -207,6 +216,9 @@ PCB->Data->SILKLAYER.meta.real.color = conf_core.appearance.color.element; PCB->Data->BACKSILKLAYER.meta.real.color = conf_core.appearance.color.invisible_objects; + delayed_labels_enabled = pcb_true; + vtp0_truncate(&delayed_labels, 0); + memset(do_group, 0, sizeof(do_group)); for (ngroups = 0, i = 0; i < pcb_max_layer; i++) { pcb_layer_t *l = LAYER_ON_STACK(i); @@ -350,6 +362,8 @@ pcb_gui->end_layer(); } + delayed_labels_enabled = pcb_false; + vtp0_truncate(&delayed_labels, 0); } /* --------------------------------------------------------------------------- @@ -415,6 +429,12 @@ /* draw element pins' names */ pcb_r_search(PCB->Data->via_tree, drawn_area, NULL, pcb_pin_name_draw_callback, NULL, NULL); } + + if (PCB->PinOn || !pcb_gui->gui) { + size_t n; + for(n = 0; n < delayed_labels.used; n++) + pcb_draw_obj_label(delayed_labels.array[n]); + } } #include "draw_composite.c" @@ -580,6 +600,14 @@ } } +static void pcb_draw_obj_label(pcb_any_obj_t *obj) +{ + switch(obj->type) { + case PCB_OBJ_LINE: pcb_line_draw_label((pcb_line_t *)obj); return; + default: break; + } +} + /* --------------------------------------------------------------------------- * HID drawing callback. */ Index: trunk/src/draw.h =================================================================== --- trunk/src/draw.h (revision 10732) +++ trunk/src/draw.h (revision 10733) @@ -112,4 +112,8 @@ /* Draw (render) a terminal label */ void pcb_term_label_draw(pcb_coord_t x, pcb_coord_t y, double scale, pcb_bool vert, const char *lab); +/* Schedule an object to be called again at the end for drawing its labels + on top of everything. */ +void pcb_draw_delay_label_add(pcb_any_obj_t *obj); + #endif