Fix: wrapping, store previous pixel value
The wrapping wasn't working properly, clearly, but I forgot about the previous pixel entirely. I'll add some more explicit tests for the previous pixel behavior. I think it's still broken for RGB and RGBA, because I'm dumb.
This commit is contained in:
40
src/main.rs
40
src/main.rs
@@ -134,29 +134,33 @@ where
|
||||
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,
|
||||
let dr = ((byte & 0b0011_0000) >> 4).wrapping_sub(2);
|
||||
let dg = ((byte & 0b0000_1100) >> 2).wrapping_sub(2);
|
||||
let db = (byte & 0b0000_0011).wrapping_sub(2);
|
||||
let result = PixelRGBA {
|
||||
r: self.prev_pixel.r.wrapping_add(dr),
|
||||
g: self.prev_pixel.g.wrapping_add(dg),
|
||||
b: self.prev_pixel.b.wrapping_add(db),
|
||||
a: self.prev_pixel.a,
|
||||
});
|
||||
};
|
||||
self.prev_pixel = result;
|
||||
return Some(result);
|
||||
}
|
||||
QOI_OP_LUMA => {
|
||||
let dg = (byte & !QOI_OP_SMALL_MASK) - 32;
|
||||
let dg = (byte & !QOI_OP_SMALL_MASK).wrapping_sub(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,
|
||||
let drdg = ((packed & 0b1111_0000) >> 4).wrapping_sub(8);
|
||||
let dbdg = (packed & 0b0000_1111).wrapping_sub(8);
|
||||
let dr = drdg.wrapping_add(dg);
|
||||
let db = dbdg.wrapping_add(dg);
|
||||
let result = PixelRGBA {
|
||||
r: self.prev_pixel.r.wrapping_add(dr),
|
||||
g: self.prev_pixel.g.wrapping_add(dg),
|
||||
b: self.prev_pixel.b.wrapping_add(db),
|
||||
a: self.prev_pixel.a,
|
||||
});
|
||||
};
|
||||
self.prev_pixel = result;
|
||||
return Some(result);
|
||||
}
|
||||
QOI_OP_RUN => {
|
||||
self.run_len = byte & !QOI_OP_SMALL_MASK;
|
||||
|
||||
Reference in New Issue
Block a user