about summary refs log tree commit diff
path: root/gifprobe/src
diff options
context:
space:
mode:
authorGenny <gen@nyble.dev>2021-11-21 18:35:57 -0600
committerGenny <gen@nyble.dev>2021-11-21 18:35:57 -0600
commit1de64a3818875947f7f1044b1d4cfdf271b04fd3 (patch)
tree3a5bfbb237d67832dfa1beeb3d28566173484b63 /gifprobe/src
parentf35e18cb0531e7d6a3544560746d592aa47ed555 (diff)
downloadgifed-1de64a3818875947f7f1044b1d4cfdf271b04fd3.tar.gz
gifed-1de64a3818875947f7f1044b1d4cfdf271b04fd3.zip
Bring gifprobe into this repository
Diffstat (limited to 'gifprobe/src')
-rw-r--r--gifprobe/src/main.rs107
1 files changed, 107 insertions, 0 deletions
diff --git a/gifprobe/src/main.rs b/gifprobe/src/main.rs
new file mode 100644
index 0000000..3af9a50
--- /dev/null
+++ b/gifprobe/src/main.rs
@@ -0,0 +1,107 @@
+use std::{convert::TryInto, fs::File, io::Write, path::Path};
+
+use gifed::{
+    block::{
+        extension::{Extension, GraphicControl},
+        ColorTable, IndexedImage, Version,
+    },
+    reader::GifReader,
+    writer::{GifBuilder, ImageBuilder},
+    Color,
+};
+use owo_colors::OwoColorize;
+
+fn main() {
+    let file = if let Some(file) = std::env::args().skip(1).next() {
+        file
+    } else {
+        println!("usage: gifprobe file.gif");
+        return;
+    };
+
+    let gif = GifReader::file(&file).unwrap();
+
+    println!("Version {}", gif.header.yellow());
+    println!(
+        "Logical Screen Descriptor\n\tDimensions {}x{}",
+        gif.screen_descriptor.width.yellow(),
+        gif.screen_descriptor.height.yellow()
+    );
+
+    if gif.screen_descriptor.color_table_present() {
+        println!(
+            "\tGlobal Color Table Present {}\n\tGlobal Color Table Size {}",
+            "Yes".green(),
+            gif.screen_descriptor.color_table_len().green()
+        );
+    } else {
+        println!(
+            "\tGlobal Color Table Present {}\n\tGlobal Color Table Size {}",
+            "No".red(),
+            gif.screen_descriptor.color_table_len().red()
+        );
+    }
+
+    let mut img_count = 0;
+    let mut hundreths: usize = 0;
+
+    for block in gif.blocks {
+        match block {
+            gifed::block::Block::IndexedImage(img) => {
+                describe_image(&img);
+                img_count += 1;
+            }
+            gifed::block::Block::Extension(ext) => match ext {
+                gifed::block::extension::Extension::GraphicControl(gce) => {
+                    hundreths += gce.delay_time() as usize;
+
+                    println!(
+                        "Graphic Control Extension\n\tDelay Time {}\n\tDispose {}",
+                        format!("{}s", gce.delay_time() as f32 / 100.0).yellow(),
+                        gce.disposal_method().unwrap().yellow()
+                    )
+                }
+                gifed::block::extension::Extension::Looping(_) => todo!(),
+                gifed::block::extension::Extension::Comment(cmt) => {
+                    println!("Comment Extension\n\tLength {}", cmt.len())
+                }
+                gifed::block::extension::Extension::Application(app) => {
+                    let auth = app.authentication_code();
+                    println!("Application Extension\n\tIdentifier {}\n\tAuthentication {:02X} {:02X} {:02X}",app.identifier().yellow(), auth[0].yellow(), auth[1].yellow(), auth[2].yellow());
+                }
+            },
+        }
+    }
+
+    println!(
+        "{} is {}.{}s long and has {} frames",
+        file,
+        hundreths / 100,
+        hundreths % 100,
+        img_count
+    );
+}
+
+fn describe_image(bli: &IndexedImage) {
+    println!(
+        "Image\n\tOffset {}x{}\n\tDimensions {}x{}",
+        bli.image_descriptor.left.yellow(),
+        bli.image_descriptor.top.yellow(),
+        bli.image_descriptor.width.yellow(),
+        bli.image_descriptor.height.yellow(),
+    );
+
+    if bli.image_descriptor.color_table_present() {
+        println!(
+            "\tLocal Color Table Present {}\n\tLocal Color Table Size {}",
+            "Yes".green(),
+            bli.image_descriptor.color_table_size().green()
+        );
+    } else {
+        println!(
+            "\tLocal Color Table Present {}\n\tLocal Color Table Size {}",
+            "No".red(),
+            bli.image_descriptor.color_table_size().red()
+        );
+    }
+}