use crate::geometry::map_ft_result;
use crate::YuvError;
use fast_transpose::{
flip_plane, flip_plane16, flip_plane16_with_alpha, flip_plane_with_alpha, flip_rgb, flip_rgb16,
flip_rgba, flip_rgba16, flop_plane, flop_plane16, flop_plane16_with_alpha,
flop_plane_with_alpha, flop_rgb, flop_rgb16, flop_rgba, flop_rgba16,
};
#[derive(Copy, Clone, Debug, Ord, PartialOrd, Eq, PartialEq, Hash)]
pub enum MirrorMode {
Vertical,
Horizontal,
}
pub fn mirror_rgba(
src: &[u8],
src_stride: usize,
dst: &mut [u8],
dst_stride: usize,
width: usize,
height: usize,
mode: MirrorMode,
) -> Result<(), YuvError> {
let rs = match mode {
MirrorMode::Vertical => flop_rgba(src, src_stride, dst, dst_stride, width, height),
MirrorMode::Horizontal => flip_rgba(src, src_stride, dst, dst_stride, width, height),
};
map_ft_result(rs)
}
pub fn mirror_rgb(
src: &[u8],
src_stride: usize,
dst: &mut [u8],
dst_stride: usize,
width: usize,
height: usize,
mode: MirrorMode,
) -> Result<(), YuvError> {
let rs = match mode {
MirrorMode::Vertical => flop_rgb(src, src_stride, dst, dst_stride, width, height),
MirrorMode::Horizontal => flip_rgb(src, src_stride, dst, dst_stride, width, height),
};
map_ft_result(rs)
}
pub fn mirror_cbcr(
src: &[u8],
src_stride: usize,
dst: &mut [u8],
dst_stride: usize,
width: usize,
height: usize,
mode: MirrorMode,
) -> Result<(), YuvError> {
let rs = match mode {
MirrorMode::Vertical => {
flop_plane_with_alpha(src, src_stride, dst, dst_stride, width, height)
}
MirrorMode::Horizontal => {
flip_plane_with_alpha(src, src_stride, dst, dst_stride, width, height)
}
};
map_ft_result(rs)
}
pub fn mirror_plane(
src: &[u8],
src_stride: usize,
dst: &mut [u8],
dst_stride: usize,
width: usize,
height: usize,
mode: MirrorMode,
) -> Result<(), YuvError> {
let rs = match mode {
MirrorMode::Vertical => flop_plane(src, src_stride, dst, dst_stride, width, height),
MirrorMode::Horizontal => flip_plane(src, src_stride, dst, dst_stride, width, height),
};
map_ft_result(rs)
}
pub fn mirror_rgba16(
src: &[u16],
src_stride: usize,
dst: &mut [u16],
dst_stride: usize,
width: usize,
height: usize,
mode: MirrorMode,
) -> Result<(), YuvError> {
let rs = match mode {
MirrorMode::Vertical => flop_rgba16(src, src_stride, dst, dst_stride, width, height),
MirrorMode::Horizontal => flip_rgba16(src, src_stride, dst, dst_stride, width, height),
};
map_ft_result(rs)
}
pub fn mirror_rgb16(
src: &[u16],
src_stride: usize,
dst: &mut [u16],
dst_stride: usize,
width: usize,
height: usize,
mode: MirrorMode,
) -> Result<(), YuvError> {
let rs = match mode {
MirrorMode::Vertical => flop_rgb16(src, src_stride, dst, dst_stride, width, height),
MirrorMode::Horizontal => flip_rgb16(src, src_stride, dst, dst_stride, width, height),
};
map_ft_result(rs)
}
pub fn mirror_cbcr16(
src: &[u16],
src_stride: usize,
dst: &mut [u16],
dst_stride: usize,
width: usize,
height: usize,
mode: MirrorMode,
) -> Result<(), YuvError> {
let rs = match mode {
MirrorMode::Vertical => {
flop_plane16_with_alpha(src, src_stride, dst, dst_stride, width, height)
}
MirrorMode::Horizontal => {
flip_plane16_with_alpha(src, src_stride, dst, dst_stride, width, height)
}
};
map_ft_result(rs)
}
pub fn mirror_plane16(
src: &[u16],
src_stride: usize,
dst: &mut [u16],
dst_stride: usize,
width: usize,
height: usize,
mode: MirrorMode,
) -> Result<(), YuvError> {
let rs = match mode {
MirrorMode::Vertical => flop_plane16(src, src_stride, dst, dst_stride, width, height),
MirrorMode::Horizontal => flip_plane16(src, src_stride, dst, dst_stride, width, height),
};
map_ft_result(rs)
}