[Refactored Reused Code]: Code responsible for dynamically computing 'xctx->manhattan_lines' are now bundled up in a separate function -- reducing complexity, increasing readability and future maintainablity, and the need to look out for unintentional C89-standard violations.

This commit is contained in:
Chayan Deb 2025-03-18 23:52:42 +05:30
parent e2b3a58540
commit 02f0a4ea3a
5 changed files with 19 additions and 28 deletions

View File

@ -3867,3 +3867,18 @@ void select_rect(int stretch, int what, int select)
}
}
/* needed to dynamically reassign the `manhattan_lines` value for wire-drawing */
void recompute_orthogonal_manhattanline(double linex1, double liney1, double linex2, double liney2) {
double origin_shifted_x2, origin_shifted_y2;
/* Origin shift the cartesian coordinate p2(x2,y2) w.r.t. p1(x1,y1) */
origin_shifted_x2 = linex2 - linex1;
origin_shifted_y2 = liney2 - liney1;
/* Draw whichever component of the resulting orthogonal-wire is bigger (either horizontal or vertical), first */
if(origin_shifted_x2*origin_shifted_x2 > origin_shifted_y2*origin_shifted_y2)
xctx->manhattan_lines = 1;
else
xctx->manhattan_lines = 2;
return;
}

View File

@ -107,7 +107,6 @@ void redraw_w_a_l_r_p_z_rubbers(int force)
{
double mx = xctx->mousex_snap;
double my = xctx->mousey_snap;
double origin_shifted_x2, origin_shifted_y2;
if(!force && xctx->mousex_snap == xctx->prev_rubberx && xctx->mousey_snap == xctx->prev_rubbery) return;
@ -117,15 +116,7 @@ void redraw_w_a_l_r_p_z_rubbers(int force)
if(xctx->constr_mv == 2) mx = xctx->mx_double_save;
if(tclgetboolvar("orthogonal_wiring")) {
new_wire(RUBBER|CLEAR, xctx->mousex_snap, xctx->mousey_snap);
/* Origin shift the cartesian coordinate p2(x2,y2) w.r.t. p1(x1,y1) */
origin_shifted_x2 = xctx->nl_x2 - xctx->nl_x1;
origin_shifted_y2 = xctx->nl_y2 - xctx->nl_y1;
/* Draw whichever component of the resulting orthogonal-wire is bigger (either horizontal or vertical), first */
if(origin_shifted_x2*origin_shifted_x2 > origin_shifted_y2*origin_shifted_y2){
xctx->manhattan_lines = 1;
} else {
xctx->manhattan_lines = 2;
}
recompute_orthogonal_manhattanline(xctx->nl_x1, xctx->nl_y1, xctx->nl_x2, xctx->nl_y2);
}
new_wire(RUBBER, mx, my);
}

View File

@ -1378,16 +1378,8 @@ void drawtempline(GC gc, int what, double linex1,double liney1,double linex2,dou
void drawtemp_manhattanline(GC gc, int what, double x1, double y1, double x2, double y2, int force_manhattan)
{
double nl_xx1, nl_yy1, nl_xx2, nl_yy2;
double origin_shifted_x2, origin_shifted_y2;
if(tclgetboolvar("orthogonal_wiring") && force_manhattan) {
/* Origin shift the cartesian coordinate p2(x2,y2) w.r.t. p1(x1,y1) */
origin_shifted_x2 = x2 - x1;
origin_shifted_y2 = y2 - y1;
/* Draw whichever component of the resulting orthogonal-wire is bigger (either horizontal or vertical), first */
if(origin_shifted_x2*origin_shifted_x2 > origin_shifted_y2*origin_shifted_y2)
xctx->manhattan_lines = 1;
else
xctx->manhattan_lines = 2;
recompute_orthogonal_manhattanline(x1, y1, x2, y2);
}
if(xctx->manhattan_lines & 1) {
nl_xx1 = x1; nl_yy1 = y1;

View File

@ -1034,15 +1034,7 @@ static void place_moved_wire(int n, int orthogonal_wiring)
/* Need to dynamically assign `manhattan_lines` to each wire. Otherwise, a single
* `manhattan_lines` value gets forced on all wires connected to a moved object*/
if(orthogonal_wiring) {
double origin_shifted_x2, origin_shifted_y2;
/* Origin shift the cartesian coordinate p2(x2,y2) w.r.t. p1(x1,y1) */
origin_shifted_x2 = xctx->rx2 - xctx->rx1;
origin_shifted_y2 = xctx->ry2 - xctx->ry1;
/* Draw whichever component of the resulting orthogonal-wire is bigger (either horizontal or vertical), first */
if(origin_shifted_x2*origin_shifted_x2 > origin_shifted_y2*origin_shifted_y2)
xctx->manhattan_lines = 1;
else
xctx->manhattan_lines = 2;
recompute_orthogonal_manhattanline(xctx->rx1, xctx->ry1, xctx->rx2, xctx->ry2);
}
/* wire x1,y1 point was moved

View File

@ -1428,6 +1428,7 @@ extern void filledrect(int c, int what, double rectx1,double recty1,
extern void drawtempline(GC gc, int what, double x1,double y1,double x2,double y2);
extern void recompute_orthogonal_manhattanline(double linex1, double liney1, double linex2, double liney2);
extern void drawtemp_manhattanline(GC gc, int what, double x1,double y1,double x2,double y2, int force_manhattan);
/* instead of doing a drawtemprect(xctx->gctiled, NOW, ....) do 4