libwebp-sys2 0.2.0

A handwritten raw interface to libwebp
Documentation
#![cfg(feature = "demux")]

use libwebp_sys::{WebPData, WebPDemux, WebPDemuxDelete};

const WEBP_IMAGE: [u8; 94] = [
    0x52, 0x49, 0x46, 0x46, 0x56, 0x00, 0x00, 0x00, 0x57, 0x45, 0x42, 0x50, 0x56, 0x50, 0x38, 0x20,
    0x4A, 0x00, 0x00, 0x00, 0xD0, 0x01, 0x00, 0x9D, 0x01, 0x2A, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00,
    0x34, 0x25, 0xA8, 0x02, 0x74, 0x01, 0x0E, 0xFE, 0x03, 0x8E, 0x00, 0x00, 0xFE, 0xAD, 0xFF, 0xF1,
    0x5C, 0xB4, 0xF8, 0xED, 0xFF, 0xF0, 0xC0, 0xBA, 0xBF, 0x93, 0x05, 0xEA, 0x0C, 0x9F, 0x93, 0x3F,
    0xE8, 0xC0, 0xBF, 0x3F, 0xFF, 0xA9, 0xBF, 0xFF, 0x24, 0x7B, 0xCB, 0xFF, 0x46, 0x05, 0xF9, 0xFF,
    0xFD, 0x4D, 0xFE, 0x30, 0xE5, 0x86, 0xAA, 0x07, 0x31, 0x23, 0x6F, 0x00, 0x00, 0x00,
];

#[test]
fn test_new_and_delete() {
    unsafe {
        let data = WebPData {
            bytes: WEBP_IMAGE.as_ptr(),
            size: WEBP_IMAGE.len(),
        };
        let ptr = WebPDemux(&data);
        assert!(!ptr.is_null());
        WebPDemuxDelete(ptr);
    }
}

#[test]
#[cfg(all(feature = "0_5", feature = "demux"))]
fn test_anim_decoder() {
    use std::fs::File;
    use std::io::prelude::*;
    use std::mem;

    use libwebp_sys::{
        WebPAnimDecoderDelete, WebPAnimDecoderGetInfo, WebPAnimDecoderGetNext,
        WebPAnimDecoderHasMoreFrames, WebPAnimDecoderNew, WebPAnimDecoderOptionsInit,
    };

    unsafe {
        let mut buf = Vec::new();
        let len = File::open("./tests/animated.webp")
            .unwrap()
            .read_to_end(&mut buf)
            .unwrap();
        let mut options = mem::zeroed();
        assert!(WebPAnimDecoderOptionsInit(&mut options) != 0);

        let data = WebPData {
            bytes: buf.as_ptr(),
            size: len,
        };
        let decoder = WebPAnimDecoderNew(&data, &options);
        assert!(!decoder.is_null());

        let mut info = mem::zeroed();
        assert!(WebPAnimDecoderGetInfo(decoder, &mut info) != 0);

        assert_eq!(info.loop_count, 0);
        assert_eq!(info.frame_count, 10);
        assert_eq!(info.canvas_width, 400);
        assert_eq!(info.canvas_height, 400);

        assert!(WebPAnimDecoderHasMoreFrames(decoder) > 0);

        let mut expected_timestamp = 40;

        while WebPAnimDecoderHasMoreFrames(decoder) > 0 {
            let mut buf = std::ptr::null_mut();
            let buf_ptr: *mut *mut u8 = &mut buf;
            let mut timestamp: i32 = 42;
            assert!(WebPAnimDecoderGetNext(decoder, buf_ptr, &mut timestamp) > 0);

            assert_eq!(timestamp, expected_timestamp);
            expected_timestamp += 40;
        }

        WebPAnimDecoderDelete(decoder);
    }
}