MCPcopy Create free account
hub / github.com/NetHack/NetHack / selection_do_gradient

Function selection_do_gradient

src/selvar.c:569–622  ·  view source on GitHub ↗

guts of l_selection_gradient */

Source from the content-addressed store, hash-verified

567
568/* guts of l_selection_gradient */
569void
570selection_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 */
625void

Callers 1

l_selection_gradientFunction · 0.85

Calls 4

line_dist_coordFunction · 0.85
rn2Function · 0.85
selection_setpointFunction · 0.85
impossibleFunction · 0.70

Tested by

no test coverage detected