spng 0.1.0-alpha.5

Rust bindings to libspng
Documentation
use spng::Decoder;
use std::io::Cursor;

static TEST_PNG_001: &[u8] = include_bytes!("test-001.png");
static TEST_PNG_002: &[u8] = include_bytes!("test-002.png");

#[test]
fn decode_001_cursor() -> Result<(), Box<dyn std::error::Error>> {
    let cursor = Cursor::new(TEST_PNG_001);
    let decoder = Decoder::new(cursor);
    let (out_info, mut reader) = decoder.read_info()?;
    let output_buffer_size = reader.output_buffer_size();
    assert_eq!(300, out_info.width);
    assert_eq!(300, out_info.height);
    assert_eq!(8, out_info.bit_depth as u8);
    assert_eq!(4, out_info.color_type.samples());
    assert_eq!(out_info.buffer_size, output_buffer_size);
    let mut out = vec![0; output_buffer_size];
    reader.next_frame(&mut out)?;
    Ok(())
}

#[test]
fn decode_001_cursor_buffered() -> Result<(), Box<dyn std::error::Error>> {
    use std::io;

    let cursor = io::BufReader::new(Cursor::new(TEST_PNG_001));
    let decoder = Decoder::new(cursor);
    let (out_info, mut reader) = decoder.read_info()?;
    let output_buffer_size = reader.output_buffer_size();
    assert_eq!(300, out_info.width);
    assert_eq!(300, out_info.height);
    assert_eq!(8, out_info.bit_depth as u8);
    assert_eq!(4, out_info.color_type.samples());
    assert_eq!(out_info.buffer_size, output_buffer_size);
    let mut out = vec![0; output_buffer_size];
    reader.next_frame(&mut out)?;
    Ok(())
}

#[test]
fn decode_001_slice() -> Result<(), Box<dyn std::error::Error>> {
    let decoder = Decoder::new(TEST_PNG_001);
    let (out_info, mut reader) = decoder.read_info()?;
    let output_buffer_size = reader.output_buffer_size();
    assert_eq!(300, out_info.width);
    assert_eq!(300, out_info.height);
    assert_eq!(8, out_info.bit_depth as u8);
    assert_eq!(4, out_info.color_type.samples());
    assert_eq!(out_info.buffer_size, output_buffer_size);
    let mut out = vec![0; output_buffer_size];
    reader.next_frame(&mut out)?;
    Ok(())
}

#[test]
fn decode_002_cursor() -> Result<(), Box<dyn std::error::Error>> {
    let cursor = Cursor::new(TEST_PNG_002);
    let decoder = Decoder::new(cursor);
    let (out_info, mut reader) = decoder.read_info()?;
    let output_buffer_size = reader.output_buffer_size();
    assert_eq!(380, out_info.width);
    assert_eq!(287, out_info.height);
    assert_eq!(8, out_info.bit_depth as u8);
    assert_eq!(4, out_info.color_type.samples());
    assert_eq!(out_info.buffer_size, output_buffer_size);
    let mut out = vec![0; output_buffer_size];
    reader.next_frame(&mut out)?;
    Ok(())
}

#[test]
fn decode_002_cursor_buffered() -> Result<(), Box<dyn std::error::Error>> {
    use std::io;

    let cursor = io::BufReader::new(Cursor::new(TEST_PNG_002));
    let decoder = Decoder::new(cursor);
    let (out_info, mut reader) = decoder.read_info()?;
    let output_buffer_size = reader.output_buffer_size();
    assert_eq!(380, out_info.width);
    assert_eq!(287, out_info.height);
    assert_eq!(8, out_info.bit_depth as u8);
    assert_eq!(4, out_info.color_type.samples());
    assert_eq!(out_info.buffer_size, output_buffer_size);
    let mut out = vec![0; output_buffer_size];
    reader.next_frame(&mut out)?;
    Ok(())
}

#[test]
fn decode_002_slice() -> Result<(), Box<dyn std::error::Error>> {
    let decoder = Decoder::new(TEST_PNG_002);
    let (out_info, mut reader) = decoder.read_info()?;
    let output_buffer_size = reader.output_buffer_size();
    assert_eq!(380, out_info.width);
    assert_eq!(287, out_info.height);
    assert_eq!(8, out_info.bit_depth as u8);
    assert_eq!(4, out_info.color_type.samples());
    assert_eq!(out_info.buffer_size, output_buffer_size);
    let mut out = vec![0; output_buffer_size];
    reader.next_frame(&mut out)?;
    Ok(())
}

#[test]
fn decode() -> Result<(), Box<dyn std::error::Error>> {
    let (out_info, out) = spng::decode(TEST_PNG_001, spng::Format::Png)?;
    assert_eq!(300, out_info.width);
    assert_eq!(300, out_info.height);
    assert_eq!(8, out_info.bit_depth as u8);
    assert_eq!(4, out_info.color_type.samples());
    assert_eq!(out_info.buffer_size, out.len());
    Ok(())
}

#[test]
fn decode_001_raw_context() -> Result<(), Box<dyn std::error::Error>> {
    use std::convert::TryFrom;
    let out_format = spng::Format::Rgba8;
    let mut ctx = spng::raw::RawContext::new()?;
    ctx.set_png_stream(TEST_PNG_001)?;
    let ihdr = ctx.get_ihdr()?;
    assert_eq!(300, ihdr.width);
    assert_eq!(300, ihdr.height);
    assert_eq!(8, ihdr.bit_depth);
    assert_eq!(4, spng::ColorType::try_from(ihdr.color_type)?.samples());
    let buffer_size = ctx.decoded_image_size(out_format)?;
    let mut data = vec![0; buffer_size];
    ctx.decode_image(&mut data, out_format, spng::DecodeFlags::empty())?;
    Ok(())
}