Index: trunk/src/draw.c =================================================================== --- trunk/src/draw.c (revision 19385) +++ trunk/src/draw.c (revision 19386) @@ -566,9 +566,22 @@ void pcb_draw_layer(pcb_draw_info_t *info, const pcb_layer_t *Layer) { unsigned int lflg = 0; - int may_have_delayed = 0; + int may_have_delayed = 0, has_xform = 0; + pcb_xform_t xform; info->layer = Layer; + if (!pcb_xform_is_nop(&Layer->meta.real.xform)) { + pcb_xform_copy(&xform, &Layer->meta.real.xform); + info->xform = &xform; + } + if (info->xform_caller != NULL) { + if (info->xform == NULL) { + info->xform = &xform; + pcb_xform_copy(&xform, info->xform_caller); + } + else + pcb_xform_add(&xform, info->xform_caller); + } lflg = pcb_layer_flags_(Layer); if (PCB_LAYERFLG_ON_VISIBLE_SIDE(lflg)) @@ -614,6 +627,7 @@ pcb_draw_out.active_padGC = NULL; info->layer = NULL; + info->xform = NULL; } void pcb_draw_layer_noxform(const pcb_board_t *pcb, const pcb_layer_t *Layer, const pcb_box_t *screen) @@ -623,6 +637,7 @@ info.pcb = pcb; info.drawn_area = screen; + info.xform_caller = NULL; /* fix screen coord order */ if ((screen->X2 <= screen->X1) || (screen->Y2 <= screen->Y1)) { @@ -659,8 +674,11 @@ info.pcb = pcb; info.drawn_area = screen; + info.xform_caller = NULL; info.layer = Layer; +#warning TODO: xform comb + lflg = pcb_layer_flags_(Layer); if (PCB_LAYERFLG_ON_VISIBLE_SIDE(lflg)) pcb_draw_out.active_padGC = pcb_draw_out.padGC; @@ -909,6 +927,7 @@ pcb_draw_info_t info; info.pcb = PCB; info.drawn_area = &ctx->view; + info.xform_caller = NULL; info.layer = NULL; draw_everything(&info); expose_end(old_gui); Index: trunk/src/obj_common.h =================================================================== --- trunk/src/obj_common.h (revision 19385) +++ trunk/src/obj_common.h (revision 19386) @@ -101,8 +101,8 @@ #define pcb_xform_add(dst, src) \ do { \ pcb_xform_t *__dst__ = dst; \ - pcb_xform_t *__src__ = src; \ - *__dst__->bloat += *__src__->bloat; \ + const pcb_xform_t *__src__ = src; \ + __dst__->bloat += __src__->bloat; \ } while(0) #define pcb_xform_is_nop(src) ((src)->bloat == 0) Index: trunk/src/obj_line.c =================================================================== --- trunk/src/obj_line.c (revision 19385) +++ trunk/src/obj_line.c (revision 19386) @@ -1018,24 +1018,32 @@ } -void pcb_line_draw_(pcb_line_t *line, int allow_term_gfx) +void pcb_line_draw_(pcb_draw_info_t *info, pcb_line_t *line, int allow_term_gfx) { + pcb_coord_t thickness = line->Thickness; + if (delayed_terms_enabled && (line->term != NULL)) { pcb_draw_delay_obj_add((pcb_any_obj_t *)line); return; } + if ((info != NULL) && (info->xform != NULL) && (info->xform->bloat != 0)) { + thickness += info->xform->bloat; + if (thickness < 1) + thickness = 1; + } + PCB_DRAW_BBOX(line); pcb_hid_set_line_cap(pcb_draw_out.fgGC, pcb_cap_round); if (!conf_core.editor.thin_draw && !conf_core.editor.wireframe_draw) { if ((allow_term_gfx) && pcb_draw_term_need_gfx(line)) { pcb_hid_set_line_cap(pcb_draw_out.active_padGC, pcb_cap_round); - pcb_hid_set_line_width(pcb_draw_out.active_padGC, line->Thickness); + pcb_hid_set_line_width(pcb_draw_out.active_padGC, thickness); pcb_gui->draw_line(pcb_draw_out.active_padGC, line->Point1.X, line->Point1.Y, line->Point2.X, line->Point2.Y); pcb_hid_set_line_width(pcb_draw_out.fgGC, PCB_DRAW_TERM_GFX_WIDTH); } else - pcb_hid_set_line_width(pcb_draw_out.fgGC, line->Thickness); + pcb_hid_set_line_width(pcb_draw_out.fgGC, thickness); pcb_gui->draw_line(pcb_draw_out.fgGC, line->Point1.X, line->Point1.Y, line->Point2.X, line->Point2.Y); } else { @@ -1046,7 +1054,7 @@ if(conf_core.editor.wireframe_draw) { pcb_hid_set_line_width(pcb_draw_out.fgGC, 0); - pcb_draw_wireframe_line(pcb_draw_out.fgGC, line->Point1.X, line->Point1.Y, line->Point2.X, line->Point2.Y, line->Thickness, 0); + pcb_draw_wireframe_line(pcb_draw_out.fgGC, line->Point1.X, line->Point1.Y, line->Point2.X, line->Point2.Y, thickness, 0); } } @@ -1056,7 +1064,7 @@ } } -static void pcb_line_draw(pcb_line_t *line, int allow_term_gfx) +static void pcb_line_draw(pcb_draw_info_t *info, pcb_line_t *line, int allow_term_gfx) { const char *color; char buf[sizeof("#XXXXXX")]; @@ -1089,12 +1097,13 @@ } pcb_gui->set_color(pcb_draw_out.fgGC, color); - pcb_line_draw_(line, allow_term_gfx); + pcb_line_draw_(info, line, allow_term_gfx); } pcb_r_dir_t pcb_line_draw_callback(const pcb_box_t * b, void *cl) { pcb_line_t *line = (pcb_line_t *)b; + pcb_draw_info_t *info = cl; if (pcb_hidden_floater((pcb_any_obj_t*)b)) return PCB_R_DIR_FOUND_CONTINUE; @@ -1102,7 +1111,7 @@ if (!PCB->SubcPartsOn && pcb_lobj_parent_subc(line->parent_type, &line->parent)) return PCB_R_DIR_NOT_FOUND; - pcb_line_draw(line, 0); + pcb_line_draw(info, line, 0); return PCB_R_DIR_FOUND_CONTINUE; } @@ -1109,6 +1118,7 @@ pcb_r_dir_t pcb_line_draw_term_callback(const pcb_box_t * b, void *cl) { pcb_line_t *line = (pcb_line_t *)b; + pcb_draw_info_t *info = cl; if (pcb_hidden_floater((pcb_any_obj_t*)b)) return PCB_R_DIR_FOUND_CONTINUE; @@ -1116,7 +1126,7 @@ if (!PCB->SubcPartsOn && pcb_lobj_parent_subc(line->parent_type, &line->parent)) return PCB_R_DIR_NOT_FOUND; - pcb_line_draw(line, 1); + pcb_line_draw(info, line, 1); return PCB_R_DIR_FOUND_CONTINUE; } Index: trunk/src/obj_line_draw.h =================================================================== --- trunk/src/obj_line_draw.h (revision 19385) +++ trunk/src/obj_line_draw.h (revision 19386) @@ -28,6 +28,8 @@ /*** Standard draw of lines ***/ +#include "draw.h" + /* Include rtree.h for this */ #ifdef PCB_RTREE_H pcb_r_dir_t pcb_line_draw_callback(const pcb_box_t * b, void *cl); @@ -34,7 +36,7 @@ pcb_r_dir_t pcb_line_draw_term_callback(const pcb_box_t * b, void *cl); #endif -void pcb_line_draw_(pcb_line_t *line, int allow_term_gfx); +void pcb_line_draw_(pcb_draw_info_t *info, pcb_line_t *line, int allow_term_gfx); void pcb_line_invalidate_erase(pcb_line_t *Line); void pcb_line_invalidate_draw(pcb_layer_t *Layer, pcb_line_t *Line); void pcb_line_draw_label(pcb_line_t *line); Index: trunk/src/obj_rat.c =================================================================== --- trunk/src/obj_rat.c (revision 19385) +++ trunk/src/obj_rat.c (revision 19386) @@ -240,7 +240,7 @@ pcb_gui->draw_arc(pcb_draw_out.fgGC, rat->Point1.X, rat->Point1.Y, w * 2, w * 2, 0, 360); } else - pcb_line_draw_((pcb_line_t *) rat, 0); + pcb_line_draw_(NULL, (pcb_line_t *) rat, 0); return PCB_R_DIR_FOUND_CONTINUE; } Index: trunk/src/obj_text.c =================================================================== --- trunk/src/obj_text.c (revision 19385) +++ trunk/src/obj_text.c (revision 19386) @@ -921,6 +921,7 @@ { pcb_coord_t x = 0; pcb_cardinal_t n; + pcb_draw_info_t *info = NULL; /* cheap draw */ if (tiny != PCB_TXT_TINY_ACCURATE) { @@ -967,7 +968,7 @@ if (xordraw) pcb_gui->draw_line(pcb_crosshair.GC, xordx + newline.Point1.X, xordy + newline.Point1.Y, xordx + newline.Point2.X, xordy + newline.Point2.Y); else - pcb_line_draw_(&newline, 0); + pcb_line_draw_(info, &newline, 0); } /* draw the arcs */ Index: trunk/src_plugins/draw_csect/draw_csect.c =================================================================== --- trunk/src_plugins/draw_csect/draw_csect.c (revision 19385) +++ trunk/src_plugins/draw_csect/draw_csect.c (revision 19386) @@ -126,7 +126,7 @@ l.Thickness = PCB_MM_TO_COORD(thick); if (l.Thickness == 0) l.Thickness = 1; - pcb_line_draw_(&l, 0); + pcb_line_draw_(NULL, &l, 0); } /* draw a line of a specific thickness */ @@ -140,7 +140,7 @@ l.Thickness = PCB_MM_TO_COORD(thick); if (l.Thickness == 0) l.Thickness = 1; - pcb_line_draw_(&l, 0); + pcb_line_draw_(NULL, &l, 0); } Index: trunk/src_plugins/draw_fontsel/draw_fontsel.c =================================================================== --- trunk/src_plugins/draw_fontsel/draw_fontsel.c (revision 19385) +++ trunk/src_plugins/draw_fontsel/draw_fontsel.c (revision 19386) @@ -70,7 +70,7 @@ l.Point2.X = PCB_MM_TO_COORD(x2); l.Point2.Y = PCB_MM_TO_COORD(y2); l.Thickness = PCB_MM_TO_COORD(thick); - pcb_line_draw_(&l, 0); + pcb_line_draw_(NULL, &l, 0); } static void dchkbox(pcb_hid_gc_t gc, int x0, int y0, int checked)