123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- use glium::texture::{RawImage2d,Texture2dDataSource};
- use therm_util::reader::ByteReader;
- #[derive(Debug,Clone)]
- pub struct FFImage {
- pixels: Vec<Vec<(u16,u16,u16,u16)>>
- }
- fn parse_pixel<Rd>(r: &mut ByteReader<Rd>) -> Result<(u16,u16,u16,u16), String>
- where Rd: Iterator<Item=u8>
- {
- Ok((try!(r.read_u16be()),
- try!(r.read_u16be()),
- try!(r.read_u16be()),
- try!(r.read_u16be())))
- }
- impl FFImage {
- pub fn from_bz2_file(path: &str) -> Result<FFImage, String> {
- let mut r = match ByteReader::from_compressed_file(path) {
- Ok(x) => x,
- Err(_) => return Err("Unable to open file".to_string()),
- };
- FFImage::from_reader(&mut r)
- }
- pub fn from_file(path: &str) -> Result<FFImage, String> {
- let mut r = match ByteReader::from_file(path) {
- Ok(x) => x,
- Err(_) => return Err("Unable to open file".to_string()),
- };
- FFImage::from_reader(&mut r)
- }
- pub fn from_reader<Rd>(r: &mut ByteReader<Rd>) -> Result<FFImage, String>
- where Rd: Iterator<Item=u8>
- {
- assert!(try!(r.next()) == 'f' as u8);
- assert!(try!(r.next()) == 'a' as u8);
- assert!(try!(r.next()) == 'r' as u8);
- assert!(try!(r.next()) == 'b' as u8);
- assert!(try!(r.next()) == 'f' as u8);
- assert!(try!(r.next()) == 'e' as u8);
- assert!(try!(r.next()) == 'l' as u8);
- assert!(try!(r.next()) == 'd' as u8);
- let w = try!(r.read_u32be());
- let h = try!(r.read_u32be());
- let mut pixels = vec![];
- for _ in 0..h {
- let mut row = vec![];
- for _ in 0..w {
- row.push(try!(parse_pixel(r)));
- }
- pixels.push(row)
- }
- pixels.reverse();
- Ok(FFImage { pixels: pixels })
- }
- pub fn get_raw_data(self) -> Vec<Vec<(u16,u16,u16,u16)>> {
- self.pixels
- }
- }
- impl <'a> Texture2dDataSource<'a> for FFImage {
- type Data = (u16, u16, u16, u16);
- fn into_raw(self) -> RawImage2d<'a, (u16, u16, u16, u16)> {
- self.pixels.into_raw()
- }
- }
|