diff --git a/src/decode.rs b/src/decode.rs index 7d062b2..b9fb6f2 100644 --- a/src/decode.rs +++ b/src/decode.rs @@ -31,14 +31,16 @@ where let data_len = data.len(); let mut data = data; - let mut index = [Pixel::::new(); 256]; + let mut index = [Pixel::<4>::new(); 256]; let mut px = Pixel::::new().with_a(0xff); + let mut px_rgba: Pixel<4>; while let [px_out, ptail @ ..] = pixels { pixels = ptail; match data { [b1 @ QOI_OP_INDEX..=QOI_OP_INDEX_END, dtail @ ..] => { - px = index[*b1 as usize]; + px_rgba = index[*b1 as usize]; + px.update(px_rgba); *px_out = px.into(); data = dtail; continue; @@ -76,8 +78,8 @@ where } } - let px_rgba = px.as_rgba(0xff); - index[px_rgba.hash_index() as usize] = px; + px_rgba = px.as_rgba(0xff); + index[px_rgba.hash_index() as usize] = px_rgba; *px_out = px.into(); } diff --git a/src/pixel.rs b/src/pixel.rs index 75ec82b..d103494 100644 --- a/src/pixel.rs +++ b/src/pixel.rs @@ -26,6 +26,15 @@ impl Pixel { } } + #[inline] + pub fn update(&mut self, px: Pixel) { + let mut i = 0; + while i < M && i < N { + self.0[i] = px.0[i]; + i += 1; + } + } + #[inline] pub fn update_rgb(&mut self, r: u8, g: u8, b: u8) { self.0[0] = r;