Fixed bug

master
elfeiin 2024-02-10 05:18:12 -08:00
parent e6e403eb36
commit 1775bbc171
Signed by: elfein
GPG Key ID: A53FDD4FD091A276
4 changed files with 136 additions and 171 deletions

28
Cargo.lock generated
View File

@ -51,9 +51,21 @@ dependencies = [
[[package]]
name = "either"
version = "1.9.0"
version = "1.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07"
checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a"
[[package]]
name = "exf"
version = "0.1.0"
dependencies = [
"arbitrary-int",
"bilge",
"bitstream-io",
"bitvec",
"either",
"ux",
]
[[package]]
name = "funty"
@ -70,18 +82,6 @@ dependencies = [
"either",
]
[[package]]
name = "pictext"
version = "0.1.0"
dependencies = [
"arbitrary-int",
"bilge",
"bitstream-io",
"bitvec",
"either",
"ux",
]
[[package]]
name = "proc-macro-error"
version = "1.0.4"

View File

@ -1,5 +1,5 @@
[package]
name = "pictext"
name = "exf"
version = "0.1.0"
edition = "2021"

View File

View File

@ -1,17 +1,93 @@
use bitstream_io::{BigEndian, BitRead, BitReader, BitWrite, BitWriter, Endianness};
use bitvec::{slice::BitSlice, vec::BitVec};
use bitvec::{field::BitField, slice::BitSlice, vec::BitVec};
use std::{
io::{Read, Write},
ops::Index,
cell::{Cell, RefCell},
ops::{DerefMut, Range},
};
mod bits;
use bits::*;
use either::Either;
use ux::u1;
pub fn read_quad_tree(input: &mut &BitSlice) {}
pub fn split_each_mut<'a>(
array2: &'a mut [&'a mut BitSlice<u8>],
at: usize,
) -> (
&'a mut [&'a mut BitSlice<u8>],
&'a mut [&'a mut BitSlice<u8>],
) {
let a = &mut [];
let b = &mut [];
for (i, row) in array2.iter_mut().enumerate() {
let c = row.split_at_mut(at);
(a[i], b[i]) = (
c.0.bit_domain_mut().region().unwrap().1,
c.1.bit_domain_mut().region().unwrap().1,
);
}
(a, b)
}
pub fn read_char_bits(input: &mut &BitSlice) -> BitVec {
pub fn index_2d<'a>(
mut input: &'a mut [&'a mut BitSlice<u8>],
index: (Range<usize>, Range<usize>),
) -> Vec<&'a mut BitSlice<u8>> {
let mut output = Vec::new();
for row in input[index.1].iter_mut() {
output.push(&mut row[index.0.clone()])
}
output
}
pub fn write_each(value: bool, output: &mut [&mut BitSlice<u8>]) {
for row in output {
for mut bit in row.iter_mut() {
bit.set(value);
}
}
}
pub fn read_quad_tree<'a>(input: &mut &BitSlice, output: &'a mut [&'a mut BitSlice<u8>]) {
let (i0, i1, i2, i3) = (input[0], input[1], input[2], input[3]);
*input = &input[4..];
let hlen = output.first().map_or(0, |f| f.len());
let vlen = output.len();
let hmid = hlen / 2;
let vmid = vlen / 2;
let temp_share = RefCell::new(output);
let mut q0 = index_2d(unsafe { *temp_share.as_ptr() }, (0..hmid, 0..vmid));
let mut q1 = index_2d(unsafe { *temp_share.as_ptr() }, (hmid..hlen, 0..vmid));
let mut q2 = index_2d(unsafe { *temp_share.as_ptr() }, (0..hmid, vmid..vlen));
let mut q3 = index_2d(unsafe { *temp_share.as_ptr() }, (hmid..hlen, vmid..vlen));
if hlen == 2 || vlen == 2 {
q0[0].set(0, i0);
q1[0].set(0, i1);
q2[0].set(0, i2);
q3[0].set(0, i3);
} else {
if i0 {
read_quad_tree(input, &mut q0);
} else {
write_each(input[0], &mut q0);
*input = &input[1..];
}
if i1 {
read_quad_tree(input, &mut q1);
} else {
write_each(input[0], &mut q1);
*input = &input[1..];
}
if i2 {
read_quad_tree(input, &mut q2);
} else {
write_each(input[0], &mut q2);
*input = &input[1..];
}
if i3 {
read_quad_tree(input, &mut q3);
} else {
write_each(input[0], &mut q3);
*input = &input[1..];
}
}
}
pub fn read_element_bits(input: &mut &BitSlice) -> BitVec {
let mut output = BitVec::new();
let mut end = 0;
for byte in input.chunks(8) {
@ -25,6 +101,41 @@ pub fn read_char_bits(input: &mut &BitSlice) -> BitVec {
output
}
pub enum Element {
ControlCode {
data: u128,
},
Glyph {
courtesy_space: bool,
image_data: Vec<BitVec<u8>>,
},
}
pub fn parse_element(input: &mut &BitSlice) -> Element {
let element_bits = read_element_bits(input);
let is_glyph = input[0];
*input = &input[1..];
if is_glyph {
let cs = input[0];
*input = &input[1..];
let mut image_data = vec![BitVec::<u8>::repeat(false, 64); 64];
let slice2d = &mut [];
for (i, row) in image_data.iter_mut().enumerate() {
slice2d[i] = &mut row[..];
}
read_quad_tree(&mut &element_bits[..], slice2d);
Element::Glyph {
courtesy_space: cs,
image_data,
}
} else {
Element::ControlCode {
data: input.load_le(),
}
}
}
// Subject to change
pub enum ControlCode {
DirectionRightDown = 4,
@ -32,149 +143,3 @@ pub enum ControlCode {
DirectionRightUp = 6,
DirectionLeftUp = 7,
}
pub struct Character {
pub x_offset: i8,
pub y_offset: i8,
pub control_code: Option<u8>,
pub graphical_data: Option<[u8; 512]>,
}
pub struct QuadNode<T> {
q0: T,
q1: T,
q2: T,
q3: T,
}
impl<T> Index<usize> for QuadNode<T> {
type Output = T;
fn index(&self, index: usize) -> &Self::Output {
match index {
0 => &self.q0,
1 => &self.q1,
2 => &self.q2,
3 => &self.q3,
_ => panic![
"Index out of bounds: QuadNode can be indexed up to 4 but the index was {index}"
],
}
}
}
pub type GraphicalData = QuadNode<
Either<
QuadNode<
Either<
QuadNode<Either<QuadNode<Either<QuadNode<Either<QuadNode<u1>, u1>>, u1>>, u1>>,
u1,
>,
>,
u1,
>,
>;
pub fn read_int() {}
pub fn decode(input: &[u8]) -> Vec<Character> {
let mut input = BitReaderWrapper {
bit_count: 0,
bitreader: BitReader::<&[u8], BigEndian>::new(input),
};
let mut output = vec![];
while let Ok(graphical) = input.bitreader.read_bit() {
input.bit_count += 1;
if graphical {
let offset_x = input.read_bit().unwrap();
let offset_y = input.read_bit().unwrap();
let mut x_offset = 0i8;
let mut y_offset = 0i8;
if offset_x {
x_offset = input.read::<i8>(7).unwrap();
}
if offset_y {
y_offset = input.read_signed::<i8>(7).unwrap();
}
let mut map = [0u64; 64];
let mut value = None;
let mut erase: i8 = -1;
for (index, shift, q) in (0..4096).map(|n| {
(
n / 64 as usize,
n % 64 as usize,
[
(n / 1024 % 4) as u8,
(n / 256 % 4) as u8,
(n / 64 % 4) as u8,
(n / 16 % 4) as u8,
(n / 4 % 4) as u8,
(n % 4) as u8,
],
)
}) {
// Check start of sub tree traversals to see if cached homogeneity.
for i in 0..q.len() as i8 {
if value.is_none() {
if q.ends_with(&vec![0; q.len() - i as usize]) {
if input.read_bit().unwrap() {
erase = i;
value = Some(input.read_bit().unwrap());
}
}
}
}
map[index] |= if let Some(v) = value {
if v {
1 << shift
} else {
0
}
} else if input.read_bit().unwrap() {
1 << shift
} else {
0
};
// Check ends of traversals to reset state.
for i in 0..q.len() as i8 {
if q.ends_with(&vec![3; q.len() - i as usize]) {
if erase == i {
value = None;
erase = -1;
}
}
}
}
let mut raster_data: [u8; 512] = [0; 512];
let mut iter = map.iter().map(|t6| t6.to_le_bytes()).flatten();
raster_data.fill_with(|| iter.next().unwrap());
output.push(Character {
x_offset,
y_offset,
control_code: None,
graphical_data: Some(raster_data),
});
input.skip(8 - input.bit_count as u32 % 8).ok();
} else {
output.push(Character {
x_offset: 0,
y_offset: 0,
control_code: input.read::<u8>(7).unwrap().into(),
graphical_data: None,
})
}
}
output
}
pub fn encode(input: &[Character]) -> Vec<u8> {
let mut tree_data = vec![];
let mut output = BitWriter::<&mut Vec<u8>, BigEndian>::new(&mut tree_data);
for character in input {
if let Some(raster) = character.graphical_data {
output.write_bit(true);
}
}
tree_data
}