Index: trunk/src/crosshair.c =================================================================== --- trunk/src/crosshair.c (revision 19399) +++ trunk/src/crosshair.c (revision 19400) @@ -89,7 +89,7 @@ continue; if (dash_last) { - pcb_draw_dashed_line(pcb_crosshair.GC, + pcb_draw_dashed_line(NULL, pcb_crosshair.GC, polygon->Points[i].X + dx, polygon->Points[i].Y + dy, polygon->Points[next].X + dx, polygon->Points[next].Y + dy, 5, pcb_false); break; /* skip normal line draw below */ Index: trunk/src/draw.c =================================================================== --- trunk/src/draw.c (revision 19399) +++ trunk/src/draw.c (revision 19400) @@ -116,7 +116,7 @@ pcb_snprintf(buf, sizeof("#XXXXXX"), "#%02x%02x%02x", r, g, b); } -void pcb_draw_dashed_line(pcb_hid_gc_t GC, pcb_coord_t x1, pcb_coord_t y1, pcb_coord_t x2, pcb_coord_t y2, unsigned int segs, pcb_bool_t cheap) +void pcb_draw_dashed_line(pcb_draw_info_t *info, pcb_hid_gc_t GC, pcb_coord_t x1, pcb_coord_t y1, pcb_coord_t x2, pcb_coord_t y2, unsigned int segs, pcb_bool_t cheap) { /* TODO: we need a real geo lib... using double here is plain wrong */ double dx = x2-x1, dy = y2-y1; @@ -124,6 +124,8 @@ int n; pcb_coord_t minlen = pcb_gui->coord_per_pix * 8; +#warning trdraw TODO: use info + if (len_mnt < minlen*2) { /* line too short, just draw it */ pcb_gui->draw_line(GC, x1, y1, x2, y2); @@ -267,8 +269,10 @@ pcb_hid_set_line_width(pcb_draw_out.fgGC, 0); pcb_hid_set_draw_xor(pcb_draw_out.fgGC, 1); - if (PCB->SubcOn) - pcb_r_search(PCB->Data->subc_tree, info->drawn_area, NULL, draw_subc_mark_callback, &per_side, NULL); + if (PCB->SubcOn) { + info->objcb.subc.per_side = per_side; + pcb_r_search(PCB->Data->subc_tree, info->drawn_area, NULL, draw_subc_mark_callback, info, NULL); + } if ((PCB->padstack_mark_on) && (conf_core.appearance.padstack.cross_thick > 0)) { pcb_hid_set_line_width(pcb_draw_out.fgGC, -conf_core.appearance.padstack.cross_thick); @@ -302,8 +306,10 @@ pcb_gui->set_drawing_mode(PCB_HID_COMP_POSITIVE, pcb_draw_out.direct, info->drawn_area); pcb_hid_set_line_cap(pcb_draw_out.fgGC, pcb_cap_round); pcb_hid_set_line_width(pcb_draw_out.fgGC, 0); - if (PCB->SubcOn) - pcb_r_search(PCB->Data->subc_tree, info->drawn_area, NULL, draw_subc_label_callback, &per_side, NULL); + if (PCB->SubcOn) { + info->objcb.subc.per_side = per_side; + pcb_r_search(PCB->Data->subc_tree, info->drawn_area, NULL, draw_subc_label_callback, info, NULL); + } if (PCB->padstack_mark_on) { pcb_hid_set_line_width(pcb_draw_out.fgGC, -conf_core.appearance.padstack.cross_thick); pcb_draw_pstk_labels(info); Index: trunk/src/draw.h =================================================================== --- trunk/src/draw.h (revision 19399) +++ trunk/src/draw.h (revision 19400) @@ -66,6 +66,9 @@ pcb_layer_type_t shape_mask; /* when gid is invalid, use this for the shapes */ } pstk; + struct { + int per_side; + } subc; } objcb; } pcb_draw_info_t; @@ -111,7 +114,7 @@ the number of on/off segment pairs. It is guaranteed that the line starts and ends with an "on" line segment. If cheap is true, allow drawing less segments if the line is short */ -void pcb_draw_dashed_line(pcb_hid_gc_t GC, pcb_coord_t x1, pcb_coord_t y1, pcb_coord_t x2, pcb_coord_t y2, unsigned int segs, pcb_bool_t cheap); +void pcb_draw_dashed_line(pcb_draw_info_t *info, pcb_hid_gc_t GC, pcb_coord_t x1, pcb_coord_t y1, pcb_coord_t x2, pcb_coord_t y2, unsigned int segs, pcb_bool_t cheap); void pcb_draw(void); Index: trunk/src/obj_subc.c =================================================================== --- trunk/src/obj_subc.c (revision 19399) +++ trunk/src/obj_subc.c (revision 19400) @@ -1577,6 +1577,7 @@ #include "draw.h" pcb_r_dir_t draw_subc_mark_callback(const pcb_box_t *b, void *cl) { + pcb_draw_info_t *info = cl; pcb_subc_t *subc = (pcb_subc_t *) b; pcb_box_t *bb = &subc->BoundingBox; int selected = PCB_FLAG_TEST(PCB_FLAG_SELECTED, subc); @@ -1593,10 +1594,10 @@ pcb_subc_draw_origin(pcb_draw_out.fgGC, subc, 0, 0); if (freq >= 0) { - pcb_draw_dashed_line(pcb_draw_out.fgGC, bb->X1, bb->Y1, bb->X2, bb->Y1, freq, pcb_true); - pcb_draw_dashed_line(pcb_draw_out.fgGC, bb->X1, bb->Y1, bb->X1, bb->Y2, freq, pcb_true); - pcb_draw_dashed_line(pcb_draw_out.fgGC, bb->X2, bb->Y2, bb->X2, bb->Y1, freq, pcb_true); - pcb_draw_dashed_line(pcb_draw_out.fgGC, bb->X2, bb->Y2, bb->X1, bb->Y2, freq, pcb_true); + pcb_draw_dashed_line(info, pcb_draw_out.fgGC, bb->X1, bb->Y1, bb->X2, bb->Y1, freq, pcb_true); + pcb_draw_dashed_line(info, pcb_draw_out.fgGC, bb->X1, bb->Y1, bb->X1, bb->Y2, freq, pcb_true); + pcb_draw_dashed_line(info, pcb_draw_out.fgGC, bb->X2, bb->Y2, bb->X2, bb->Y1, freq, pcb_true); + pcb_draw_dashed_line(info, pcb_draw_out.fgGC, bb->X2, bb->Y2, bb->X1, bb->Y2, freq, pcb_true); } return PCB_R_DIR_FOUND_CONTINUE; @@ -1604,6 +1605,7 @@ pcb_r_dir_t draw_subc_label_callback(const pcb_box_t *b, void *cl) { + pcb_draw_info_t *info = cl; pcb_subc_t *subc = (pcb_subc_t *) b; pcb_box_t *bb = &subc->BoundingBox;