use std::path::Path;
use wgpu::{Device, Queue, TextureFormat};
pub struct ImageExporter {
#[allow(dead_code)]
device: Device,
#[allow(dead_code)]
queue: Queue,
#[allow(dead_code)]
format: TextureFormat,
settings: ImageExportSettings,
}
#[derive(Debug, Clone)]
pub struct ImageExportSettings {
pub width: u32,
pub height: u32,
pub samples: u32,
pub background_color: [f32; 4],
pub quality: f32,
pub include_metadata: bool,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum ImageFormat {
Png,
Jpeg,
WebP,
Bmp,
}
impl Default for ImageExportSettings {
fn default() -> Self {
Self {
width: 800,
height: 600,
samples: 4, background_color: [1.0, 1.0, 1.0, 1.0], quality: 0.95,
include_metadata: true,
}
}
}
impl ImageExporter {
pub async fn new() -> Result<Self, String> {
Self::with_settings(ImageExportSettings::default()).await
}
pub async fn with_settings(settings: ImageExportSettings) -> Result<Self, String> {
let instance = wgpu::Instance::new(wgpu::InstanceDescriptor::default());
let adapter = instance
.request_adapter(&wgpu::RequestAdapterOptions {
power_preference: wgpu::PowerPreference::HighPerformance,
compatible_surface: None,
force_fallback_adapter: false,
})
.await
.ok_or("Failed to find suitable GPU adapter")?;
let (device, queue) = adapter
.request_device(&wgpu::DeviceDescriptor::default(), None)
.await
.map_err(|e| format!("Failed to create device: {e}"))?;
Ok(Self {
device,
queue,
format: TextureFormat::Rgba8UnormSrgb,
settings,
})
}
pub async fn export_png<P: AsRef<Path>>(
&self,
_figure: &mut crate::plots::Figure,
path: P,
) -> Result<(), String> {
let placeholder_data =
vec![255u8; (self.settings.width * self.settings.height * 4) as usize];
self.save_png(&placeholder_data, path).await
}
async fn save_png<P: AsRef<Path>>(&self, data: &[u8], path: P) -> Result<(), String> {
use image::{ImageBuffer, Rgba};
let image =
ImageBuffer::<Rgba<u8>, _>::from_raw(self.settings.width, self.settings.height, data)
.ok_or("Failed to create image buffer")?;
image
.save(path)
.map_err(|e| format!("Failed to save PNG: {e}"))?;
println!("DEBUG: PNG export completed successfully");
Ok(())
}
pub fn set_settings(&mut self, settings: ImageExportSettings) {
self.settings = settings;
}
pub fn settings(&self) -> &ImageExportSettings {
&self.settings
}
}