aboutsummaryrefslogtreecommitdiff
path: root/vendor/gif/examples
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/gif/examples')
-rw-r--r--vendor/gif/examples/check.rs41
-rw-r--r--vendor/gif/examples/explode.rs44
2 files changed, 85 insertions, 0 deletions
diff --git a/vendor/gif/examples/check.rs b/vendor/gif/examples/check.rs
new file mode 100644
index 0000000..89a6123
--- /dev/null
+++ b/vendor/gif/examples/check.rs
@@ -0,0 +1,41 @@
+use std::{env, fs, process};
+
+fn main() {
+ let file = env::args().nth(1)
+ .unwrap_or_else(|| explain_usage());
+ let file = fs::File::open(&file)
+ .expect("failed to open input file");
+ let mut reader = {
+ let mut options = gif::DecodeOptions::new();
+ options.allow_unknown_blocks(true);
+ options.read_info(file).unwrap()
+ };
+
+ loop {
+ let frame = match reader.read_next_frame() {
+ Ok(Some(frame)) => frame,
+ Ok(None) => break,
+ Err(error) => {
+ println!("Error: {:?}", error);
+ break;
+ }
+ };
+
+ println!(
+ " Frame:\n \
+ delay: {:?}\n \
+ canvas: {}x{}+{}+{}\n \
+ dispose: {:?}\n \
+ needs_input: {:?}",
+ frame.delay,
+ frame.width, frame.height, frame.left, frame.top,
+ frame.dispose,
+ frame.needs_user_input
+ );
+ }
+}
+
+fn explain_usage() -> ! {
+ println!("Print information on the frames of a gif.\n\nUsage: check <file>");
+ process::exit(1)
+}
diff --git a/vendor/gif/examples/explode.rs b/vendor/gif/examples/explode.rs
new file mode 100644
index 0000000..caa3c34
--- /dev/null
+++ b/vendor/gif/examples/explode.rs
@@ -0,0 +1,44 @@
+//! Exports each GIF frame as a separate image.
+
+use std::env;
+use std::fs::File;
+use std::path::PathBuf;
+
+fn main() -> Result<(), Box<dyn std::error::Error>> {
+ let input_path = PathBuf::from(
+ env::args_os()
+ .nth(1)
+ .ok_or("Specify a GIF path as the first argument")?,
+ );
+
+ let input = File::open(&input_path)?;
+ let mut options = gif::DecodeOptions::new();
+ options.set_color_output(gif::ColorOutput::Indexed);
+ let mut decoder = options.read_info(input)?;
+ let screen_width = decoder.width();
+ let screen_height = decoder.height();
+ let global_pal = decoder.global_palette().unwrap_or_default().to_vec();
+
+ let output_file_stem = input_path.file_stem().unwrap().to_str().unwrap();
+ let mut frame_number = 1;
+ while let Some(frame) = decoder.read_next_frame()? {
+ let output_path = format!("{}.{:03}.gif", output_file_stem, frame_number);
+ let mut output = File::create(&output_path)?;
+ let mut encoder = gif::Encoder::new(&mut output, screen_width, screen_height, &global_pal)?;
+ encoder.write_frame(&frame)?;
+ frame_number += 1;
+
+ use gif::DisposalMethod::*;
+ let disposal = match frame.dispose {
+ Any => "any",
+ Keep => "keep",
+ Background => "background",
+ Previous => "previous",
+ };
+ eprintln!(
+ "Written {} ({}x{}@{}x{} delay={} {})",
+ output_path, frame.width, frame.height, frame.top, frame.left, frame.delay, disposal
+ );
+ }
+ Ok(())
+}