refactor: remove nop from ops list

This commit is contained in:
YK 2024-07-11 18:55:44 +03:00
parent 1e405bff30
commit c63d2bdcba
2 changed files with 3 additions and 6 deletions

View File

@ -61,7 +61,6 @@ pub enum Ops {
Diff ([i8; 3]), Diff ([i8; 3]),
Rgb (RgbColor), Rgb (RgbColor),
Rgba (RgbaColor), Rgba (RgbaColor),
Nop
} }
type RgbColor = [u8; 3]; type RgbColor = [u8; 3];

View File

@ -16,7 +16,6 @@ impl Ops {
let clrb = |diff: i8| cast_with_bias(diff, 8); let clrb = |diff: i8| cast_with_bias(diff, 8);
match self { match self {
Ops::Nop => (),
Ops::Rgb([r, g, b]) => buf.extend_from_slice(&[254, r, g, b]), Ops::Rgb([r, g, b]) => buf.extend_from_slice(&[254, r, g, b]),
Ops::Rgba([r, g, b, a]) => buf.extend_from_slice(&[255, r, g, b, a]), Ops::Rgba([r, g, b, a]) => buf.extend_from_slice(&[255, r, g, b, a]),
Ops::Index(idx) => buf.push(idx as u8), Ops::Index(idx) => buf.push(idx as u8),
@ -44,7 +43,7 @@ fn encode_body (header: Header, data: &[u8]) -> Option<Vec<u8>> {
let mut known = [[0u8; 4]; 64]; let mut known = [[0u8; 4]; 64];
let mut last = [0u8, 0, 0, 255]; let mut last = [0u8, 0, 0, 255];
let mut out = Vec::with_capacity(header.width as usize * header.height as usize); let mut out = Vec::with_capacity(header.width as usize * header.height as usize);
let mut cur = Ops::Nop; let mut cur = Ops::Rgba([0, 0, 0, 255]);
for mut chunk in &data.iter().chunks(header.channels.num()) { for mut chunk in &data.iter().chunks(header.channels.num()) {
let (&r, &g, &b) = chunk.next_tuple()?; let (&r, &g, &b) = chunk.next_tuple()?;
@ -57,9 +56,9 @@ fn encode_body (header: Header, data: &[u8]) -> Option<Vec<u8>> {
match cur { match cur {
// if run is in bounds 0..62 // if run is in bounds 0..62
Ops::Run(run) if run < 62 => cur = Ops::Run(run + 1), Ops::Run(run) if run < 62 => cur = Ops::Run(run + 1),
// if run is full, commit it to out vec, and start a new one // if run is full, write it, and start a new one
Ops::Run(run) if run >= 62 => { Ops::Run(run) if run >= 62 => {
cur = Ops::Run(62); // clamp for safety; cur = Ops::Run(62); // clamp for safety, or return None? @Q
cur.write_encoded(&mut out); cur.write_encoded(&mut out);
cur = Ops::Run(1); cur = Ops::Run(1);
}, },
@ -71,7 +70,6 @@ fn encode_body (header: Header, data: &[u8]) -> Option<Vec<u8>> {
if discriminant(&cur) == discriminant(&Ops::Run(0)) { if discriminant(&cur) == discriminant(&Ops::Run(0)) {
cur.write_encoded(&mut out); cur.write_encoded(&mut out);
} }
let hash = hash(rgba); let hash = hash(rgba);
// INDEX -> DIFF -> LUMA -> RGB(A) // INDEX -> DIFF -> LUMA -> RGB(A)
if known[hash] == rgba { if known[hash] == rgba {