iced-yoda/glow/src/window/compositor.rs

65 lines
1.7 KiB
Rust
Raw Normal View History

2020-05-21 00:37:47 +02:00
use crate::{Backend, Renderer, Settings, Viewport};
2020-05-21 00:37:47 +02:00
use core::ffi::c_void;
use glow::HasContext;
2020-05-21 00:37:47 +02:00
use iced_graphics::Size;
use iced_native::mouse;
/// A window graphics backend for iced powered by `glow`.
#[allow(missing_debug_implementations)]
pub struct Compositor {
2020-05-21 00:37:47 +02:00
gl: glow::Context,
}
2020-05-21 00:37:47 +02:00
impl iced_graphics::window::GLCompositor for Compositor {
type Settings = Settings;
type Renderer = Renderer;
2020-05-21 00:37:47 +02:00
unsafe fn new(
settings: Self::Settings,
loader_function: impl FnMut(&str) -> *const c_void,
) -> (Self, Self::Renderer) {
let gl = glow::Context::from_loader_function(loader_function);
2020-05-21 00:37:47 +02:00
gl.clear_color(1.0, 1.0, 1.0, 1.0);
2020-05-21 00:37:47 +02:00
// Enable auto-conversion from/to sRGB
gl.enable(glow::FRAMEBUFFER_SRGB);
2020-05-21 00:37:47 +02:00
// Enable alpha blending
gl.enable(glow::BLEND);
gl.blend_func(glow::SRC_ALPHA, glow::ONE_MINUS_SRC_ALPHA);
2020-05-21 00:37:47 +02:00
let renderer = Renderer::new(Backend::new(&gl, settings));
2020-05-21 00:37:47 +02:00
(Self { gl }, renderer)
}
2020-05-21 00:37:47 +02:00
fn resize_viewport(&mut self, physical_size: Size<u32>) {
unsafe {
2020-05-21 00:37:47 +02:00
self.gl.viewport(
0,
0,
physical_size.width as i32,
physical_size.height as i32,
);
}
}
fn draw<T: AsRef<str>>(
&mut self,
renderer: &mut Self::Renderer,
2020-05-20 20:28:35 +02:00
viewport: &Viewport,
output: &<Self::Renderer as iced_native::Renderer>::Output,
overlay: &[T],
) -> mouse::Interaction {
2020-05-21 00:37:47 +02:00
let gl = &self.gl;
unsafe {
gl.clear(glow::COLOR_BUFFER_BIT);
}
2020-05-21 00:37:47 +02:00
renderer.backend_mut().draw(gl, viewport, output, overlay)
}
}