use crate::error::RenderError;
const MAX_DIMENSION: u32 = 16_384;
pub(super) fn f64_to_px(value: f64, axis: &str) -> Result<u32, RenderError> {
if !value.is_finite() {
return Err(RenderError::new(format!(
"scene {axis} is non-finite ({value})"
)));
}
let px = value.round();
if px <= 0.0 {
return Err(RenderError::new(format!(
"scene {axis} rounds to a non-positive value ({px})"
)));
}
let px_u32 = px as u32;
if px_u32 > MAX_DIMENSION {
return Err(RenderError::new(format!(
"scene {axis} ({px_u32}) exceeds maximum allowed dimension ({MAX_DIMENSION})"
)));
}
Ok(px_u32)
}
pub(super) fn premultiplied_to_straight(r: u8, g: u8, b: u8, a: u8) -> (u8, u8, u8, u8) {
if a == 0 {
return (0, 0, 0, 0);
}
let a_u16 = u16::from(a);
let un = |v: u8| -> u8 {
let v_u16 = u16::from(v);
let result = (v_u16 * 255 + a_u16 / 2) / a_u16;
result.min(255) as u8
};
(un(r), un(g), un(b), a)
}