diff --git a/in/1kb.qoi b/in/1kb.qoi new file mode 100644 index 0000000..dd95fcc Binary files /dev/null and b/in/1kb.qoi differ diff --git a/out/1kb.qoi b/out/1kb.qoi index da76eaa..e8925b8 100644 Binary files a/out/1kb.qoi and b/out/1kb.qoi differ diff --git a/out/dice.qoi b/out/dice.qoi index 2358313..9f6317c 100644 Binary files a/out/dice.qoi and b/out/dice.qoi differ diff --git a/src/encoder.rs b/src/encoder.rs index 3a1dbf7..7330596 100644 --- a/src/encoder.rs +++ b/src/encoder.rs @@ -9,17 +9,17 @@ impl Ops { // @TODO don't alloc here, get a mut reference and extend here fn format (self) -> Vec { // cast_diff - let cd = |diff: i8| cast_with_bias(diff, 2); + let cd = |diff: i8| cast_with_bias(diff, -2); // cast_luma_green - let clg = |diff: i8| cast_with_bias(diff, 32); + let clg = |diff: i8| cast_with_bias(diff, -32); // cast_luma_red_blue - let clrb = |diff: i8| cast_with_bias(diff, 8); + let clrb = |diff: i8| cast_with_bias(diff, -8); match self { Ops::Nop => vec![], Ops::Rgb([r, g, b]) => vec![254, r, g, b], Ops::Rgba([r, g, b, a]) => vec![255, r, g, b, a], - Ops::Index(idx) => vec![0b1111 & idx as u8], + Ops::Index(idx) => vec![idx as u8], Ops::Run(len) => vec![(3 << 6) | (len - 1)], Ops::Diff([dr, dg, db]) => vec![(1 << 6) | ((cd(dr) << 4) | (cd(dg) << 2) | cd(db)) ], Ops::Luma([dr, dg, db]) => vec![(2 << 6) | clg(dg), (clrb(dr) << 4) | clrb(db)], @@ -75,7 +75,7 @@ fn encode_body (header: Header, data: &[u8]) -> Option> { // INDEX -> DIFF -> LUMA -> RGB(A) if known[hash] == rgba { cur = Ops::Index(hash); - } else if let Some(ops) = diff_ops([r, g, b], [last[0], last[1], last[2]]) { + } else if let Some(ops) = diff_ops([last[0], last[1], last[2]], [r, g, b]) { cur = ops; } else { cur = header.channels.ops_color(&rgba[..header.channels.num()])?; @@ -90,7 +90,7 @@ fn encode_body (header: Header, data: &[u8]) -> Option> { } -fn encode_full (header: Header, bytes: &[u8]) -> Option> { +pub fn encode_full (header: Header, bytes: &[u8]) -> Option> { let mut out = Vec::with_capacity(header.width as usize * header.height as usize * 4); out.extend_from_slice(&encode_header(header)?); out.extend_from_slice(&encode_body(header, bytes)?); @@ -103,8 +103,6 @@ fn encode_full (header: Header, bytes: &[u8]) -> Option> { #[cfg(test)] mod test { use std::time::Instant; - - use super::*; #[test]