farbfeld.rs 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. use glium::texture::{RawImage2d,Texture2dDataSource};
  2. use therm_util::reader::ByteReader;
  3. #[derive(Debug,Clone)]
  4. pub struct FFImage {
  5. pixels: Vec<Vec<(u16,u16,u16,u16)>>
  6. }
  7. fn parse_pixel<Rd>(r: &mut ByteReader<Rd>) -> Result<(u16,u16,u16,u16), String>
  8. where Rd: Iterator<Item=u8>
  9. {
  10. Ok((try!(r.read_u16be()),
  11. try!(r.read_u16be()),
  12. try!(r.read_u16be()),
  13. try!(r.read_u16be())))
  14. }
  15. impl FFImage {
  16. pub fn from_bz2_file(path: &str) -> Result<FFImage, String> {
  17. let mut r = match ByteReader::from_compressed_file(path) {
  18. Ok(x) => x,
  19. Err(_) => return Err("Unable to open file".to_string()),
  20. };
  21. FFImage::from_reader(&mut r)
  22. }
  23. pub fn from_file(path: &str) -> Result<FFImage, String> {
  24. let mut r = match ByteReader::from_file(path) {
  25. Ok(x) => x,
  26. Err(_) => return Err("Unable to open file".to_string()),
  27. };
  28. FFImage::from_reader(&mut r)
  29. }
  30. pub fn from_reader<Rd>(r: &mut ByteReader<Rd>) -> Result<FFImage, String>
  31. where Rd: Iterator<Item=u8>
  32. {
  33. assert!(try!(r.next()) == 'f' as u8);
  34. assert!(try!(r.next()) == 'a' as u8);
  35. assert!(try!(r.next()) == 'r' as u8);
  36. assert!(try!(r.next()) == 'b' as u8);
  37. assert!(try!(r.next()) == 'f' as u8);
  38. assert!(try!(r.next()) == 'e' as u8);
  39. assert!(try!(r.next()) == 'l' as u8);
  40. assert!(try!(r.next()) == 'd' as u8);
  41. let w = try!(r.read_u32be());
  42. let h = try!(r.read_u32be());
  43. let mut pixels = vec![];
  44. for _ in 0..h {
  45. let mut row = vec![];
  46. for _ in 0..w {
  47. row.push(try!(parse_pixel(r)));
  48. }
  49. pixels.push(row)
  50. }
  51. pixels.reverse();
  52. Ok(FFImage { pixels: pixels })
  53. }
  54. pub fn get_raw_data(self) -> Vec<Vec<(u16,u16,u16,u16)>> {
  55. self.pixels
  56. }
  57. }
  58. impl <'a> Texture2dDataSource<'a> for FFImage {
  59. type Data = (u16, u16, u16, u16);
  60. fn into_raw(self) -> RawImage2d<'a, (u16, u16, u16, u16)> {
  61. self.pixels.into_raw()
  62. }
  63. }