use yog_gfx::{Rect, Vec2};
use super::super::assets::Resources;
use super::super::{gfx, raster};
use super::{Args, SCALE, SCREEN, Tab, VIEW, draw_background, draw_tree, draw_window};
const MAX_PIXELS: u64 = 1 << 22;
#[derive(Debug, Clone, yog_data::Schema)]
#[data(rename_all = "camelCase")]
pub struct Layer {
pub image: String,
pub window: String,
pub size: [f32; 2],
pub at: [f32; 2],
pub drag_min: [f32; 2],
pub drag_max: [f32; 2],
}
pub(super) fn render(args: &Args, tab: &Tab, drag: [f32; 2], res: &Resources) -> Option<Layer> {
let [[x0, x1], [y0, y1]] = tab.range;
let size = Vec2::new(x1 - x0 + VIEW.w, y1 - y0 + VIEW.h);
let (w, h) = (size.x as u32, size.y as u32);
if u64::from(w) * u64::from(h) > MAX_PIXELS {
return None;
}
let origin = Vec2::new(x1, y1);
let ops = gfx::record(w as i32, h as i32, |ctx| {
let d = &ctx.draw2d();
draw_background(d, args, Rect::new(0.0, 0.0, size.x, size.y), origin);
draw_tree(d, args, &tab.spots, origin);
});
let image = raster::rasterize(&ops, w, h, SCALE, res).png_url()?;
let ops = gfx::record(SCREEN.0 as i32, SCREEN.1 as i32, |ctx| {
draw_window(&ctx.draw2d(), args, tab);
});
let window = raster::rasterize(&ops, SCREEN.0 as u32, SCREEN.1 as u32, SCALE, res).png_url()?;
let scroll = |centre: f32, drag: f32| (centre + drag).floor();
Some(Layer {
image,
window,
size: [size.x, size.y],
at: [
scroll(tab.centre.x, drag[0]) - origin.x,
scroll(tab.centre.y, drag[1]) - origin.y,
],
drag_min: [x0 - tab.centre.x, y0 - tab.centre.y],
drag_max: [x1 - tab.centre.x, y1 - tab.centre.y],
})
}