use raqote::DrawOptions;
use raqote::DrawTarget;
use raqote::PathBuilder;
use raqote::StrokeStyle;
use show_image::event::ModifiersState;
use show_image::event::VirtualKeyCode;
use show_image::event::WindowEvent;
use show_image::Image;
#[show_image::main]
fn main() -> Result<(), String> {
env_logger::init();
let args: Vec<_> = std::env::args().collect();
if args.len() != 1 {
return Err(format!("usage: {}", args[0]));
}
let mut image = DrawTarget::new(1000, 1000);
let mut overlay = DrawTarget::new(500, 1000);
image.set_transform(&raqote::Transform::scale(1000.0, 1000.0));
overlay.set_transform(&raqote::Transform::scale(1000.0, 1000.0));
let black = raqote::Color::new(255, 0, 0, 0).into();
let white = raqote::Color::new(255, 255, 255, 255).into();
let red = raqote::Color::new(255, 190, 0, 0).into();
let yellow = raqote::Color::new(255, 255, 215, 85).into();
let blue = raqote::Color::new(255, 0, 50, 160).into();
let draw_options = DrawOptions::new();
image.fill_rect(0.0, 0.0, 1.0, 1.0, &white, &draw_options);
image.fill_rect(0.00, 0.00, 0.25, 0.30, &red, &draw_options);
image.fill_rect(0.00, 0.70, 0.25, 0.30, &blue, &draw_options);
image.fill_rect(0.85, 0.70, 0.15, 0.30, &yellow, &draw_options);
let mut path = PathBuilder::new();
path.move_to(0.25, 0.00);
path.line_to(0.25, 1.00);
image.stroke(
&path.finish(),
&black,
&StrokeStyle {
width: 0.03,
..Default::default()
},
&draw_options,
);
let mut path = PathBuilder::new();
path.move_to(0.00, 0.30);
path.line_to(0.25, 0.30);
image.stroke(
&path.finish(),
&black,
&StrokeStyle {
width: 0.04,
..Default::default()
},
&draw_options,
);
let mut path = PathBuilder::new();
path.move_to(0.00, 0.70);
path.line_to(1.00, 0.70);
image.stroke(
&path.finish(),
&black,
&StrokeStyle {
width: 0.03,
..Default::default()
},
&draw_options,
);
let mut path = PathBuilder::new();
path.move_to(0.85, 0.70);
path.line_to(0.85, 1.00);
image.stroke(
&path.finish(),
&black,
&StrokeStyle {
width: 0.03,
..Default::default()
},
&draw_options,
);
let mut path = PathBuilder::new();
path.move_to(0.85, 0.70);
path.line_to(0.85, 1.00);
image.stroke(
&path.finish(),
&black,
&StrokeStyle {
width: 0.03,
..Default::default()
},
&draw_options,
);
let mut path = PathBuilder::new();
path.move_to(0.00, 0.00);
path.line_to(1.00, 1.00);
overlay.stroke(
&path.finish(),
&yellow,
&StrokeStyle {
width: 0.03,
..Default::default()
},
&draw_options,
);
let image: Image = image.into();
let image_view = image.as_image_view().map_err(|x| x.to_string())?;
println!("{:#?}", image_view.info());
let overlay: show_image::Image = overlay.into();
let window = show_image::context().run_function_wait(move |context| -> Result<_, String> {
let mut window = context.create_window("image", Default::default()).map_err(|e| e.to_string())?;
window.set_image("mondriaan", &image.as_image_view().map_err(|e| e.to_string())?);
window.set_overlay("overlay", &overlay.as_image_view().map_err(|e| e.to_string())?, false);
Ok(window.proxy())
})?;
for event in window.event_channel().map_err(|e| e.to_string())? {
if let WindowEvent::KeyboardInput(event) = event {
if event.is_synthetic || !event.input.state.is_pressed() {
continue;
}
if event.input.key_code == Some(VirtualKeyCode::Escape) {
println!("Escape pressed!");
break;
} else if event.input.key_code == Some(VirtualKeyCode::O) && event.input.modifiers == ModifiersState::CTRL {
println!("Ctrl+O pressed, toggling overlay");
window.run_function_wait(|mut window| {
window.toggle_overlay_visible("overlay").unwrap();
}).map_err(|e| e.to_string())?;
}
}
}
Ok(())
}