use after_effects::Parameters;
use premiere as pr;
use super::legacy::{CpuParams, SetupParams, get_param};
use super::value::{Color, ParamValue, Point2};
use crate::types::Pixel;
pub fn cpu_float<P: SetupParams>(p: &Parameters<P>, id: P) -> Result<ParamValue, after_effects::Error> {
Ok(ParamValue::Float(p.float(id)?))
}
pub fn cpu_angle<P: SetupParams>(p: &Parameters<P>, id: P) -> Result<ParamValue, after_effects::Error> {
Ok(ParamValue::Float(p.angle(id)?))
}
pub fn cpu_checkbox<P: SetupParams>(p: &Parameters<P>, id: P) -> Result<ParamValue, after_effects::Error> {
Ok(ParamValue::Bool(p.checkbox(id)?))
}
pub fn cpu_color<P: SetupParams>(p: &Parameters<P>, id: P) -> Result<ParamValue, after_effects::Error> {
let px = p.color(id)?;
Ok(ParamValue::Color(Color::from_u8(px.red, px.green, px.blue, px.alpha)))
}
pub fn cpu_popup<P: SetupParams>(p: &Parameters<P>, id: P) -> Result<ParamValue, after_effects::Error> {
Ok(ParamValue::Index((p.popup(id)? as u32).saturating_sub(1)))
}
pub fn cpu_point<P: SetupParams>(p: &Parameters<P>, id: P, layer_w: u32, layer_h: u32) -> Result<ParamValue, after_effects::Error> {
let (x, y) = p.point(id)?;
Ok(ParamValue::Point(Point2::new(x / layer_w.max(1) as f32, y / layer_h.max(1) as f32)))
}
pub fn gpu_float<P: SetupParams>(f: &pr::GpuFilterData, rp: &pr::RenderParams, id: P) -> ParamValue {
ParamValue::Float(get_param::<f32, _>(f, id, rp))
}
pub fn gpu_checkbox<P: SetupParams>(f: &pr::GpuFilterData, rp: &pr::RenderParams, id: P) -> ParamValue {
ParamValue::Bool(get_param::<bool, _>(f, id, rp))
}
pub fn gpu_color<P: SetupParams>(f: &pr::GpuFilterData, rp: &pr::RenderParams, id: P) -> ParamValue {
let c: Pixel = get_param(f, id, rp);
ParamValue::Color(Color::from_u8(c.red, c.green, c.blue, c.alpha))
}
pub fn gpu_popup<P: SetupParams>(f: &pr::GpuFilterData, rp: &pr::RenderParams, id: P) -> ParamValue {
ParamValue::Index(get_param::<i32, _>(f, id, rp).max(0) as u32)
}
pub fn gpu_point<P: SetupParams>(f: &pr::GpuFilterData, rp: &pr::RenderParams, id: P) -> ParamValue {
let (x, y): (f32, f32) = get_param(f, id, rp);
ParamValue::Point(Point2::new(x, y))
}