use crate::{pixel, view};
pub trait Get<P, C>
where
P: pixel::Read<C>,
C: pixel::Channel,
{
fn get_clamped(self, x: i64, y: i64) -> P;
}
impl<'a, P, C, T> Get<P, C> for T
where
P: pixel::Read<C>,
C: pixel::Channel,
T: Into<view::Read<'a, P, C>>,
{
#[inline]
fn get_clamped(self, x: i64, y: i64) -> P {
let view = self.into();
let width = view.width() as i64;
let height = view.height() as i64;
view.get(clamp(x, 0, width - 1) as u32, clamp(y, 0, height - 1) as u32)
}
}
pub trait Set<P, C>
where
P: pixel::Write<C>,
C: pixel::Channel,
{
fn set_clamped(self, x: i64, y: i64, value: &P);
}
impl<'a, P, C, T> Set<P, C> for T
where
P: pixel::Write<C>,
C: pixel::Channel,
T: Into<view::Write<'a, P, C>>,
{
#[inline]
fn set_clamped(self, x: i64, y: i64, value: &P) {
let mut view = self.into();
let width = view.width() as i64;
let height = view.height() as i64;
view.set(clamp(x, 0, width - 1) as u32, clamp(y, 0, height - 1) as u32, value);
}
}
#[inline]
pub fn clamp<T: PartialOrd>(value: T, min: T, max: T) -> T {
if value > max {
max
}
else if value < min {
min
}
else {
value
}
}