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]);
|
return Some(self.back_buffer[idx]);
|
||||||
}
|
}
|
||||||
QOI_OP_DIFF => {
|
QOI_OP_DIFF => {
|
||||||
let dr = ((byte & 0b0011_0000) >> 4) - 2;
|
let dr = ((byte & 0b0011_0000) >> 4).wrapping_sub(2);
|
||||||
let dg = ((byte & 0b0000_1100) >> 2) - 2;
|
let dg = ((byte & 0b0000_1100) >> 2).wrapping_sub(2);
|
||||||
let db = (byte & 0b0000_0011) - 2;
|
let db = (byte & 0b0000_0011).wrapping_sub(2);
|
||||||
return Some(PixelRGBA {
|
let result = PixelRGBA {
|
||||||
r: self.prev_pixel.r + dr,
|
r: self.prev_pixel.r.wrapping_add(dr),
|
||||||
g: self.prev_pixel.g + dg,
|
g: self.prev_pixel.g.wrapping_add(dg),
|
||||||
b: self.prev_pixel.b + db,
|
b: self.prev_pixel.b.wrapping_add(db),
|
||||||
a: self.prev_pixel.a,
|
a: self.prev_pixel.a,
|
||||||
});
|
};
|
||||||
|
self.prev_pixel = result;
|
||||||
|
return Some(result);
|
||||||
}
|
}
|
||||||
QOI_OP_LUMA => {
|
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 packed = self.bytes.next()?;
|
||||||
let drdg = ((packed & 0b1111_0000) >> 4) - 8;
|
let drdg = ((packed & 0b1111_0000) >> 4).wrapping_sub(8);
|
||||||
let dbdg = (packed & 0b0000_1111) - 8;
|
let dbdg = (packed & 0b0000_1111).wrapping_sub(8);
|
||||||
let dr = drdg + dg;
|
let dr = drdg.wrapping_add(dg);
|
||||||
let db = dbdg + dg;
|
let db = dbdg.wrapping_add(dg);
|
||||||
return Some(PixelRGBA {
|
let result = PixelRGBA {
|
||||||
r: self.prev_pixel.r + dr,
|
r: self.prev_pixel.r.wrapping_add(dr),
|
||||||
g: self.prev_pixel.g + dg,
|
g: self.prev_pixel.g.wrapping_add(dg),
|
||||||
b: self.prev_pixel.b + db,
|
b: self.prev_pixel.b.wrapping_add(db),
|
||||||
a: self.prev_pixel.a,
|
a: self.prev_pixel.a,
|
||||||
});
|
};
|
||||||
|
self.prev_pixel = result;
|
||||||
|
return Some(result);
|
||||||
}
|
}
|
||||||
QOI_OP_RUN => {
|
QOI_OP_RUN => {
|
||||||
self.run_len = byte & !QOI_OP_SMALL_MASK;
|
self.run_len = byte & !QOI_OP_SMALL_MASK;
|
||||||
|
|||||||
Reference in New Issue
Block a user