From 1712b2fc7b7d56bdce3c860a312cb35cd5b3b3e4 Mon Sep 17 00:00:00 2001 From: zroug <37004975+zroug@users.noreply.github.com> Date: Tue, 10 Jul 2018 17:21:13 +0200 Subject: [PATCH] Added support for rational tags --- src/decoder/ifd.rs | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/decoder/ifd.rs b/src/decoder/ifd.rs index 8ac9cab..b349e64 100644 --- a/src/decoder/ifd.rs +++ b/src/decoder/ifd.rs @@ -6,7 +6,7 @@ use std::collections::{HashMap}; use super::stream::{ByteOrder, SmartReader, EndianReader}; use ::{TiffError, TiffResult}; -use self::Value::{Unsigned, List}; +use self::Value::{Unsigned, List, Rational}; macro_rules! tags { {$( @@ -90,7 +90,8 @@ pub enum Type { pub enum Value { //Signed(i32), Unsigned(u32), - List(Vec) + List(Vec), + Rational(u32, u32) } impl Value { @@ -112,6 +113,7 @@ impl Value { Ok(new_vec) }, Unsigned(val) => Ok(vec![val]), + Rational(numerator, denominator) => Ok(vec![numerator, denominator]) //_ => Err(::image::FormatError("Tag data malformed.".to_string())) } } @@ -178,6 +180,22 @@ impl Entry { } Ok(List(v)) } + (Type::RATIONAL, 1) => { + try!(decoder.goto_offset(try!(self.r(bo).read_u32()))); + let numerator = try!(decoder.read_long()); + let denominator = try!(decoder.read_long()); + Ok(Rational(numerator, denominator)) + }, + (Type::RATIONAL, n) => { + let mut v = Vec::with_capacity(n as usize); + try!(decoder.goto_offset(try!(self.r(bo).read_u32()))); + for _ in 0 .. n { + let numerator = try!(decoder.read_long()); + let denominator = try!(decoder.read_long()); + v.push(Rational(numerator, denominator)) + } + Ok(List(v)) + }, _ => Err(TiffError::UnsupportedError("Unsupported data type.".to_string())) } }