From 4df7c1f1cbe0c3f79eec6be2474aead263f166c8 Mon Sep 17 00:00:00 2001 From: metamuffin Date: Tue, 20 Dec 2022 08:57:35 +0100 Subject: infra for compressed literal --- evc/src/block.rs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'evc/src/block.rs') diff --git a/evc/src/block.rs b/evc/src/block.rs index cbf69bf..69cc460 100644 --- a/evc/src/block.rs +++ b/evc/src/block.rs @@ -1,5 +1,5 @@ use crate::{ - format::ser::{ConstSizeSerExt, Sink, Small, Source}, + format::ser::{ConstSizeSerExt, Ser, Sink, Small, Source}, helpers::vector::Vec2, helpers::{matrix::Mat2, pixel::Pixel}, }; @@ -8,7 +8,7 @@ use anyhow::bail; #[derive(Clone, Debug, PartialEq)] pub enum Block { Literal(Vec), - CompressedLiteral(Vec), + CompressedLiteral(Vec), Split(Box<[Block; 2]>), Reference { translation: Vec2 }, AdvancedReference(AdvancedReference), @@ -32,7 +32,10 @@ impl Block { sink.put(0u8)?; pixels.write_const_size(sink, size.area() as usize)?; } - Block::CompressedLiteral(_) => bail!("compressed literal is not supported"), + Block::CompressedLiteral(data) => { + sink.put(1u8)?; + data.write(sink)?; + } Block::Split(box [a, b]) => { sink.put(2u8)?; let [asize, bsize] = split_size(size); @@ -58,7 +61,7 @@ impl Block { pub fn read(source: &mut impl std::io::Read, size: Vec2) -> anyhow::Result { Ok(match source.get::()? { 0 => Block::Literal(Vec::read_const_size(source, size.area() as usize)?), - 1 => bail!("compressed literal is not supported"), + 1 => Block::CompressedLiteral(Vec::read(source)?), 2 => Block::Split(Box::new({ let [asize, bsize] = split_size(size); let a = Block::read(source, asize)?; -- cgit v1.2.3-70-g09d2