picto 0.4.4

Image handling library.
Documentation
#[macro_use]
extern crate approx;
extern crate picto;

mod png {
	use picto::{self, color::*};

	#[test]
	fn read_as_is() {
		let image = picto::read::from_path::<Rgb, u8, _>("tests/rainbow.png").unwrap();

		assert_eq!(400, image.width());
		assert_eq!(326, image.height());

		assert_relative_eq!(Rgb::new_u8(0xff, 0x00, 0x00), image.get(0, 0), epsilon = 0.01);
		assert_relative_eq!(Rgb::new_u8(0x00, 0x02, 0xff), image.get(399, 0), epsilon = 0.01);
	}

	#[test]
	fn read_with_convert() {
		let image = picto::read::from_path::<Rgba, u8, _>("tests/rainbow.png").unwrap();

		assert_eq!(400, image.width());
		assert_eq!(326, image.height());

		assert_relative_eq!(Rgba::new_u8(0xff, 0x00, 0x00, 0xff), image.get(0, 0), epsilon = 0.01);
		assert_relative_eq!(Rgba::new_u8(0x00, 0x02, 0xff, 0xff), image.get(399, 0), epsilon = 0.01);
	}

	#[test]
	fn write() {
		{
			let mut image = picto::Buffer::<Rgb, u8, _>::new(2, 2);

			image.set(0, 0, &Rgb::new(1.0, 0.0, 0.0));
			image.set(0, 1, &Rgb::new(0.0, 1.0, 0.0));
			image.set(1, 0, &Rgb::new(0.0, 0.0, 1.0));
			image.set(1, 1, &Rgb::new(1.0, 0.0, 1.0));

			picto::write::to_path("tests/test.png", &image).unwrap();
		}

		{
			let image = picto::read::from_path::<Rgb, u8, _>("tests/test.png").unwrap();

			assert_eq!(2, image.width());
			assert_eq!(2, image.height());

			assert_relative_eq!(Rgb::new(1.0, 0.0, 0.0), image.get(0, 0), epsilon = 0.01);
			assert_relative_eq!(Rgb::new(0.0, 1.0, 0.0), image.get(0, 1), epsilon = 0.01);
			assert_relative_eq!(Rgb::new(0.0, 0.0, 1.0), image.get(1, 0), epsilon = 0.01);
			assert_relative_eq!(Rgb::new(1.0, 0.0, 1.0), image.get(1, 1), epsilon = 0.01);
		}
	}
}

mod jpeg {
	use picto::{self, color::*};

	#[test]
	fn read_as_is() {
		let image = picto::read::from_path::<Rgb, u8, _>("tests/rainbow.jpeg").unwrap();

		assert_eq!(400, image.width());
		assert_eq!(326, image.height());

		assert_relative_eq!(Rgb::new_u8(0xff, 0x00, 0x00), image.get(0, 0), epsilon = 0.01);
		assert_relative_eq!(Rgb::new_u8(0x00, 0x02, 0xff), image.get(399, 0), epsilon = 0.01);
	}

	#[test]
	fn read_with_convert() {
		let image = picto::read::from_path::<Rgba, u8, _>("tests/rainbow.jpeg").unwrap();

		assert_eq!(400, image.width());
		assert_eq!(326, image.height());

		assert_relative_eq!(Rgba::new_u8(0xff, 0x00, 0x00, 0xff), image.get(0, 0), epsilon = 0.01);
		assert_relative_eq!(Rgba::new_u8(0x00, 0x02, 0xff, 0xff), image.get(399, 0), epsilon = 0.01);
	}
}

mod bmp {
	use picto::{self, color::*};

	#[test]
	fn read_as_is() {
		let image = picto::read::from_path::<Rgb, u8, _>("tests/rainbow.bmp").unwrap();

		assert_eq!(400, image.width());
		assert_eq!(326, image.height());

		assert_relative_eq!(Rgb::new_u8(0xff, 0x00, 0x00), image.get(0, 0), epsilon = 0.01);
		assert_relative_eq!(Rgb::new_u8(0x00, 0x02, 0xff), image.get(399, 0), epsilon = 0.01);
	}

