diff --git a/Cargo.toml b/Cargo.toml index 229e16c..57892c2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,4 +17,5 @@ x11-dl = "2.19.1" winapi = "0.3.9" [dev-dependencies] -winit = "0.26.1" \ No newline at end of file +winit = "0.26.1" +image = "0.23.14" \ No newline at end of file diff --git a/examples/fruit.jpg b/examples/fruit.jpg new file mode 100644 index 0000000..4ed2c4e Binary files /dev/null and b/examples/fruit.jpg differ diff --git a/examples/fruit.jpg.license b/examples/fruit.jpg.license new file mode 100644 index 0000000..a9ffa46 --- /dev/null +++ b/examples/fruit.jpg.license @@ -0,0 +1,5 @@ +fruit.jpg is licensed under the Creative Commons Attribution 3.0 Unported license and was put on Wikimedia by user Atomcibre + +Source: https://commons.wikimedia.org/wiki/File:Culinary_fruits_front_view.jpg + +License: https://creativecommons.org/licenses/by/3.0/deed.en \ No newline at end of file diff --git a/examples/fruit.rs b/examples/fruit.rs new file mode 100644 index 0000000..7375780 --- /dev/null +++ b/examples/fruit.rs @@ -0,0 +1,38 @@ +use image::GenericImageView; +use softbuffer::GraphicsContext; +use winit::event::{Event, WindowEvent}; +use winit::event_loop::{ControlFlow, EventLoop}; +use winit::window::WindowBuilder; + +fn main() { + //see fruit.jpg.license for the license of fruit.jpg + let fruit = image::load_from_memory(include_bytes!("fruit.jpg")).unwrap(); + let buffer = fruit.pixels().map(|(_x, _y, pixel)|{ + let red = pixel.0[0] as u32; + let green = pixel.0[1] as u32; + let blue = pixel.0[2] as u32; + + blue | (green << 8) | (red << 16) + }).collect::>(); + + let event_loop = EventLoop::new(); + let window = WindowBuilder::new().build(&event_loop).unwrap(); + let mut graphics_context = unsafe { GraphicsContext::new(window) }.unwrap(); + + event_loop.run(move |event, _, control_flow| { + *control_flow = ControlFlow::Wait; + + match event { + Event::RedrawRequested(window_id) if window_id == graphics_context.window().id() => { + graphics_context.set_buffer(&buffer, fruit.width() as u16, fruit.height() as u16); + } + Event::WindowEvent { + event: WindowEvent::CloseRequested, + window_id, + } if window_id == graphics_context.window().id() => { + *control_flow = ControlFlow::Exit; + } + _ => {} + } + }); +}