X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=nihav-core%2Fsrc%2Fscale%2Fmod.rs;h=16c69efa95013e6fc14056a57c26ed9c9c2478a7;hb=d66e60559ac53f86a8e7a1c31b89a6cf320177d0;hp=e66d393c0733917fc8c08beac3b2c98cc8302e73;hpb=4b459d0b9b76cb51c1029e6d1ffb17cf5f2d44d9;p=nihav.git diff --git a/nihav-core/src/scale/mod.rs b/nihav-core/src/scale/mod.rs index e66d393..16c69ef 100644 --- a/nihav-core/src/scale/mod.rs +++ b/nihav-core/src/scale/mod.rs @@ -21,6 +21,7 @@ mod kernel; mod colorcvt; mod repack; +#[allow(clippy::module_inception)] mod scale; mod palette; @@ -190,6 +191,39 @@ fn copy(pic_in: &NABufferType, pic_out: &mut NABufferType) } } } + } else if let (Some(ref sbuf), Some(ref mut dbuf)) = (pic_in.get_vbuf16(), pic_out.get_vbuf16()) { + let mut same = true; + let num_components = sbuf.get_info().get_format().get_num_comp(); + for i in 0..num_components { + if sbuf.get_stride(i) != dbuf.get_stride(i) { + same = false; + break; + } + if sbuf.get_offset(i) != dbuf.get_offset(i) { + same = false; + break; + } + } + if same { + let sdata = sbuf.get_data(); + let ddata = dbuf.get_data_mut().unwrap(); + ddata.copy_from_slice(&sdata[0..]); + } else { + let sdata = sbuf.get_data(); + for comp in 0..num_components { + let (_, h) = sbuf.get_dimensions(comp); + let src = &sdata[sbuf.get_offset(comp)..]; + let sstride = sbuf.get_stride(comp); + let doff = dbuf.get_offset(comp); + let dstride = dbuf.get_stride(comp); + let ddata = dbuf.get_data_mut().unwrap(); + let dst = &mut ddata[doff..]; + let copy_size = sstride.min(dstride); + for (dline, sline) in dst.chunks_exact_mut(dstride).take(h).zip(src.chunks_exact(sstride)) { + (&mut dline[..copy_size]).copy_from_slice(&sline[..copy_size]); + } + } + } } else { unimplemented!(); } @@ -319,7 +353,7 @@ pub fn flip_picture(pic: &mut NABufferType) -> ScaleResult<()> { } }, NABufferType::Video16(ref mut vb) => { - let ncomp = vb.get_num_components(); + let ncomp = vb.get_num_components().max(1); for comp in 0..ncomp { let off = vb.get_offset(comp); let stride = vb.get_stride(comp); @@ -331,7 +365,7 @@ pub fn flip_picture(pic: &mut NABufferType) -> ScaleResult<()> { } }, NABufferType::Video32(ref mut vb) => { - let ncomp = vb.get_num_components(); + let ncomp = vb.get_num_components().max(1); for comp in 0..ncomp { let off = vb.get_offset(comp); let stride = vb.get_stride(comp);