(Clippy fixes across the board)
This commit is contained in:
parent
b315ea20a7
commit
637ac22a99
7 changed files with 61 additions and 69 deletions
108
src/decode.rs
108
src/decode.rs
|
|
@ -10,6 +10,11 @@ use crate::header::Header;
|
|||
use crate::pixel::{Pixel, SupportedChannels};
|
||||
use crate::utils::{cold, unlikely};
|
||||
|
||||
const QOI_OP_INDEX_END: u8 = QOI_OP_INDEX | 0x3f;
|
||||
const QOI_OP_RUN_END: u8 = QOI_OP_RUN | 0x3d; // <- note, 0x3d (not 0x3f)
|
||||
const QOI_OP_DIFF_END: u8 = QOI_OP_DIFF | 0x3f;
|
||||
const QOI_OP_LUMA_END: u8 = QOI_OP_LUMA | 0x3f;
|
||||
|
||||
pub fn qoi_decode_impl<const N: usize, const RGBA: bool>(
|
||||
data: &[u8], n_pixels: usize,
|
||||
) -> Result<Vec<u8>>
|
||||
|
|
@ -24,11 +29,6 @@ where
|
|||
});
|
||||
}
|
||||
|
||||
const QOI_OP_INDEX_END: u8 = QOI_OP_INDEX | 0x3f;
|
||||
const QOI_OP_RUN_END: u8 = QOI_OP_RUN | 0x3d; // <- note, 0x3d (not 0x3f)
|
||||
const QOI_OP_DIFF_END: u8 = QOI_OP_DIFF | 0x3f;
|
||||
const QOI_OP_LUMA_END: u8 = QOI_OP_LUMA | 0x3f;
|
||||
|
||||
let mut out = vec![0; n_pixels * N]; // unnecessary zero-init, but w/e
|
||||
let mut pixels = cast_slice_mut::<_, [u8; N]>(&mut out);
|
||||
let mut data = &data[QOI_HEADER_SIZE..];
|
||||
|
|
@ -36,65 +36,57 @@ where
|
|||
let mut index = [Pixel::<N>::new(); 256];
|
||||
let mut px = Pixel::<N>::new().with_a(0xff);
|
||||
|
||||
loop {
|
||||
match pixels {
|
||||
[px_out, ptail @ ..] => {
|
||||
pixels = ptail;
|
||||
match data {
|
||||
[b1 @ QOI_OP_INDEX..=QOI_OP_INDEX_END, dtail @ ..] => {
|
||||
px = index[usize::from(*b1)];
|
||||
*px_out = px.into();
|
||||
data = dtail;
|
||||
continue;
|
||||
}
|
||||
[QOI_OP_RGB, r, g, b, dtail @ ..] => {
|
||||
px = Pixel::from_rgb(Pixel::from_array([*r, *g, *b]), px.a_or(0xff));
|
||||
data = dtail;
|
||||
}
|
||||
[QOI_OP_RGBA, r, g, b, a, dtail @ ..] if RGBA => {
|
||||
px = Pixel::from_array([*r, *g, *b, *a]);
|
||||
data = dtail;
|
||||
}
|
||||
[b1 @ QOI_OP_RUN..=QOI_OP_RUN_END, dtail @ ..] => {
|
||||
*px_out = px.into();
|
||||
let run = usize::from(b1 & 0x3f).min(pixels.len());
|
||||
let (phead, ptail) = pixels.split_at_mut(run); // can't panic
|
||||
phead.fill(px.into());
|
||||
pixels = ptail;
|
||||
data = dtail;
|
||||
continue;
|
||||
}
|
||||
[b1 @ QOI_OP_DIFF..=QOI_OP_DIFF_END, dtail @ ..] => {
|
||||
px.rgb_add(
|
||||
((b1 >> 4) & 0x03).wrapping_sub(2),
|
||||
((b1 >> 2) & 0x03).wrapping_sub(2),
|
||||
(b1 & 0x03).wrapping_sub(2),
|
||||
);
|
||||
data = dtail;
|
||||
}
|
||||
[b1 @ QOI_OP_LUMA..=QOI_OP_LUMA_END, b2, dtail @ ..] => {
|
||||
let vg = (b1 & 0x3f).wrapping_sub(32);
|
||||
let vg_8 = vg.wrapping_sub(8);
|
||||
let vr = vg_8.wrapping_add((b2 >> 4) & 0x0f);
|
||||
let vb = vg_8.wrapping_add(b2 & 0x0f);
|
||||
px.rgb_add(vr, vg, vb);
|
||||
data = dtail;
|
||||
}
|
||||
_ => {
|
||||
cold();
|
||||
if unlikely(data.len() < 8) {
|
||||
return Err(Error::UnexpectedBufferEnd);
|
||||
}
|
||||
}
|
||||
}
|
||||
index[usize::from(px.hash_index())] = px;
|
||||
while let [px_out, ptail @ ..] = pixels {
|
||||
pixels = ptail;
|
||||
match data {
|
||||
[b1 @ QOI_OP_INDEX..=QOI_OP_INDEX_END, dtail @ ..] => {
|
||||
px = index[usize::from(*b1)];
|
||||
*px_out = px.into();
|
||||
data = dtail;
|
||||
continue;
|
||||
}
|
||||
[QOI_OP_RGB, r, g, b, dtail @ ..] => {
|
||||
px = Pixel::from_rgb(Pixel::from_array([*r, *g, *b]), px.a_or(0xff));
|
||||
data = dtail;
|
||||
}
|
||||
[QOI_OP_RGBA, r, g, b, a, dtail @ ..] if RGBA => {
|
||||
px = Pixel::from_array([*r, *g, *b, *a]);
|
||||
data = dtail;
|
||||
}
|
||||
[b1 @ QOI_OP_RUN..=QOI_OP_RUN_END, dtail @ ..] => {
|
||||
*px_out = px.into();
|
||||
let run = usize::from(b1 & 0x3f).min(pixels.len());
|
||||
let (phead, ptail) = pixels.split_at_mut(run); // can't panic
|
||||
phead.fill(px.into());
|
||||
pixels = ptail;
|
||||
data = dtail;
|
||||
continue;
|
||||
}
|
||||
[b1 @ QOI_OP_DIFF..=QOI_OP_DIFF_END, dtail @ ..] => {
|
||||
px.rgb_add(
|
||||
((b1 >> 4) & 0x03).wrapping_sub(2),
|
||||
((b1 >> 2) & 0x03).wrapping_sub(2),
|
||||
(b1 & 0x03).wrapping_sub(2),
|
||||
);
|
||||
data = dtail;
|
||||
}
|
||||
[b1 @ QOI_OP_LUMA..=QOI_OP_LUMA_END, b2, dtail @ ..] => {
|
||||
let vg = (b1 & 0x3f).wrapping_sub(32);
|
||||
let vg_8 = vg.wrapping_sub(8);
|
||||
let vr = vg_8.wrapping_add((b2 >> 4) & 0x0f);
|
||||
let vb = vg_8.wrapping_add(b2 & 0x0f);
|
||||
px.rgb_add(vr, vg, vb);
|
||||
data = dtail;
|
||||
}
|
||||
_ => {
|
||||
cold();
|
||||
break;
|
||||
if unlikely(data.len() < 8) {
|
||||
return Err(Error::UnexpectedBufferEnd);
|
||||
}
|
||||
}
|
||||
}
|
||||
index[usize::from(px.hash_index())] = px;
|
||||
*px_out = px.into();
|
||||
}
|
||||
|
||||
Ok(out)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue