use super::*;
impl BackendKind {
pub fn name(&self) -> &'static str {
match self {
BackendKind::WebGpu => "webgpu",
BackendKind::WebGl2 => "webgl2",
BackendKind::Canvas2D => "canvas2d",
}
}
pub fn is_gpu(&self) -> bool {
matches!(self, BackendKind::WebGpu | BackendKind::WebGl2)
}
}
impl BackendFactory {
pub fn new() -> Self {
Self
}
pub async fn create(
canvas: &HtmlCanvasElement,
preferred: BackendKind,
) -> Option<Box<dyn ChartBackend>> {
let order: &[BackendKind] = match preferred {
BackendKind::WebGpu => &[
BackendKind::WebGpu,
BackendKind::WebGl2,
BackendKind::Canvas2D,
],
BackendKind::WebGl2 => &[BackendKind::WebGl2, BackendKind::Canvas2D],
BackendKind::Canvas2D => &[BackendKind::Canvas2D],
};
for kind in order {
match kind {
BackendKind::WebGpu => {
if let Some(backend) = webgpu::WebGpuChartBackend::create(canvas).await {
return Some(Box::new(backend));
}
}
BackendKind::WebGl2 => {
if let Some(backend) = webgl::WebGl2ChartBackend::create(canvas) {
return Some(Box::new(backend));
}
}
BackendKind::Canvas2D => {
if let Some(backend) = canvas2d::Canvas2dChartBackend::create(canvas) {
return Some(Box::new(backend));
}
}
}
}
None
}
pub fn detect(preferred: BackendKind) -> BackendKind {
if preferred == BackendKind::WebGpu && !webgpu::WebGpuChartBackend::is_supported() {
return if webgl::WebGl2ChartBackend::is_supported() {
BackendKind::WebGl2
} else {
BackendKind::Canvas2D
};
}
if preferred == BackendKind::WebGl2 && !webgl::WebGl2ChartBackend::is_supported() {
return BackendKind::Canvas2D;
}
preferred
}
}