use std::cell::RefCell;
use platform_headless::HeadlessWindow;
use renderer_core::RenderBackend;
use renderer_software::{SoftwareRenderer, SoftwareRendererConfig};
use crate::{Color, DrawCommand};
thread_local! {
static RASTERIZER: RefCell<Option<SoftwareRenderer<HeadlessWindow, HeadlessWindow>>> =
const { RefCell::new(None) };
}
pub fn rasterize(
commands: &[DrawCommand],
width: u32,
height: u32,
scale: f32,
clear_color: Option<Color>,
) -> Option<Vec<u8>> {
if width == 0 || height == 0 {
return None;
}
RASTERIZER.with(|cell| {
let mut slot = cell.borrow_mut();
let renderer = slot.get_or_insert_with(|| {
SoftwareRenderer::new_headless(width, height, SoftwareRendererConfig::default())
});
renderer.begin_frame(width, height, scale, 0).ok()?;
renderer.render_frame(commands, clear_color).ok()?;
renderer.read_rgba().map(<[u8]>::to_vec)
})
}