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")} + } } }