use crate::{Renderer, Transformation}; use raw_window_handle::HasRawWindowHandle; pub struct Target { surface: wgpu::Surface, width: u16, height: u16, dpi: f32, transformation: Transformation, swap_chain: wgpu::SwapChain, } impl Target { pub fn dimensions(&self) -> (u16, u16) { (self.width, self.height) } pub fn dpi(&self) -> f32 { self.dpi } pub fn transformation(&self) -> Transformation { self.transformation } pub fn next_frame(&mut self) -> wgpu::SwapChainOutput { self.swap_chain.get_next_texture() } } impl iced_native::renderer::Target for Target { type Renderer = Renderer; fn new( window: &W, width: u16, height: u16, dpi: f32, renderer: &Renderer, ) -> Target { let surface = wgpu::Surface::create(window); let swap_chain = new_swap_chain(&surface, width, height, &renderer.device); Target { surface, width, height, dpi, transformation: Transformation::orthographic(width, height), swap_chain, } } fn resize( &mut self, width: u16, height: u16, dpi: f32, renderer: &Renderer, ) { self.width = width; self.height = height; self.dpi = dpi; self.transformation = Transformation::orthographic(width, height); self.swap_chain = new_swap_chain(&self.surface, width, height, &renderer.device); } } fn new_swap_chain( surface: &wgpu::Surface, width: u16, height: u16, device: &wgpu::Device, ) -> wgpu::SwapChain { device.create_swap_chain( &surface, &wgpu::SwapChainDescriptor { usage: wgpu::TextureUsage::OUTPUT_ATTACHMENT, format: wgpu::TextureFormat::Bgra8UnormSrgb, width: u32::from(width), height: u32::from(height), present_mode: wgpu::PresentMode::Vsync, }, ) }