about summary refs log tree commit diff
path: root/src/block/indexedimage.rs
diff options
context:
space:
mode:
authorGenny <gen@nyble.dev>2021-09-15 22:16:30 -0500
committerGenny <gen@nyble.dev>2021-09-15 22:16:30 -0500
commit7b8081a79fb3db4a76f9e4cca8f8a88e6e7f873c (patch)
tree5eab8cbf47698b031c12f8eadc4c55f674f70c01 /src/block/indexedimage.rs
parentcdedae673268c372beb27c6d2f123cdf21f630f1 (diff)
downloadgifed-7b8081a79fb3db4a76f9e4cca8f8a88e6e7f873c.tar.gz
gifed-7b8081a79fb3db4a76f9e4cca8f8a88e6e7f873c.zip
Reading, fix writing, monocommit
Diffstat (limited to 'src/block/indexedimage.rs')
-rw-r--r--src/block/indexedimage.rs87
1 files changed, 48 insertions, 39 deletions
diff --git a/src/block/indexedimage.rs b/src/block/indexedimage.rs
index ae2da06..52be3d5 100644
--- a/src/block/indexedimage.rs
+++ b/src/block/indexedimage.rs
@@ -1,45 +1,54 @@
-use crate::LZW;
+use std::convert::TryFrom;
+
 use super::{ColorTable, ImageDescriptor};
+use crate::LZW;
 
 pub struct IndexedImage {
-	pub image_descriptor: ImageDescriptor,
-	pub local_color_table: Option<ColorTable>,
-	pub indicies: Vec<u8>
+    pub image_descriptor: ImageDescriptor,
+    pub local_color_table: Option<ColorTable>,
+    pub indicies: Vec<u8>,
 }
 
 impl IndexedImage {
-	pub fn as_boxed_slice(&self, minimum_code_size: u8) -> Box<[u8]> {
-		let mut out = vec![];
-
-		let mut boxed: Box<[u8]> = (&self.image_descriptor).into();
-		out.extend_from_slice(&*boxed);
-
-		// Get the mcs while we write out the color table
-		let mut mcs = if let Some(lct) = &self.local_color_table {
-			boxed = lct.into();
-			out.extend_from_slice(&*boxed);
-
-			lct.packed_len()
-		} else {
-			minimum_code_size
-		};
-
-		if mcs < 2 {
-			mcs = 2; // Must be true: 0 <= mcs <= 8
-		}
-
-		// First write out the MCS
-		out.push(mcs);
-
-		let compressed = LZW::encode(mcs, &self.indicies);
-		
-		for chunk in compressed.chunks(255) {
-			out.push(chunk.len() as u8);
-			out.extend_from_slice(chunk);
-		}
-		// Data block length 0 to indicate an end
-		out.push(0x00);
-
-		out.into_boxed_slice()
-	}
-}
\ No newline at end of file
+    pub fn as_boxed_slice(&self, minimum_code_size: u8) -> Box<[u8]> {
+        let mut out = vec![];
+
+        let mut boxed: Box<[u8]> = (&self.image_descriptor).into();
+        out.extend_from_slice(&*boxed);
+
+        // Get the mcs while we write out the color table
+        let mut mcs = if let Some(lct) = &self.local_color_table {
+            boxed = lct.into();
+            out.extend_from_slice(&*boxed);
+
+            lct.packed_len()
+        } else {
+            minimum_code_size + 1
+        };
+
+        if mcs < 2 {
+            mcs = 2; // Must be true: 0 <= mcs <= 8
+        }
+
+        // First write out the MCS
+        out.push(mcs);
+
+        let compressed = LZW::encode(mcs, &self.indicies);
+
+        for chunk in compressed.chunks(255) {
+            out.push(chunk.len() as u8);
+            out.extend_from_slice(chunk);
+        }
+        // Data block length 0 to indicate an end
+        out.push(0x00);
+
+        out.into_boxed_slice()
+    }
+}
+
+pub struct BlockedImage {
+    pub image_descriptor: ImageDescriptor,
+    pub local_color_table: Option<ColorTable>,
+    pub lzw_minimum_code_size: u8,
+    pub blocks: Vec<Vec<u8>>,
+}