use hephaestus::backend::vello::VelloRenderer;
use hephaestus::color::{rgb, rgb8, Color};
use hephaestus::composition::{Composition, Patch, Span};
use hephaestus::geometry::Size;
use hephaestus::plot::chrome::axis::{Axis, AxisPlacement};
use hephaestus::plot::theme::{
AxisTheme, Element, HAlign, Rotation, TextElement, Theme, TitleLocation, VAlign,
};
use hephaestus::plot::{scale, Plot, PlotComposition, PointGeom};
use hephaestus::scales::chrome::AxisSide;
use hephaestus::scene::SceneBuilder;
use hephaestus::Renderer;
fn main() {
let (w, h) = (900u32, 600u32);
let dpi = 96.0;
let comp = || Composition::empty(1, 1).place(1, 1, Span::cell(), Patch::new("p"));
let xs: Vec<f64> = (0..40).map(|i| i as f64 * 0.15).collect();
let ys: Vec<f64> = xs.iter().map(|x| (x * 0.7).sin() * 0.4 + 0.5).collect();
let mut plot = Plot::new(&comp(), "p")
.bind("x", "x_scale")
.bind("y", "y_scale")
.title("Inside axis titles");
plot.add_geom(
PointGeom::builder()
.set("x", xs)
.set("y", ys)
.set("size", 6.0_f64)
.set("fill", rgb(0.20, 0.45, 0.85))
.build(),
);
plot.add_axis(
Axis::rail("x_scale", AxisPlacement::Cartesian(AxisSide::Bottom)).title("Time (s)"),
);
plot.add_axis(
Axis::rail("y_scale", AxisPlacement::Cartesian(AxisSide::Left)).title("Amplitude"),
);
let mut theme = Theme::default();
theme.axis.by_channel_side[0][0] = AxisTheme {
title_location: Some(TitleLocation::Inside),
title: Element::Set(TextElement {
angle: Some(Rotation::Degrees(0.0)),
align: Some(HAlign::End),
valign: Some(VAlign::Bottom),
..TextElement::default()
}),
..AxisTheme::default()
};
theme.axis.by_channel_side[1][0] = AxisTheme {
title_location: Some(TitleLocation::Inside),
title: Element::Set(TextElement {
angle: Some(Rotation::Degrees(0.0)),
align: Some(HAlign::Start),
valign: Some(VAlign::Top),
..TextElement::default()
}),
..AxisTheme::default()
};
let mut view = PlotComposition::new(&comp())
.add_scale("x_scale", scale::continuous(0.0..=6.0))
.add_scale("y_scale", scale::continuous(0.0..=1.0))
.theme(theme);
view.attach_plot(plot);
let mut renderer = VelloRenderer::new().expect("vello renderer init");
let bg: Color = rgb8(248, 248, 248);
{
let scene = renderer.scene();
scene.clear();
view.render(scene, Size::new(w as f64, h as f64), dpi);
}
let mut pixels = vec![0u8; (w * h * 4) as usize];
renderer
.render_to_buffer(w, h, bg, &mut pixels)
.expect("render");
let path = std::env::current_dir()
.unwrap()
.join("examples/theme_axis_title_inside.png");
hephaestus::png::write_png(&path, w, h, &pixels).expect("write png");
println!("wrote {}", path.display());
}