From ef4b31dab6c05f3e8693bd36dfc640c36e7ab2a6 Mon Sep 17 00:00:00 2001 From: Robert Garrett Date: Mon, 6 May 2024 14:18:45 -0500 Subject: [PATCH] Most of the decoders, but the match is broken I was going to try to match over the op codes, but that isn't possible. Most of the decoders are done, too, but I'm quite sure that the delta operations will encounter a wrap around and then panic. The OP_RUN is a problem, as well. I think I'm going to cheat this problem by holding a counter. This way I can see if I'm in a run, and then emit another pixel copy until counter == 0. --- src/main.rs | 50 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 69ed9a1..7e88e12 100644 --- a/src/main.rs +++ b/src/main.rs @@ -92,7 +92,55 @@ impl<'input, I> Iterator for Decoder where I: Iterator { fn next(&mut self) -> Option { let byte = self.bytes.next()?; - todo!(); + match byte { + QOI_OP_RGB => { + return Some(PixelRGBA { + r: self.bytes.next()?, + g: self.bytes.next()?, + b: self.bytes.next()?, + a: self.prev_pixel.a, + }); + }, + QOI_OP_RGBA => { + return Some(PixelRGBA { + r: self.bytes.next()?, + g: self.bytes.next()?, + b: self.bytes.next()?, + a: self.bytes.next()?, + }); + }, + QOI_OP_INDEX => { + let idx = (byte | 0b0011_1111) as usize; + return Some(self.back_buffer[idx]); + }, + QOI_OP_DIFF => { + let dr = ((byte | 0b0011_0000) >> 4) - 2; + let dg = ((byte | 0b0000_1100) >> 2) - 2; + let db = (byte | 0b0000_0011) - 2; + return Some(PixelRGBA { + r: self.prev_pixel.r + dr, + g: self.prev_pixel.g + dg, + b: self.prev_pixel.b + db, + a: self.prev_pixel.a + }); + }, + QOI_OP_LUMA => { + let dg = (byte | 0b0011_1111) - 32; + let packed = self.bytes.next()?; + let drdg = ((packed | 0b1111_0000) >> 4) - 8; + let dbdg = (packed | 0b0000_1111) - 8; + let dr = drdg + dg; + let db = dbdg + dg; + return Some(PixelRGBA { + r: self.prev_pixel.r + dr, + g: self.prev_pixel.g + dg, + b: self.prev_pixel.b + db, + a: self.prev_pixel.a + }); + }, + QOI_OP_RUN => {todo!("Impl Decode QOI_OP_RUN")}, + _ => {panic!("bad op code")} + } } }