	#[test]
	fn read_with_convert() {
		let image = picto::read::from_path::<Rgba, u8, _>("tests/rainbow.bmp").unwrap();

		assert_eq!(400, image.width());
		assert_eq!(326, image.height());

		assert_relative_eq!(Rgba::new_u8(0xff, 0x00, 0x00, 0xff), image.get(0, 0), epsilon = 0.01);
		assert_relative_eq!(Rgba::new_u8(0x00, 0x02, 0xff, 0xff), image.get(399, 0), epsilon = 0.01);
	}

	#[test]
	fn write() {
		{
			let mut image = picto::Buffer::<Rgb, u8, _>::new(2, 2);

			image.set(0, 0, &Rgb::new(1.0, 0.0, 0.0));
			image.set(0, 1, &Rgb::new(0.0, 1.0, 0.0));
			image.set(1, 0, &Rgb::new(0.0, 0.0, 1.0));
			image.set(1, 1, &Rgb::new(1.0, 0.0, 1.0));

			picto::write::to_path("tests/test.bmp", &image).unwrap();
		}

		{
			let image = picto::read::from_path::<Rgb, u8, _>("tests/test.bmp").unwrap();

			assert_eq!(2, image.width());
			assert_eq!(2, image.height());

			assert_relative_eq!(Rgb::new(1.0, 0.0, 0.0), image.get(0, 0), epsilon = 0.01);
			assert_relative_eq!(Rgb::new(0.0, 1.0, 0.0), image.get(0, 1), epsilon = 0.01);
			assert_relative_eq!(Rgb::new(0.0, 0.0, 1.0), image.get(1, 0), epsilon = 0.01);
			assert_relative_eq!(Rgb::new(1.0, 0.0, 1.0), image.get(1, 1), epsilon = 0.01);
		}
	}
}

mod tga {
	use picto::{self, color::*};

	#[test]
	fn read_as_is() {
		let image = picto::read::from_path::<Rgb, u8, _>("tests/rainbow.tga").unwrap();

		assert_eq!(400, image.width());
		assert_eq!(326, image.height());

		assert_relative_eq!(Rgb::new_u8(0xff, 0x00, 0x00), image.get(0, 0), epsilon = 0.01);
		assert_relative_eq!(Rgb::new_u8(0x00, 0x02, 0xff), image.get(399, 0), epsilon = 0.01);
	}

	#[test]
	fn read_with_convert() {
		let image = picto::read::from_path::<Rgba, u8, _>("tests/rainbow.tga").unwrap();

		assert_eq!(400, image.width());
		assert_eq!(326, image.height());

		assert_relative_eq!(Rgba::new_u8(0xff, 0x00, 0x00, 0xff), image.get(0, 0), epsilon = 0.01);
		assert_relative_eq!(Rgba::new_u8(0x00, 0x02, 0xff, 0xff), image.get(399, 0), epsilon = 0.01);
	}

	#[test]
	fn write() {
		{
			let mut image = picto::Buffer::<Rgb, u8, _>::new(2, 2);

			image.set(0, 0, &Rgb::new(1.0, 0.0, 0.0));
			image.set(0, 1, &Rgb::new(0.0, 1.0, 0.0));
			image.set(1, 0, &Rgb::new(0.0, 0.0, 1.0));
			image.set(1, 1, &Rgb::new(1.0, 0.0, 1.0));

			picto::write::to_path("tests/test.tga", &image).unwrap();
		}

		{
			let image = picto::read::from_path::<Rgb, u8, _>("tests/test.tga").unwrap();

			assert_eq!(2, image.width());
			assert_eq!(2, image.height());

			assert_relative_eq!(Rgb::new(1.0, 0.0, 0.0), image.get(0, 0), epsilon = 0.01);
			assert_relative_eq!(Rgb::new(0.0, 1.0, 0.0), image.get(0, 1), epsilon = 0.01);
			assert_relative_eq!(Rgb::new(0.0, 0.0, 1.0), image.get(1, 0), epsilon = 0.01);
			assert_relative_eq!(Rgb::new(1.0, 0.0, 1.0), image.get(1, 1), epsilon = 0.01);
		}
	}
}

