#[cfg(test)]
mod tests;
use crate::util::Pixel;
use semisafe::slice::get as semisafe_get;
use semisafe::slice::get_mut as semisafe_get_mut;
use std::num::NonZeroUsize;
#[inline]
pub fn pad_reference_frame<T: Pixel>(
offset: usize,
ref_pitch: NonZeroUsize,
hpad: usize,
vpad: usize,
width: NonZeroUsize,
height: NonZeroUsize,
dest: &mut [T],
) {
let pfoff = offset + vpad * ref_pitch.get() + hpad;
let max_offset = offset + hpad + width.get() + (vpad + height.get()) * ref_pitch.get();
debug_assert!(dest.len() >= max_offset + ref_pitch.get() * (vpad - 1) + hpad);
unsafe {
pad_corner(
offset,
*semisafe_get(dest, pfoff),
hpad,
vpad,
ref_pitch,
dest,
);
pad_corner(
offset + hpad + width.get(),
*semisafe_get(dest, pfoff + width.get() - 1),
hpad,
vpad,
ref_pitch,
dest,
);
pad_corner(
offset + (vpad + height.get()) * ref_pitch.get(),
*semisafe_get(dest, pfoff + (height.get() - 1) * ref_pitch.get()),
hpad,
vpad,
ref_pitch,
dest,
);
pad_corner(
offset + hpad + width.get() + (vpad + height.get()) * ref_pitch.get(),
*semisafe_get(
dest,
pfoff + (height.get() - 1) * ref_pitch.get() + width.get() - 1,
),
hpad,
vpad,
ref_pitch,
dest,
);
for i in 0..width.get() {
let value = *semisafe_get(dest, pfoff + i);
let mut poff = offset + hpad + i;
for _j in 0..vpad {
*semisafe_get_mut(dest, poff) = value;
poff += ref_pitch.get();
}
}
for i in 0..height.get() {
let value = *semisafe_get(dest, pfoff + i * ref_pitch.get());
let poff = offset + (vpad + i) * ref_pitch.get();
semisafe_get_mut(semisafe_get_mut(dest, poff..), ..hpad).fill(value);
}
for i in 0..height.get() {
let value = *semisafe_get(dest, pfoff + i * ref_pitch.get() + width.get() - 1);
let poff = offset + (vpad + i) * ref_pitch.get() + width.get() + hpad;
semisafe_get_mut(semisafe_get_mut(dest, poff..), ..hpad).fill(value);
}
for i in 0..width.get() {
let value = *semisafe_get(dest, pfoff + i + (height.get() - 1) * ref_pitch.get());
let mut poff = offset + hpad + i + (height.get() + vpad) * ref_pitch.get();
for _j in 0..vpad {
*semisafe_get_mut(dest, poff) = value;
poff += ref_pitch.get();
}
}
}
}
unsafe fn pad_corner<T: Pixel>(
mut offset: usize,
val: T,
hpad: usize,
vpad: usize,
ref_pitch: NonZeroUsize,
dest: &mut [T],
) {
for _i in 0..vpad {
semisafe_get_mut(semisafe_get_mut(dest, offset..), ..hpad).fill(val);
offset += ref_pitch.get();
}
}