(
frame: &mut Frame,
p0: iced::Point,
p1: iced::Point,
line_type: LineType,
width: f32,
color: Color,
phase_start: f32,
)
| 461 | } |
| 462 | |
| 463 | fn draw_styled_line_segment( |
| 464 | frame: &mut Frame, |
| 465 | p0: iced::Point, |
| 466 | p1: iced::Point, |
| 467 | line_type: LineType, |
| 468 | width: f32, |
| 469 | color: Color, |
| 470 | phase_start: f32, |
| 471 | ) { |
| 472 | let delta = iced::Vector::new(p1.x - p0.x, p1.y - p0.y); |
| 473 | let length = (delta.x * delta.x + delta.y * delta.y).sqrt(); |
| 474 | if length <= f32::EPSILON { |
| 475 | return; |
| 476 | } |
| 477 | |
| 478 | let direction = iced::Vector::new(delta.x / length, delta.y / length); |
| 479 | |
| 480 | match line_type { |
| 481 | LineType::Solid => stroke_segment(frame, p0, p1, width, color), |
| 482 | LineType::Dashed { length: dash } => { |
| 483 | let dash = dash.max(1.0); |
| 484 | let gap = (dash * 0.5).max(1.0); |
| 485 | let pattern = dash + gap; |
| 486 | let mut pattern_start = -(phase_start.rem_euclid(pattern)); |
| 487 | while pattern_start < length { |
| 488 | let seg_start = pattern_start.max(0.0); |
| 489 | let seg_end = (pattern_start + dash).min(length); |
| 490 | if seg_end > seg_start { |
| 491 | let start = iced::Point::new( |
| 492 | p0.x + direction.x * seg_start, |
| 493 | p0.y + direction.y * seg_start, |
| 494 | ); |
| 495 | let end = iced::Point::new( |
| 496 | p0.x + direction.x * seg_end, |
| 497 | p0.y + direction.y * seg_end, |
| 498 | ); |
| 499 | stroke_segment(frame, start, end, width, color); |
| 500 | } |
| 501 | pattern_start += pattern; |
| 502 | } |
| 503 | } |
| 504 | LineType::Dotted { spacing } => { |
| 505 | let spacing = spacing.max(1.0); |
| 506 | let step = spacing * 2.0; |
| 507 | let radius = width.max(1.5) * 0.5; |
| 508 | let remainder = phase_start.rem_euclid(step); |
| 509 | let mut offset = if remainder <= f32::EPSILON { |
| 510 | 0.0 |
| 511 | } else { |
| 512 | step - remainder |
| 513 | }; |
| 514 | while offset <= length { |
| 515 | let center = |
| 516 | iced::Point::new(p0.x + direction.x * offset, p0.y + direction.y * offset); |
| 517 | let dot = canvas::Path::circle(center, radius); |
| 518 | frame.fill(&dot, color); |
| 519 | offset += step; |
| 520 | } |
no test coverage detected