blockworx_export/
level.rs1use blockworx_editor::{
6 gesture::Gesture,
7 path::BlockPath,
8 presentation::Presentation,
9 widget::{display::render, drawing::Drawing},
10};
11use blockworx_geom::Rect;
12use blockworx_paint::TextLayout;
13use blockworx_paint::theme::{Style, Theme};
14
15use crate::svg::SvgRenderer;
16
17pub struct RenderedLevel {
23 pub svg: String,
24 pub frame: Rect,
25 pub blocks: Vec<(blockworx_doc::id::BlockId, Rect)>,
26}
27
28pub fn render_svg(
32 theme: &Theme,
33 layout: &dyn TextLayout,
34 indexed: blockworx_doc::document::IndexedDocument<'_>,
35 path: &BlockPath,
36 presentation: &mut Presentation,
37) -> String {
38 render_level(theme, layout, indexed, path, presentation).svg
39}
40
41pub fn render_level(
44 theme: &Theme,
45 layout: &dyn TextLayout,
46 indexed: blockworx_doc::document::IndexedDocument<'_>,
47 path: &BlockPath,
48 presentation: &mut Presentation,
49) -> RenderedLevel {
50 let mut gesture = Gesture::idle();
52 let mut drawing = Drawing::new(indexed, path, presentation, &mut gesture);
53 let mut svg = SvgRenderer::new(theme.palette().clone(), layout);
54 {
55 let mut style = Style::new(theme, &mut svg);
56 drawing.refresh_text_extents(&style);
59 render(&drawing, &mut style);
60 }
61 let blocks = drawing
62 .blocks_layer()
63 .filter_map(|(id, shape)| Some((id.block()?, shape.gui_rect())))
64 .collect();
65 let (svg, frame) = svg.finish();
66 RenderedLevel { svg, frame, blocks }
67}