impl Kernel for PackKernel {
fn init(&mut self, in_fmt: &ScaleInfo, dest_fmt: &ScaleInfo) -> ScaleResult<NABufferType> {
- self.ncomps = in_fmt.fmt.components as usize;
+ self.ncomps = in_fmt.fmt.components.min(dest_fmt.fmt.components) as usize;
for i in 0..self.ncomps {
let ichr = in_fmt.fmt.comp_info[i].unwrap();
let ochr = dest_fmt.fmt.comp_info[i].unwrap();
let ddata = dbuf.get_data_mut().unwrap();
for (src, dst) in sdata.chunks(istride).zip(ddata.chunks_mut(dstride)).take(h) {
for x in 0..w {
- dst[x * step + self.ooff[comp]] = convert_depth(src[x] as u32, self.depths[comp], self.osize[comp]) as u8;
+ dst[x * step + self.ooff[comp]] = convert_depth(u32::from(src[x]), self.depths[comp], self.osize[comp]) as u8;
}
}
}
for x in 0..w {
let mut elem: u32 = 0;
for comp in 0..self.ncomps {
- let c = src[ioff[comp] + x] as u32;
+ let c = u32::from(src[ioff[comp] + x]);
elem |= convert_depth(c, self.depths[comp], self.osize[comp]) << self.shifts[comp];
}
dst[x] = elem as u16;
}
}
-pub fn create_pack() -> Box<Kernel> {
+pub fn create_pack() -> Box<dyn Kernel> {
Box::new(PackKernel::new())
}
impl Kernel for UnpackKernel {
fn init(&mut self, in_fmt: &ScaleInfo, dest_fmt: &ScaleInfo) -> ScaleResult<NABufferType> {
- self.ncomps = in_fmt.fmt.components as usize;
+ self.ncomps = in_fmt.fmt.components.min(dest_fmt.fmt.components) as usize;
let mut chr: Vec<Option<NAPixelChromaton>> = Vec::with_capacity(MAX_CHROMATONS);
for i in 0..self.ncomps {
let ichr = in_fmt.fmt.comp_info[i].unwrap();
chr.push(Some(dchr));
}
let mut df = in_fmt.fmt;
- for i in 0..self.ncomps {
- df.comp_info[i] = chr[i];
- }
+ df.comp_info[..self.ncomps].clone_from_slice(&chr[..self.ncomps]);
+ df.components = self.ncomps as u8;
+ df.palette = false;
println!(" [intermediate format {}]", df);
let res = alloc_video_buffer(NAVideoInfo::new(in_fmt.width, in_fmt.height, false, df), 3);
if res.is_err() { return Err(ScaleError::AllocError); }
let dst = dbuf.get_data_mut().unwrap();
for src in sdata.chunks(istride).take(h) {
for x in 0..w {
- let elem = src[x] as u32;
+ let elem = u32::from(src[x]);
for i in 0..self.ncomps {
dst[offs[i] + x] = convert_depth((elem >> self.shifts[i]) & self.masks[i], self.depths[i], self.osize[i]) as u8;
}
}
}
-pub fn create_unpack() -> Box<Kernel> {
+pub fn create_unpack() -> Box<dyn Kernel> {
Box::new(UnpackKernel::new())
}
}
let mut df = in_fmt.fmt;
df.palette = false;
- for i in 0..self.ncomps {
- df.comp_info[i] = chr[i];
- }
+ df.comp_info[..self.ncomps].clone_from_slice(&chr[..self.ncomps]);
println!(" [intermediate format {}]", df);
let res = alloc_video_buffer(NAVideoInfo::new(in_fmt.width, in_fmt.height, false, df), 3);
if res.is_err() { return Err(ScaleError::AllocError); }
for x in 0..w {
let palidx = src[x] as usize;
for i in 0..self.ncomps {
- let elem = pal[palidx * self.palstep + self.coffs[i]] as u32;
+ let elem = u32::from(pal[palidx * self.palstep + self.coffs[i]]);
dst[offs[i] + x] = convert_depth(elem, self.depths[i], 8) as u8;
}
}
}
}
-pub fn create_depal() -> Box<Kernel> {
+pub fn create_depal() -> Box<dyn Kernel> {
Box::new(DepalKernel::new())
}