+fn swap_plane<T:Copy>(data: &mut [T], stride: usize, h: usize, line0: &mut [T], line1: &mut [T]) {
+ let mut doff0 = 0;
+ let mut doff1 = stride * (h - 1);
+ for _ in 0..h/2 {
+ line0.copy_from_slice(&data[doff0..][..stride]);
+ line1.copy_from_slice(&data[doff1..][..stride]);
+ (&mut data[doff1..][..stride]).copy_from_slice(line0);
+ (&mut data[doff0..][..stride]).copy_from_slice(line1);
+ doff0 += stride;
+ doff1 -= stride;
+ }
+}
+
+pub fn flip_picture(pic: &mut NABufferType) -> ScaleResult<()> {
+ match pic {
+ NABufferType::Video(ref mut vb) => {
+ let ncomp = vb.get_num_components();
+ for comp in 0..ncomp {
+ let off = vb.get_offset(comp);
+ let stride = vb.get_stride(comp);
+ let (_, h) = vb.get_dimensions(comp);
+ let data = vb.get_data_mut().unwrap();
+ let mut line0 = vec![0; stride];
+ let mut line1 = vec![0; stride];
+ swap_plane(&mut data[off..], stride, h, line0.as_mut_slice(), line1.as_mut_slice());
+ }
+ },
+ NABufferType::Video16(ref mut vb) => {
+ let ncomp = vb.get_num_components();
+ for comp in 0..ncomp {
+ let off = vb.get_offset(comp);
+ let stride = vb.get_stride(comp);
+ let (_, h) = vb.get_dimensions(comp);
+ let data = vb.get_data_mut().unwrap();
+ let mut line0 = vec![0; stride];
+ let mut line1 = vec![0; stride];
+ swap_plane(&mut data[off..], stride, h, line0.as_mut_slice(), line1.as_mut_slice());
+ }
+ },
+ NABufferType::Video32(ref mut vb) => {
+ let ncomp = vb.get_num_components();
+ for comp in 0..ncomp {
+ let off = vb.get_offset(comp);
+ let stride = vb.get_stride(comp);
+ let (_, h) = vb.get_dimensions(comp);
+ let data = vb.get_data_mut().unwrap();
+ let mut line0 = vec![0; stride];
+ let mut line1 = vec![0; stride];
+ swap_plane(&mut data[off..], stride, h, line0.as_mut_slice(), line1.as_mut_slice());
+ }
+ },
+ NABufferType::VideoPacked(ref mut vb) => {
+ let ncomp = vb.get_num_components();
+ for comp in 0..ncomp {
+ let off = vb.get_offset(comp);
+ let stride = vb.get_stride(comp);
+ let (_, h) = vb.get_dimensions(comp);
+ let data = vb.get_data_mut().unwrap();
+ let mut line0 = vec![0; stride];
+ let mut line1 = vec![0; stride];
+ swap_plane(&mut data[off..], stride, h, line0.as_mut_slice(), line1.as_mut_slice());
+ }
+ },
+ _ => { return Err(ScaleError::InvalidArgument); },
+ };
+ Ok(())
+}
+