diff --git a/src/decoder.rs b/src/decoder.rs index d111f82..5611f61 100644 --- a/src/decoder.rs +++ b/src/decoder.rs @@ -65,17 +65,16 @@ impl Decoder for Vec<[u8; 4]> { (known[q as usize & 63], 1) }, q if q >> 6 == 1 => { // QOI_OP_DIFF - let dr = ((q & 48) >> 4) as i8 - 2; - let dg = ((q & 12) >> 2) as i8 - 2; - let db = (q & 3) as i8 - 2; - ([ prev[0].wrapping_add_signed(dr), prev[1].wrapping_add_signed(dg), prev[2].wrapping_add_signed(db), prev[3]], 1) + let mut diff = [((q & 48) >> 4) as i8 - 2, ((q & 12) >> 2) as i8 - 2, (q & 3) as i8 - 2, 0].into_iter(); + (prev.map(|p| p.wrapping_add_signed(diff.next().unwrap())), 1) }, q if q >> 6 == 2 => { // QOI_OP_LUMA let extra = *iter.next()?; let dg = (q & 63) as i8 - 32; - let dr = ((extra & 240) >> 4) as i8 - 8; - let db = (extra & 15) as i8 - 8; - ([ prev[0].wrapping_add_signed(dr + dg), prev[1].wrapping_add_signed(dg), prev[2].wrapping_add_signed(db + dg), prev[3]], 1) + let dr = ((extra & 240) >> 4) as i8 - 8 + dg; + let db = (extra & 15) as i8 - 8 + dg; + let mut diff = [dr, dg, db, 0].into_iter(); + (prev.map(|p| p.wrapping_add_signed(diff.next().unwrap())), 1) }, q if q >> 6 == 3 => { // QOI_OP_RUN let len = ((q & 63) + 1) as usize;