1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
use exporter::{ Exporter, ExportResult, }; use std::marker::PhantomData; use image::{ DynamicImage, ImageBuffer, Rgba, }; use texture::Texture; #[derive(Copy, Clone)] pub struct ImageExporter<T>(PhantomData<T>); impl<T: Texture<Pixel=Rgba<u8>>> ImageExporter<T> { pub fn export(texture: &T) -> ExportResult<DynamicImage> { <Self as Exporter<T>>::export(texture) } } impl<T: Texture<Pixel=Rgba<u8>>> Exporter<T> for ImageExporter<T> { type Output = DynamicImage; fn export(texture: &T) -> ExportResult<DynamicImage> { let width = texture.width(); let height = texture.height(); if width == 0 || height == 0 { return Err("Widht or height of this texture is zero".to_string()); } let mut pixels = Vec::new(); for row in 0..height { for col in 0..width { if let Some(pixel) = texture.get(col, row) { pixels.push(pixel[0]); pixels.push(pixel[1]); pixels.push(pixel[2]); pixels.push(pixel[3]); } else { pixels.push(0); pixels.push(0); pixels.push(0); pixels.push(0); } } } if let Some(image_buffer) = ImageBuffer::<Rgba<u8>, Vec<u8>>::from_raw(width, height, pixels) { Ok(DynamicImage::ImageRgba8(image_buffer)) } else { Err("Can't export texture".to_string()) } } }