1 extern crate sdl2;
2 
3 use sdl2::pixels::PixelFormatEnum;
4 use sdl2::rect::Rect;
5 use sdl2::event::Event;
6 use sdl2::keyboard::Keycode;
7 
main() -> Result<(), String>8 pub fn main() -> Result<(), String> {
9     let sdl_context = sdl2::init()?;
10     let video_subsystem = sdl_context.video()?;
11 
12     let window = video_subsystem.window("rust-sdl2 demo: Video", 800, 600)
13         .position_centered()
14         .opengl()
15         .build()
16         .map_err(|e| e.to_string())?;
17 
18     let mut canvas = window.into_canvas().build().map_err(|e| e.to_string())?;
19     let texture_creator = canvas.texture_creator();
20 
21     let mut texture = texture_creator.create_texture_streaming(PixelFormatEnum::RGB24, 256, 256)
22         .map_err(|e| e.to_string())?;
23     // Create a red-green gradient
24     texture.with_lock(None, |buffer: &mut [u8], pitch: usize| {
25         for y in 0..256 {
26             for x in 0..256 {
27                 let offset = y*pitch + x*3;
28                 buffer[offset] = x as u8;
29                 buffer[offset + 1] = y as u8;
30                 buffer[offset + 2] = 0;
31             }
32         }
33     })?;
34 
35     canvas.clear();
36     canvas.copy(&texture, None, Some(Rect::new(100, 100, 256, 256)))?;
37     canvas.copy_ex(&texture, None,
38         Some(Rect::new(450, 100, 256, 256)), 30.0, None, false, false)?;
39     canvas.present();
40 
41     let mut event_pump = sdl_context.event_pump()?;
42 
43     'running: loop {
44         for event in event_pump.poll_iter() {
45             match event {
46                 Event::Quit {..}
47                 | Event::KeyDown { keycode: Some(Keycode::Escape), .. } => {
48                     break 'running
49                 },
50                 _ => {}
51             }
52         }
53         // The rest of the game loop goes here...
54     }
55 
56     Ok(())
57 }
58