1use pixels::{Error, Pixels, SurfaceTexture};
2use winit::dpi::LogicalSize;
3use winit::event::{Event, VirtualKeyCode};
4use winit::event_loop::{ControlFlow, EventLoop};
5use winit::window::WindowBuilder;
6use winit::platform::run_return::EventLoopExtRunReturn;
7use winit_input_helper::WinitInputHelper;
8
9pub struct Screen {
10 pixels: Pixels,
11 event_loop: EventLoop<()>,
12 w: usize,
13 h: usize,
14}
15
16impl Screen {
17 pub fn new<F>(w: usize, h: usize, mut draw: F)
18 where
19 F: 'static + FnMut(&mut [u8])
20 {
21 let event_loop = EventLoop::new();
22 let mut input = WinitInputHelper::new();
23 let window = {
24 let size = LogicalSize::new(w as f64, h as f64);
25 WindowBuilder::new()
26 .with_title("Hello Pixels")
27 .with_inner_size(size)
28 .with_min_inner_size(size)
29 .with_resizable(false)
30 .build(&event_loop)
31 .unwrap()
32 };
33
34 let mut pixels = {
35 let window_size = window.inner_size();
36 let surface_texture = SurfaceTexture::new(window_size.width, window_size.height, &window);
37 Pixels::new(w as u32, h as u32, surface_texture).unwrap()
38 };
39
40 event_loop.run(move |event, _, control_flow| {
41 if let Event::RedrawRequested(_) = event {
43 draw(pixels.get_frame());
44 if pixels
45 .render()
46 .map_err(|e| eprintln!("pixels.render() failed: {:?}", e))
47 .is_err()
48 {
49 *control_flow = ControlFlow::Exit;
50 return;
51 }
52 }
53
54 if input.update(&event) {
56 if input.key_pressed(VirtualKeyCode::Escape) || input.quit() {
58 *control_flow = ControlFlow::Exit;
59 return;
60 }
61
62 if let Some(size) = input.window_resized() {
64 pixels.resize_surface(size.width, size.height);
65 }
66
67 window.request_redraw();
68 }
69 });
70 }
71
72}