use crate::{ block::{Block, BlockInner}, frame::Frame, view::View, }; pub fn encode_block(view: View<&Frame>, prev: View<&Frame>) -> Block { let diff = View::diff(&view, &prev) / view.area() as f64; // eprintln!("{:?} {diff}", view.size); let inner = if diff < 0.9 { BlockInner::Reference { translation: (0, 0), } } else { if view.size.0 < 16 { BlockInner::Literal(view.pixels()) } else { let [av, bv] = view.split(); let [ap, bp] = prev.split(); let a = encode_block(av, ap); let b = encode_block(bv, bp); if a.is_literal() && b.is_literal() { BlockInner::Literal(view.pixels()) } else { BlockInner::Split(Box::new([a, b])) } } }; Block { size: view.size, inner, } }