diff options
Diffstat (limited to 'src/gif.rs')
-rw-r--r-- | src/gif.rs | 45 |
1 files changed, 43 insertions, 2 deletions
diff --git a/src/gif.rs b/src/gif.rs index f6ff345..e6ad70f 100644 --- a/src/gif.rs +++ b/src/gif.rs @@ -1,4 +1,4 @@ -use crate::block::{Block, ColorTable, ScreenDescriptor, Version}; +use crate::block::{Block, ColorTable, extension::Extension, ScreenDescriptor, Version}; pub struct Gif { pub header: Version, pub screen_descriptor: ScreenDescriptor, @@ -32,6 +32,10 @@ impl Gif { Block::IndexedImage(image) => { boxed = image.as_boxed_slice(mcs); out.extend_from_slice(&*boxed); + }, + Block::Extension(ext) => { + boxed = ext.into(); + out.extend_from_slice(&*boxed); } } } @@ -47,10 +51,11 @@ impl Gif { pub mod gif { use crate::Color; use crate::writer::{GifBuilder, ImageBuilder}; + use crate::block::extension::{DisposalMethod, GraphicControl}; use super::*; #[test] - fn to_vec() { + fn to_vec_gif87a() { let gct = vec![ Color::new(1, 2, 3), Color::new(253, 254, 255) ]; @@ -82,4 +87,40 @@ pub mod gif { assert_eq!(actual_out, expected_out); } + + #[test] + fn to_vec_gif89a() { + let gct = vec![ + Color::new(1, 2, 3), Color::new(253, 254, 255) + ]; + let colortable = vec![ + Color::new(0, 0, 0), Color::new(128, 0, 255) + ]; + let indicies = vec![0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0]; + + let expected_out = vec![ + 0x47, 0x49, 0x46, 0x38, 0x37, 0x61, // Version - GIF87a + 0x04, 0x00, 0x04, 0x00, 0b1000_0000, 0x00, 0x00, // Logical Screen Descriptor + 1, 2, 3, 253, 254, 255, // Global Color Table + 0x2C, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0b1000_0000, // Image Descriptor 1 + 0, 0, 0, 128, 0, 255, // Color Table + 0x02, 0x05, 0x84, 0x1D, 0x81, 0x7A, 0x50, 0x00, // Image Data 1 + 0x21, 0xF9, 0x04, 0b000_010_0_0, 0x40, 0x00, 0x00, 0x00, // Graphic Control Extension + 0x2C, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0b0000_0000, // Image Descriptor 2 + 0x02, 0x05, 0x84, 0x1D, 0x81, 0x7A, 0x50, 0x00, // Image Data 2 + 0x3B // Trailer + ]; + + let actual_out = GifBuilder::new(Version::Gif87a, 4, 4) + .global_color_table(gct.into()) + .image(ImageBuilder::new(4, 4) + .color_table(colortable.into()) + .indicies(indicies.clone()) + ).extension(Extension::GraphicControl(GraphicControl::new(DisposalMethod::RestoreBackground, false, false, 64, 0))) + .image(ImageBuilder::new(4, 4) + .indicies(indicies) + ).build().to_vec(); + + assert_eq!(actual_out, expected_out); + } } \ No newline at end of file |