Index: trunk/src/crosshair.c =================================================================== --- trunk/src/crosshair.c (revision 32125) +++ trunk/src/crosshair.c (revision 32126) @@ -273,6 +273,20 @@ *ox =nx * offs; *oy = ny * offs; } + +/* extend the pine between px;py and (already moved) x;y knowing the previous + point beyond px;py (which is ppx;ppy) */ +static void perp_extend(rnd_coord_t ppx, rnd_coord_t ppy, rnd_coord_t *px, rnd_coord_t *py, rnd_coord_t x, rnd_coord_t y, rnd_coord_t dx, rnd_coord_t dy) +{ + rnd_coord_t ix, iy; + + pcb_lines_intersect_at(ppx, ppy, *px, *py, (*px) + dx, (*py) + dy, x, y, &ix, &iy); + + *px = ix; + *py = iy; +} + + /* --------------------------------------------------------------------------- * draws the attached object while in tool mode move or copy */ @@ -486,7 +500,22 @@ x = point->X + dx; y = point->Y + dy; nx = polygon->Points[next].X; ny = polygon->Points[next].Y; + if (modifier) { + rnd_coord_t ppx, ppy, nnx, nny; + prev = pcb_poly_contour_prev_point(polygon, prev); + next = pcb_poly_contour_next_point(polygon, next); + ppx = polygon->Points[prev].X; ppy = polygon->Points[prev].Y; + nnx = polygon->Points[next].X; nny = polygon->Points[next].Y; + + perp_extend(ppx, ppy, &px, &py, x, y, dx, dy); + perp_extend(nnx, nny, &nx, &ny, x, y, dx, dy); + + /* draw the extra two segments on prev-prev and next-next */ + rnd_render->draw_line(pcb_crosshair.GC, ppx, ppy, px, py); + rnd_render->draw_line(pcb_crosshair.GC, nnx, nny, nx, ny); + } + /* draw the two segments */ rnd_render->draw_line(pcb_crosshair.GC, px, py, x, y); rnd_render->draw_line(pcb_crosshair.GC, x, y, nx, ny); Index: trunk/src/search.c =================================================================== --- trunk/src/search.c (revision 32125) +++ trunk/src/search.c (revision 32126) @@ -1787,7 +1787,7 @@ } -int pcb_lines_intersect(rnd_coord_t ax1, rnd_coord_t ay1, rnd_coord_t ax2, rnd_coord_t ay2, rnd_coord_t bx1, rnd_coord_t by1, rnd_coord_t bx2, rnd_coord_t by2) +int pcb_lines_intersect_at(rnd_coord_t ax1, rnd_coord_t ay1, rnd_coord_t ax2, rnd_coord_t ay2, rnd_coord_t bx1, rnd_coord_t by1, rnd_coord_t bx2, rnd_coord_t by2, rnd_coord_t *iscx, rnd_coord_t *iscy) { /* TODO: this should be long double if rnd_coord_t is 64 bits */ double ua, xi, yi, X1, Y1, X2, Y2, X3, Y3, X4, Y4, tmp; @@ -1834,6 +1834,11 @@ xi = X1 + ua * (X2 - X1); yi = Y1 + ua * (Y2 - Y1); + if (iscx != NULL) + *iscx = xi; + if (iscy != NULL) + *iscy = yi; + #define check(e1, e2, i) \ if (e1 < e2) { \ if ((i < e1) || (i > e2)) \ @@ -1851,6 +1856,10 @@ return 1; } +int pcb_lines_intersect(rnd_coord_t ax1, rnd_coord_t ay1, rnd_coord_t ax2, rnd_coord_t ay2, rnd_coord_t bx1, rnd_coord_t by1, rnd_coord_t bx2, rnd_coord_t by2) +{ + return pcb_lines_intersect_at(ax1, ay1, ax2, ay2, bx1, by1, bx2, by2, NULL, NULL); +} rnd_r_dir_t pcb_search_data_by_loc(pcb_data_t *data, pcb_objtype_t type, const rnd_box_t *query_box, rnd_r_dir_t (*cb_)(void *closure, pcb_any_obj_t *obj, void *box), void *closure) { Index: trunk/src/search.h =================================================================== --- trunk/src/search.h (revision 32125) +++ trunk/src/search.h (revision 32126) @@ -34,6 +34,7 @@ #include #include "layer.h" +int pcb_lines_intersect_at(rnd_coord_t ax1, rnd_coord_t ay1, rnd_coord_t ax2, rnd_coord_t ay2, rnd_coord_t bx1, rnd_coord_t by1, rnd_coord_t bx2, rnd_coord_t by2, rnd_coord_t *iscx, rnd_coord_t *iscy); int pcb_lines_intersect(rnd_coord_t ax1, rnd_coord_t ay1, rnd_coord_t ax2, rnd_coord_t ay2, rnd_coord_t bx1, rnd_coord_t by1, rnd_coord_t bx2, rnd_coord_t by2); rnd_bool pcb_arc_in_box(pcb_arc_t *arc, rnd_box_t *b); rnd_bool pcb_gfx_in_box(pcb_gfx_t *gfx, rnd_box_t *b);