about summary refs log tree commit diff
path: root/gifprobe
diff options
context:
space:
mode:
Diffstat (limited to 'gifprobe')
-rw-r--r--gifprobe/Cargo.toml14
-rw-r--r--gifprobe/src/main.rs107
2 files changed, 121 insertions, 0 deletions
diff --git a/gifprobe/Cargo.toml b/gifprobe/Cargo.toml
new file mode 100644
index 0000000..75047b8
--- /dev/null
+++ b/gifprobe/Cargo.toml
@@ -0,0 +1,14 @@
+[package]
+name = "gifprobe"
+version = "0.1.0"
+authors = ["Genevive Alfirevic <gen@nyble.dev"]
+edition = "2018"
+license = "CC0-1.0"
+description = "Print the details of a gif to stdout; ffprobe for gif"
+repository = "https://github.com/genuinebyte/gifed"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
+owo-colors = "2.0.0"
+gifed = { path = "../gifed" }
\ No newline at end of file
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()
+        );
+    }
+}