use std::collections::HashMap;
use super::key::PipelineKey;
pub type PipelineFn = unsafe extern "C" fn(dst: *mut u8, src_solid: u32, count: usize);
pub type PipelineCovFn =
unsafe extern "C" fn(dst: *mut u8, src_solid: u32, count: usize, coverage: *const u8);
pub type TransformEdgesFn = unsafe extern "C" fn(
edges: *mut f64,
count: usize,
m00: f64,
m01: f64,
m10: f64,
m11: f64,
m20: f64,
m21: f64,
);
pub type PipelineBoxFn =
unsafe extern "C" fn(dst: *mut u8, src_solid: u32, width: usize, height: usize, stride: usize);
pub type SweepFn = unsafe extern "C" fn(cells: *mut i32, cov_buf: *mut u8, len: usize);
pub type PipelineSpanFn = unsafe extern "C" fn(dst: *mut u8, src_span: *const u32, count: usize);
pub type PipelineSpanCovFn =
unsafe extern "C" fn(dst: *mut u8, src_span: *const u32, count: usize, coverage: *const u8);
pub type RadialGradientRowFn = unsafe extern "C" fn(
dst_row: *mut u32,
lut: *const u32,
width: usize,
ux_start: f32,
uy_start: f32,
cx: f32,
cy: f32,
r0: f32,
inv_r_diff_max: f32,
dux_dx: f32,
duy_dx: f32,
);
pub type LinearGradientCovFn = unsafe extern "C" fn(
dst: *mut u8,
lut: *const u32,
count: usize,
coverage: *const u8,
t_start: i64,
dt_dx: i64,
);
#[derive(Default)]
pub struct PipelineCache {
map: HashMap<PipelineKey, PipelineFn>,
cov_map: HashMap<PipelineKey, PipelineCovFn>,
box_map: HashMap<PipelineKey, PipelineBoxFn>,
span_map: HashMap<PipelineKey, PipelineSpanFn>,
span_cov_map: HashMap<PipelineKey, PipelineSpanCovFn>,
}
impl PipelineCache {
pub fn new() -> Self {
Self::default()
}
pub fn get(&self, key: &PipelineKey) -> Option<PipelineFn> {
self.map.get(key).copied()
}
pub fn insert(&mut self, key: PipelineKey, func: PipelineFn) {
self.map.insert(key, func);
}
pub fn get_cov(&self, key: &PipelineKey) -> Option<PipelineCovFn> {
self.cov_map.get(key).copied()
}
pub fn insert_cov(&mut self, key: PipelineKey, func: PipelineCovFn) {
self.cov_map.insert(key, func);
}
pub fn get_box(&self, key: &PipelineKey) -> Option<PipelineBoxFn> {
self.box_map.get(key).copied()
}
pub fn insert_box(&mut self, key: PipelineKey, func: PipelineBoxFn) {
self.box_map.insert(key, func);
}
pub fn get_span(&self, key: &PipelineKey) -> Option<PipelineSpanFn> {
self.span_map.get(key).copied()
}
pub fn insert_span(&mut self, key: PipelineKey, func: PipelineSpanFn) {
self.span_map.insert(key, func);
}
pub fn get_span_cov(&self, key: &PipelineKey) -> Option<PipelineSpanCovFn> {
self.span_cov_map.get(key).copied()
}
pub fn insert_span_cov(&mut self, key: PipelineKey, func: PipelineSpanCovFn) {
self.span_cov_map.insert(key, func);
}
}