feat(player): update SDL2 renderer

This commit is contained in:
2026-03-19 01:25:50 +08:00
parent 105a6ce834
commit 487ada4c10

View File

@@ -3,58 +3,42 @@
use anyhow::Result; use anyhow::Result;
use sdl2::pixels::PixelFormatEnum; use sdl2::pixels::PixelFormatEnum;
use sdl2::rect::Rect; use sdl2::rect::Rect;
use std::sync::{Arc, Mutex};
pub struct Renderer { pub struct Renderer {
sdl: sdl2::Sdl, sdl: sdl2::Sdl,
video_subsystem: sdl2::VideoSubsystem,
window: sdl2::video::Window,
canvas: sdl2::render::Canvas<sdl2::video::Window>, canvas: sdl2::render::Canvas<sdl2::video::Window>,
texture_creator: sdl2::render::TextureCreator<sdl2::video::WindowContext>,
texture: Option<sdl2::render::Texture>,
width: u32, width: u32,
height: u32, height: u32,
} }
impl Renderer { impl Renderer {
pub fn new(title: &str, width: u32, height: u32) -> Result<Self> { pub fn new(title: &str, width: u32, height: u32) -> Result<Self> {
let sdl = sdl2::init()?; let sdl = sdl2::init().map_err(|e| anyhow::anyhow!("SDL init failed: {}", e))?;
let video_subsystem = sdl.video()?; let video_subsystem = sdl
.video()
.map_err(|e| anyhow::anyhow!("Video subsystem failed: {}", e))?;
let window = video_subsystem let window = video_subsystem
.window(title, width, height) .window(title, width, height)
.position_centered() .position_centered()
.build()?; .build()
.map_err(|e| anyhow::anyhow!("Window creation failed: {}", e))?;
let canvas = window.into_canvas().build()?; let canvas = window
let texture_creator = canvas.texture_creator(); .into_canvas()
.build()
.map_err(|e| anyhow::anyhow!("Canvas creation failed: {}", e))?;
Ok(Self { Ok(Self {
sdl, sdl,
video_subsystem,
window,
canvas, canvas,
texture_creator,
texture: None,
width, width,
height, height,
}) })
} }
pub fn create_texture(&mut self, width: u32, height: u32) -> Result<()> { pub fn update_frame(&mut self, texture: &sdl2::render::Texture) -> Result<()> {
self.texture = Some( let _ = self.canvas.copy(texture, None, None);
self.texture_creator
.create_texture_streaming(PixelFormatEnum::RGB24, width, height)?
);
self.width = width;
self.height = height;
Ok(())
}
pub fn update_texture(&mut self, data: &[u8]) -> Result<()> {
if let Some(ref mut texture) = self.texture {
texture.update(None, data, self.width as usize * 3)?;
}
Ok(()) Ok(())
} }
@@ -63,53 +47,43 @@ impl Renderer {
self.canvas.clear(); self.canvas.clear();
} }
pub fn draw_bbox(&mut self, x: i32, y: i32, w: u32, h: u32, label: &str) { pub fn draw_bbox(&mut self, x: i32, y: i32, w: u32, h: u32, _label: &str) {
// Draw rectangle border self.canvas
self.canvas.set_draw_color(sdl2::pixels::Color::RGB(0, 255, 0)); .set_draw_color(sdl2::pixels::Color::RGB(0, 255, 0));
let _ = self.canvas.draw_rect(Rect::new(x, y, w, h)); let _ = self.canvas.draw_rect(Rect::new(x, y, w, h));
// Draw label background
let label_rect = Rect::new(x, y - 20, 100, 20); let label_rect = Rect::new(x, y - 20, 100, 20);
self.canvas.set_draw_color(sdl2::pixels::Color::RGBA(0, 0, 0, 180)); self.canvas
.set_draw_color(sdl2::pixels::Color::RGBA(0, 0, 0, 180));
let _ = self.canvas.fill_rect(label_rect); let _ = self.canvas.fill_rect(label_rect);
} }
pub fn present(&mut self) { pub fn present(&mut self) {
// Draw texture if available
if let Some(ref texture) = self.texture {
self.canvas.copy(texture, None, None).ok();
}
self.canvas.present(); self.canvas.present();
} }
pub fn set_fullscreen(&mut self, fullscreen: bool) -> Result<()> {
if fullscreen {
self.window.set_fullscreen(sdl2::video::FullscreenType::Desktop)?;
} else {
self.window.set_fullscreen(sdl2::video::FullscreenType::Off)?;
}
Ok(())
}
pub fn resize(&mut self, width: u32, height: u32) -> Result<()> {
self.window.set_size(width, height)?;
Ok(())
}
pub fn poll_events(&mut self) -> Vec<sdl2::event::Event> { pub fn poll_events(&mut self) -> Vec<sdl2::event::Event> {
let mut events = Vec::new(); let mut events = Vec::new();
let pump = self.sdl.event_pump(); if let Ok(mut pump) = self.sdl.event_pump() {
if let Ok(pump) = pump {
for event in pump.poll_iter() { for event in pump.poll_iter() {
events.push(event); events.push(event);
} }
} }
events events
} }
pub fn canvas(&mut self) -> &mut sdl2::render::Canvas<sdl2::video::Window> {
&mut self.canvas
}
pub fn width(&self) -> u32 {
self.width
}
pub fn height(&self) -> u32 {
self.height
}
} }
impl Drop for Renderer { impl Drop for Renderer {
fn drop(&mut self) { fn drop(&mut self) {}
// Cleanup handled automatically
}
} }