blockworx_canvas2d/
ground.rs1use blockworx_geom::Rect;
7use blockworx_paint::ground::{GridLine, horizontals, verticals};
8use blockworx_paint::{Ground, Vantage};
9use web_sys::CanvasRenderingContext2d;
10
11use crate::color::css_color;
12
13pub fn paint_ground(
15 ctx: &CanvasRenderingContext2d,
16 viewport: Rect,
17 vantage: Vantage,
18 ground: Ground,
19) {
20 ctx.set_fill_style_str(&css_color(ground.background));
21 ctx.fill_rect(
22 viewport.min.x.into(),
23 viewport.min.y.into(),
24 viewport.width().into(),
25 viewport.height().into(),
26 );
27 if ground.grid.a() == 0 {
28 return;
29 }
30 ctx.set_stroke_style_str(&css_color(ground.grid));
31 for weight in [GridLine::Major, GridLine::Minor] {
34 ctx.begin_path();
35 for x in at(verticals(vantage, viewport), weight) {
36 ctx.move_to(x.into(), viewport.min.y.into());
37 ctx.line_to(x.into(), viewport.max.y.into());
38 }
39 for y in at(horizontals(vantage, viewport), weight) {
40 ctx.move_to(viewport.min.x.into(), y.into());
41 ctx.line_to(viewport.max.x.into(), y.into());
42 }
43 ctx.set_line_width(weight.width().into());
44 ctx.stroke();
45 }
46}
47
48fn at(ruled: impl Iterator<Item = (f32, GridLine)>, weight: GridLine) -> impl Iterator<Item = f32> {
49 ruled
50 .filter(move |&(_, line)| line == weight)
51 .map(|(at, _)| at)
52}