1use glfw::*;
2use glow::HasContext as _;
3use impellers::*;
4
5pub fn main() {
6 let mut gtx = init(fail_on_errors).unwrap();
7 gtx.window_hint(WindowHint::OpenGlProfile(OpenGlProfileHint::Core));
8 gtx.window_hint(WindowHint::ContextVersionMajor(4));
9 gtx.window_hint(WindowHint::SRgbCapable(true));
10 gtx.window_hint(WindowHint::ScaleToMonitor(true));
11 let (mut window, ev_receiver) = gtx
12 .create_window(800, 600, "rust-glfw-impeller demo", WindowMode::Windowed)
13 .expect("failed to create window");
14 window.set_all_polling(true);
15 window.make_current();
16
17 let mut itx = unsafe {
19 impellers::Context::new_opengl_es(|s| {
20 window
21 .get_proc_address(s)
22 .map(|f| f as _)
23 .unwrap_or(std::ptr::null_mut())
24 })
25 }
26 .unwrap();
27 let glow_ctx: glow::Context = unsafe {
28 glow::Context::from_loader_function(|s| {
29 window
30 .get_proc_address(s)
31 .map(|f| f as _)
32 .unwrap_or(std::ptr::null_mut())
33 })
34 };
35 while !window.should_close() {
37 gtx.poll_events();
39 for (_, event) in flush_messages(&ev_receiver) {
40 match event {
41 WindowEvent::Close => {
42 window.set_should_close(true);
43 }
44 WindowEvent::FramebufferSize(_, _) => {
45 }
47 _ => {}
48 }
49 }
50
51 let (width, height) = window.get_framebuffer_size();
52 let mut surface = unsafe {
53 itx.wrap_fbo(
54 0,
55 PixelFormat::RGBA8888,
56 ISize::new(width.into(), height.into()),
57 )
58 }
59 .expect("failed to wrap window's framebuffer");
60 let clear_display_list = {
62 let mut builder = DisplayListBuilder::new(None);
64 let mut paint = Paint::default();
66 paint.set_color(Color::BLACKBERRY);
68 builder.draw_paint(&paint);
70 let current_time = gtx.get_time(); paint.set_color(Color::new_srgb(
74 current_time.sin().abs() as _,
75 current_time.cos().abs() as _,
76 current_time.tan().abs() as _,
77 ));
78 builder.draw_rect(&Rect::from_size(Size::new(200.0, 200.0)), &paint);
79 builder.build().expect("failed to build a display_list")
81 };
82 let animating_dl = {
83 let mut builder = DisplayListBuilder::new(None);
85 let mut paint = Paint::default();
87 let current_time = gtx.get_time(); paint.set_color(Color::new_srgb(
91 current_time.sin().abs() as _,
92 current_time.cos().abs() as _,
93 current_time.tan().abs() as _,
94 ));
95 builder.draw_rect(&Rect::from_size(Size::new(200.0, 200.0)), &paint);
96 builder.build().expect("failed to build a display_list")
98 };
99 let oval_dl = {
100 let mut builder = DisplayListBuilder::new(None);
102 let mut paint = Paint::default();
104 paint.set_color(Color::GRANNY_APPLE);
106 builder.draw_oval(&Rect::from_size(Size::new(200.0, 200.0)), &paint);
107 builder.build().expect("failed to build a display_list")
109 };
110 let main_display_list = {
111 let mut builder = DisplayListBuilder::new(None);
112 builder.draw_display_list(&clear_display_list, 1.0);
113 builder.draw_display_list(&animating_dl, 1.0);
114 builder.draw_display_list(&oval_dl, 1.0);
115 builder.build().expect("failed to build a display_list")
117 };
118 unsafe {
121 glow_ctx.clear_color(1.0, 0.0, 0.0, 1.0);
122 glow_ctx.clear(glow::COLOR_BUFFER_BIT);
123 }
124 surface
125 .draw_display_list(&main_display_list)
126 .expect("failed to draw on surface");
127 window.swap_buffers();
129 }
130
131 }