switch 8x8 cell diff to vertical
This commit is contained in:
parent
b85cb52ce0
commit
242724d7fd
4 changed files with 29 additions and 27 deletions
3
.gitignore
vendored
3
.gitignore
vendored
|
@ -5,3 +5,6 @@
|
||||||
*.map
|
*.map
|
||||||
*.pdf
|
*.pdf
|
||||||
target/
|
target/
|
||||||
|
*.png
|
||||||
|
*.mp4
|
||||||
|
*.webm
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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!(),
|
||||||
|
|
Loading…
Reference in a new issue