mod gif {
	use std::fs::File;

	use picto::{self, color::*, HasParameters};

	#[test]
	fn read_as_is() {
		let image = picto::read::from_path::<Rgb, u8, _>("tests/rainbow.gif").unwrap();

		assert_eq!(400, image.width());
		assert_eq!(326, image.height());

		assert_relative_eq!(Rgb::new_u8(0xff, 0x00, 0x00), image.get(0, 0), epsilon = 0.2);
		assert_relative_eq!(Rgb::new_u8(0x00, 0x02, 0xff), image.get(399, 0), epsilon = 0.2);
	}

	#[test]
	fn read_with_convert() {
		let image = picto::read::from_path::<Rgba, u8, _>("tests/rainbow.gif").unwrap();

		assert_eq!(400, image.width());
		assert_eq!(326, image.height());

		assert_relative_eq!(Rgba::new_u8(0xff, 0x00, 0x00, 0xff), image.get(0, 0), epsilon = 0.2);
		assert_relative_eq!(Rgba::new_u8(0x00, 0x02, 0xff, 0xff), image.get(399, 0), epsilon = 0.2);
	}

	#[test]
	fn write() {
		{
			let mut image = picto::Buffer::<Rgb, u8, _>::new(2, 2);

			image.set(0, 0, &Rgb::new(0.0, 0.0, 0.0));
			image.set(0, 1, &Rgb::new(0.0, 1.0, 0.0));
			image.set(1, 0, &Rgb::new(0.0, 0.0, 1.0));
			image.set(1, 1, &Rgb::new(1.0, 0.0, 1.0));

			picto::write::gif(File::create("tests/test.gif").unwrap(), &image, |gif| {
				gif.set(vec![255u8, 0, 0, 0, 255, 0, 0, 0, 255, 255, 0, 0]).unwrap();
			})
			.unwrap();
		}

		{
			let image = picto::read::from_path::<Rgb, u8, _>("tests/test.gif").unwrap();

			assert_eq!(2, image.width());
			assert_eq!(2, image.height());

			assert_relative_eq!(Rgb::new(0.0, 0.0, 0.0), image.get(0, 0), epsilon = 0.2);
			assert_relative_eq!(Rgb::new(0.0, 1.0, 0.0), image.get(0, 1), epsilon = 0.2);
			assert_relative_eq!(Rgb::new(0.0, 0.0, 1.0), image.get(1, 0), epsilon = 0.2);
			assert_relative_eq!(Rgb::new(1.0, 0.0, 1.0), image.get(1, 1), epsilon = 0.5);
		}
	}
}

mod xyz {
	use picto::{self, color::*};

	#[test]
	fn read_as_is() {
		let image = picto::read::from_path::<Rgb, u8, _>("tests/boat.xyz").unwrap();

		assert_eq!(320, image.width());
		assert_eq!(240, image.height());

		assert_relative_eq!(Rgb::new_u8(0x1e, 0x03, 0x43), image.get(0, 0), epsilon = 0.01);
		assert_relative_eq!(Rgb::new_u8(0x1f, 0x03, 0x45), image.get(0, 239), epsilon = 0.01);
	}

	#[test]
	fn read_with_convert() {
		let image = picto::read::from_path::<Rgba, u8, _>("tests/boat.xyz").unwrap();

		assert_eq!(320, image.width());
		assert_eq!(240, image.height());

		assert_relative_eq!(Rgba::new_u8(0x1e, 0x03, 0x43, 0xff), image.get(0, 0), epsilon = 0.01);
		assert_relative_eq!(Rgba::new_u8(0x1f, 0x03, 0x45, 0xff), image.get(0, 239), epsilon = 0.01);
	}
}