use std::sync::mpsc::Sender;
use crate::event::{Action, Key, MouseButton, WindowEvent};
use crate::window::WgpuCanvas;
use image::{GenericImage, Pixel};
use winit::window::WindowAttributes;
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum NumSamples {
Zero = 0,
One = 1,
Two = 2,
Four = 4,
Eight = 8,
Sixteen = 16,
}
impl NumSamples {
pub fn from_u32(i: u32) -> Option<NumSamples> {
match i {
0 => Some(NumSamples::Zero),
1 => Some(NumSamples::One),
2 => Some(NumSamples::Two),
4 => Some(NumSamples::Four),
8 => Some(NumSamples::Eight),
16 => Some(NumSamples::Sixteen),
_ => None,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct CanvasSetup {
pub vsync: bool,
pub samples: NumSamples,
pub canvas_id: String,
}
impl Default for CanvasSetup {
fn default() -> Self {
CanvasSetup {
vsync: true,
samples: NumSamples::Zero,
canvas_id: "canvas".to_string(),
}
}
}
pub struct Canvas {
canvas: WgpuCanvas,
}
impl Canvas {
pub async fn open(
window_attrs: WindowAttributes,
canvas_setup: Option<CanvasSetup>,
out_events: Sender<WindowEvent>,
) -> Self {
Canvas {
canvas: WgpuCanvas::open(window_attrs, canvas_setup, out_events).await,
}
}
pub fn poll_events(&mut self) {
self.canvas.poll_events()
}
pub fn get_current_texture(&self) -> Option<wgpu::SurfaceTexture> {
self.canvas.get_current_texture()
}
pub fn present(&self, frame: wgpu::SurfaceTexture) {
self.canvas.present(frame)
}
pub fn depth_view(&self) -> &wgpu::TextureView {
self.canvas.depth_view()
}
pub fn msaa_view(&self) -> Option<&wgpu::TextureView> {
self.canvas.msaa_view()
}
pub fn sample_count(&self) -> u32 {
self.canvas.sample_count()
}
pub fn surface_format(&self) -> wgpu::TextureFormat {
self.canvas.surface_format()
}
pub fn size(&self) -> (u32, u32) {
self.canvas.size()
}
pub fn cursor_pos(&self) -> Option<(f64, f64)> {
self.canvas.cursor_pos()
}
pub fn scale_factor(&self) -> f64 {
self.canvas.scale_factor()
}
pub fn set_title(&mut self, title: &str) {
self.canvas.set_title(title)
}
pub fn set_icon(&mut self, icon: impl GenericImage<Pixel = impl Pixel<Subpixel = u8>>) {
self.canvas.set_icon(icon)
}
pub fn set_cursor_grab(&self, grab: bool) {
self.canvas.set_cursor_grab(grab);
}
pub fn set_cursor_position(&self, x: f64, y: f64) {
self.canvas.set_cursor_position(x, y);
}
pub fn hide_cursor(&self, hide: bool) {
self.canvas.hide_cursor(hide);
}
pub fn hide(&mut self) {
self.canvas.hide()
}
pub fn show(&mut self) {
self.canvas.show()
}
pub fn get_mouse_button(&self, button: MouseButton) -> Action {
self.canvas.get_mouse_button(button)
}
pub fn get_key(&self, key: Key) -> Action {
self.canvas.get_key(key)
}
pub fn copy_frame_to_readback(&self, frame: &wgpu::SurfaceTexture) {
self.canvas.copy_frame_to_readback(frame)
}
pub fn read_pixels(&self, out: &mut Vec<u8>, x: usize, y: usize, width: usize, height: usize) {
self.canvas.read_pixels(out, x, y, width, height)
}
}