guts of l_selection_gradient */
| 567 | |
| 568 | /* guts of l_selection_gradient */ |
| 569 | void |
| 570 | selection_do_gradient( |
| 571 | struct selectionvar *ov, |
| 572 | long x, long y, |
| 573 | long x2,long y2, |
| 574 | long gtyp, |
| 575 | long mind, long maxd) |
| 576 | { |
| 577 | long dx, dy, dofs; |
| 578 | |
| 579 | if (mind > maxd) { |
| 580 | long tmp = mind; |
| 581 | mind = maxd; |
| 582 | maxd = tmp; |
| 583 | } |
| 584 | |
| 585 | dofs = maxd * maxd - mind * mind; |
| 586 | if (dofs < 1) |
| 587 | dofs = 1; |
| 588 | |
| 589 | switch (gtyp) { |
| 590 | default: |
| 591 | impossible("Unrecognized gradient type! Defaulting to radial..."); |
| 592 | FALLTHROUGH; |
| 593 | /* FALLTHRU */ |
| 594 | case SEL_GRADIENT_RADIAL: { |
| 595 | for (dx = 0; dx < COLNO; dx++) |
| 596 | for (dy = 0; dy < ROWNO; dy++) { |
| 597 | long d0 = line_dist_coord(x, y, x2, y2, dx, dy); |
| 598 | |
| 599 | if (d0 <= mind * mind |
| 600 | || (d0 <= maxd * maxd && d0 - mind * mind < rn2(dofs))) |
| 601 | selection_setpoint(dx, dy, ov, 1); |
| 602 | } |
| 603 | break; |
| 604 | } |
| 605 | case SEL_GRADIENT_SQUARE: { |
| 606 | for (dx = 0; dx < COLNO; dx++) |
| 607 | for (dy = 0; dy < ROWNO; dy++) { |
| 608 | long d1 = line_dist_coord(x, y, x2, y2, x, dy); |
| 609 | long d2 = line_dist_coord(x, y, x2, y2, dx, y); |
| 610 | long d3 = line_dist_coord(x, y, x2, y2, x2, dy); |
| 611 | long d4 = line_dist_coord(x, y, x2, y2, dx, y2); |
| 612 | long d5 = line_dist_coord(x, y, x2, y2, dx, dy); |
| 613 | long d0 = min(d5, min(max(d1, d2), max(d3, d4))); |
| 614 | |
| 615 | if (d0 <= mind * mind |
| 616 | || (d0 <= maxd * maxd && d0 - mind * mind < rn2(dofs))) |
| 617 | selection_setpoint(dx, dy, ov, 1); |
| 618 | } |
| 619 | break; |
| 620 | } /*case*/ |
| 621 | } /*switch*/ |
| 622 | } |
| 623 | |
| 624 | /* bresenham line algo */ |
| 625 | void |
no test coverage detected