framebuffer_free_lifetime/
framebuffer_free_lifetime.rs1#![no_main]
9#![no_std]
10
11use core::time::Duration;
12use embedded_graphics::{pixelcolor::Rgb888, prelude::*, primitives::Rectangle};
13use embedded_graphics_gop::fb::FbDrawTarget;
14use uefi::{helpers, prelude::*, proto::console::gop::GraphicsOutput, runtime::ResetType};
15
16#[entry]
17fn main() -> Status {
18 helpers::init().unwrap();
19
20 let handle =
21 boot::get_handle_for_protocol::<GraphicsOutput>().expect("Unable to get GOP handle");
22 let mut gop =
23 boot::open_protocol_exclusive::<GraphicsOutput>(handle).expect("Unable to open GOP handle");
24
25 let mode_800x600 = gop
26 .modes()
27 .find(|m| m.info().resolution() == (800, 600))
29 .expect("Unable to find 800x600 video mode");
30 gop.set_mode(&mode_800x600)
31 .expect("Couldn't switch to 800x600 video mode");
32
33 let mut target = unsafe { FbDrawTarget::new_free_lifetime(&mut gop) };
38 drop(gop);
39 target
44 .fill_solid(
45 &Rectangle::new(Point::zero(), Size::new(266, 600)),
46 Rgb888::RED,
47 )
48 .expect("infallible");
49 target
50 .fill_solid(
51 &Rectangle::new(Point::new(266, 0), Size::new(267, 600)),
52 Rgb888::GREEN,
53 )
54 .expect("infallible");
55 target
56 .fill_solid(
57 &Rectangle::new(Point::new(533, 0), Size::new(267, 600)),
58 Rgb888::BLUE,
59 )
60 .expect("infallible");
61
62 boot::stall(Duration::from_secs(10));
63 runtime::reset(ResetType::SHUTDOWN, Status::SUCCESS, None);
64}