switch 8x8 cell diff to vertical

This commit is contained in:
Crispy 2024-04-12 17:43:49 +02:00
parent b85cb52ce0
commit 242724d7fd
4 changed files with 29 additions and 27 deletions

3
.gitignore vendored
View file

@ -5,3 +5,6 @@
*.map *.map
*.pdf *.pdf
target/ target/
*.png
*.mp4
*.webm

View file

@ -1,6 +1,6 @@
use crate::*; use crate::*;
pub fn cell_diff_8_horizontal(prev_frame: &Frame, encoded: &[u8], reader: &mut usize) -> Frame { pub fn cell_diff_8_vertical(prev_frame: &Frame, encoded: &[u8], reader: &mut usize) -> Frame {
let bitmap = { let bitmap = {
*reader += 3; *reader += 3;
let mut bitmap = (encoded[0] as u32) << 16; let mut bitmap = (encoded[0] as u32) << 16;
@ -15,23 +15,15 @@ pub fn cell_diff_8_horizontal(prev_frame: &Frame, encoded: &[u8], reader: &mut u
*reader += runs; *reader += runs;
let cells_x = WIDTH / 8; let cells_x = WIDTH / 8;
let cells_y = HEIGHT / 8;
let mut index = 0; let mut index = 0;
for celly in 0..cells_y { for x in 0..WIDTH {
for cellx in 0..cells_x { for y in 0..HEIGHT {
let cellx = x / 8;
let celly = y / 8;
let is_changed = (bitmap >> (cellx + cells_x * celly)) & 1; let is_changed = (bitmap >> (cellx + cells_x * celly)) & 1;
if is_changed == 1 { if is_changed == 1 {
let pixels = &new_pixels[(index * 8 * 8)..((index + 1) * 8 * 8)]; frame[x][y] = new_pixels[index];
let mut i = 0;
for dx in 0..8 {
for dy in 0..8 {
let x = cellx * 8 + dx;
let y = celly * 8 + dy;
frame[x][y] = pixels[i];
i += 1;
}
}
index += 1; index += 1;
} }
} }

View file

@ -1,6 +1,6 @@
use crate::*; use crate::*;
pub fn cell_diff_8_horizontal(prev_frame: &Frame, frame: &Frame) -> EncodedFrame { pub fn cell_diff_8_vertical(prev_frame: &Frame, frame: &Frame) -> EncodedFrame {
let cells_x = WIDTH / 8; let cells_x = WIDTH / 8;
let cells_y = HEIGHT / 8; let cells_y = HEIGHT / 8;
let loss = 0; let loss = 0;
@ -8,17 +8,15 @@ pub fn cell_diff_8_horizontal(prev_frame: &Frame, frame: &Frame) -> EncodedFrame
let mut bitmap: u32 = 0; let mut bitmap: u32 = 0;
let mut changed_pixels = Vec::new(); let mut changed_pixels = Vec::new();
for celly in 0..cells_y {
for cellx in 0..cells_x { for cellx in 0..cells_x {
for celly in 0..cells_y {
let mut changed = 0; let mut changed = 0;
let mut cell_contents = Vec::new();
// todo try encoding the cells in frame space instead of one cell at a time
for dx in 0..8 { for dx in 0..8 {
for dy in 0..8 { for dy in 0..8 {
let x = cellx * 8 + dx; let x = cellx * 8 + dx;
let y = celly * 8 + dy; let y = celly * 8 + dy;
let pixel = frame[x][y]; let pixel = frame[x][y];
cell_contents.push(pixel);
if pixel != prev_frame[x][y] { if pixel != prev_frame[x][y] {
changed += 1; changed += 1;
} }
@ -26,14 +24,23 @@ pub fn cell_diff_8_horizontal(prev_frame: &Frame, frame: &Frame) -> EncodedFrame
} }
if changed > loss { if changed > loss {
bitmap |= 1 << (cellx + cells_x * celly); bitmap |= 1 << (cellx + cells_x * celly);
changed_pixels.extend_from_slice(&cell_contents); }
}
}
for x in 0..WIDTH {
for y in 0..HEIGHT {
let cellx = x / 8;
let celly = y / 8;
let bit = 1 << (cellx + cells_x * celly);
if (bitmap & bit) != 0 {
changed_pixels.push(frame[x][y]);
} }
} }
} }
let mut data = vec![(bitmap >> 16) as u8, (bitmap >> 8) as u8, bitmap as u8]; let mut data = vec![(bitmap >> 16) as u8, (bitmap >> 8) as u8, bitmap as u8];
data.extend_from_slice(&rle_255_encode(&changed_pixels)); data.extend_from_slice(&rle_255_encode(&changed_pixels));
EncodedFrame { EncodedFrame {
encoding: Encoding::CellDiff8H, encoding: Encoding::CellDiff8V,
data, data,
} }
} }

View file

@ -57,7 +57,7 @@ fn encode(frames: &[Frame]) -> Vec<u8> {
enc::rle_diff_horizontal, enc::rle_diff_horizontal,
enc::rle_diff_vertical, enc::rle_diff_vertical,
enc::bg_strips_horizontal, enc::bg_strips_horizontal,
enc::cell_diff_8_horizontal, enc::cell_diff_8_vertical,
]; ];
let mut last_frame = FRAME_0; let mut last_frame = FRAME_0;
@ -109,8 +109,8 @@ enum Encoding {
// BGStripsV, // BGStripsV,
// QuadTree, // QuadTree,
// DrawCommands, // DrawCommands,
CellDiff8H, // CellDiff8H,
// CellDiff8V, CellDiff8V,
// CellDiff4HH, // CellDiff4HH,
// CellDiff4HV, // CellDiff4HV,
// CellDiff4VH, // CellDiff4VH,
@ -129,8 +129,8 @@ fn get_matching_decoder(encoding: Encoding) -> FrameDecoder {
// Encoding::BGStripsV => todo!(), // Encoding::BGStripsV => todo!(),
// Encoding::QuadTree => todo!(), // Encoding::QuadTree => todo!(),
// Encoding::DrawCommands => todo!(), // Encoding::DrawCommands => todo!(),
Encoding::CellDiff8H => dec::cell_diff_8_horizontal, // Encoding::CellDiff8H => todo!(),
// Encoding::CellDiff8V => todo!(), Encoding::CellDiff8V => dec::cell_diff_8_vertical,
// Encoding::CellDiff4HH => todo!(), // Encoding::CellDiff4HH => todo!(),
// Encoding::CellDiff4HV => todo!(), // Encoding::CellDiff4HV => todo!(),
// Encoding::CellDiff4VH => todo!(), // Encoding::CellDiff4VH => todo!(),